Mysql—高可用之组复制 (MGR)

MySQL Group Replication(简称 MGR )是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩 展的解决方案

组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务

MySQL 组复制分单主模式和多主模式,传统的mysql复制技术仅解决了数据同步的问题, MGR 对属于同一组的服务器自动进行协调。对于要提交的事务,组成员必须就全局事务序列中给定事务 的顺序达成一致 提交或回滚事务由每个服务器单独完成,但所有服务器都必须做出相同的决定

如果存在网络分区,导致成员无法达成事先定义的分割策略,则在解决此问题之前系统不会继续进行, 这是一种内置的自动裂脑保护机制 MGR由组通信系统( Group Communication System ,GCS ) 协议支持 该系统提供故障检测机制、组成员服务以及安全且有序的消息传递

组复制流程

首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致性协议层

Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里大多数人(对应 Node 点)的同意,大多数指的是同意的节点数量需要大于N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO)事务则不需要经过组内同意,直接 提交 即可

实现mysql组复制

注意:进行实验时将为了避免出错,停止Mysql然后将数据全部删除。

创建三台主机:172.25.254.10,172.25.254.20和172.25.254.30

172.25.254.10

主机上编辑配置文件

[root@mysql-node10 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=10 #配置server唯一标识号

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #禁用指定存储 引擎

gtid_mode=ON #启用全局事件标识

enforce_gtid_consistency=ON #强制gtid一致

master_info_repository=TABLE #复制事件数据到表中而不记录在数据目录中 relay_log_info_repository=TABLE binlog_checksum=NONE #禁止对二进制日志校验 log_slave_updates=ON #打开数据库中继

log_bin=binlog #重新指定log名称 binlog_format=ROW #使用行日志格式 plugin_load_add='group_replication.so' #加载组复制插件 transaction_write_set_extraction=XXHASH64 #把每个事件编码为加密散列

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #通知插件正 式加入

group_replication_start_on_boot=off #在server启动时不自动启动组复 制 group_replication_local_address="172.25.254.10:33061" #指定插件接受其他成员的信息端 口

group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061" #本地地址允许访 问成员列表

group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8" #主机白名单

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF #使用多主模式

group_replication_enforce_update_everywhere_checks=ON #组同步中有任何改变

group_replication_allow_local_disjoint_gtids_join=1 #放弃自己信息以 master事件为主

使用命令对mysql进行初始化

[root@nginx ~]# mysqld --user=mysql --initialize

获取临时密码:q8N_EtJjl/hX

开启数据库

[root@nginx ~]# /etc/init.d/mysqld start

使用命令进行登录MySQL,输入临时密码:q8N_EtJjl/hX

[root@nginx ~]# mysql -uroot -p

登录后修改用户密码

mysql> alter user root@localhost identified by "123";

关闭日志同步信息

mysql> SET SQL_LOG_BIN=0;

 建立数据同步的用户lee

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

对数据进行授权

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

开启日志同步信息

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';

指定初始成员,值在第 一台主机中执行

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

mysql>START GROUP_REPLICATION;

mysql>SET GLOBAL group_replication_bootstrap_group=OFF;

使用命令查看

mysql> SELECT * FROM performance_schema.replication_group_members;

做主机解析

[root@nginx ~]# vim /etc/hosts

将底下的文件传递到172.25.254.20主机上

[root@nginx ~]# scp /etc/my.cnf root@172.25.254.20:/etc/my.cnf

将底下的文件传递到172.25.254.30主机上

[root@nginx ~]# scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf

172.25.254.20

也做主机解析

[root@nginx ~]# vim /etc/hosts

主机上编辑配置文件

[root@mysql-node10 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=20

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 

gtid_mode=ON 

enforce_gtid_consistency=ON

master_info_repository=TABLE 

relay_log_info_repository=TABLE binlog_checksum=NONE

log_slave_updates=ON 

log_bin=binlog 

plugin_load_add='group_replication.so' 

transaction_write_set_extraction=XXHASH64

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off group_replication_local_address="172.25.254.20:33061" 

group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061" 

group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8" 

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF 

group_replication_enforce_update_everywhere_checks=ON 

group_replication_allow_local_disjoint_gtids_join=1 

删除数据然后进行初始化

[root@nginx ~]# rm -fr /data/mysql/*
[root@nginx ~]# mysqld --user=mysql --initialize

按照前面方法一样

启动数据库

[root@nginx ~]# /etc/init.d/mysqld start

登入数据库

[root@nginx ~]# mysql -uroot -p

进行相关配置

mysql> alter user root@localhost identified by "lee";

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';

mysql> START GROUP_REPLICATION;  

172.25.254.30

也做主机解析

[root@nginx ~]# vim /etc/hosts

编辑配置文件

[root@mysql-node10 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=30

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 

gtid_mode=ON 

enforce_gtid_consistency=ON

master_info_repository=TABLE 

relay_log_info_repository=TABLE binlog_checksum=NONE

log_slave_updates=ON 

log_bin=binlog 

plugin_load_add='group_replication.so' 

transaction_write_set_extraction=XXHASH64

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off group_replication_local_address="172.25.254.30:33061" 

group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061" 

group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8" 

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF 

group_replication_enforce_update_everywhere_checks=ON 

group_replication_allow_local_disjoint_gtids_join=1 

删除数据然后进行初始化

[root@nginx ~]# rm -fr /data/mysql/*
[root@nginx ~]# mysqld --user=mysql --initialize

按照前面方法一样

启动数据库

[root@nginx ~]# /etc/init.d/mysqld start

登入数据库

[root@nginx ~]# mysql -uroot -p

mysql> alter user root@localhost identified by "lee";

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';

mysql> START GROUP_REPLICATION;  

测试

再172.25.254.10主机上进行查看

mysql> SELECT * FROM performance_schema.replication_group_members;

显示有三个成员

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值