linux服务-MariaDB 10.6 Galera Cluster 部署

MariaDB 10.6 Galera Cluster 部署

文档参考:MariaDB Galera Cluster 10.6 集群部署豆包ai

MariaDB 10.6 Galera Cluster是基于MariaDB 10.6社区版与Galera 4同步复制技术深度整合的高可用、多主复制集群解决方案,专为解决传统异步复制的数据一致性问题和单点故障风险设计,核心价值在于数据强一致性、零数据丢失及对应用透明的高可用服务。

一、工作原理

1.1、基础特性

  1. 同步多主复制(Multi-Master):集群中所有节点均为可读写节点,无主从角色区分,支持并发写入多个节点,避免传统主从架构的主节点单点瓶颈。写入操作在所有节点同步确认后才返回成功,确保集群数据强一致性,无复制延迟导致的数据不一致问题。

  2. 自动节点故障检测与恢复:通过组通信协议(GCS)实时监控节点状态,故障节点自动被剔除,不影响集群服务;故障节点恢复后可自动重新加入集群并增量同步缺失数据,实现无缝回归,无需手动干预备份恢复。

  3. 无数据丢失(RPO=0):基于同步复制机制,仅当写入操作被集群中大多数节点(quorum,法定人数)持久化到磁盘后,才向客户端返回成功响应。即使部分节点宕机,只要法定人数节点存活,数据就不会丢失,满足核心业务零数据丢失需求。

  4. 对应用透明:应用程序无需大量改造,可像访问单个MariaDB实例一样访问集群,节点切换、数据同步等操作对应用层屏蔽,降低迁移和运维成本。

  5. MariaDB 10.6 专属增强:继承MariaDB 10.6的全部特性(如性能优化、JSON功能增强、窗口函数完善、安全性提升等),同时针对Galera做版本适配,修复低版本兼容性问题,提升大事务处理效率和集群稳定性。

  6. 简单说

    • 几乎同步复制

    • 主动-主动多主拓扑

    • 读取和写入任何群集节点

    • 自动成员资格控制,故障节点从群集中删除

    • 自动节点连接

    • 行级别的真正并行复制

    • 直接客户端连接,本机MariaDB的外观和感觉

1.2、架构与工作原理

采用无中心分布式架构,无专门管理节点,所有节点地位平等。集群规模建议为3、5等奇数个节点(便于达成法定人数,规避脑裂),最小可用规模为2个节点(需额外配置仲裁节点)。每个节点包含两个核心组件:

  • 架构说明

    • MariaDB 10.6 数据库实例:负责处理SQL请求、数据存储等基础数据库功能。
    • Galera Plugin(wsrep补丁):实现组通信、同步复制、节点状态同步等集群核心功能,是集群运行的关键驱动。
  • 工作流程(写入操作)

    • 客户端向集群任意节点提交写入请求(INSERT/UPDATE/DELETE等)。

    • 发起节点对SQL操作进行语法校验、事务预处理,生成写集(Write Set,含事务修改数据及元数据)。

    • 通过Galera组通信协议(GCS)将写集广播到集群所有其他节点。

    • 所有节点对写集进行冲突检测(避免多节点并发写入同一数据冲突),检测通过后持久化到本地磁盘。

    • 发起节点收到大多数节点的持久化确认后,执行本地事务提交,并向客户端返回写入成功。

    • 其他节点收到法定人数确认后,自动提交该事务,完成全集群数据同步。

    • 流程图

      bash 复制代码
      ┌─────────────────┐
      │      客户端      │
      └─────────┬───────┘
                │ 1. 提交写入请求(INSERT/UPDATE/DELETE)
      ┌─────────▼───────┐
      │ 集群任意节点(发起节点) │
      └─────────┬───────┘
                │ 2. 语法校验 + 事务预处理
      ┌─────────▼───────┐
      │  生成写集(Write Set)  │
      └─────────┬───────┘
                │ 3. 通过 GCS 组通信协议广播
      ┌─────────▼───────┐
      │  集群所有其他节点   │
      └─────────┬───────┘
      ┌─────────┴───────┐
      │  所有节点执行冲突检测  │
      └─────────┬───────┘
                │ 4. 检测通过(不通过则终止事务)
      ┌─────────▼───────┐
      │  写集持久化到本地磁盘  │
      └─────────┬───────┘
                │ 5. 各节点向发起节点反馈持久化确认
      ┌─────────▼───────┐
      │  发起节点收集确认结果  │
      └─────────┬───────┘
                │ 6. 收到大多数节点(法定人数)确认
      ┌─────────▼───────┐
      │  发起节点提交本地事务  │
      └─────────┬───────┘
                │ 7. 向客户端返回「写入成功」
      ┌─────────▼───────┐
      │  其他节点收到法定人数确认 │
      └─────────┬───────┘
                │ 8. 其他节点自动提交事务
      ┌─────────▼───────┐
      │  全集群数据同步完成   │
      └─────────────────┘

1.3、缺点

  • 加入新节点时开销大,需要复制完整数据;
  • 不能有效地解决写扩展的问题,所有的写操作都发生在所有的节点;
  • 有多少个节点,就有多少份重复的数据;
  • 由于事务提交需要跨节点通信,即涉及分布式事务操作,因此写入会比主从复制慢很多,节点越多,写入越慢,死锁和回滚也会更加频繁;
  • 对网络要求比较高,如果网络出现波动不稳定,则可能会造成两个节点失联,Galera Cluster集群会发生脑裂,服务将不可用;
  • 仅支持InnoDB/XtraDB存储引擎,任何写入其他引擎的表,包括mysql.*表都不会被复制,DDL语句可以复制,但是insert into mysql.user(MyISAM存储引擎)之类的插入数据不会被复制;
  • Delete操作不支持没有主键的表,因为没有主键的表在不同的节点上的顺序不同,如果执行select ... limit ...将出现不同的结果集;
  • 整个集群的写入吞吐量取决于最弱的节点限制,集群要使用同一的配置;

二、安装

2.1、环境准备

  • 节点规划:三个节点统一执行

    节点编号 节点IP 节点名称 系统版本 内核
    节点1 10.4.50.163 node1 中科方德 4.19.113-16
    节点2 10.4.50.164 node2 中科方德 4.19.113-16
    节点3 10.4.50.165 node3 中科方德 4.19.113-16
  • 配置时间同步

    bash 复制代码
    # 手动同步阿里云时间服务器
    ntpdate ntp.aliyun.com
    
    # 添加定时任务,每天凌晨3点自动同步
    echo "0 3 * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1" >> /var/spool/cron/root
    chmod 600 /var/spool/cron/root
  • 关闭防火墙与SELinux

    bash 复制代码
    # 避免端口拦截或权限限制,确保集群节点间通信正常:
    # 关闭防火墙(永久生效)
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 关闭SELinux(临时+永久)
    setenforce 0
    sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  • 核心端口开放

    端口号 协议 端口用途 所属组件 说明与注意事项
    3306或自行定义 TCP 数据库客户端连接 MariaDB 10.6 1. 仅需开放 TCP 协议,无需 UDP。
    4567 TCP/UDP Galera 集群节点间组通信 Galera 4 1. 必须同时开放 TCP 和 UDP 协议 ,缺一不可,否则集群节点无法建立通信、无法同步数据; 2. 默认端口不可修改
    4568 TCP IST(增量状态传输)同步 Galera 4 1. 默认端口 4568,建议保持默认。
    4444 TCP SST(全量状态传输)同步 Galera 4 1. 仅需开放 TCP 协议,所有节点统一,该端口为 SST 同步的默认通信端口,无需额外修改。
    • 防火墙配置

      bash 复制代码
      # 1. 开放3306端口(TCP)
      firewall-cmd --permanent --add-port=3306/tcp
      
      # 2. 开放4567端口(TCP+UDP,核心集群通信)
      firewall-cmd --permanent --add-port=4567/tcp
      firewall-cmd --permanent --add-port=4567/udp
      
      # 3. 开放4568端口(TCP,IST增量同步)
      firewall-cmd --permanent --add-port=4568/tcp
      
      # 4. 开放4444端口(TCP,SST全量同步)
      firewall-cmd --permanent --add-port=4444/tcp
      
      # 重新加载
      firewall-cmd --reload
      
      # 查看所有永久开放的端口
      firewall-cmd --permanent --list-ports
      
      # 富策略
      firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="${ip}" port protocol="tcp" port="${port}" accept"
      firewall-cmd --zone=public --list-rich-rules

2.2、编译部署

为啥要编译:方便后续平台迁移,一次构建N次迁移,最后编译完打成rpm包

  • 安装目录说明 <- 后补充的,下面安装的时候注意目录

    bash 复制代码
    mkdir /opt/mariadb/lib		# galera
    mkdir /opt/mariadb/mairadb  # mariadb服务
  • galera 下载源码包, 只需要一台编译,其它机器直接压缩cp过去就行

    • galera说明

      • 选择对应的maraidb版本,x86可直接用,arm需要编译,【x86实在编译不出来,先用官方的,arm mips就需要在研究一下了,先跑逻辑】,参考<-- arm编译可行

    • 获取libgalera_smm.so

      bash 复制代码
      # x86实在编译不出来,先用官方的,arm mips就需要在研究一下了,先跑逻辑
      wget https://mirrors.neusoft.edu.cn/mariadb///mariadb-10.6.24/bintar-linux-systemd-x86_64/mariadb-10.6.24-linux-systemd-x86_64.tar.gz
      # 解压后找到 在解压的lib目录下 libgalera_smm.so
      lib]# ldd libgalera_smm.so 
      	libssl.so.1.0.0 => not found
      	libcrypto.so.1.0.0 => not found
      # 可能会缺这两个so文件, 继续找
    • openssl

      bash 复制代码
      wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2a/openssl-1.0.2a.tar.gz
      # 略过解压步骤
      ./config --prefix=/opt/ssl --openssldir=/opt/ssl shared zlib enable-ssl3 enable-ssl3-method
      make -j 32 && make -j 32 install
      ls -l /opt/ssl/lib/
      -r-xr-xr-x 1 root root 2677440 1月   5 09:46 libcrypto.so.1.0.0
      -r-xr-xr-x 1 root root  544840 1月   5 09:46 libssl.so.1.0.0
      
      # 进lib目录下, 用ldd命令查看依赖关系
      [root@localhost lib]# ldd libcrypto.so.1.0.0 
      [root@localhost lib]# ldd libssl.so.1.0.0 
      	libcrypto.so.1.0.0 => not found
    • 依赖缺失

      bash 复制代码
      # 直接放 /lib64可能会破坏国产化系统,我们用patchelf打入rpath
      # 下载patchelf
      # https://gitcode.com/gh_mirrors/pa/patchelf/tags  找到最新版本
      # 国产可能不登陆就没法下载,自行手动下载吧
      wget https://raw.gitcode.com/gh_mirrors/pa/patchelf/archive/refs/heads/0.15.5.zip
      ./bootstrap.sh
      ./configure
      make
      make check
      sudo make install
      
      # 将在放到统一的目录如 /opt/mysql/mysqlso 下
      libgalera_smm.so
      libcrypto.so.1.0.0
      libssl.so.1.0.0
    • 依赖处理

      bash 复制代码
      patchelf --set-rpath /opt/mysql/mysqlso libssl.so.1.0.0
      patchelf --set-rpath /opt/mysql/mysqlso libgalera_smm.so 
      
      [root@localhost mysqlso]# readelf -d libgalera_smm.so 
       0x000000000000001d (RUNPATH)  Library runpath: [/opt/mysql/mysqlso]
      
      [root@localhost mysqlso]# readelf -d libssl.so.1.0.0 
       0x000000000000001d (RUNPATH)            Library runpath: [/opt/mysql/mysqlso]
      
      [root@localhost mysqlso]# ldd libgalera_smm.so 
      ldd: warning: you do not have execution permission for `./libgalera_smm.so'
      # 这种可以忽略
      ./libgalera_smm.so: /略过/libcrypto.so.1.0.0: no version information available (required by ./libgalera_smm.so)
      ./libgalera_smm.so: /略过/libssl.so.1.0.0: no version information available (required by ./libgalera_smm.so)
      	libssl.so.1.0.0 => /opt/mysql/mysqlso/libssl.so.1.0.0 (0x00007f8ba56bf000)
      	libcrypto.so.1.0.0 => /opt/mysql/mysqlso/libcrypto.so.1.0.0 (0x00007f8ba4a83000)
  • maraidb10.6.24编译

    • 下载并添加rpath

      bash 复制代码
      wget https://mirrors.neusoft.edu.cn/mariadb///mariadb-10.6.24/source/mariadb-10.6.24.tar.gz
      tar xf mariadb-10.6.24.tar.gz
      cd mariadb-10.6.24
      vim CMakeLists.txt 
      # 修改,在Internal/CPack下添加,自定义rpath路径
      SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
        ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_SOURCE_DIR}/cmake/Internal/CPack)
      SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
      SET(CMAKE_INSTALL_RPATH "/opt/mysql/mysqlso")
    • 处理依赖

      bash 复制代码
      yum -y install gnutls-devel  ncurses-devel bison-devel boost boost-devel flex flex-devel libxml2 libxml2-devel snappy snappy-devel curl-devel lz4-devel pcre2 pcre2-devel pcre pcre-devel
      
      wget https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz
      tar -xzvf zstd-1.5.7.tar.gz
      cd zstd-1.5.7
      # 32是cpu核数
      make -j 32 &&  make -j 32 install
    • 开始编译

      bash 复制代码
      cmake \
      -DCMAKE_INSTALL_PREFIX=/opt/mariadb \
      -DMYSQL_DATADIR=/opt/mariadb/data \
      -DSYSCONFDIR=/opt/mariadb \
      -DWITH_MYISAM_STORAGE_ENGINE=1 \
      -DWITH_INNOBASE_STORAGE_ENGINE=1 \
      -DWITH_MEMORY_STORAGE_ENGINE=1 \
      -DWITH_READLINE=1 \
      -DMYSQL_UNIX_ADDR=/opt/mariadb/data/mysql.sock \
      -DMYSQL_TCP_PORT=3306 \
      -DENABLED_LOCAL_INFILE=1 \
      -DWITH_PARTITION_STORAGE_ENGINE=1 \
      -DDEFAULT_CHARSET=utf8 \
      -DDEFAULT_COLLATION=utf8_general_ci
      -DWITH_ROCKSDB=OFF \
      -DWITH_GALERA=1 \
      -DGALERA_INCLUDE_DIR=/opt/mysql/mysqlso \
      -DGALERA_LIBRARY=/opt/mysql/mysqlso/libgalera_smm.so \
      -DMYSQL_USER=mysql \
      -DWITHOUT_MYISAM_STORAGE_ENGINE=1
      
      make -j 8 && make -j 8 install
      
      DMYSQL_TCP_PORT # 端口编译可以用其它的,避免冲突
    • 初始化

      bash 复制代码
      cd /opt/mariadb
      scripts/mysql_install_db --user=root --datadir=data/
    • my.cnf配置

      bash 复制代码
      # vi /opt/mariadb/my.cnf
      [root@localhost etsdb106]# cat my.cnf 
      [client]
      port        = 3306
      socket      = /opt/mariadb/data/mysql.sock
      
      [mysqld]
      port        = 3306
      socket      = /opt/mariadb/data/mysql.sock
      lower_case_table_names = 1
      character-set-server=utf8
      key_buffer_size = 64M
      max_allowed_packet = 10M
      table_open_cache = 256
      sort_buffer_size = 512K
      net_buffer_length = 8K
      read_buffer_size = 1M
      read_rnd_buffer_size = 512K
      myisam_sort_buffer_size = 16M
      max_connections=3000
      thread_cache_size=1000
      max_connect_errors=200
      interactive_timeout=600
      wait_timeout=3600
      innodb_buffer_pool_size=1000M
      read_buffer_size = 256K
      query_cache_type = 1
      query_cache_limit = 512K
      query_cache_min_res_unit = 2k
      query_cache_size=32M
      tmp_table_size=64M
      open_files_limit = 65535
      
      #加载密码复杂度审计插件
      plugin-load=simple_password_check.so
      #密码长度,默认8位
      simple_password_check_minimal_length=8
      #特殊符号,1代表至少1位
      #simple_password_check_other_characters=1
      #同时包含大小写
      #simple_password_check_letters_same_case=1
      #字母数,1代表至少1位
      #simple_password_check_letters_same_case=1
      #数字数,1代表至少1位
      #simple_password_check_digits=1
      # 最大生效时间
      default_password_lifetime=90
      #最大错误登录次数
      max_password_errors=5
      
      ############## 这部分在下面要修改 #####
      # unix_socket=OFF
      # log-bin=mysql-bin
      # binlog_format=mixed
      server-id   = 1
      expire_logs_days=30
      ############## 
      
      [mysqldump]
      quick
      max_allowed_packet = 16M
      
      [mysql]
      no-auto-rehash
      
      [myisamchk]
      key_buffer_size = 20M
      sort_buffer_size = 20M
      read_buffer = 2M
      write_buffer = 2M
      
      [mysqlhotcopy]
      interactive-timeout
    • 自启脚本

      bash 复制代码
      # cat /usr/lib/systemd/system/mariadb.service
      # 添加完之后才能cat 
      [Unit]
      Description=MariaDBserver database server
      After=syslog.target
      After=network.target
      
      [Service]
      Type=simple
      
      ExecStart=/opt/mariadb/bin/mysqld_safe  --defaults-file=/opt/mariadb/my.cnf --user=root
      TimeoutSec=300
      PrivateTmp=true
      
      [Install]
      WantedBy=multi-user.target
      
      # 启动
      systemctl start mariadb
    • 修改密码之类的

      bash 复制代码
      ./bin/mysql    # 不用密码直接登陆 
      select user, host, plugin from mysql.user;
      SET GLOBAL simple_password_check_other_characters=0;
      SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');
      SET PASSWORD FOR 'mariadb.sys'@'localhost' = PASSWORD('新密码');
      grant all on *.* to 'root'@'%' identified by '新密码';
      delete from  mysql.user where user=' ';
      select User,Host,Password from mysql.user;
      FLUSH PRIVILEGES;
    • 此时再用 ./mysql还是免密进入

      bash 复制代码
      # vi /opt/mariadb/my.cnf
      [root@localhost etsdb106]# cat my.cnf 
      [mysqld]
      unix_socket=OFF    # 把注释打开,禁止用unix_socket登陆
      
      # 重启再登陆 就要密码了
      [root@localhost mariadb]# systemctl restart mariadb
      
      # 验证
      [root@localhost mariadb]# ./bin/mysql
      ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
      [root@localhost mariadb]# ./bin/mysql -uroot -p
      Enter password:   # 直接回车
      ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
      
      # 在登陆 
      [root@localhost mariadb]# ./bin/mysql -uroot -p
      Enter password:  # 敲密码
      Server version: 10.6.24-MariaDB Source distribution
      MariaDB [(none)]> 
    • 基础准备完成

      bash 复制代码
      systemctl stop mariadb 
      rm -rf mysql-test
      # 把 maraidb跟 mysqlso压缩好,
      /opt/mariadb, /opt/mysql/mysqlso/
      # 节点1,2,3 三台机器,保持一样。

三、Galera集群配置

3.1、节点配置

  • 三个节点都共同的部分, 参考配置

    bash 复制代码
    expire_logs_days=7
    # log-bin=mysql-bin
    # 强制要求binlog_format(二进制日志格式)必须设置为ROW(行级格式)
    binlog_format=row
    # 禁用语句级复制相关优化,适配ROW格式
    log_slave_updates=ON
    # 关闭二进制日志校验(Galera已做相关校验,避免冲突)
    binlog_checksum=NONE
    
    # 存储引擎(必须InnoDB)
    default-storage-engine=InnoDB
    innodb_autoinc_lock_mode=2
    innodb_flush_log_at_trx_commit=1
    innodb_buffer_pool_size=1G
    
    # Galera核心配置
    wsrep_on=ON
    # 注意libgalera_smm.so路径 
    wsrep_provider=/opt/mysql/mysqlso/libgalera_smm.so
    # 随便敲,具有唯一性就行
    wsrep_cluster_name="ESCSASSEEQ"
    wsrep_cluster_address="gcomm://10.4.50.163,10.4.50.164,10.4.50.165"
    
    # 优化配置
    wsrep_slave_threads=4
    wsrep_sync_wait=1
    
    # 日志配置
    slow_query_log=ON
    slow_query_log_file=/opt/EETRUST/common/etsdb106/logs/slow_query.log
    log_error=/opt/EETRUST/common/etsdb106/logs/error.log
  • 通用命令

    bash 复制代码
    useradd -r -s /sbin/nologin mysql
    mkdir /opt/mariadb/logs
    chmod 777 /opt/mariadb -R
    chmod 644 /opt/mariadb/my.cnf
    chown mysql:mysql /opt/mariadb -R
  • 节点1

    bash 复制代码
    server-id   = 1
    
    # 节点名称
    wsrep_node_name="galera-node-1"
    # 节点IP
    wsrep_node_address="10.4.50.163"
    # 同步方式
    wsrep_sst_method=rsync
    wsrep_provider_options="gcache.size=1G;ist.recv_addr=10.4.50.163:4568;gmcast.listen_addr=tcp://0.0.0.0:4567"
  • 节点2

    bash 复制代码
    server-id   = 2
    
    # 节点名称
    wsrep_node_name="galera-node-2"
    # 节点IP
    wsrep_node_address="10.4.50.164"
    # 同步方式
    wsrep_sst_method=rsync
    wsrep_provider_options="gcache.size=1G;ist.recv_addr=10.4.50.164:4568;gmcast.listen_addr=tcp://0.0.0.0:4567"
  • 节点3

    bash 复制代码
    server-id   = 3
    
    # 节点名称
    wsrep_node_name="galera-node-3"
    # 节点IP
    wsrep_node_address="10.4.50.165"
    # 同步方式
    wsrep_sst_method=rsync
    wsrep_provider_options="gcache.size=1G;ist.recv_addr=10.4.50.165:4568;gmcast.listen_addr=tcp://0.0.0.0:4567"
  • 参数说明

    系统变量/选项 描述
    wsrep_provider 设置 wsrep 提供程序的路径。这是文件的路径。。每个版本可能不太一样。
    wsrep_cluster_address 启动时要连接到的群集节点的地址。为每个群集节点的 IP 地址或域名的逗号分隔列表。最佳做法是在此列表中包括所有群集节点。格式: gcomm://
    wsrep_node_name 设置当前节点名称
    wsrep_node_address 设置当前节点的IP地址
    wsrep_cluster_name 设置群集的逻辑名称。所有群集节点上必须相同。
    binlog_format 设置为ROW ,MariaDB Galera Cluster 不支持其他二进制日志格式。
    innodb_autoinc_lock_mode 设置为 2,MariaDB Galera 集群不支持其他自动增量锁定模式。
    wsrep_on 设置为ON 以启用 MariaDB Galera 集群。
    wsrep_provider_options 选项变量,gcache.size=1G 可以指定群集缓存,提高性能。可根据服务器内存调整。

3.2、集群初始化

  • 节点1

    bash 复制代码
    # 第一次种子节点,必须要手动初始化
    /opt/maraidb/bin/mysqld \
    --defaults-file=/opt/maraidb/my.cnf \
    --user=mysql \
    --wsrep-new-cluster &
    • 检查

      bash 复制代码
      # 注意看以下几个值
      [root@localhost mariadb]# ./bin/mysql -uroot -p
      MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
      | wsrep_incoming_addresses      | 10.4.50.163:8105   |
      | wsrep_cluster_size            | 1                  |
      | wsrep_cluster_status          | Primary            |
      | wsrep_connected               | ON                 |
      
      # 此时 kill mysqld进程,在重启,或者继续下面操作都行
  • 节点2、节点3

    bash 复制代码
    # 直接启动就行 systemctl start maraidb
    cd /opt/mariadb/
    tail -f logs/error.log
    # 确认没有异常, 正常日志
    2026-01-05 16:17:26 2 [Note] WSREP: ================================================
    View:
      id: 2b6525ab-ea0e-11f0-ac32-4f86af15e710:3
      status: primary
      protocol_version: 4
      capabilities: MULTI-MASTER, CERTIFICATION, PARALLEL_APPLYING, REPLAY, ISOLATION, PAUSE, CAUSAL_READ, INCREMENTAL_WS, UNORDERED, PREORDERED, STREAMING, NBO
      final: no
      own_index: 1
      members(3):
    	0: 2b5f5932-ea0e-11f0-a7ed-f38027b426cc, galera-node-1
    	1: b5b8d6be-ea0e-11f0-9a42-1b3dcf176a85, galera-node-2
    	2: f77948be-ea0e-11f0-8145-7af6d199179d, galera-node-3
    • 检查

      bash 复制代码
      # 注意看以下几个值
      [root@localhost mariadb]# ./bin/mysql -uroot -p
      MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
      | wsrep_incoming_addresses      | 10.4.50.163:8105,10.4.50.164:8105,10.4.50.165:8105   |
      | wsrep_cluster_size            | 3                  |
      | wsrep_cluster_status          | Primary            |
      | wsrep_connected               | ON                 |

3.3、验证

  • 任意一个节点 如 164

    bash 复制代码
    cd /opt/mariadb/bin
    ./mysql -uroot -p
    
    # 创建数据库和表
    CREATE DATABASE galera_test_db DEFAULT CHARACTER SET utf8mb4;
    USE galera_test_db;
    CREATE TABLE user_info (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_name VARCHAR(50) NOT NULL,
        create_time DATETIME DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    # 插入数据
    INSERT INTO user_info (user_name) VALUES ('test_user_01'), ('test_user_02');
    
    # 查询验证
    SELECT * FROM user_info;
  • 此时 163或165上连接, 数据很快就会同步

    bash 复制代码
    cd /opt/mariadb/bin
    ./mysql -uroot -p
    USE galera_test_db;
    SELECT * FROM user_info;

四、注意事项与总结

  • 注意事项
    • 存储引擎限制:仅支持InnoDB,MyISAM等非事务引擎不支持同步复制,会导致数据不一致,生产环境严禁使用。
    • 大事务限制:避免超大事务(如百万级批量插入),会占用大量带宽和内存,导致集群阻塞,建议拆分为小事务。
    • DDL操作注意:DDL操作(CREATE/ALTER TABLE)会触发全量同步,高并发场景建议在业务低峰期执行。
    • 节点数量建议:优先选择3、5等奇数节点,避免脑裂;2节点需额外配置仲裁节点。
    • 手动部署路径适配:所有配置必须指定手动创建的目录(数据、配置、日志),登录时需指定socket文件,否则会连接失败。
    • 备份策略:定期备份/usr/local/mariadb10.6/data目录,避免集群整体遭遇逻辑错误(如误删库)导致数据丢失。
    • 端口开放:生产环境需开放3306(MySQL)、4567(Galera通信)、4568(IST同步)、4444(SST同步)端口,而非直接关闭防火墙。
  • 总结
    • MariaDB 10.6 Galera Cluster的核心优势的是同步多主复制、数据强一致性和自动故障恢复,适配核心业务高可用需求;
    • 手动部署的核心是路径适配与权限配置,二进制解压方案优先于源码编译,适合快速落地;
    • 集群部署的关键是节点1初始化(--wsrep-new-cluster)和其余节点自动加入,配置时需确保集群名称一致、节点IP正确;
    • 生产环境需严格遵守存储引擎限制、节点数量建议及备份策略,确保集群稳定性和数据安全性。
相关推荐
tyatyatya5 分钟前
MySQL Group Replication(MGR)集群部署,实现自动故障切换
数据库·mysql
b***59435 分钟前
mysql 迁移达梦数据库出现的 sql 语法问题 以及迁移方案
数据库·sql·mysql
木风小助理5 分钟前
MySQL中COUNT()、COUNT(1)与COUNT
数据库
不想上班的小吕5 分钟前
采购申请创建(BAPI_PR_CREATE/BAPI_REQUISITION_CREATE)
java·服务器·数据库
j***89467 分钟前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
emma羊羊8 分钟前
Vulhub-Mysql靶场
数据库·mysql
STCNXPARM13 分钟前
Android14显示系统 - VSYNC机制
android·surfaceflinger·vsync
say_fall14 分钟前
C++ 类与对象易错点:初始化列表顺序 / 静态成员访问 / 隐式类型转换
android·java·开发语言·c++
橘橙黄又青14 分钟前
mongodb的基本命令
数据库·mongodb
AC赳赳老秦17 分钟前
量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码
数据库·elasticsearch·信息可视化·流程图·数据库架构·memcached·deepseek