MariaDB Galera Cluster是一种同步多主机集群方案,目前它支持XtraDB/ InnoDB存储引擎,为MySQL/MariaDB的高可用架构提供了一种实现基础。
首先引用《MySQL高可用方案选型参考》这篇文章中关于Gelera优缺点的分析。
优势:
- 服务高可用;
- 数据同步复制(并发复制),几乎无延迟;
- 多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突;
- 新节点可以自动部署,部署操作简单;
- 数据严格一致性,尤其适合电商类应用;
- 完全兼容MySQL;
劣势:
- 只支持InnoDB引擎;
- 所有表都要有主键;
- 不支持LOCK TABLE等显式锁操作;
- 锁冲突、死锁问题相对更多;
- 不支持XA;
- 集群吞吐量/性能取决于短板;
- 新加入节点采用SST时代价高;
- 存在写扩大问题;
- 如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟;
接下来动手实践,用虚拟机完成MariaDB Galera Cluster的搭建。
1.环境准备
CentOS 7.3
MariaDB 10.1.23
host: 192.168.1.103,192.168.1.105,192.168.1.106
2.修改MariaDB配置文件
192.168.1.103
cat << EOF > /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
wsrep_node_name=node1
wsrep_node_address=192.168.1.103
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# Allow server to accept connections on all interfaces.
# bind-address=0.0.0.0
# Optional setting
wsrep_slave_threads=1
innodb_flush_log_at_trx_commit=0
EOF
192.168.1.105
cat << EOF > /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
wsrep_node_name=node2
wsrep_node_address=192.168.1.105
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# Allow server to accept connections on all interfaces.
# bind-address=0.0.0.0
# Optional setting
wsrep_slave_threads=1
innodb_flush_log_at_trx_commit=0
EOF
192.168.1.106
cat << EOF > /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
wsrep_node_name=node3
wsrep_node_address=192.168.1.106
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# Allow server to accept connections on all interfaces.
# bind-address=0.0.0.0
# Optional setting
wsrep_slave_threads=1
innodb_flush_log_at_trx_commit=0
EOF
3.初始化集群
# 在第一个节点上启动galera cluster
galera_new_cluster
# 或
/usr/sbin/mysqld --wsrep-new-cluster --user=root &
# 其它节点重启mariadb
systemctl restart mariadb.service
# 特别提醒:如果其它节点无法启动,需要关闭selinux
# /etc/selinux/config中,SELINUX=enforcing改为SELINUX=disabled,重启后永久生效
4.查询集群中的节点
# 查看节点数量
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
# 查看更多信息
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
5.测试
- 向任意节点数据库写入数据,无论是对数据库、表还是对表中数据的操作,都会更新到其它节点;
- 任意使一个节点上的MariaDB下线,集群会自动将该节点从集群中clean up;MariaDB再次上线时,集群又自动将该节点添加进来。
具体的测试过程就不摆出来了,集群搭建好后这些结果是没有什么悬念的。
总结:以上只是如何搭建集群,如果要对这种集群方案有深刻的认识和理解,需要对其原理进一步研究!建议阅读官方文档及其它文章。
参考文章:
Galera replication for MySQL(包括Galera replication原理)
MySQL的Galera Cluster配置说明
如何修復 MariaDB Galera Cluster