介绍

MariaDB Galera Cluster 是 MariaDB 的虚拟同步多主集群。它仅在Linux上可用,并且仅支持InnoDB存储引擎(尽管有 对MyISAMMariaDB 10.6Aria的实验性支持。请参阅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规划
mariadb1100.64.128.201
mariadb2100.64.128.202
mariadb3100.64.128.203

安装(每台服务器都要配置安装)

关闭SElinux 关闭防火墙

1
2
3
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
10
11
cat > /etc/yum.repos.d/mariadb.repo <<EOF
[mariadb]
name = MariaDB
baseurl = https://mirrors.cloud.tencent.com/mariadb/yum/10.6/centos8-amd64
module_hotfixes=1
gpgkey=https://mirrors.cloud.tencent.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

## 注意,使用了腾讯云镜像源,mariadb 10.6

1
2
3
4
5
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 上,默认情况下会读取以下目录中的自定义配置文件:

  • /etc/my.cnf.d/

性能优化和编码配置(可忽略)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim /etc/my.cnf.d/server.cnf

[mysqld]
max_connections = 4096
max_allowed_packet = 128M

character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

innodb_buffer_pool_size = 4G
innodb_io_capacity = 200

thread_cache_size=64
thread_concurrency=24

log_error = mariadbd.err

  • 性能优化配置,每台服务器可一样
  • 需要根据自己的硬件配置进行调整,上述配置要求内存大于4G

集群配置

1
2
3
4
5
6
7
8
9
10
11
12
[galera]
# Cluster Configuration
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
#wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
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
8
9
10
11
12
13
# mariadb1  (第一个启动的需要运行galera_new_cluster 进行引导,如果所以节点同时停止,也需要此命令。)

galera_new_cluster
systemctl enable mariadb

# mariadb2

systemctl enable --now mariadb

# mariadb3

systemctl enable --now mariadb

验证集群启动情况

1
2
3
4
5
6
7
8
9
10
11
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
2
mysql -e "create database galera_test character set utf8 collate utf8_general_ci;"

在mariadb2和3查看是否同步。

1
2
mysql -e "show databases;"

初始化

1
2
3
4
mariadb-secure-installation

## 初始化root密码,远程访问配置,删除测试数据库等。

重启集群

MariaDB galera cluster 所有节点服务全部停止后再次启动会报错,需要按照以下方法启动集群。

1
2
3
4
5
6
7
[root@mariadb1 ~]# vim /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: f4f3025f-6119-113d-83e8-ca4b232b71ed
seqno: -1
safe_to_bootstrap: 0

修改safe_to_bootstrap参数改为1,然后在该节点执行以下命令启动第一个节点,执行以下命令后参数会被重新置为0:

也可以直接删除此文件即可。

mariadb1 (第一个启动的节点)

1
2
galera_new_cluster

mariadb2和3 (其他节点)

1
2
systemctl start mariadb

集群状态查看(健康检查)

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
81
82
83
84
85
[root@localhost ~]# mysql 
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 <info@codership.com> |
| 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地址

参考

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/