介绍
MariaDB Galera Cluster 是 MariaDB 的虚拟同步 多主集群。它仅在Linux上可用,并且仅支持InnoDB 存储引擎(尽管有 对MyISAM 和MariaDB 10.6 的Aria 的实验性支持。请参阅wsrep_replicate_myisam 系统变量,或者从 MariaDB 10.6 开始,wsrep_mode 系统变量)。
个人为了替代主从复制而使用。
特征
几乎同步复制
主动-主动多主拓扑
读取和写入任何群集节点
自动成员资格控制,故障节点从群集中删除
自动节点连接
行级别的真正并行复制
直接客户端连接,本机MariaDB的外观和感觉
好处 上述功能为 DBMS 群集解决方案带来了几个好处,包括:
无副本滞后
没有丢失交易
读取可伸缩性
较小的客户端延迟
缺点
加入新节点时开销大,需要复制完整数据
不能有效地解决写扩展的问题,所有的写操作都发生在所有的节点
有多少个节点,就有多少份重复的数据
由于事务提交需要跨节点通信,即涉及分布式事务操作,因此写入会比主从复制慢很多,节点越多,写入越慢,死锁和回滚也会更加频繁;
对网络要求比较高,如果网络出现波动不稳定,则可能会造成两个节点失联,Galera Cluster集群会发生脑裂,服务将不可用
仅支持InnoDB/XtraDB存储引擎,任何写入其他引擎的表,包括mysql.*表都不会被复制,DDL语句可以复制,但是insert into mysql.user(MyISAM存储引擎)之类的插入数据不会被复制
Delete操作不支持没有主键的表,因为没有主键的表在不同的节点上的顺序不同,如果执行select … limit …将出现不同的结果集
整个集群的写入吞吐量取决于最弱的节点限制,集群要使用同一的配置
安装环境 Mariadb 版本 10.6 (LTS版本 、与MySQL 8 兼容性相对较好)
Galera 版本 4 (对应10.6)
Rocky Linux 8(关闭 SELINUX)
关闭防火墙
安装规划
服务器名字
IP规划
mariadb1
100.64.128.201
mariadb2
100.64.128.202
mariadb3
100.64.128.203
安装(每台服务器都要配置安装) NTP 每台节点都配置统一的NTP服务器,确保时间差不大于3秒。
关闭SElinux 关闭防火墙 1 2 systemctl disable --now firewalld sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0
添加yum源 1 2 3 4 5 6 7 8 9 cat > /etc/yum .repos.d/mariadb.repo <<EOF [mariadb] name = MariaDB baseurl = https://mi rrors.cloud.tencent.com/mariadb/yum /10.6/ centos8-amd64 module\_hotfixes=1 gpgkey=https://mi rrors.cloud.tencent.com/mariadb/yum /RPM-GPG-KEY-MariaDB gpgcheck=1 EOF
1 2 yum install -y MariaDB-server MariaDB-client MariaDB-backup rsync galera-4 ## 安装数据库和galera
配置文件 在RHEL,CentOS和SLES上,MariaDB的软件包捆绑了以下配置文件:
/etc/my.cnf
/etc/my.cnf.d/client.cnf
/etc/my.cnf.d/mysql-clients.cnf
/etc/my.cnf.d/server.cnf
在 RHEL、CentOS 和 SLES 上,默认情况下会读取以下目录中的自定义配置文件:
性能优化和编码配置(可忽略) 1 2 3 4 5 6 7 8 9 10 11 vim /etc/my.cnf.d/server.cnf [mysqld] max\_connections = 4096 max\_allowed\_packet = 128 M character-set-server = utf8mb4collation-server = utf8mb4\_general\_ciinnodb\_buffer\_pool\_size = 4 G innodb\_io\_capacity = 300 thread\_cache\_size= 64 thread\_concurrency= 24 log\_error = mariadbd.err
性能优化配置,每台服务器可一样
需要根据自己的硬件配置进行调整,上述配置要求内存大于4G.
innodb_buffer_pool_instances在10.6中已删除
innodb_io_capacity默认为200
集群配置 1 2 3 4 5 6 7 8 9 10 11 [galera] wsrep\_on =ON wsrep\_provider =/usr/lib64/galera-4 /libgalera\_smm.so wsrep\_cluster\_name =JOJO1 wsrep\_cluster\_address ="gcomm://100.64.128.201,100.64.128.202,100.64.128.203" wsrep\_node\_name =100.64 .128.201 wsrep\_node\_address =100.64 .128.201 binlog\_format =ROW innodb\_autoinc\_lock\_mode =2
wsrep_cluster_address需要修改包含所有节点的IP地址。
wsrep_node_name 都修改为当前服务器节点IP地址即可。
说明
系统变量/选项
描述
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 = 6G可以指定群集缓存,提高性能。
启动和验证 引导新集群 1 2 3 4 5 6 7 galera\_new\_cluster systemctl enable mariadb systemctl enable --now mariadb systemctl enable --now mariadb
验证集群启动情况 1 2 3 4 5 6 7 8 mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep\_cluster\_size' " [root@mariadb1 ~]# mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep\_cluster\_size' " Enter password: +--------------------+-------+ | Variable\_name | Value | +--------------------+-------+ | wsrep\_cluster\_size | 3 | +--------------------+-------+
在任意节点运行,查看在线节点数量为3即可。
验证集群数据同步 在mariadb1 创建数据库
1 mysql -e "create database galera\_test character set utf8 collate utf8\_general\_ci;"
在mariadb2和3查看是否同步。
1 mysql -e "show databases;"
初始化 1 2 mariadb-secure-installation ## 初始化root密码,远程访问配置,删除测试数据库等。
重启集群 MariaDB galera cluster 所有节点服务全部停止后再次启动会报错,需要按照以下方法启动集群。
1 2 3 4 5 6 [root@mariadb1 ~]# vim /var/lib/mysql/grastate.dat # GALERA saved state version: 2.1 uuid: f4f3025f-6119 -113 d-83e8 -ca4b232b71edseqno: -1 safe\_to\_bootstrap: 0
修改safe_to_bootstrap参数改为1,然后在该节点执行以下命令启动第一个节点,执行以下命令后参数会被重新置为0:
也可以直接删除此文件即可。
mariadb1 (第一个启动的节点)
mariadb2和3 (其他节点)
集群状态查看(健康检查) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [root@localhost ~] Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 13 Server version: 10.6.12-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'wsrep\_%'; +-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ | Variable\_name | Value | +-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ | wsrep\_local\_state\_uuid | eb507a9d-cf73-11ed-aa89-df688f9a9d63 | | wsrep\_protocol\_version | 10 | | wsrep\_last\_committed | 3 | | wsrep\_replicated | 1 | | wsrep\_replicated\_bytes | 512 | | wsrep\_repl\_keys | 1 | | wsrep\_repl\_keys\_bytes | 32 | | wsrep\_repl\_data\_bytes | 409 | | wsrep\_repl\_other\_bytes | 0 | | wsrep\_received | 6 | | wsrep\_received\_bytes | 510 | | wsrep\_local\_commits | 0 | | wsrep\_local\_cert\_failures | 0 | | wsrep\_local\_replays | 0 | | wsrep\_local\_send\_queue | 0 | | wsrep\_local\_send\_queue\_max | 1 | | wsrep\_local\_send\_queue\_min | 0 | | wsrep\_local\_send\_queue\_avg | 0 | | wsrep\_local\_recv\_queue | 0 | | wsrep\_local\_recv\_queue\_max | 2 | | wsrep\_local\_recv\_queue\_min | 0 | | wsrep\_local\_recv\_queue\_avg | 0.166667 | | wsrep\_local\_cached\_downto | 1 | | wsrep\_flow\_control\_paused\_ns | 0 | | wsrep\_flow\_control\_paused | 0 | | wsrep\_flow\_control\_sent | 0 | | wsrep\_flow\_control\_recv | 0 | | wsrep\_flow\_control\_active | false | | wsrep\_flow\_control\_requested | false | | wsrep\_cert\_deps\_distance | 1 | | wsrep\_apply\_oooe | 0 | | wsrep\_apply\_oool | 0 | | wsrep\_apply\_window | 1 | | wsrep\_apply\_waits | 0 | | wsrep\_commit\_oooe | 0 | | wsrep\_commit\_oool | 0 | | wsrep\_commit\_window | 1 | | wsrep\_local\_state | 4 | | wsrep\_local\_state\_comment | Synced | | wsrep\_cert\_index\_size | 1 | | wsrep\_causal\_reads | 0 | | wsrep\_cert\_interval | 0 | | wsrep\_open\_transactions | 0 | | wsrep\_open\_connections | 0 | | wsrep\_incoming\_addresses | 100.64.128.201:0,100.64.128.203:0 | | wsrep\_cluster\_weight | 2 | | wsrep\_desync\_count | 0 | | wsrep\_evs\_delayed | | | wsrep\_evs\_evict\_list | | | wsrep\_evs\_repl\_latency | 0/0/0/0/0 | | wsrep\_evs\_state | OPERATIONAL | | wsrep\_gcomm\_uuid | 55a87cd0-cf72-11ed-b741-f670ec8e21cc | | wsrep\_gmcast\_segment | 0 | | wsrep\_applier\_thread\_count | 1 | | wsrep\_cluster\_capabilities | | | wsrep\_cluster\_conf\_id | 2 | | wsrep\_cluster\_size | 2 | | wsrep\_cluster\_state\_uuid | eb507a9d-cf73-11ed-aa89-df688f9a9d63 | | wsrep\_cluster\_status | Primary | | wsrep\_connected | ON | | wsrep\_local\_bf\_aborts | 0 | | wsrep\_local\_index | 0 | | wsrep\_provider\_capabilities | :MULTI\_MASTER:CERTIFICATION:PARALLEL\_APPLYING:TRX\_REPLAY:ISOLATION:PAUSE:CAUSAL\_READS:INCREMENTAL\_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: | | wsrep\_provider\_name | Galera | | wsrep\_provider\_vendor | Codership Oy <[email protected] > | | wsrep\_provider\_version | 26.4.14(r06a0c285) | | wsrep\_ready | ON | | wsrep\_rollbacker\_thread\_count | 1 | | wsrep\_thread\_count | 2 | +-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
wsrep_local_index = 2 在集群中的索引值
wsrep_ready为ON,表示集群正常运行。
wsrep_cluster_status为Primary,表示节点为主节点,正常读写。
wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群
wsrep_cluster_size为3,表示集群有三个节点。
wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群。
wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值。
wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.
wsrep_flow_control_sent:表示该节点已经停止复制了多少次.
wsrep_incoming_addresses:代表所有节点的IP地址
关于故障转移 考虑使用keepalived作为故障转移,可以主动检测节点健康。
参考 https://blog.csdn.net/qq_35506960/article/details/120844297
https://mariadb.com/docs/server/deploy/community-cluster-cs10-6/
https://dev.mysql.com/doc/refman/8.0/ja/innodb-configuring-io-capacity.html
https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/
https://mariadb.com/kb/en/getting-started-with-mariadb-galera-cluster/