简介
原理
当一个事务在当前写入的节点提交后,通过wsrep API(write set replication API)将这个事务变成写集(write set)广播到同集群的其他节点中,其他节点收到写集事务后,对这个事务进行可行性检查,并返回结果给wsrep API。若大多数节点都预估自己可以成功执行这个事务,则wsrep API会做出仲裁,通知所有可以成功执行这个事务的节点提交这个事务,并将事务成功提交的消息返回给客户端,同时根据需要剔除没有成功执行事务的节点。
优缺点
1.数据备份安全性高,因为集群中的每个节点都保存着一份完整的数据副本,
2.集群扩展性强,当有新节点上线时,可以从空库状态直接拉取集群的数据来获取全量数据传输(SST),也可以选择从恢复最新备份状态加入集群,获取差量数据传输(IST)。而当其中一个结点下线时,直接关闭实例,集群就会自动踢出这个结点。重新上线时,会根据自身数据与集群数据的落后程度决定通过SST或者IST传输数据。
3.同步效率高效,集群提供了高性能的读写状态(相对于同步复制),而由于同步机制的原因,甚至可以通过增加slave线程的办法来使结点同步效率更进一步提高
4.更加友好的软硬件兼容性
5、DDL操作会严重阻塞同步线程,线上大动作DDL会导致有可能导致节点堵塞无响应,更进一步会导致部分结点下线。
集群准备
准备虚拟机
部署安装三台Centos6虚拟机,设置hostname和IP地址,关闭selinux和防火墙,实现hostname和IP地址的映射
hostname | ip |
---|---|
galera1 | 192.168.29.135 |
galera2 | 192.168.29.136 |
galera3 | 192.168.29.137 |
安装galera-mysql
安装epel源
在galera-cluster网站中下载对应版本的galera-MySQL和Replication Library并安装到三个结点中
下载链接:https://galeracluster.com/downloads/
配置galera-MySQL
每个结点都创建用于集群同步的账号
mysql>grant all on *.* to 'sst'@'192.168.29.%' identified by 'your_password';
mysql>flush privileges;
修改配置文件
galera1结点
#可选项
server_id=1
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
#模块的路径
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
#集群名称
wsrep_cluster_name='galera'
#集群通信地址
wsrep_cluster_address='gcomm://'
#本结点名字
wsrep_node_name='galera1'
#本节点ip地址
wsrep_node_address='192.168.29.135'
#集群同步账号和密码
wsrep_sst_auth=sst:your_password
#数据传输方式
wsrep_sst_method=rsync
重启galera1的mysqld服务
查看端口除了3306外,还监听了4567号通信端口
[root@galera1 ~]# netstat -tnlp |grep mysqld
tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 3824/mysqld
tcp 0 0 :::3306 :::* LISTEN 3824/mysqld
galera2配置文件
server_id=2
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
#添加到集群中
wsrep_cluster_address='gcomm://192.168.29.135'
wsrep_node_name='galera2'
wsrep_node_address='192.168.29.136'
wsrep_sst_auth=sst:your_password
wsrep_sst_method=rsync
galera3配置文件
server_id=3
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
#添加到集群中
wsrep_cluster_address='gcomm://192.168.29.135'
wsrep_node_name='galera3'
wsrep_node_address='192.168.29.137'
wsrep_sst_auth=sst:your_password
wsrep_sst_method=rsync
配置好配置文件后启动galera2和galera3的mysqld服务,观察集群状态
mysql> show status like 'wsrep%';
wsrep_incoming_addresses|192.168.29.135:3306,192.168.29.136:3306,192.168.29.137:3306
可看到三个结点均已经加入集群中
测试验证
在任意结点创建mydb库,并创建test表,出入数据,观察其余结点是否进行数据同步
#galera2执行SQL语句
mysql> create database mydb charset utf8;
mysql> use mydb;
mysql> create table test(num int primary key,name char(12) not null);
mysql>insert into test values(2,'Jack');
#galera1中查看数据
mysql> select * from mydb.test;
+-----+------+
| num | name |
+-----+------+
| 2 | Jack |
+-----+------+
自此MySQL的galera集群搭建完毕
重启问题
1、单独重启
单独重启galera2和galera3结点的mysqld服务能正常加入到集群中,重启galera1结点会发现galera1单独在一个新的集群中,galera2和galera3在另一个集群中,这是由于galera1的配置文件中wsrep_cluster_address='gcomm://'会使galera1新建一个集群
因此在重启galera1前,应该修改配置文件
wsrep_cluster_address='gcomm://192.168.29.136,192.168.29.137'
此时重启galera的mysqld服务将会重新进入集群中
2、集群重启
当所有结点的mysqld都停止后,想要重启集群则需要先把/var/lib/mysql中的galera.cache ,grastate.dat,gvwstate.dat三个文件删除,依次启动galera1、galera2、galera3的mysqld服务即可使集群恢复正常