主從復(fù)制:
從服務(wù)器:
I/O線程:從master請求二進(jìn)制日志信息,并保存至中繼日志;
SQL線程:從relay log中讀取日志信息,在本地完成重放;
異步模式:async
1、從服務(wù)器落后于主服務(wù)器;
2、主從數(shù)據(jù)不一致;
二進(jìn)制日志的格式:SET datetime = now()
1、基于行
2、基于語句
3、混合
配置過程:
1、master
(1) 啟用二進(jìn)制日志;
my.cnf----> log_bin=log_bin.log
(2) 設(shè)置一個(gè)在當(dāng)前集群中惟一的server-id;
my.cnf----> server_id=1
(3) 創(chuàng)建一個(gè)有復(fù)制權(quán)限(REPLICATION SLAVE, REPLICATION CLIENT)賬號(hào);
MariaDB>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' identified by 'PASSWORD';
(4)查看Master日志信息,記錄,復(fù)制時(shí)使用
MariaDB>SHOW MASTER STATUS;
+----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| log_bin.000014 | 30155002 | | |
+----------------+----------+--------------+------------------+
2、slave
(1) 啟用中繼日志;
my.cnf---->relay_log=relay-bin
(2) 設(shè)置一個(gè)在當(dāng)前集群中惟一的server-id;
my.cnf----> server_id=2
(3) 使用有復(fù)制權(quán)限用戶賬號(hào)連接至主服務(wù)器,并啟動(dòng)復(fù)制線程;
MariaDB>CHANGE MASTER TO MASTER_HOST='192.168.20.1', MASTER_USER='slave', MASTER_PASSWORD='PASSWORD', MASTER_LOG_FILE='log_bin.0000014', MASTER_LOG_POS=30155002, MASTER_CONNECT_RETRY=5
MariaDB>START SLAVE;
(4)查看Slave復(fù)制狀態(tài)
MariaDB>SHOW SLAVE STATUS\G
一主多從,一從一主;服務(wù)器程序版本最好相同
總結(jié):
master: binlog dump
slave: IO thread, SQL thread
slave: 如果連接至主服務(wù)器:
CHANGE MASTER TO option [, option] ...
option:
MASTER_BIND = 'interface_name'
| MASTER_HOST = 'host_name' 主服務(wù)器地址
| MASTER_USER = 'user_name' 有復(fù)制權(quán)限的用戶名
| MASTER_PASSWORD = 'password' 用戶密碼
| MASTER_PORT = port_num 主服務(wù)器的端口
| MASTER_CONNECT_RETRY = interval 連接重試時(shí)間間隔
| MASTER_HEARTBEAT_PERIOD = interval 心跳檢測時(shí)間間隔
| MASTER_LOG_FILE = 'master_log_name' 主服務(wù)器二進(jìn)制日志文件
| MASTER_LOG_POS = master_log_pos 二進(jìn)制日志文件中的位置
| 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)
主主:
互為主從:
1、數(shù)據(jù)不一致;
2、自動(dòng)增長id
定義一個(gè)節(jié)點(diǎn)使用奇數(shù)id
auto_increment_offset=1
auto_increment_increment=2
定義另一個(gè)節(jié)點(diǎn)使用偶數(shù)id
auto_increment_offset=2
auto_increment_increment=2
(1) 各自使用不同的server id
(2) 都啟用binlog和relay log
(3) 定義自動(dòng)增長的id字段的增長方式
(4) 都授權(quán)有復(fù)制權(quán)限的用戶賬號(hào)
(5) 各自把對方指定為主服務(wù)器
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' IDENTIFIED BY 'PASSWORD';
復(fù)制如何開始?
主節(jié)點(diǎn)運(yùn)行很長時(shí)間,且已經(jīng)有一定規(guī)模的數(shù)據(jù),如何啟動(dòng)復(fù)制?
在主節(jié)點(diǎn)做一個(gè)完全備份,并記錄二進(jìn)制日志文件及位置;
在從節(jié)點(diǎn)恢復(fù)此完全備份,并在啟動(dòng)復(fù)制時(shí)從記錄的二進(jìn)制日志文件和位置開始;
復(fù)制時(shí)應(yīng)該注意的問題:
1、如何限制從服務(wù)器只讀?
在從服務(wù)器啟動(dòng)read_only;但僅對非具有SUPER權(quán)限的用戶有效;
阻止所有用戶 :MariaDB> FLUSH TABLES WITH READ LOCK;
2、如何保證主從復(fù)制時(shí)的事務(wù)安全?
在master節(jié)點(diǎn)啟用參數(shù):
sync_binlog = on
如果用到的為InnoDB存儲(chǔ)引擎:
innodb_flush_logs_at_trx_commit
innodb_support_xa=on
在slave節(jié)點(diǎn):
skip_slave_start
主節(jié)點(diǎn):
sync_master_info = 1
從節(jié)點(diǎn)
sync_relay_log = 1
sync_relay_log_info = 1
3、半同步復(fù)制
主節(jié)點(diǎn):
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.05 sec)
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 |
+------------------------------------+-------+
4 rows in set (0.00 sec)
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=2000;
Query OK, 0 rows affected (0.00 sec)
從節(jié)點(diǎn):
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.05 sec)
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
如果從服務(wù)器已經(jīng)啟動(dòng),還需要重啟IO_THREAD;
4、復(fù)制過濾器
讓slave僅復(fù)制有限的幾個(gè)數(shù)據(jù)庫,而非所有;
有兩種實(shí)現(xiàn)思路:
(1) 主服務(wù)器僅向二進(jìn)制日志中記錄有特定數(shù)據(jù)庫相關(guān)的寫操作;
問題:即時(shí)點(diǎn)還原將無法全面實(shí)現(xiàn);
binlog_do_db= # 數(shù)據(jù)庫白名單
binlog_ignore_db= # 數(shù)據(jù)庫黑名單
(2)從服務(wù)器的SQL_THREAD僅在中斷日志中讀取特定數(shù)據(jù)相關(guān)的語句并應(yīng)用在本地;
問題:會(huì)造成網(wǎng)絡(luò)帶寬和磁盤IO的浪費(fèi);
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
5、基于SSL的復(fù)制
前提:支持SSL
(1) 主服務(wù)器端配置證書和私鑰,并創(chuàng)建一個(gè)要求必須使用SSL連接的復(fù)制賬號(hào)(REQUIRE SSL);
(2) SLAV端連接master時(shí),使用MASTER_SSL相關(guān)的選項(xiàng)來配置證書等信息;
6、跟復(fù)制功能相關(guān)的文件:
master.info:用于保存slave連接至master時(shí)的相關(guān)信息;
relay-log.info:保存了當(dāng)前slave節(jié)點(diǎn)上已經(jīng)復(fù)制的當(dāng)前二進(jìn)制日志和本地relay log日志對應(yīng)關(guān)系;
7、復(fù)制的監(jiān)控和維護(hù)
(1) 清理日志:PURGE
(2) 復(fù)制監(jiān)控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
(3) 如何判斷slave是否落后于master
Seconds_Behind_Master: 0
(4) 如何確定主從節(jié)點(diǎn)數(shù)據(jù)是否一致?
通過表自身的CHECKSUM檢查
使用percona-tools中pt-table-checksum
(5) 數(shù)據(jù)不一致的修復(fù)方法:
重復(fù)復(fù)制;