本文最后更新于 2024年3月26日 下午
介绍
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 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://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 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 上,默认情况下会读取以下目录中的自定义配置文件:
性能优化和编码配置(可忽略) 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 = 128 Mcharacter-set-server = utf8mb4collation-server = utf8mb4_general_ci innodb_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 12 [galera] wsrep_on =ON wsrep_provider =/usr/lib64/galera-4 /libgalera_smm.sowsrep_cluster_name =JOJO1wsrep_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 =ROWinnodb_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 galera_new_cluster systemctl enable mariadb systemctl enable --now mariadb 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 -113 d-83e8 -ca4b232b71edseqno: -1 safe_to_bootstrap: 0
修改safe_to_bootstrap参数改为1,然后在该节点执行以下命令启动第一个节点,执行以下命令后参数会被重新置为0:
也可以直接删除此文件即可。
mariadb1 (第一个启动的节点)
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 ~] 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/