mariadb主從複製:
複製:每個節點都有相同的數據集
從節點:
I/O Thread:從master請求二進制日誌事件,並保持在中繼日誌中
SQL Thread:從中繼日誌中讀取日誌事件,在本地完成重放
主節點:
dump Thread:爲每個slave的I/O Thread啓動一個dump線程,用於向其發送binary log events
特點:
1.異步複製
2.主從數據不一致比較常見
3.一主多從
4.從服務器還可以有從服務
配置過程:
主節點:
1.啓動二進制日誌
2.爲當前節點設置一個全局唯一的ID號
3.創建有複製權限的用戶賬號
replication slave,replication client
從節點:
1.啓動中繼日誌
2.位當前節點設置一個全局唯一的ID號
3.使用有複製權限的用戶賬號連接至主服務器,並啓動複製線程
複製架構中應該注意的問題:
1.限制從服務器爲只讀
在從服務器上設置read_only=ON;此限制對擁有SUPER權限的用戶均無效;
阻止所有用戶;
mysql>flush tables with read lock;
2.如何保證主從複製的事務安全:
在master節點啓用參數:
sync_binlog=ON
如果用到的爲InnoDB存儲引擎;
innodb_flush_logs_at_trx_commit=ON
inndb_support_xa=ON
在slave節點;
skip_slave_start=ON
複製過濾器
讓從節點僅複製指定的數據庫,或指定數據庫的指定表
有兩種實現方式;
1.主服務器僅向二進制日誌中記錄與特定數據庫(特定表)相關的事件;
問題:事件還原無法實現:不建議使用
binlog_do_db= #數據庫白名單列表
binlog_ignore_do #數據庫黑名單列表
2.從服務SQL_THREAD在replay中繼日誌的事件時,僅讀取與特定數據庫(特定表)相關的事件並應用於本地
問題:會造成網絡磁盤IO浪費;
replicate_do_db=
replicate_ignore_db=
replicate_do_table=
replicate_ignore_table=
replicate_wind_do_table=
replicate_wind_ignore_table=
主從複製配置:
主節點:
vi /etc/my.cnf
在[mysqld]中加入:
log-bin=mysql_bin_log #啓動二進制日誌
server-id=1 #主節點和從節點一定要不通
innodb_file_per_table=ON
skip_name_resolve=ON
重啓mariadb:systemctl restart mariadb
創建複製用戶並授權:
MariaDB [(none)]> grant replication slave,replication slave on *.* to 'repluser'@'172.16.%.%' identified by '123456'
MariaDB [(none)]> show master logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| mysql_bin_log.000001 | 30379 |
| mysql_bin_log.000002 | 1038814 |
| mysql_bin_log.000003 | 264 |
| mysql_bin_log.000004 | 264 |
| mysql_bin_log.000005 | 245 | #記住這個二進制文件名和對應的序號
+----------------------+-----------+
5 rows in set (0.00 sec)
從節點:
vi /etc/my.cnf
在[mysqld]中加入:
relay-log=relay-log
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
重啓mariadb:systemctl restart mariadb
連接主服務器:
MariaDB [(none)]> change master to master_host='172.16.6.12',master_user='repluser',master_password='123456',master_log_file='mysql_bin_log.000005',master_log_pos=245;
開始複製:
MariaDB [(none)]> start slave;
查看複製狀態:
MariaDB [(none)]> show slave status\G;
mariadb半同步複製:
主節點
MariaDB [(none)]> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1;
MariaDB [(none)]> show plugins;
MariaDB [(none)]> show global variables like '%semi%';
MariaDB [(none)]> show global status like '%semi%';
從節點:
MariaDB [(none)]> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=1;
MariaDB [(none)]> show plugins;
MariaDB [(none)]> show global variables like '%semi%';
MariaDB [(none)]> start slave