MariaDB Galera Cluster是多主同步复制集群解决方案,支持数据强一致性、高可用性和横向扩展,适用于需要高并发读写、零数据丢失的场景。其核心特点包括:同步复制(所有节点数据实时一致)、多主写入(任意节点均可执行写操作)、自动故障转移(节点宕机后自动剔除,剩余节点继续提供服务)。
环境要求
ssh-keygen和ssh-copy-id配置);软件要求
mariadb-galera-cluster,部分发行版需单独安装)。在所有节点上执行以下命令,安装MariaDB及Galera集群组件:
# Ubuntu/Debian示例
sudo apt update && sudo apt install -y mariadb-server mariadb-client mariadb-galera-cluster rsync
# CentOS/RHEL示例
sudo yum install -y mariadb-server mariadb galera
安装完成后,MariaDB服务会自动启动,初始状态为单机模式。
编辑每个节点的MariaDB配置文件(路径因发行版而异,常见为/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf.d/server.cnf),在[mysqld] section添加以下配置:
[mysqld]
# 基础配置
bind-address = 0.0.0.0 # 允许远程访问
default-storage-engine= InnoDB # 必须使用InnoDB引擎(Galera仅支持InnoDB)
innodb_autoinc_lock_mode= 2 # 自增锁模式(同步复制要求)
binlog_format = ROW # 二进制日志格式(同步复制要求)
# Galera集群配置
wsrep_on = ON # 开启Galera功能
wsrep_provider = /usr/lib/galera/libgalera_smm.so # Galera provider库路径(Ubuntu/Debian)
# wsrep_provider = /usr/lib64/galera/libgalera_smm.so # CentOS/RHEL路径
wsrep_cluster_name = my_galera_cluster # 集群名称(所有节点必须一致)
wsrep_cluster_address = gcomm://node1_ip,node2_ip,node3_ip # 初始集群地址(首次初始化为空)
wsrep_node_address = node_current_ip # 当前节点IP地址
wsrep_node_name = node1 # 当前节点名称(需唯一,如node1/node2/node3)
wsrep_sst_method = xtrabackup-v2 # 数据同步方法(推荐xtrabackup,性能更好)
wsrep_sst_auth = sstuser:sstpassword # SST用户及密码(用于数据同步认证)
注意:
wsrep_cluster_address在首次初始化集群时需设置为gcomm://(空值),后续加入节点时再填写完整节点列表。
在第一个节点上执行以下命令,创建Galera集群:
# 登录MariaDB并创建SST用户(用于数据同步)
mysql -u root -p -e "
CREATE USER 'sstuser'@'%' IDENTIFIED BY 'sstpassword';
GRANT ALL PRIVILEGES ON *.* TO 'sstuser'@'%';
FLUSH PRIVILEGES;"
# 初始化集群(启动第一个节点)
sudo galera_new_cluster
说明:
galera_new_cluster命令会启动集群并生成集群UUID,后续节点需通过该UUID加入集群。
在第二个及后续节点上,修改配置文件中的wsrep_cluster_address为完整节点列表(如gcomm://node1_ip,node2_ip,node3_ip),然后重启MariaDB服务:
# 修改配置文件中的wsrep_cluster_address(如上述配置)
sudo systemctl restart mariadb
节点重启后,会自动连接到集群并同步数据。
在任意节点上登录MariaDB,执行以下命令检查集群状态:
SHOW STATUS LIKE 'wsrep%';
重点关注以下指标:
wsrep_cluster_size:集群节点数量(应等于已加入节点的总数);wsrep_ready:集群是否就绪(值为ON表示正常);wsrep_connected:节点是否连接到集群(值为ON表示正常)。为提升集群的读性能和可用性,可通过HAProxy实现负载均衡,将请求分发到多个MariaDB节点:
# 安装HAProxy
sudo apt install -y haproxy # Ubuntu/Debian
sudo yum install -y haproxy # CentOS/RHEL
# 配置HAProxy(编辑/etc/haproxy/haproxy.cfg)
frontend mysql_front
bind 192.168.1.100:3306 # HAProxy监听IP(虚拟VIP)
default_backend mysql_back
backend mysql_back
balance roundrobin # 轮询算法
server node1 192.168.1.11:3306 check port 9200 inter 2000 rise 2 fall 3
server node2 192.168.1.12:3306 check port 9200 inter 2000 rise 2 fall 3
server node3 192.168.1.13:3306 check port 9200 inter 2000 rise 2 fall 3
# 重启HAProxy
sudo systemctl restart haproxy
说明:
balance roundrobin表示轮询分发请求,check表示健康检查(端口9200为MariaDB的status端口,需在MariaDB配置中开启)。
通过Prometheus+Granafa或Zabbix搭建监控系统,监控以下指标:
wsrep_ready、wsrep_connected);wsrep_cluster_size);wsrep_local_recv_queue_len);即使Galera Cluster支持同步复制,仍需定期备份数据,推荐使用mariabackup(MariaDB官方备份工具):
# 安装mariabackup
sudo apt install -y mariadb-backup # Ubuntu/Debian
sudo yum install -y mariadb-backup # CentOS/RHEL
# 全量备份(示例)
sudo mariabackup --user=root --password=your_password --backup --target-dir=/backup/full
# 恢复备份(示例)
sudo mariabackup --user=root --password=your_password --prepare --target-dir=/backup/full
sudo mariabackup --user=root --password=your_password --copy-back --target-dir=/backup/full
innodb_flush_log_at_trx_commit(如设为2可提升性能,但会牺牲部分持久性);