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正确;
    • 生产环境需严格遵守存储引擎限制、节点数量建议及备份策略,确保集群稳定性和数据安全性。
相关推荐
2501_948120151 分钟前
移动端混合开发性能优化策略
android·性能优化
JMchen1232 分钟前
Android剪切板工具类ClipBoardUtil:简化剪切板操作
android·java·移动开发·android studio
自己的九又四分之三站台3 分钟前
向量数据库PGVector实操
数据库
sa100274 分钟前
walmart沃尔玛关键词商品搜索实现逻辑
数据库·python
handsome123417 分钟前
Navicat 查数据 乱码 解决 的经历
数据库·mysql·oracle
AllData公司负责人21 分钟前
【亲测好用】数仓建模平台能力演示
大数据·数据库·算法
Minilinux201823 分钟前
Android系列之 屏幕触控机制(二)
android·屏幕触控·安卓屏幕触控·android touch·安卓系列
李堇34 分钟前
自定义android下拉框
android·java
我是六月生35 分钟前
小米/红米手机刷机教程(小米官方工具,刷机包)
android·智能手机
非凡ghost39 分钟前
Photo Studio PRO安卓版(照片编辑应用)
android·windows·学习·智能手机·软件需求