主從複製:
從服務器:
I/O線程:從master請求二進制日誌信息,並保存至中繼日誌;
SQL線程:從relay log中讀取日誌信息,在本地完成重放;數據庫
異步模式:async 一、從服務器落後於主服務器; 二、主從數據不一致; 二進制日誌的格式:SET datetime = now() 一、基於行 二、基於語句 三、混合 配置過程: 一、master (1) 啓用二進制日誌; my.cnf----> log_bin=log_bin.log (2) 設置一個在當前集羣中唯一的server-id; my.cnf----> server_id=1 (3) 建立一個有複製權限(REPLICATION SLAVE, REPLICATION CLIENT)帳號; MariaDB>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' identified by 'PASSWORD'; (4)查看Master日誌信息,記錄,複製時使用 MariaDB>SHOW MASTER STATUS; +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | log_bin.000014 | 30155002 | | | +----------------+----------+--------------+------------------+ 二、slave (1) 啓用中繼日誌; my.cnf---->relay_log=relay-bin (2) 設置一個在當前集羣中唯一的server-id; my.cnf----> server_id=2 (3) 使用有複製權限用戶帳號鏈接至主服務器,並啓動複製線程; 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複製狀態 MariaDB>SHOW SLAVE STATUS\G 一主多從,一從一主;服務器程序版本最好相同 總結: master: binlog dump slave: IO thread, SQL thread slave: 若是鏈接至主服務器: 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) 主主: 互爲主從: 一、數據不一致; 二、自動增加id 定義一個節點使用奇數id auto_increment_offset=1 auto_increment_increment=2 定義另外一個節點使用偶數id auto_increment_offset=2 auto_increment_increment=2 (1) 各自使用不一樣的server id (2) 都啓用binlog和relay log (3) 定義自動增加的id字段的增加方式 (4) 都受權有複製權限的用戶帳號 (5) 各自把對方指定爲主服務器 GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' IDENTIFIED BY 'PASSWORD'; 複製如何開始? 主節點運行很長時間,且已經有必定規模的數據,如何啓動複製? 在主節點作一個徹底備份,並記錄二進制日誌文件及位置; 在從節點恢復此徹底備份,並在啓動複製時從記錄的二進制日誌文件和位置開始; 複製時應該注意的問題: 一、如何限制從服務器只讀? 在從服務器啓動read_only;但僅對非具備SUPER權限的用戶有效; 阻止全部用戶 :MariaDB> FLUSH TABLES WITH READ LOCK; 二、如何保證主從複製時的事務安全? 在master節點啓用參數: sync_binlog = on 若是用到的爲InnoDB存儲引擎: innodb_flush_logs_at_trx_commit innodb_support_xa=on 在slave節點: skip_slave_start 主節點: sync_master_info = 1 從節點 sync_relay_log = 1 sync_relay_log_info = 1 三、半同步複製 主節點: 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) 從節點: 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) 若是從服務器已經啓動,還須要重啓IO_THREAD; 四、複製過濾器 讓slave僅複製有限的幾個數據庫,而非全部; 有兩種實現思路: (1) 主服務器僅向二進制日誌中記錄有特定數據庫相關的寫操做; 問題:即時點還原將沒法全面實現; binlog_do_db= # 數據庫白名單 binlog_ignore_db= # 數據庫黑名單 (2)從服務器的SQL_THREAD僅在中斷日誌中讀取特定數據相關的語句並應用在本地; 問題:會形成網絡帶寬和磁盤IO的浪費; Replicate_Do_DB= Replicate_Ignore_DB= Replicate_Do_Table= Replicate_Ignore_Table= Replicate_Wild_Do_Table= Replicate_Wild_Ignore_Table= 五、基於SSL的複製 前提:支持SSL (1) 主服務器端配置證書和私鑰,並建立一個要求必須使用SSL鏈接的複製帳號(REQUIRE SSL); (2) SLAV端鏈接master時,使用MASTER_SSL相關的選項來配置證書等信息; 六、跟複製功能相關的文件: master.info:用於保存slave鏈接至master時的相關信息; relay-log.info:保存了當前slave節點上已經複製的當前二進制日誌和本地relay log日誌對應關係; 七、複製的監控和維護 (1) 清理日誌:PURGE (2) 複製監控 SHOW MASTER STATUS SHOW BINLOG EVENTS SHOW BINARY LOGS SHOW SLAVE STATUS (3) 如何判斷slave是否落後於master Seconds_Behind_Master: 0 (4) 如何肯定主從節點數據是否一致? 經過表自身的CHECKSUM檢查 使用percona-tools中pt-table-checksum (5) 數據不一致的修復方法: 重複複製;