其中对应的角色分为2个:协调者和参与者
1、 接收客户端请求
2、 广播请求到其他参与者(包括自己)
3、 作为参与者进行数据更新
4、 更新失败或者成功返回给客户端
1、接收协调者的广播请求,然后进行数据库的更新
1、全局唯一ID生成,保证ID的唯一和递增
2、协调者自己也是通过广播接收后进行的数据库业务操作,各个节点平等,保证了并发
3、事务传输要么成功传给了所有节点,要么都失败
4、事务在所有节点中的顺序一致
5、每个节点知道所有节点的状态(通过广播实现)
与异步复制相比:
数据一致性强,传统异步复制并不能保证主从数据一致性,这是由于一般情况下,主库多线程并发执行
事务,但从库却只有一个线程重做事务,在高压力情况下必然会导致主从延迟。
与使用半同步复制或分布式锁实现的同步复制相比:
性能高,扩展性好,半同步复制在高负载甚至从库性能较差的情况下,难以保证其性能。即使自动的
从半同步复制切换到异步复制,也会牺牲其最大的优点:一致性。其扩展友好度也较差
galera集群的独特优势:
1. 同步复制,主备无延迟
2. 支持多主同时读写,保证数据一致性
3. 集群中各节点保存全量数据
4. 节点添加/删除,自动检测和配置
5. 行级别并行复制
6. 不需要写binlog
DDL操作会严重阻塞同步线程,线上大动作DDL会导致有可能导致节点堵塞无响应,更进一步会导致
部分节点下线。实际使用中需要搭配pt-osc或者gh-osc等在线DDL工具来进行操作DDL。
步骤:
[root@rehl-14 ~]# vim /etc/hosts
192.168.10.10 rehl-10
192.168.10.14 rehl-14
192.168.10.15 rehl-15
galera集群对应的 rpm 包连接下载
链接:https://pan.baidu.com/s/1Z4cV__uhw79IMJpJ_r9CMg 密码:4k5u
yum install rsync
yum remove mariadb-libs ##卸载mariadb 冲突的软件包
rpm -ivh mysql-wsrep-common-5.7-5.7.21-25.14.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-5.7-5.7.21-25.14.el7.x86_64.rpm
rpm -ivh mysql-wsrep-client-5.7-5.7.21-25.14.el7.x86_64.rpm
yum install mysql-wsrep-server-5.7-5.7.21-25.14.el7.x86_64.rpm
yum install galera-3-25.3.23-2.el7.x86_64.rpm
如果下列配置有开启就必须要关闭,否则会影响到galera集群的启动!
[root@rehl-14 ~]# vim /etc/my.cnf
sync_binlog=0
# basedir=/usr/local/mysql57 ##注释掉
binlog_rows_query_log_events=OFF ##导致集群多写入时失败,一定要关闭!
#plugin-load=rpl_semi_sync_master=semisync_master.so ##关闭半同步复制,提供了同步复制。
#rpl_semi_sync_master_enabled=1
gtid-mode=ON ##启用GTID功能。
enforce-gtid-consistency=ON
再次附上 /etc/my.cnf 的配置文件;可参照以下配置,复制应用时,创建对应的文件目录即可
链接:https://pan.baidu.com/s/1ciNC-_pV4iAvzAOttWj6lQ 密码:f0ff
[root@rehl-14 ~]# mysqld --initialize --user=mysql ##此时会在/mysql 下,产生全新的数据库
[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql ##启动数据库
新建一个新数据库名 class,授权一个新用户 mary 在数据库 class 下允许所有权限,密码 123123 允许的网段为 192.168.10.%
[root@rehl-14 ~]# grant all on class.* to 'mary'@'192.168.10.%' IDENTIFIED BY '123123';
[root@rehl-14 ~]# killall mysqld
[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so ##要确认插件是存在的
wsrep_cluster_name='cluster1' ##集群名称
wsrep_cluster_address='gcomm://' ##首次作为发起人,此处为空,不向任何人同步数据。
wsrep_node_name='rehl-14' ##本机的主机名
wsrep_node_address='192.168.10.14' ##本机的 IP 地址
wsrep_sst_auth=mary:123123 ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync ##同步数据时使用的组件
[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql
mysql> show status like “%wsrep%”;
在第一加入(rehl-10 192.168.10.10)修改(/etc/my.cnf)
[root@rehl-10 ~]# vim /etc/my.cnf
server-id=2 #不能重复
wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so ##要确认插件是存在的
wsrep_cluster_name='cluster1' ##集群名称
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.15' ##向其他人同步数据同步数据。
wsrep_node_name='rehl-10' ##本机的主机名
wsrep_node_address='192.168.10.10' ##本机的 IP 地址
wsrep_sst_auth=mary:123123 ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync ##同步数据时使用的组件
在第二加入(rehl-10 192.168.10.15)修改(/etc/my.cnf)
[root@rehl-15 ~]# vim /etc/my.cnf
server-id=3 #不能重复
wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so ##要确认插件是存在的
wsrep_cluster_name='cluster1' ##集群名称
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.10' ##向其他人同步数据同步数据。
wsrep_node_name='rehl-15' ##本机的主机名
wsrep_node_address='192.168.10.15' ##本机的 IP 地址
wsrep_sst_auth=mary:123123 ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync ##同步数据时使用的组件
从服务器启动服务后,在主服务器察看集群信息
mysqld --daemonize --datadir=/mysql
mysql> show status like “%wsrep%”;
发现对多了两个ip地址,证明galera集群已实现
测试一
分别向三个节点 建库,建表, 插入数据操作,验证多点写入,观察数据是否同步
在所有其余两个数据库中都可以查询到插入数据的存在
测试二:
下线其中一个节点 killall mysqld (不要是发起人 192.168.10.14 ),剩余节点继续添加数据, 拉开距离。
此时离线数据库重新上线,启动服务即可,观察是否能追上其他人的数据
当断开后一段时间重新连接会发现数据一样能够自动同步回来
测试三:
让 发起人节点 离线。 剩余服务器继续插入数据,拉开距离
再让 发起人 重新上线
[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_cluster_address='gcomm://192.168.10.15,192.168.10.10'
此时 gcomm:// 不在为空,要向其他服务器同步数据
测试四:
停止集群所有数据库
最后离开集群/停止的数据库 主机, 要最先 启动。否则可能导致数据丢失
如果要一台不是最后离开的主机强制启动。 修改 /mysql/grastate.dat
修改 safe_to_bootstrap: 0 为1,修改最先启动的数据库/etc/my.cnf
修改 wsrep_cluster_address='gcomm://‘ 为空,不向任何主机进行同步
然后再启动数据库服务,接着启动其他数据库!