MySQL主主同步

一、环境

    机器A:192.168.31.152

    机器B:192.168.31.140

    系统:Ubuntu 16.04

    数据库:MySQL 5.7.22

二、Master配置

    1、机器A-Master配置

        1.1、修改配置文件

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
#服务器的ID,必须唯一,一般设置自己的IP
server-id		= 152
#开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log_bin			= /var/log/mysql/mysql-bin.log
#主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format	        = mixed
#为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size	= 1M
#二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days	= 10
#如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志
max_binlog_size  	= 100M

# Master DB #
#需要同步的数据库
binlog_do_db		    = sync_test
#不需要备份的数据库(MySQL库一般不同步)
binlog_ignore_db	    = mysql
#主键自增规则,避免主从同步ID重复的问题
#自增因子(每次加2)
auto-increment-increment    = 2
#自增偏移(从1开始),单数
auto-increment-offset	    = 1

# Slave DB #
#作为从服务器时的中继日志
relay_log		= /var/log/mysql/relay-bin.log
#表示 slave 将复制事件写进自己的二进制日志
log_slave_updates	= 1
#跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
slave_skip_errors	= all

1.2、配置

#先重启一下服务
shell> service mysql restart  
#登录到mysql
shell> mysql -uroot -p123 
#创建数据库同步用户,并授予相应的权限
mysql> grant replication slave, replication client on *.* to 'sync'@'192.168.31.140' identified by '123';
#刷新授权表信息
mysql> flush privileges;
#查看binlog文件的position(偏移)和File(日志文件)的值,从机上需要用到
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003     |      809 |   sync_test  | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

    2、机器B-Master配置
2.1、修改配置文件
    
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
#服务器的ID,必须唯一,一般设置自己的IP
server-id		= 140
#开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log_bin			= /var/log/mysql/mysql-bin.log
#主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format	        = mixed
#为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size	= 1M
#二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days	= 10
#如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志
max_binlog_size  	= 100M

# Master DB #
#需要同步的数据库
binlog_do_db		    = sync_test
#不需要备份的数据库(MySQL库一般不同步)
binlog_ignore_db	    = mysql
#主键自增规则,避免主从同步ID重复的问题
#自增因子(每次加2)
auto-increment-increment    = 2
#自增偏移(从2开始),双数
auto-increment-offset	    = 2

# Slave DB#
#作为从服务器时的中继日志
relay_log		= /var/log/mysql/relay-bin.log
#表示 slave 将复制事件写进自己的二进制日志
log_slave_updates	= 1
#跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
slave_skip_errors	= all

2.2、配置

#先重启一下服务
shell> service mysql restart  
#登录到mysql
shell> mysql -uroot -p123 
#创建数据库同步用户,并授予相应的权限
mysql> grant replication slave, replication client on *.* to 'sync'@'192.168.31.152' identified by '123';
#刷新授权表信息
mysql> flush privileges;
#查看binlog文件的position(偏移)和File(日志文件)的值,从机上需要用到
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004     |      809 |   sync_test  | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

三、Slave配置

    1、机器A-Slave配置

#master_user和master_password:在140上执行grant replication slave...创建的用户和密码([email protected])
#master_log_file和master_log_pos:在140上运行show master status;命令执行结果对应File和Position字段的值
mysql> change master to master_host='192.168.31.140',master_user='sync', master_password='123', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=809, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.45 sec)
#查看作为从节点的状态信息
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.31.140
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 809
               Relay_Log_File: edu-mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 809
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

由于此时从节点还没有启动,Slave_IO_State的值为空,Slave_IO_Running和Slave_SQL_Running线程为No表示也没有运行,然后启动Slave:

#启动从节点,开始工作接收主节点发送事件
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
#重新查看slave节点的状态
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.31.140
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 809
               Relay_Log_File: edu-mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 809
              Relay_Log_Space: 531
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 140
                  Master_UUID: 65bdedc1-24dd-11e7-a0ac-000c295d5365
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

2、机器B-Slave配置

#master_user和master_password:在152上执行grant replication slave...创建的用户和密码([email protected])
#master_log_file和master_log_pos:在152上运行show master status;命令执行结果对应File和Position字段的值
mysql> change master to master_host='192.168.31.152',master_user='sync', master_password='123', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=809, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.45 sec)
#查看作为从节点的状态信息
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.31.152
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 809
               Relay_Log_File: edu-mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 809
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

由于此时从节点还没有启动,Slave_IO_State的值为空,Slave_IO_Running和Slave_SQL_Running线程为No表示也没有运行,然后启动Slave:

#启动从节点,开始工作接收主节点发送事件
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
#重新查看slave节点的状态
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.31.152
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 809
               Relay_Log_File: edu-mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 809
              Relay_Log_Space: 531
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 152
                  Master_UUID: 70416044-49c8-11e8-8367-8cec450cd8d
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

四、验证

    1、在机器A上登录MySQL,并创建数据库sync_test:

mysql> create database if not exists sync_test default character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.05 sec)

创建user表:

mysql> use sync_test;
Database changed
mysql> create table user (id int, name varchar(25));
Query OK, 0 rows affected (0.41 sec)

插入一条数据:

mysql> insert into user(id, name) values(1, 'menghao');
Query OK, 1 row affected (0.10 sec)

查询结果:

mysql> select * from user;
+------+---------+
| id   | name    |
+------+---------+
|    1 | menghao |
+------+---------+
1 row in set (0.00 sec)

    2、在机器B上登录MySQL,验证同步结果:

        查询数据库列表:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sync_test          |
| sys                |
| test               |
| wordpress          |
+--------------------+
8 rows in set (0.03 sec)

查询表列表:

mysql> use sync_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> show tables;
+---------------------+
| Tables_in_sync_test |
+---------------------+
| user                |
+---------------------+
1 row in set (0.01 sec)

查询数据:

mysql> select * from user;
+------+---------+
| id   | name    |
+------+---------+
|    1 | menghao |
+------+---------+
1 row in set (0.02 sec)

五、多台(大于等于三台)主主同步:

    前面说的是2台MySQL服务器,你也可以扩展到多台,实现方法类似 

    A -> D -> C-> B ->A 

    MySQL主主同步_第1张图片

    这样一个环形的备份结构就形成了,最后可要记住自增长ID(主键)要设计好哦,否则会出错的。



你可能感兴趣的:(数据库)