Mysql——5、MySQL主从复制

一、MySQL复制

1.1 系统扩展的方式:
scale up:向上扩展,垂直扩展
scale out:向外扩展,水平扩展
1.2 MySQL的扩展:复制:每个节点都有相同的数据集;向外扩展;二进制日志;单向;
1.3 复制的功用:
负载均衡读;数据分布;备份;高可用和故障切换;MySQL升级测试
1.4 主从复制:
(1)从节点:
(中继日志)
I/O Thread:从Master请求二进制日志时间,并保存于中继日志中;
SQL Thread:从中继日志中读取日志事件,在本地完成重放;
(2)主节点:
(二进制日志)
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events;
1.5 主从复制特点:
(1)异步复制
(2)主从数据不一致比较常见
1.6 复制架构:M/S, M/M, 环状复制
一主多从:(从服务器可以再有从服务器)
一从多主:
1、主节点是单点
2、写操作无法有效均衡
1.7 二进制日志事件记录格式:
语句:STATEMENT
行:ROW 行存储量最大
混合:MIXED 使用比较多

**1.8 复制类型:**主从、主主、半同步复制、复制过滤器

二、主从复制

2.1 主从配置过程:
主节点:
(1)启动二进制日志;

[mysqld]
log_bin=mysql-bin

(2)为当前节点设置一个全局唯一的ID号;

[mysqld]
server_id=1

(3)创建有复制权限的用户账号:

 REPLICATION SLAVE, REPLICATION CLIENT
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';

从节点:
(1)启动中继日志(并闭二进制日志建议);

[mysqld]
relay_log=relay-log
relay_log_index=relay-log.index

(2)为当前节点设置一个全局唯一的ID号;

[mysqld]
server-id=7

(3)使用有复制权限的用户账号连接至主服务器,并启动复制线程;

mysql > CHANGE MASTER TO MASTER_HOST='172.16.92.32',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_log_file='master-bin.000003',MASTER_LOG_POS=245;
mysql > START SLAVE [IO_THREAD|SQL_THREAD];

复制三个步骤:
(1)在主库上启用二进制日志;
(2)备库从主库复制二进制日志,并保存至本地的中继日志中;
(3)备库从中继日志中读取事件并于本地执行一次;
2.2 思考:如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点?

  • 通过备份恢复数据至从服务器;
  • 复制起始位置为备份时,二进制日志文件及其POS

2.3 主从复制示例:

主节点172.16.92.32:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=master-bin
server-id=1
innodb_file_per_table=ON
skip_name_resolve=ON
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

ls /etc/my.cnf.d/
client.cnf  mysql-clients.cnf  server.cnf
systemctl start mariadb.service
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';
MariaDB [(none)]> SHOW MASTER LOGS;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| master-bin.000001 |     30379 |
| master-bin.000002 |   1038814 |
| master-bin.000003 |       245 |
+-------------------+-----------+
MariaDB [(none)]>  SHOW GLOBAL VARIABLES LIKE '%SERVER%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| character_set_server | latin1            |
| collation_server     | latin1_swedish_ci |
| server_id            | 1                 |
+----------------------+-------------------+
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%master%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| master_verify_checksum | OFF   |
| sync_master_info       | 0     |
+------------------------+-------+

从节点172.16.92.33:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
relay-log=relay-log
relay-log-index=relay-log.index
server-id=7
innodb_file_per_table=ON
skip_name_resolve=ON
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

systemctl start mariadb.service
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%SERVER%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| character_set_server | latin1            |
| collation_server     | latin1_swedish_ci |
| server_id            | 7                 |
+----------------------+-------------------+
MariaDB [(none)]> HELP CHANGE MASTER TO
Name: 'CHANGE MASTER TO'
Description:
Syntax:
	CHANGE MASTER TO option [, option] ...

option:
			  | MASTER_BIND = 'interface_name'
			  | MASTER_HOST = 'host_name'    # 指明要连接的主节点,值类型字串
			  | MASTER_USER = 'user_name'    # 具有复制权限的账号,值类型为字串 
			  | MASTER_PASSWORD = 'password' # 上述用户的密码,值类型为字串 
			  | MASTER_PORT = port_num
			  | MASTER_CONNECT_RETRY = interval
			  | MASTER_HEARTBEAT_PERIOD = interval
			  | MASTER_LOG_FILE = 'master_log_name'  # 复制起点,主节点上二进制日志,值类型为字串
			  | MASTER_LOG_POS = master_log_pos      # 复制起点,主节点上二进制日志中起始事件的位置,值类型为数值
			  | RELAY_LOG_FILE = 'relay_log_name'
			  | RELAY_LOG_POS = relay_log_pos
			  | MASTER_SSL = {0|1}
			  | MASTER_SSL_CA = 'ca_file_name'
			  | MASTER_SSL_CAPATH = 'ca_directory_name'
			  | MASTER_SSL_CERT = 'cert_file_name'
			  | MASTER_SSL_KEY = 'key_file_name'
			  | MASTER_SSL_CIPHER = 'cipher_list'
			  | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
			  | IGNORE_SERVER_IDS = (server_id_list)
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.92.32',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_log_file='master-bin.000003',MASTER_LOG_POS=245;
MariaDB [(none)]> SHOW SLAVE STATUS\G
MariaDB [(none)]> HELP START SLAVE
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G

测试:
在主节点:

MariaDB [(none)]> CREATE DATABASE mydb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      579 |              |                  |
+-------------------+----------+--------------+------------------+

在从节点可以查看到数据同步过来了:

MariaDB [(none)]> SHOW SLAVE STATUS\G     #可以看到Exec_Master_Log_Pos: 579
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%relay_log%';
+----------------------------------+----------------+
| Variable_name                    | Value          |
+----------------------------------+----------------+
| innodb_recovery_update_relay_log | OFF            |
| max_relay_log_size               | 0              |
| relay_log                        | relay-log      |
| relay_log_index                  |                |
| relay_log_info_file              | relay-log.info |
| relay_log_purge                  | ON             |
| relay_log_recovery               | OFF            |
| relay_log_space_limit            | 0              |
| sync_relay_log                   | 0              |
| sync_relay_log_info              | 0              |
+----------------------------------+----------------+
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# file /var/lib/mysql/master.info
/var/lib/mysql/master.info: ASCII text
[root@localhost mysql]# cat /var/lib/mysql/master.info
18
master-bin.000003
579
172.16.92.32
repluser
replpass
3306
60
0





0
1800.000

0
[root@localhost mysql]# file relay-log.info
relay-log.info: ASCII text
[root@localhost mysql]# cat relay-log.info 
./relay-log.000002
864
master-bin.000003
579

2.4 复制架构中应该注意的问题:
(1)限制从服务器为只读:
在从服务器上设置 read_only=ON;此限制对拥有SUPER权限的用户均无效;
阻止所有用户的方法:mysql> FLUSH TABLES WITH READ LOCK;(写操作都会被阻塞)
(2)如何保证主从复制的事务安全?
前提:mysql对二进制日志事件数据会有缓冲;
在master节点启用参数:sync_binlog=ON
如果用到的为InnoDB存储引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
在slave节点:skip_slave_start=ON

master节点: sync_master_log
slave节点: sync_relay_log sync_relay_log_info
(3)双版本一致,从节点版本低于主节点可能会引起错误
(4)半同步复制?

半同步:master要等待一个从节点把数据完整复制过去;

三、主主复制

(1) 双方节点都得创建具有复制权限用户;
(2) 双节点都得启用中继日志和二进制日志;
(3) 为保证具有自动增长功能的字段能正确生成ID,需要配置两个节点分别使用偶数或奇数ID号;
(4) 都要把对方配置为自己的主节点;
3.1 互为主从:
(1)数据不一致:因此慎用;
(2)自动增长id:
配置一个节点使用奇数id
auto_increment_offset=1
auto_increment_increment=2
另一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
3.2 配置步骤:
(1)各节点使用一个唯一server_id;
(2)都启动binary_log和relay log;
(3)创建拥有复制权限的用户账号;
(4)定义自动增长id字段的数据范围为奇偶;
(5)均把对方指定为主节点,并启动复制线程;

3.3 主主复制示例

(1)各节点使用一个唯一server_id;
(2)都启动binary_log和relay log;
主节点1 172.16.92.32

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=master-bin
relay_log=relay-log
server-id=1
innodb_file_per_table=ON
skip_name_resolve=ON
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

[root@localhost ~]# systemctl start mariadb   #确定都启动binary_log和relay log
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';
| log_bin                                   | ON
| relay_log                                 | relay-log  

主节点2 172.16.92.33

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=master-bin
relay_log=relay-log
server-id=5
innodb_file_per_table=ON
skip_name_resolve=ON

auto_increment_offset=2
auto_increment_increment=2

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

[root@localhost ~]# systemctl start mariadb   #确定都启动binary_log和relay log
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';
| log_bin                                   | ON
| relay_log                                 | relay-log  

(3)创建拥有复制权限的用户账号;
2个主节点都操作:

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
#生产环境注意不要写'172.16.%.%'的方式,应指定详细IP
MariaDB [(none)]> FLUSH PRIVILEGES;

主节点2 172.16.92.33

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      506 |              |                  |
+-------------------+----------+--------------+------------------+
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.92.32',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=506;
MariaDB [(none)]> SHOW SLAVE STATUS\G
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.92.32
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 506
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-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: 506
              Relay_Log_Space: 818
              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: 1

主节点1 172.16.92.32

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      506 |              |                  |
+-------------------+----------+--------------+------------------+

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.92.33',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=506;
MariaDB [(none)]> SHOW SLAVE STATUS\G
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.92.33
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 506
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-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: 506
              Relay_Log_Space: 818
              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: 5

测试:
主节点1 172.16.92.32创建数据库mydb:

MariaDB [(none)]> CREATE DATABASE mydb;
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+

查看主节点2 172.16.92.33数据库也同步了,使用数据库创建表测试:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
MariaDB [(none)]> use mydb;
Database changed
MariaDB [mydb]> CREATE TABLE tb1 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(30));
MariaDB [mydb]> DESC tb1;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | char(30)         | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
MariaDB [mydb]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      659 |              |                  |
+-------------------+----------+--------------+------------------+

再查看主节点1 172.16.92.32已同步数据, 往表里面写入数据:

MariaDB [mydb]> use mydb;
Database changed
MariaDB [mydb]> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| tb1            |
+----------------+
MariaDB [mydb]> DESC tb1;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | char(30)         | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
MariaDB [mydb]> INSERT INTO tb1 (name) VALUES ('Yang Kang'),('Yang Guo'),('Xiao Ming');
MariaDB [mydb]> SELECT * FROM tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Yang Kang |
|  3 | Yang Guo  |
|  5 | Xiao Ming |
+----+-----------+

主节点2 172.16.92.33数据已同步,再插入数据:

MariaDB [mydb]> SELECT * FROM tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Yang Kang |
|  3 | Yang Guo  |
|  5 | Xiao Ming |
+----+-----------+
MariaDB [mydb]> INSERT INTO tb1 (name) VALUES ('Chen Yi'),('Chen Er'),('Chen San');
MariaDB [mydb]> SELECT * FROM tb1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Yang Kang |
|  3 | Yang Guo  |
|  5 | Xiao Ming |
|  6 | Chen Yi   |
|  8 | Chen Er   |
| 10 | Chen San  |
+----+-----------+

四、半同步复制

测试环境重置:
systemctl stop mariadb
rm -rf /var/lib/mysql/*
主节点 172.16.92.32:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=master-bin
server-id=1
innodb_file_per_table=ON
skip_name_resolve=ON
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

从节点 172.16.92.33:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
relay_log=relay-log
server-id=5
innodb_file_per_table=ON
skip_name_resolve=ON

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

主节点 172.16.92.32 创建拥有复制权限的用户账号:

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
#生产环境注意不要写'172.16.%.%'的方式,应指定详细IP
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      496 |              |                  |
+-------------------+----------+--------------+------------------+

从节点 172.16.92.33:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.92.32',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=496;
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.92.32
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 496
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-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: 496
              Relay_Log_Space: 818
              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: 1
MariaDB [(none)]> STOP SLAVE;

安装插件:
主节点 172.16.92.32:

MariaDB [(none)]> HELP INSTALL
Name: 'INSTALL PLUGIN'
Description:
Syntax:
INSTALL PLUGIN plugin_name SONAME 'shared_library_name'
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| 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              | 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     |
+--------------------------------------------+-------+

从节点 172.16.92.33:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_slave_enabled = 1;

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
MariaDB [(none)]> START SLAVE;

在主节点172.16.92.32验证是否已经工作于半同步模式:

MariaDB [(none)]> CREATE DATABASE mydb;
MariaDB [(none)]> USE mydb;
Database changed
MariaDB [mydb]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 546   |
| Rpl_semi_sync_master_net_wait_time         | 546   |
| Rpl_semi_sync_master_net_waits             | 1     |
| 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      | 671   |
| Rpl_semi_sync_master_tx_wait_time          | 671   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+

master:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql> SHOW GLOBAL STATUS LIKE '%semi%';

slave:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

主节点在联系从节点超时后,会自动降纸为异步模式;

五、复制过滤器

让从节点仅复制指定的数据库,或指定数据库的指定表;
有两种实现方式:
(1)在主节点上过滤
主服务器仅向二进制日志记录与指定数据库(特定表)相关的事件;
问题:时间还原无法实现,不建议使用:
binlog_do_db = # 数据库白名单列表
binlog_ignore_db = # 数据库黑名单列表

(2)在从节点上过滤
从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定的数据库(特定表)相关的事件并应用于本地;
问题:会造成网络及磁盘IO浪费;

replicate_do_db =  #数据库复制白名单
replicate_ignore_db =  #数据库复制黑名单
replicate_db_table = DB_NAME.TB_NAME #复制表的白名单
replicate_ignore_table =  #复制表的黑名单
replicate_wild_do_table = #支持通配符的复制表的白名单
replicate_wild_ignore_table = 

在从节点上测试,调整只复制mydb数据库的数据:

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'replicate%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| replicate_annotate_row_events    | OFF       |
| replicate_do_db                  |           |
| replicate_do_table               |           |
| replicate_events_marked_for_skip | replicate |
| replicate_ignore_db              |           |
| replicate_ignore_table           |           |
| replicate_wild_do_table          |           |
| replicate_wild_ignore_table      |           |
+----------------------------------+-----------+
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> SET GLOBAL replicate_do_db=mydb;
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'replicate%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| replicate_annotate_row_events    | OFF       |
| replicate_do_db                  | mydb      |
| replicate_do_table               |           |
| replicate_events_marked_for_skip | replicate |
| replicate_ignore_db              |           |
| replicate_ignore_table           |           |
| replicate_wild_do_table          |           |
| replicate_wild_ignore_table      |           |
+----------------------------------+-----------+
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.92.32
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 579
               Relay_Log_File: relay-log.000004
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: mydb   #说明只复制mydb的数据
          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: 579
              Relay_Log_Space: 1186
              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: 1

#此时在主节点上面新建一个其他的数据库,发现并不会同步到从节点上。
#在主节点的mydb数据库上面插入数据,发现可以同步到从节点。

六、基于SSL复制

6.1 前提:支持SSL
(1)master配置证书和私钥:并且创建一个要求必须使用SSL连接的复制账号;
(2)slave端使用CHANGE MASTER TO命令时指明ssl相关选项;
6.2 跟复制功能相关的文件:
master.info : 用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等等;
relay-log.info : 保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系;
6.3 复制的监控和维护:
(1)清理日志:
PURGE
(2)复制监控:
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS

SHOW SLAVE STATUS
SHOW PROCESSLIST;
(3)从服务器是否落后于主服务:
Seconds_Behind_Master: 0
(4)如何确定主从节点数据是否一致:
percona-tools
(5)数据不一致如何修复?
重新复制

猜你喜欢

转载自blog.csdn.net/change_can/article/details/85252725