1.galera
快速搭建
使用软件版本3-25.3.22-2.el7.x86_64
galera软件http://releases.galeracluster.com/galera-3/centos/7/x86_64/galera-3-25.3.22-2.el7.x86_64.rpm
mysql依赖包http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
#安装过程中可能出现各种依赖问题,根据拋错把需要依赖的软件装上即可
#如果有安装过mysql-libs包或mariadb会出错,需要先卸载yum remove mysql-libs -y
rpm -ivh galera-3-25.3.22-2.el7.x86_64.rpm
rpm -ivh mysql-wsrep-common-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-compat-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-devel-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-client-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-server-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-5.7-5.7.20-25.13.el7.x86_64.rpm
rpm -ivh mysql-wsrep-test-5.7-5.7.20-25.13.el7.x86_64.rpm
安装xtrabackup
rpm -Uvh https://www.percona.com/redir/downloads/percona-release/redhat/percona-release-0.1-4.noarch.rpm
yum install percona-xtrabackup -y
galera支持三种同步方式,下图是官网对三种同步方式对比:
Method | Speed | Blocks Donor | Available on Live Node | Type | DB Root Access |
---|---|---|---|---|---|
mysqldump | Slow | Blocks | Available | Logical | Donor and Joiner |
rsync | Fastest | Blocks | Unavailable | Physical | None |
xtrabackup | Fast | Briefly | Unavailable | Physical | Donor only |
来源:http://galeracluster.com/documentation-webpages/sst.html
创建mysql实例
# 确保mysqld服务停止,此处自己指定实例(提示:CentOS7中使用systemctl管理mysql多实例)
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysqld@3306
# 启动服务,修改初始密码
set password='admin123';
# 创建用于同步的账户
GRANT ALL PRIVILEGES on *.* to sst@'%' IDENTIFIED BY 'admin123';
flush privileges;
# my.cnf配置文件
[mysqld@3306]
datadir = /var/lib/mysqld@3306
socket = /var/lib/mysqld@3306/mysqld@3306.sock
port = 3306
pid-file = /var/run/mysqld@3306/mysqld@3306.pid
log-error = /var/log/mysqld.log
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
skip-name-resolve = 1
log-bin = mysql-bin
log-slave-updates = 0
relay_log_recovery = 1
relay-log = mysqld@3320-relay-bin
user = mysql
language = /usr/share/mysql/english
default-storage-engine = InnoDB
character-set-server = UTF8
server-id = 1
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_sst_method=xtrabackup
wsrep_sst_auth=root:admin123
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
# 如果是启动第一台的,该行为wsrep_cluster_address=gcomm:// ,且按照systemctl正常方式启动mysql实例即可
wsrep_cluster_address=gcomm://
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.184.50'
wsrep_node_name='db1'
# 设置好my.cnf后,重启mysqld@3306
注意:mysqld.log日志中如果出现错误Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup --role 'joiner
查看配置的同步账户是否有远程执行 相关 命令的权限
# 第二个节点
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_address=gcomm://192.168.184.50
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.184.52'
wsrep_node_name='db2'
确认galera启动成功 mysql>show status like 'wsrep_cluster_size';
或者 mysql -usst -padmin123 -P3306 -h192.168.184.50 -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
查看galera状态 mysql> show status like 'wsrep%';
方案分析
- 在高可用当中,galera可以理解成传统数据库主主半同步的另一种实现方式,在这种方式中,不是通过数据共享实现的,而是另一种数据高冗余的方式。这种方式下,能保证同时读写任何一个数据库都是等价的。
-
推荐至少使用三个数据库实例来搭建galera,在两个数据库的galera集群中,如果有一个数据库宕机,另一个将不可写,需要手动清除galera集群状态。测试双节点环境结果如下:
# 开启一个数据库防火墙panic-on模式,模拟双节点网络不通,在另一个节点上写入
mysql> create database test_error;
ERROR 1047 (08S01): WSREP has not yet prepared node for application use
# 重置galera集群状态,再写入。当关闭panic-on模式后,两个节点能同步数据到一直状态
mysql> set global wsrep_provider_options='pc.bootstrap=YES';
Query OK, 0 rows affected (0.00 sec)
mysql> create database test_error;
Query OK, 1 row affected (0.05 sec)
# 如果在开启panic-on模式后,两个节点都写入了数据,关闭panic-on模式后不能同步数据
- 通常如果只使用两个节点作数据库的话,也需要引入第三个节点做仲裁节点。第三个节点可以不读写数据,仅用来配置成集群中的一个节点,用作投票。这样能防止两个数据库节点互相连接不上,但第三个节点能知道具体哪个节点出错了,这样就能控制写入数据只在能连上的节点上。
为了避免“脑裂”,Galera集群最少需要3个节点,生产环境中最好是3台独立主机,或者位于3个不同IDC的主机。如果觉得3台主机太浪费,也可以2台数据库节点+1个虚拟机仲裁节点。
仲裁节点是集群的一部分,可以参与投票,但是不参与实际复制。在3个IDC场景下,如果一个IDC自身网络中断,但假如它与仲裁节点可以连通,同时其他节点也与仲裁节点可以连通的话,那仲裁节点就会作为中间人连接另两个节点通信。
尽管仲裁节点不存储数据,但它必须可以看到所有的流量的传输复制。如果仲裁节点放在一个网络环境较差的地方,那它连接到集群的时候,可能会导致集群性能下降。 - 如果事务一致性要求比较高的业务系统中,需要做数据库单一入口可以使用keepalived的vip来实现
- 如果事务一致性要求不是特别高的业务系统中,使用mysql-proxy来做代理。实现读写分离也比较方便。