mysql的主从复制,基于gtid的主从复制,半同步复制,组复制

主从复制原理:

这里写图片描述

从库生成两个线程,一个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)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/81627776