前言:
Mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证mysql数据库的可靠性。就要会一些提高可靠性的技术。因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据提高可靠性,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力。
本文我们将会详细给大家介绍在Redhat7环境下Mysql的主从复制以及基于gtid的主从复制、半同步复制、组复制,实现数据同步!!!
一、主从复制的概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主要用途:
1、读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2、数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换
3、高可用HA
4、架构扩展
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。
二、主从复制的原理
我们先看图:
1、主节点 binary log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
2、从节点I/O线程
当从节点上执行start slave
命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
3、从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
PS:
对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。
要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。
4、主从复制的主要步骤:
整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:
复制的基本过程如下:
- 从节点上的I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
- 主节点接收到来自从节点的I/O请求后,通过负责复制的I/O进程根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的bin-log file 的以及bin-log position;从节点的I/O进程接收到内容后,将接收到的日志内容更新到本机的relay log中,并将读取到的binary log文件名和位置保存到master-info 文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我”;
- Slave 的 SQL线程检测到relay-log 中新增加了内容后,会将relay-log的内容解析成在祝节点上实际执行过的操作,并在本数据库中执行。
三、异步复制(主从复制、以及基于gtid的主从复制)
MySQL 主从复制默认是异步的模式。MySQL增删改操作会全部记录在binary log中,当slave节点连接master时,会主动从master处获取最新的bin log文件。并把bin log中的sql relay。
异步模式如下图所示,这种模式下,主节点不会主动push bin log到从节点,这样有可能导致failover的情况下,也许从节点没有即时地将最新的bin log同步到本地。
实验环境:
server1 | 172.25.75.1 | master |
---|---|---|
server2 | 172.25.75.2 | slaver |
异步:速度快,对主无影响(但当网络卡顿,从可能接受不到某些数据)
1、mysql的主从复制
1、获得资源,解压(安装rpm包,不用编译)基础设置
master:
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm
mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
开启log-bin日志
[root@server1 ~]# vim /etc/my.cnf
29 log-bin=mysql-bin
30 server-id=1
2、启动mysql,作简单配置
master:
[root@server1 ~]# systemctl start mysqld
[root@server1 ~]# cat /var/log/mysqld.log | grep password
2019-05-09T03:01:50.444683Z 1 [Note] A temporary password is generated for root@localhost: W0GbuqAJm%.0 #会发现生成初始密码
[root@server1 ~]# mysql_secure_installation #改密码,设定安全性
[root@server1 ~]# mysql -uroot -pWestos+001 #登陆数据库
3、server2进行和server1同样的步骤,my.cnf不同:添加server-id=2即可
SLAVE:
[root@server2 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server2 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm
mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@server2 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server2 ~]# vim /etc/my.cnf
[root@server2 ~]# systemctl start mysqld
[root@server2 ~]# grep password /var/log/mysqld.log
2019-05-09T03:08:51.954438Z 1 [Note] A temporary password is generated for root@localhost: upXp7O%Wpopa
[root@server2 ~]# mysql_secure_installation
[root@server2 ~]# mysql -uroot -pWestos+001
4、在server1(主)上写入信息
[root@server1 ~]# mysql -uroot -pWestos+001
mysql> SHOW PLUGINS; #查看插件
mysql> grant replication slave on *.* to repl@'172.25.75.%' identified by 'Westos+001'; #配置哪个主机作为从
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> SHOW MASTER STATUS; #查看从需要的信息
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 691 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
5、在server2(从)上进行配置
[root@server2 ~]# mysql -uroot -pWestos+001
mysql> change master to master_host='172.25.75.1',master_user='repl',master_password='Westos+001',master_log_file='mysql-bin.000002',master_log_pos=691; #授权
Query OK, 0 rows affected, 2 warnings (0.18 sec)
mysql> START SLAVE; #启动slave
mysql> SHOW SLAVE STATUS\G; #查看slave信息
#表示成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6、测试
在master(server1)上创建表:
mysql> CREATE DATABASE redhat;
Query OK, 1 row affected (0.01 sec)
mysql> USE redhat;
Database changed
mysql> CREATE table usertb (
-> username varchar(10) not null,
-> password varchar(15) not null);
Query OK, 0 rows affected (0.16 sec)
mysql> DESC usertb;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| password | varchar(15) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into usertb values ('user1','123');
Query OK, 1 row affected (0.01 sec)
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
+----------+----------+
1 row in set (0.00 sec)
在slave上查看是否同步数据:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| redhat |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> USE redhat;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
+----------+----------+
1 row in set (0.00 sec)
数据同步成功!!!
2、mysql基于gtid的主从复制
1、将master和slave的mysql关闭,修改配置文件
master:
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# vim /etc/my.cnf #更改主的配置文件,启动mysql
29 log-bin=mysql-bin
30 server-id=1
31 gtid_mode=ON
32 enforce-gtid-consistency=true
[root@server1 ~]# systemctl start mysqld
slave:
[root@server2 ~]# systemctl stop mysqld
[root@server2 ~]# vim /etc/my.cnf
29 server-id=2
30 gtid_mode=ON
31 enforce-gtid-consistency=true
[root@server2 ~]# systemctl start mysqld
2、在主库端进入mysql,进行授权(主从复制已经做过)
3、在从库端进入mysql,关闭slave,进行gtid授权
slave:
[root@server2 ~]# mysql -uroot -pWestos+001
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> CHANGE MASTER TO
-> MASTER_HOST = '172.25.75.1', #主库ip
-> MASTER_USER = 'repl', #使用的用户(主库那边授权的用户身份)
-> MASTER_PASSWORD = 'Westos+001', #密码
-> MASTER_AUTO_POSITION = 1; #自动开启gtid的复制方式
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G;
#IO和SQL打开即授权成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、测试
在主库写入信息:
mysql> USE redhat;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into usertb values ('user2','123');
Query OK, 1 row affected (0.02 sec)
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
+----------+----------+
2 rows in set (0.00 sec)
mysql>
在从库查看:
mysql> use redhat;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
+----------+----------+
2 rows in set (0.00 sec)
数据同步成功!!!
从库此时可以使用以下命令查看复制的数据是基于gtid的同步方式:
mysql> show slave status\G;
Retrieved_Gtid_Set: ca7ea429-7206-11e9-9eed-52540025b321:1
Executed_Gtid_Set: ca7ea429-7206-11e9-9eed-52540025b321:1
或者:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| ca7ea429-7206-11e9-9eed-52540025b321 | 1 | 1 |
+--------------------------------------+----------------+--------------+
1 row in set (0.00 sec)
四、半同步复制
这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有一定的降低,响应时间会变长。如下图所示:
半同步模式不是mysql内置的,从mysql 5.5开始集成,需要master 和slave 安装插件开启半同步模式。
实验环境:
server1 | 172.25.75.1 | master |
---|---|---|
server2 | 172.25.75.2 | slaver |
配置要求:半同步:等代10秒,如果没有收到ack就转为异步
1、在主库安装插件,激活插件
master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; #查看安装的插件
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1; #激活插件
Query OK, 0 rows affected (0.00 sec)
2、在从库安装插件,并激活
slave:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)
3、重启从库的IO线程
slave:
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
4、在主库查看信息
master:
mysql> show status like '%rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON | 可以看到半同步打开
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
mysql> show variables like '%rpl%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+------------+
7 rows in set (0.00 sec)
5、在从库查看信息
mysql> show variables like '%rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.00 sec)
6、测试
1、将从库的IO线程关闭,在主库添加信息。模仿网络卡顿
slave:
mysql> STOP SLAVE IO_THREAD; #此时主库收不到从库发送的ack,模仿网络卡顿
Query OK, 0 rows affected (0.00 sec)
master:
mysql> use redhat;
Database changed
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
+----------+----------+
2 rows in set (0.00 sec)
mysql> insert into usertb values ('user3','456');
Query OK, 1 row affected (10.02 sec)
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
| user3 | 456 |
+----------+----------+
3 rows in set (0.00 sec)
slave查看:(信息同步不到)
mysql> use redhat;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
+----------+----------+
2 rows in set (0.00 sec)
2、在主库查看状态,打开从库IO线程,模拟网络通畅
master:
mysql> show status like '%rpl%'; #此时已经变成异步,半同步关闭
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
slave:
mysql> show status like '%rpl%'; #半同步关闭,异步开启
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------+
1 row in set (0.00 sec)
mysql> START SLAVE IO_THREAD; #将IO打开,模拟网络通畅
Query OK, 0 rows affected (0.00 sec)
mysql> select * from usertb; #此时可以查看到数据同步
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 123 |
| user3 | 456 |
+----------+----------+
3 rows in set (0.00 sec)
注意:此时默认的状态是半同步,会自动开启(半同步是mysql的5.5后提出的)
五、组复制
组复制是基于分布式一致性协议Paxos实现数据最终一致性的MySQL插件,通过这种插件可以实现弹性、高可用、容错复制拓扑结构。
MySQL组复制提供分布式状态机复制,在服务器之间具有强协调。当数据库服务器是属于同一组时,组复制机制可以自动协调它们。该组可以在具有自动选择新主库功能的单主模式下操作,这种情况下一个组只有主节点才可以做写操作。或者,对于更高级的用户,该组可以以多主模式部署,即多个节点都可以做写操作,即使它们是同时发过来的写请求。不过这种情况下,应用层会有部分额外的限制。
MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)。
- 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
- 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。
server1 | 172.25.75.1 | master1 |
---|---|---|
server2 | 172.25.75.2 | master2 |
server3 | 172.25.75.3 | master3 |
1、恢复环境,更改配置文件
server1:
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf ib_buffer_pool mysql-bin.000001 private_key.pem sys
ca-key.pem ibdata1 mysql-bin.000002 public_key.pem
ca.pem ib_logfile0 mysql-bin.000003 redhat
client-cert.pem ib_logfile1 mysql-bin.index server-cert.pem
client-key.pem mysql performance_schema server-key.pem
[root@server1 mysql]# rm -rf *
[root@server1 mysql]# ps ax | grep mysqld #确保没有mysql进程
随机生成UUID:
[root@server1 mysql]# uuidgen
e93da943-5c25-4f49-8178-fde00864f26c
更改配置文件:
[root@server1 mysql]# vim /etc/my.cnf
29 server_id=1
30 gtid_mode=ON
31 enforce_gtid_consistency=ON
32 master_info_repository=TABLE
33 relay_log_info_repository=TABLE
34 binlog_checksum=NONE #关闭binlog校验
35 log_slave_updates=ON
36 log_bin=binlog
37 binlog_format=ROW #组复制依赖基于行的复制格式
38
39 transaction_write_set_extraction=XXHASH64
40 loose-group_replication_group_name="e93da943-5c25-4f49-8178-fde00864f26c"
41 loose-group_replication_start_on_boot=off
42 loose-group_replication_local_address= "172.25.75.1:24901"
43 loose-group_replication_group_seeds= "172.25.75.1:24901,172.25.75.2:24901,172.25.75.3:24901"
44 loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.75.0/24"
46 loose-group_replication_enforce_update_everywhere_checks=ON
47 loose-group_replication_single_primary_mode=OFF #后两行是开启多主模式的参数
2、server1启动mysql,修改安全设定
[root@server1 mysql]# systemctl start mysqld
[root@server1 mysql]# cat /var/log/mysqld.log | grep password
3、server1登录mysql,进行配置设定
[root@server1 mysql]# mysql -p
mysql> alter user root@localhost identified by 'Westos+001'; #更改root用户的密码,也可以初始化
Query OK, 0 rows affected (0.01 sec)
mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,防止传到其他server上
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos+001'; #创建用户用于复制
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #给所有库的所有表
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; #刷新授权表
Query OK, 0 rows affected (0.00 sec)
mysql> SET SQL_LOG_BIN=1; ##开启日志
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+001' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.18 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #添加组复制的插件
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW PLUGINS; ##查看插件
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##组复制发起节点开启这个参数
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.28 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看server1是否online
| group_replication_applier | a4d64ced-7236-11e9-8788-52540025b321 | server1 | 3306 | ONLINE |
4、添加server2到组内
1、关闭server2的mysql,删除信息,修改配置文件
[root@server2 ~]# systemctl stop mysqld
[root@server2 ~]# rm -rf /var/lib/mysql/*
[root@server2 ~]# vim /etc/my.cnf
29 server_id=2
30 gtid_mode=ON
31 enforce_gtid_consistency=ON
32 master_info_repository=TABLE
33 relay_log_info_repository=TABLE
34 binlog_checksum=NONE
35 log_slave_updates=ON
36 log_bin=binlog
37 binlog_format=ROW
38
39 transaction_write_set_extraction=XXHASH64
40 loose-group_replication_group_name="e93da943-5c25-4f49-8178-fde00864f26c" ##注意:这里和server1的保持一致!!!!!!
41 loose-group_replication_start_on_boot=off
42 loose-group_replication_local_address= "172.25.75.2:24901"
43 loose-group_replication_group_seeds= "172.25.75.1:24901,172.25.75.2:24901,172.25.75.3:24901"
44 loose-group_replication_bootstrap_group=off
45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.75.0/24"
46 loose-group_replication_enforce_update_everywhere_checks=ON
47 loose-group_replication_single_primary_mode=OFF
2、server2启动mysqld,修改安全设定
[root@server2 ~]# systemctl start mysqld
[root@server2 ~]# cat /var/log/mysqld.log | grep password
[root@server2 ~]# mysql_secure_installation #安全初始化
3、登陆mysql,进行配置设定
server2:
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos+001';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+001' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.17 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.05 sec)
mysql> set global group_replication_allow_local_disjoint_gtids_join=on; ##不做这一步 会报错
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (12.93 sec)
4、在server1上查看是否添加成功
mysql> mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | a4d64ced-7236-11e9-8788-52540025b321 | server1 | 3306 | ONLINE |
| group_replication_applier | d9f7e591-7238-11e9-90cf-52540000f9c8 | server2 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
online则表示添加成功!!!
5、添加server3到组内,步骤和server2的添加一样,这里不做赘述
/etc/my.cnf的编辑:
29 server_id=3
30 gtid_mode=ON
31 enforce_gtid_consistency=ON
32 master_info_repository=TABLE
33 relay_log_info_repository=TABLE
34 binlog_checksum=NONE
35 log_slave_updates=ON
36 log_bin=binlog
37 binlog_format=ROW
38
39 transaction_write_set_extraction=XXHASH64
40 loose-group_replication_group_name="e93da943-5c25-4f49-8178-fde00864f26c"
41 loose-group_replication_start_on_boot=off
42 loose-group_replication_local_address= "172.25.75.3:24901"
43 loose-group_replication_group_seeds= "172.25.75.1:24901,172.25.75.2:24901,172.25.75.3:24901"
44 loose-group_replication_bootstrap_group=off
45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.75.0/24"
46 loose-group_replication_enforce_update_everywhere_checks=ON
47 loose-group_replication_single_primary_mode=OFF
添加完成后,在server1上验证是否添加成功!!!
mysql> mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 5915cd88-723d-11e9-b374-52540087af7c | server3 | 3306 | ONLINE |
| group_replication_applier | a4d64ced-7236-11e9-8788-52540025b321 | server1 | 3306 | ONLINE |
| group_replication_applier | d9f7e591-7238-11e9-90cf-52540000f9c8 | server2 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
看到3台都是online,表示正常
这时在任何一个节点都可以看到刚才插入的数据
在任何节点写入数据,其他节点也能看到
6、测试
在server2加入数据
在server3上查看数据:
在server1上查看数据:
多主组复制配置成功!!!