MySQL的Galera Cluster配置说明

标签:
mysql集群多主galeramariadb |
分类: Web应用 |
[2017.03.15 修订]
部分图片引用自《Galera Cluster Best Practices》
--------------------------
一、Galera Cluster介绍
Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件。
从用户视角看,一组Galera集群可以看作一个具有多入口的MySQL库,用户可以同时从多个IP读写这个库。
目前Galera已经得到广泛应用,例如Openstack中,在集群规模不大的情况下,稳定性已经得到了实践考验。
http://s5/mw690/0023u9s8zy79wbYP7HCf4&690Cluster配置说明" TITLE="MySQL的Galera
主要特点:
- 同步复制
- 真正的multi-master,即所有节点可以同时读写数据库
- 自动的节点成员控制,失效节点自动被清除
- 新节点加入数据自动复制
- 真正的并行复制,行级
- 用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
因为是多主,所以不存在Slave lag
不存在丢失交易的情况
同时具有读和写的扩展能力
更小的客户端延迟
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
技术:
Galera集群的复制功能基于Galera library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
http://s6/bmiddle/0023u9s8zy79wceSyVva5&690Cluster配置说明" TITLE="MySQL的Galera
Cluster配置说明" />
[2017.03.15 修订]
http://s3/mw690/0023u9s8zy79wQYuZp0d2&690Cluster配置说明" TITLE="MySQL的Galera
二、Galera安装流水账
2.1 Galera与SElinux
2.1.2 安装好Galera集群,然后做如下各种操作,获取SELinux的events log
启动节点
停止节点服务,在其他节点做插入,删除,更新操作,重启服务
停止节点服务,删除grastate.dat文件,重启服务
直接重启节点
尽量将日常操作都做过一遍。
2.1.3 据SElinux日志来生成policy文件,编译为module后打包,加载
]# fgrep "mysqld" /var/log/audit/audit.log | audit2allow -m MySQL_galera -o galera.te
]# checkmodule -M -m galera.te -o galera.mod
]# semodule_package -m galera.mod -o galera.pp.
]# semodule -I galera.pp
2.2 安装MariaDB
[在每个节点上]
2.2.1 加入MariaDB官方源
]# vim /etc/yum/repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
2.2.2 安装MariaDB,Galera,xtrabackup
]# yum install MariaDB-client MariaDB-Galera-server galera xtrabackup
2.2.3 启动MariaDB,并作安全加固
]# service mysql start
]# /usr/bin/mysql_secure_installation
2.2.4 增加SST用户,用于同步数据
]# mysql -u root -p
mysql> GRANT ALL PRIVILEGES on *.* to sst_user@'%' IDENTIFIED BY 'dbpass';
mysql> FLUSH PRIVILEGES;
mysql> quit
注意:为了安全,尽量不要用‘%’,而是指定的集群节点IP。
2.2.5 停止MariaDB,编辑Galera配置文件
]# service mysql stop
]# vi /etc/my.cnf.d/server.cnf
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
# Galera Provider Configuration
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_address="gcomm://1.1.1.1,1.1.1.2,1.1.1.3"
wsrep_cluster_name='galera_cluster'
# Galera Node Configuration
wsrep_node_address='1.1.1.1'
wsrep_node_name='db1'
# Galera Synchronization Configuration
wsrep_sst_method=xtrabackup
wsrep_sst_auth=sst_user:dbpass
对于第二、三个节点,不要忘了修改地址:
wsrep_node_address=1.1.1.2
wsrep_node_name='db2'
2.2.6 初始化第一个节点
]# /etc/init.d/mysql start --wsrep-new-cluster
检查集群状态
]# mysql-uroot-p-e"show status like 'wsrep%'"
|wsrep_local_state_comment | Synced <-- cluster is synced
|wsrep_incoming_addresses
|wsrep_cluster_size
|wsrep_ready
2.2.7 启动第二个节点
]# service mysql start
]# mysql -u root -p -e "show status like 'wsrep%'"
| wsrep_local_state_comment | Synced
| wsrep_incoming_addre sses | 1.1.1.1:3306,1.1.1.2:3306 |
| wsrep_cluster_size
| wsrep_connected
| wsrep_ready
2.2.8 启动第三个节点
| wsrep_local_state_comment | Synced
| wsrep_incoming_addresses
| wsrep_cluster_size
| wsrep_connected
| wsrep_ready
2.2.9 检验集群同步是否成功,在第一个节点执行:
]# mysql -u root -p -e 'CREATE DATABASE clustertest;'
]# mysql -u root -p -e 'CREATE TABLE clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), ipaddress VARCHAR(20), PRIMARY KEY(id));'
]# mysql -u root -p -e 'INSERT INTO clustertest.mycluster (name, ipaddress) VALUES ("db1", "1.1.1.1");'
分别在3个节点上都执行以下查询:
]# mysql -u root -p -e 'SELECT * FROM clustertest.mycluster;'
Enter password:
+----+------+-----------+
| id | name | ipaddress |
+----+------+-----------+
| 2
+----+------+-----------+
如果3个节点都能看到同样的结果,说明集群同步没有问题。
2.2.10 重新启动第一个节点,再次加入集群
]# service mysql stop
]# service mysql start
注意:除了第一次初始化启动集群外,绝对不要再次执行“--wsrep-new-cluster”,第一次初始化的时候也不能在多个节点上执行!!!切记!
三、Galera与haproxy
http://s2/mw690/0023u9s8zy79wdKHYYN11&690Cluster配置说明" TITLE="MySQL的Galera
盗一个别人的图来说明大概意思,这个图本身是说明haproxy配合主从复制的,但我们所用的读写分离意思是一样的。
http://s14/mw690/0023u9s8zy79wiMuXSd5d&690Cluster配置说明" TITLE="MySQL的Galera
3.1 galera的backend check
3.1.1
3.1.2
]# vi /etc/xinetd.d/mysqlchk:
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED }
3.1.3
# echo 'mysqlchk
3.1.4
3.1.5
mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!'
注意:用户名和密码要与clustercheck脚本中的参数一致。
3.1.6
...
listen percona-cluster 0.0.0.0:3307
balance leastconn
option httpchk
mode tcp
server node1 1.1.1.1:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2
server node2 1.1.1.2:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2
server node3 1.1.1.3:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2 backup
haproxy做backend check的时候,如果后端节点正常,则会返回HTTP code 200 (OK), 否则返回HTTP error 503 (Service Unavailable) ,这样haproxy会自动加载或下线节点。
四、仲裁节点
使用YUM安装的MariaDB带有Galera Arbitrator,在配置文件中写入前边配好的集群节点地址和端口,集群名字,启动grab即可。
]# vi /etc/sysconfig/garb
# Copyright (C) 2012 Codership Oy
# This config file is to be sourced by garb service script.
# A comma-separated list of node addresses (address[:port]) in the cluster
GALERA_NODES="1.1.1.1:4567, 1.1.1.2:4567, 1.1.1.3:4567"
# Galera cluster name, should be the same as on the rest of the nodes.
GALERA_GROUP="galera_cluster"
# Optional Galera internal options string (e.g. SSL settings)
# see http://galeracluster.com/documentation-webpages/galeraparameters.html
# GALERA_OPTIONS=""
# Log file for garbd. Optional, by default logs to syslog
# Deprecated for CentOS7, use journalctl to query the log for garbd
# LOG_FILE=""
]# service garb start
[ ok ] Starting /usr/bin/garbd: :.
]# service garb status
[ ok ] garb is running.
]# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
检查集群节点数量,会发现增加了1个节点。
补充下关于如何测试Galera集群的脑裂(两个节点的集群)
1.断开两个节点的网络连接,quorum丢失,所有节点不再接受请求
2.将网络连接恢复,quorum仍然丢失,所有节点仍旧不接受请求。
3.登录其中一个节点,reset quorum:
SET GLOBAL wsrep_provider_options='pc.bootstrap=1';
4.quorum被重置,集群恢复
参考文档:
http://galeracluster.com/documentation-webpages/galerainstallation.html Galera安装文档
https://www.vps.net/community/knowledgebase/display/vpsfeatures/Galera+MySQL+Recommended+Cluster+Configuration 关于参考节点
http://www.tuicool.com/articles/qM3iU3Y
https://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/garbd_howto.html
https://www.freesoftwareservers.com/wiki/configure-garbd-mariadb-centos-7-10649614.html
http://www.cnblogs.com/itcomputer/articles/5614356.html
https://severalnines.com/resources/tutorials/mysql-load-balancing-haproxy-tutorial 关于节点状态检查
https://severalnines.com/blog/high-availability-read-write-splitting-php-mysqlnd-mysql-replication-and-haproxy
http://www.th7.cn/db/mysql/201410/74544.shtml
https://www.percona.com/live/mysql-conference-2013/sites/default/files/slides/PLUC_2013_GCBP.pdf
http://lefred.be/content/mysql-group-replication-as-ha-solution/
https://www.percona.com/live/data-performance-conference-2016/sessions/high-availability-using-mysql-group-replication
http://mysqlhighavailability.com/mysql-group-replication-a-quick-start-guide/ MySQL GR
https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mariadb-10-1-on-ubuntu-16-04-servers Galera安装步骤
https://www.percona.com/blog/2014/09/01/galera-replication-how-to-recover-a-pxc-cluster/ 故障恢复