全同步复制(银行)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
1.组复制(全同步复制)介绍:
** 组复制分单主模式和多主模式,mysql 的复制技术仅解决了数据同步的问题,如果 master 宕机,意味着数据库管理员需要介入,应用系统可能需要修改数据库连接地址或者重启才能实现。(这里也可以使用数据库中间件产品来避免应用系统数据库连接的问题,例如 mycat 和 atlas 等产品)。组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用。
单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only,
当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master
多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念只要突然故障的节点数量不太多,这个多主模型就能继续可用**
2.组复制特点
● 高一致性
● 高容错性
只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
● 高扩展性
节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
● 高灵活性
有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;
但是组复制的效率很低
当master节点写数据的时候,会等待所有的slave节点完成数据的复制,然后才继续往下进行
组复制的每一个节点都可能是slave
实验环境
**172.25.62.1 server1 master
172.25.62.2 server2 slave
172.25.62.3 server3 slave
**
server1上
先将之前的环境删掉
修改配置文件
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW #组复制依赖基于行的复制格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="c36cc649-3f17-11e9-960e-525400cf2a01" ##可以看/var/lib/mysql/auto.cnf 这个uuid必须与你当前的uuid不同,且组复制组成员配置文件内的uuid相同
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.62.1:24901"
loose-group_replication_group_seeds= "172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901"##官网新版33061好像不太行
loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
loose-group_replication_ip_whitelist="127.0.0.1,172.25.62.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF #后两行是开启多主模式的参数
4.启动mysqld
systemctl start mysqld
启动数据库
过滤出密码,数据库初始化
mysql -uroot -pGaojia+123登录数据库
show databases;查看数据库
alter user root@localhost identified by 'Gaojia123';
SET SQL_LOG_BIN=0;#关闭二进制日志,防止传到其他server上
CREATE USER rpl_user@'%' IDENTIFIED BY 'Gaojia+123';##创建复制要用的用户
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';##授权REPLICATION表示授权复制的权限
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;##开启日志
根据官网设置组复制的用户和密码
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Gaojia+123' FOR CHANNEL 'group_replication_recovery';
SHOW PLUGINS; ##查看插件
SET GLOBAL group_replication_bootstrap_group=ON; ##组复制发起节点开启这个参数,其他slave不开
START GROUP_REPLICATION; ##测试看能否开启
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members; ##查看server1是否有记录
server2上
一样的操作,删除之前的数据
修改配置文件,再开启
``server_id=2
gtid_mode=ON
enforce_gtid_cnotallow=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW #组复制依赖基于行的复制格式transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name=“c36cc649-3f17-11e9-960e-525400cf2a01” ##可以看/var/lib/mysql/auto.cnf
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= “172.25.62.2:24901”
loose-group_replication_group_seeds= “172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901”
loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
loose-group_replication_ip_whitelist=“127.0.0.1,172.25.62.0/24”
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF #后两行是开启多主模式的参数
过滤出密码,初始化
#进入数据库
mysql> alter user root@localhost identified by 'Gaojia+123'; #修改root用户密码
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Gaojia123';
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='Gaojia123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#这里不需要做server1上做的SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
此时报错
cat /var/log/mysqld.log ,找到解决办法
要将参数设为on
先停止组复制参数
将
set global group_replication_allow_local_disjoint_gtids_join=on;设置好
再去开启组复制
server3上
同server2一样,就配置文件不一样,我就不解说了=—=!
在server3上插入数据
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
server1上也能看见
组复制完成