一、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)数据不一致如何修复?
重新复制