mysqld.sock 未在 Galera 节点上创建
mysqld.sock not created on Galera node
我在 MariaDB 容器上有一个 Galera 集群 运行,只有引导节点接受连接——其他节点不创建套接字。
我对这种行为感到困惑,因为所有节点都是从相同的 VM 模板创建的并且具有相同的配置(除了引导程序节点中的 wsrep_cluster_address = gcomm://
)。
我正在使用 mariadb/server:10.4
作为容器图像。
/etc/mysql/my.cnf
(唯一存在且跨所有节点相同的配置文件):
[mysqld]
port = 3306
report_host = {{ ansible_host }} # always FQDN
default_storage_engine = InnoDB
binlog_format = ROW
character-set-server = utf8mb4
character_set_server = utf8mb4
[mariadb]
bind-address = 0.0.0.0
innodb_autoinc_lock_mode = 2
# Galera cluster configuration
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address = gcomm://10.0.0.100,10.0.1.101,10.0.0.102,10.0.0.103
wsrep_cluster_name = my-galera-cluster
wsrep_sst_method = rsync
wsrep_sst_auth = root:s3cr3t-r00t-p4ssw0rd
# Cluster node configuration
wsrep_node_address = {{ inventory_hostname }} # always IP
wsrep_node_name = {{ ansible_host.split(".")[0] | lower }} # always host name
这就是我 运行 Ansible 中每个节点的方式:
- name: Start MariaDB docker container
docker_container:
image: "mariadb/server:10.4"
name: "mariadb-server"
state: started
log_driver: json-file
log_options:
max-size: "100m"
max-file: "2"
env:
MARIADB_ROOT_PASSWORD_FILE: "/etc/mysql/secrets/mariadb_root_password"
MARIADB_USER: "my-user"
MARIADB_PASSWORD_FILE: "/etc/mysql/secrets/mariadb_my-user_password"
MARIADB_ALLOW_EMPTY_PASSWORD: "no"
MARIADB_ROOT_HOST: "%"
# https://github.com/docker-library/mariadb/issues/262
MYSQL_INITDB_SKIP_TZINFO: "1"
volumes:
- "/etc/mysql:/etc/mysql"
- "/var/lib/mysql:/var/lib/mysql"
ports:
- "{{ inventory_hostname }}:3306:3306"
- "{{ inventory_hostname }}:4567:4567"
- "{{ inventory_hostname }}:4567:4567/udp"
- "{{ inventory_hostname }}:4568:4568"
- "{{ inventory_hostname }}:4444:4444"
当我检查引导节点上的集群状态时,我得到了令人满意的数字,例如:
wsrep_cluster_size 4
wsrep_cluster_status Primary
wsrep_connected ON
wsrep_ready ON
mysqld
守护进程出现在所有节点上:
# docker exec mariadb-server ps -ef
UID PID PPID C STIME TTY TIME CMD
mysql 1 0 0 07:12 ? 00:00:06 mysqld
mysql 46 1 0 07:12 ? 00:00:00 sh -c wsrep_sst_rsync --role 'joiner' --address '10.0.1.102' --datadir '/var/lib/mysql/' --parent '1'
mysql 47 46 0 07:12 ? 00:00:04 /bin/bash -ue /usr//bin/wsrep_sst_rsync --role joiner --address 10.0.1.102 --datadir /var/lib/mysql/ --parent 1
mysql 98 47 0 07:12 ? 00:00:00 rsync --daemon --no-detach --port 4444 --config /var/lib/mysql//rsync_sst.conf
mysql 16029 47 0 08:18 ? 00:00:00 sleep 1
root 16030 0 0 08:18 ? 00:00:00 ps -ef
每个容器都有默认的套接字目录:/var/run/mysqld
,但只有引导节点创建 mysqld.sock
,因此尝试在本地登录失败:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
即使我将 socket = /var/run/mysqld/mysqld.sock
添加到任何部分([mariadb]
、[mysql]
、[mysqld]
、[client]
),其他节点似乎也只是跳过它的创造。引导节点是唯一在日志中生成此行的节点:
[Note] Server socket created on IP: '0.0.0.0'
如何让其他节点也创建套接字?
重要说明:当我禁用 Galera 配置时,每个节点都成功创建了一个套接字。
找到套接字路径:
mysql -u root -p -h 127.0.0.1 -e "select @@socket"
如果存在 none,请设置以下内容并重新启动 mysql:
[mysqld]
socket: /var/run/mysqld.sock
我切换到在没有容器的操作系统上直接安装 MariaDB,我的套接字问题得到解决...奇怪。
我在 MariaDB 容器上有一个 Galera 集群 运行,只有引导节点接受连接——其他节点不创建套接字。
我对这种行为感到困惑,因为所有节点都是从相同的 VM 模板创建的并且具有相同的配置(除了引导程序节点中的 wsrep_cluster_address = gcomm://
)。
我正在使用 mariadb/server:10.4
作为容器图像。
/etc/mysql/my.cnf
(唯一存在且跨所有节点相同的配置文件):
[mysqld]
port = 3306
report_host = {{ ansible_host }} # always FQDN
default_storage_engine = InnoDB
binlog_format = ROW
character-set-server = utf8mb4
character_set_server = utf8mb4
[mariadb]
bind-address = 0.0.0.0
innodb_autoinc_lock_mode = 2
# Galera cluster configuration
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address = gcomm://10.0.0.100,10.0.1.101,10.0.0.102,10.0.0.103
wsrep_cluster_name = my-galera-cluster
wsrep_sst_method = rsync
wsrep_sst_auth = root:s3cr3t-r00t-p4ssw0rd
# Cluster node configuration
wsrep_node_address = {{ inventory_hostname }} # always IP
wsrep_node_name = {{ ansible_host.split(".")[0] | lower }} # always host name
这就是我 运行 Ansible 中每个节点的方式:
- name: Start MariaDB docker container
docker_container:
image: "mariadb/server:10.4"
name: "mariadb-server"
state: started
log_driver: json-file
log_options:
max-size: "100m"
max-file: "2"
env:
MARIADB_ROOT_PASSWORD_FILE: "/etc/mysql/secrets/mariadb_root_password"
MARIADB_USER: "my-user"
MARIADB_PASSWORD_FILE: "/etc/mysql/secrets/mariadb_my-user_password"
MARIADB_ALLOW_EMPTY_PASSWORD: "no"
MARIADB_ROOT_HOST: "%"
# https://github.com/docker-library/mariadb/issues/262
MYSQL_INITDB_SKIP_TZINFO: "1"
volumes:
- "/etc/mysql:/etc/mysql"
- "/var/lib/mysql:/var/lib/mysql"
ports:
- "{{ inventory_hostname }}:3306:3306"
- "{{ inventory_hostname }}:4567:4567"
- "{{ inventory_hostname }}:4567:4567/udp"
- "{{ inventory_hostname }}:4568:4568"
- "{{ inventory_hostname }}:4444:4444"
当我检查引导节点上的集群状态时,我得到了令人满意的数字,例如:
wsrep_cluster_size 4
wsrep_cluster_status Primary
wsrep_connected ON
wsrep_ready ON
mysqld
守护进程出现在所有节点上:
# docker exec mariadb-server ps -ef
UID PID PPID C STIME TTY TIME CMD
mysql 1 0 0 07:12 ? 00:00:06 mysqld
mysql 46 1 0 07:12 ? 00:00:00 sh -c wsrep_sst_rsync --role 'joiner' --address '10.0.1.102' --datadir '/var/lib/mysql/' --parent '1'
mysql 47 46 0 07:12 ? 00:00:04 /bin/bash -ue /usr//bin/wsrep_sst_rsync --role joiner --address 10.0.1.102 --datadir /var/lib/mysql/ --parent 1
mysql 98 47 0 07:12 ? 00:00:00 rsync --daemon --no-detach --port 4444 --config /var/lib/mysql//rsync_sst.conf
mysql 16029 47 0 08:18 ? 00:00:00 sleep 1
root 16030 0 0 08:18 ? 00:00:00 ps -ef
每个容器都有默认的套接字目录:/var/run/mysqld
,但只有引导节点创建 mysqld.sock
,因此尝试在本地登录失败:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
即使我将 socket = /var/run/mysqld/mysqld.sock
添加到任何部分([mariadb]
、[mysql]
、[mysqld]
、[client]
),其他节点似乎也只是跳过它的创造。引导节点是唯一在日志中生成此行的节点:
[Note] Server socket created on IP: '0.0.0.0'
如何让其他节点也创建套接字? 重要说明:当我禁用 Galera 配置时,每个节点都成功创建了一个套接字。
找到套接字路径:
mysql -u root -p -h 127.0.0.1 -e "select @@socket"
如果存在 none,请设置以下内容并重新启动 mysql:
[mysqld]
socket: /var/run/mysqld.sock
我切换到在没有容器的操作系统上直接安装 MariaDB,我的套接字问题得到解决...奇怪。