主从复制原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
mysql的日志类型:
Error log 错误日志
General query log普通查询日志
Slow query log 慢查询日志(记录哪些查询比较慢 )
Binary log二进制日志文件(1、用于增量备份。2、主从)
1.传统的实现数据库同步
#主服务器(master)
[root@server1 mysql5.7]# ls
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm
[root@server1 mysql5.7]# yum install * -y
[root@server1 mysql5.7]# /etc/init.d/mysqld start
Initializing MySQL database:
[ OK ]
Installing validate password plugin: [ OK ]
Starting mysqld: [ OK ]
#
#编辑主配置文件
[root@server1 ~]# vim /etc/my.cnf
[root@server1 mysql5.7]# grep password /var/log/mysqld.log #获取初始密码
2018-08-07T14:06:55.029406Z 1 [Note] A temporary password is generated for root@localhost: aG!a*sUs>3#) #初始密码
[root@server1 ~]# mysql_secure_installation #初始化
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
[root@server1 ~]# mysql -p #登陆数据库
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.17-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>grant replication slave on *.* to la@'172.25.44.%' identified by 'westos'; #创建同步帐户,并给予权限,密码太简单,不能通过审核
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> grant replication slave on *.* to la@'172.25.44.%' identified by 'Ting@666'; #为服务器设置一个连接账户并授予REPLICATION SLAVE权限
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> SHOW master status;
Empty set (0.00 sec)
mysql> show variables like '%log_bin%'; #查看是否开启二进制文件
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF | #oFF代表开启
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
6 rows in set (0.00 sec)
[root@server1 ~]# /etc/init.d/mysqld restart #重启服务
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
[root@server1 ~]# mysql -uroot -p
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON | #成功开启
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
6 rows in set (0.00 sec)
mysql> SHOW master status; #记录 File 和 Position 的值.
#在从服务器上测试 #可以登陆就说明同步成功
配置从服务器(slave)
[root@server4 ~]# ls
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm
[root@server4 ~]# yum install *.rpm -y
[root@server2 ~]# vim /etc/my.cnf
添加 server_id=2
注:从服务器 ID 号,不能和主 ID 相同,如果设置多个从服务器,每个从服务器必
须有一个唯一的 server-id 值,必须与主服务器的以及其它从服务器的不相同。
可以认为 server-id 值类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集
中的每个服务器实例。
[root@server4 ~]# /etc/init.d/mysqld start
Starting mysqld: [ OK ]
[root@server2 ~]# grep password /var/log/mysqld.log
2018-08-07T14:08:13.524527Z 1 [Note] A temporary password is generated for root@localhost: td08?Witnwy- #初始密码
[root@server4 ~]# mysql_secure_installation #初始化
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
[root@server4 ~]# mysql -p
Enter password:
mysql> show slave status;
Empty set (0.00 sec)
mysql> change master to master_host='172.25.44.1',master_user='la',master_password='Ting@666',master_log_file='mysql-bin.000003',master_log_pos=841; #同上面在主服务器里查看到的数据,必须保持一致
Query OK, 0 rows affected, 2 warnings (0.21 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.44.1
Master_User: la
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 154
Relay_Log_File: server4-relay-bin.000007
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是 yes,表示从库的 I/O,Slave_SQL 线程都正确开启.表明数据库正在同步
#测试
#在主服务器上创建数据库
mysql> create database test;
Query OK, 1 row affected (0.06 sec)
mysql> use test;
Database changed
mysql> create table userlist(
-> username varchar(15) not null,
-> password varchar(25) not null);
Query OK, 0 rows affected (0.40 sec)
mysql> desc userlist;
mysql> insert into userlist values ('userq','111');
Query OK, 1 row affected (0.09 sec)
mysql> insert into userlist values ('user1','222');
Query OK, 1 row affected (0.09 sec)
mysql> insert into userlist values ('user2','333');
Query OK, 1 row affected (0.08 sec)
mysql> select * from userlist;
#在从服务器上查看是否同步
2.gtid实现同步
#在master上
[root@server1 ~]#vim /etc/my.cfg
加入:
gtid_mode =ON
enforce-gtid-consistency=true
[root@server1 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
[root@server1 ~]# mysql -p
Enter password:
#查看master status,数据已经改变
在slave上:
[root@server4 ~]# vim /etc/my.cnf
加入:
gtid_mode =ON
enforce-gtid-consistency=true
[root@server4 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
[root@server4 ~]# mysql -p
Enter password:
mysql> change master to master_host='172.25.44.1',master_user='la',master_password='Ting@666',master_log_file='mysql-bin.000003',MASTER_AUTO_POSITION=1;
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
mysql> stop slave; #记得要先关闭slave
Query OK, 0 rows affected (0.01 sec)
mysql> change master to master_host='172.25.44.1',master_user='la',master_password='Ting@666',MASTER_AUTO_POSITION=1; #改变slave服务器用于连接master服务器的参数,此处把MASTER值设为动态
Query OK, 0 rows affected, 2 warnings (0.16 sec)
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.44.1
Master_User: la
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 154
Relay_Log_File: server4-relay-bin.000002
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#
#在master上创建数据库,在slave上就可以同步
mysql> create database westos;
Query OK, 1 row affected (0.06 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| westos |
+--------------------+
6 rows in set (0.00 sec)
#
#在slave端查看是否同步:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| westos |
+--------------------+
6 rows in set (0.00 sec)
3.基于gtid的一主二从
Server1(master) -> server3 (master,salve)-> server3(slave)
#
##1.配置:
#Server1:
[root@server1 ~]# vim /etc/my.cnf
20 datadir=/var/lib/mysql
21 socket=/var/lib/mysql/mysql.sock
22 server-id = 1
23 log_bin = mysql-bin
24 # Disabling symbolic-links is recommended to prevent assorted security risks
25 symbolic-links=0
26
27 log-error=/var/log/mysqld.log
28 pid-file=/var/run/mysqld/mysqld.pid
29
30 gtid_mode =ON
31 enforce-gtid-consistency=true
[root@server1 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
#
#Server2:
[root@server2 ~]# vim /etc/my.cnf
20 datadir=/var/lib/mysql
21 socket=/var/lib/mysql/mysql.sock
22 server-id = 2
23 # Disabling symbolic-links is recommended to prevent assorted security risks
24 symbolic-links=0
25
26 log-error=/var/log/mysqld.log
27 pid-file=/var/run/mysqld/mysqld.pid
28
29 gtid_mode =ON
30 enforce-gtid-consistency=true
31
32 log_bin = mysql-bin
33 log_slave-updates
[root@server2 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
mysql> show slave status\G; #保证连接成功
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.44.1
Master_User: la
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1116
Relay_Log_File: server2-relay-bin.000006
Relay_Log_Pos: 1329
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> grant replication slave on *.* to la@'172.25.44.%' identified by 'Ting@666'; #授权
Query OK, 0 rows affected, 1 warning (0.13 sec)
mysql> flush privileges; #刷新
Query OK, 0 rows affected (0.12 sec)
#
#Server3:
[root@server3 ~]# vim /etc/my.cnf
20 datadir=/var/lib/mysql
21 socket=/var/lib/mysql/mysql.sock
22 server-id = 3
23 # Disabling symbolic-links is recommended to prevent assorted security risks
24 symbolic-links=0
25
26 log-error=/var/log/mysqld.log
27 pid-file=/vari/run/mysqld/mysqld.pid
28
29 gtid_mode =ON
30 enforce-gtid-consistency=true
31
[root@server3 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
mysql> show slave status\G; #保证连接成功
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.44.2
Master_User: la
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 194
Relay_Log_File: server3-relay-bin.000003
Relay_Log_Pos: 407
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试环境是否搭建成功
#Server1(创建数据库):
mysql> create database test;
Query OK, 1 row affected (0.04 sec)
mysql> use test;
Database changed
mysql> create table userlist(
-> username varchar(15) not null,
-> password varchar(25) not null);
Query OK, 0 rows affected (0.38 sec)
mysql> insert into userlist values ('userq','111');
Query OK, 1 row affected (0.07 sec)
mysql> insert into userlist values ('user1','222');
Query OK, 1 row affected (0.11 sec)
mysql> select * from userlist;
+----------+----------+
| username | password |
+----------+----------+
| userq | 111 |
| user1 | 222 |
+----------+----------+
2 rows in set (0.00 sec)
#在Server2(sever1的slave端)查看数据是否同步:
mysql> use test;
mysql> select * from userlist
-> ;
+----------+----------+
| username | password |
+----------+----------+
| userq | 111 |
| user1 | 222 |
+----------+----------+
2 rows in set (0.00 sec)
#在Server3(sever2的slave端)查看数据是否同步:
mysql> use test;
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 userlist;
+----------+----------+
| username | password |
+----------+----------+
| userq | 111 |
| user1 | 222 |
+----------+----------+
2 rows in set (0.00 sec)
#同步成功就说明一主二从环境搭建成功
mysql主从复制存在的问题:
1.主库宕机后,数据可能丢失
2.从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
1.半同步复制---解决数据丢失的问题
2.并行复制----解决从库复制延迟的问题
4.gtid实现半同步
关于半同步:
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后
不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才
返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时
它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
所以,半同步复制最好在低延时的网络中使用。
#
#主服务器上
[root@server4 ~]# mysql -p
Enter password:
安装插件:rpl_semi_sync_master
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.50 sec)
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF | #半同步复制处于关闭状态
| rpl_semi_sync_master_timeout | 10000 | #默认1000毫秒,即10秒超时,将切换为异步复制
| rpl_semi_sync_master_trace_level | 32 | #表示用于开启半同步复制时的调试级别,默认32
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON | #表示是否允许master每个事物都要等待slave接收确认,默认为ON
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_master_enabled=1; #设置变量,启用半同步复制,这是临时设置,永久设置需要编辑文件/etc/my.cnf写入rpl_semi_sync_master_enabled=1
Query OK, 0 rows affected (0.01 sec)
mysql> stop slave IO_THREAD; #关闭线程
Query OK, 0 rows affected (0.06 sec)
mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.01 sec)
mysql> show global status like '%semi%'; #可以用这些参数进行监控
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 | #记录支持半同步的slave的个数
| Rpl_semi_sync_master_net_avg_wait_time | 0 | #master 等待slave回复的平均等待时间,单位微秒
| Rpl_semi_sync_master_net_wait_time | 0 | #master 总的等待时间
| Rpl_semi_sync_master_net_waits | 0 | #master 等待slave回复的的总的等待次数
| Rpl_semi_sync_master_no_times | 0 | #master 关闭半同步复制的次数
| Rpl_semi_sync_master_no_tx | 0 | #master 没有收到slave的回复而提交的次数
| Rpl_semi_sync_master_status | ON | #标记master现在是否是半同步复制状态
| Rpl_semi_sync_master_timefunc_failures | 0 | #时间函数未正常工作的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |#开启Semi-sync,事务返回需要等待的平均时间
| 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 | #当前有多少个session 因为slave 的回复而造成等待
| Rpl_semi_sync_master_yes_tx | 0 | #master 成功接收到slave的回复的次数
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
#
#配置从服务器:
[root@server1 ~]# mysql -p
安装插件:rpl_semi_sync_slave
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.08 sec)
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.08 sec)
#设置变量,启用半同步复制
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)
#测试:
#在slave端
#在master端
mysql> drop database student;
Query OK, 0 rows affected (10.13 sec) #会延迟默认的10s,
#再次回到slave端查看master数据库;
#打开slave,就会同步,保证数据不会丢失
5.多组复制
#一.特点:
● 高一致性
基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
● 高容错性
只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
● 高扩展性
节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
● 高灵活性
有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;
多主模式下,所有 server 都可以同时处理更新操作。
#二、什么样的应用场景适合用组复制?
1、弹性的数据库复制环境
组复制可以灵活的增加和减少集群中的数据库实例
2、高可用的数据库环境
组复制允许数据库实例宕机,只要集群中大多数服务器可用,则整个数据库服务可用
3、替代传统主从复制结构的数据库环境
#恢复环境,准备重新初始化
Server3:
[root@server3 ~]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
Server2:
[root@server2 mysql]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
Server1:
[root@server1 ~]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf ib_buffer_pool mysql-bin.000001 public_key.pem
ca-key.pem ibdata1 mysql-bin.000002 server-cert.pem
ca.pem ib_logfile0 mysql-bin.index server-key.pem
client-cert.pem ib_logfile1 performance_schema sys
client-key.pem mysql private_key.pem test
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# ls
[root@server1 mysql]# pwd
/var/lib/mysql
[root@server1 mysql]# vim /etc/my.cnf #恢复源文件,删除自己之前添加的参数
[root@server1 mysql]# /etc/init.d/mysqld start
Initializing MySQL database: [ OK ]
Installing validate password plugin: [ OK ]
Starting mysqld: [ OK ]
[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
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="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
41 loose-group_replication_start_on_boot=off
42 loose-group_replication_local_address= "172.25.44.1:24901"
43 loose-group_replication_group_seeds="172.25.44.1:24901,172.25.44.2:24901,172.25.44.3:249 01"
44 loose-group_replication_bootstrap_group= off
45 loose-group_replication_enforce_update_everywhere_check=on
46 loose-group_replication_ip_whitelist="172.25.44.0/24,127.0.0.1/8"
[root@server1 mysql]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user root@localhost identified by 'Ting@666';
Query OK, 0 rows affected (0.05 sec)
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Ting@666';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.12 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='Ting@666' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.64 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.56 sec)
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.17 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;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 65d57626-9c7f-11e8-9084-525400488d86 | server1 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)
mysql> create database test;
Query OK, 1 row affected (0.43 sec)
mysql> use test;
Database changed
mysql> create table userlist(
-> username varchar(15) not null,
-> password varchar(25) not null);
Query OK, 0 rows affected (0.69 sec)
mysql> insert into userlist values ('user1','222');
Query OK, 1 row affected (0.18 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from test.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 222 |
+----------+----------+
1 row in set (0.00 sec)
mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
| binlog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.17-log, Binlog ver: 4 |
| binlog.000001 | 123 | Previous_gtids | 1 | 150 | |
| binlog.000001 | 150 | Stop | 1 | 169 | |
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
3 rows in set (0.00 sec)
mysql> select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| b08c3587-9c87-11e8-9a6b-525400488d86 |
+--------------------------------------+
1 row in set (0.00 sec)
Server2:
[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# ls
auto.cnf ibdata1 ib_logfile1 mysql relay-log.info server3-relay-bin.000006 sys
ib_buffer_pool ib_logfile0 master.info performance_schema server3-relay-bin.000005 server3-relay-bin.index test
[root@server2 mysql]# rm -fr *
[root@server2 mysql]# ls
[root@server2 mysql]# vim /etc/my.cnf
server_id=2
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
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.44.2:24901"
loose-group_replication_group_seeds="172.25.44.1:24901,172.25.44.2:24901,172.25.44.3:24901"
loose-group_replication_bootstrap_group= off
loose-group_replication_enforce_update_everywhere_check=on
loose-group_replication_ip_whitelist="172.25.44.0/24,127.0.0.1/8"
[root@server2 mysql]#grep password /var/log/mysqld.log
password is generated for root@localhost: ipjs=hHIX1Jq
[root@server2 mysql]# mysql -p
Enter password:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user root@localhost identified by 'Ting@666';
Query OK, 0 rows affected (0.09 sec)
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Ting@666';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.30 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='Ting@666' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.69 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.18 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (6.65 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 65d57626-9c7f-11e8-9084-525400488d86 | server1 | 3306 | ONLINE |
| group_replication_applier | 9bd1cad1-9c87-11e8-9252-525400d1190e | server2 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
Server3:
[root@server3 ~]# cd /var/lib/mysql
[root@server3 mysql]# ls
auto.cnf ibdata1 ib_logfile1 mysql relay-log.info server3-relay-bin.000006 sys
ib_buffer_pool ib_logfile0 master.info performance_schema server3-relay-bin.000005 server3-relay-bin.index test
[root@server3 mysql]# rm -fr *
[root@server3 mysql]# ls
[root@server3 mysql]# vim /etc/my.cnf
[root@server3 mysql]# /etc/init.d/mysqld start
Initializing MySQL database: [ OK ]
Installing validate password plugin: [ OK ]
Starting mysqld: [ OK ]
[root@server3 mysql]# grep password /var/log/mysqld.log
2018-08-10T10:41:31.743796Z 1 [Note] A temporary password is generated for root@localhost: oa8nuK>_d;V4
[root@server3 mysql]# mysql -p
Enter password:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user root@localhost identified by 'Ting@666';
Query OK, 0 rows affected (0.07 sec)
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Ting@666';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.30 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='Ting@666' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.62 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.16 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.21 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 65d57626-9c7f-11e8-9084-525400488d86 | server1 | 3306 | ONLINE |
| group_replication_applier | 9bd1cad1-9c87-11e8-9252-525400d1190e | server2 | 3306 | ONLINE |
| group_replication_applier | f1cc1986-9c89-11e8-8461-525400061bac | server3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)