mysqld.sock 未在 Galera 节点上创建

问题描述

我有一个在 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'

如何让其他节点也创建socket? 重要提示:当我禁用 galera 配置时,每个节点都会成功创建一个套接字。

解决方法

定位套接字路径:

mysql -u root -p -h 127.0.0.1 -e "select @@socket"

如果不存在,设置以下并重启mysql:

[mysqld]
socket: /var/run/mysqld.sock
,

我切换到在没有容器的操作系统上直接安装 MariaDB,我的套接字问题得到了解决......奇怪。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...