半同步複制
預設情況下,MySQL的複制功能是異步的,異步複制可以提供最佳的性能,主庫把binlog日志發送給從庫即結束,并不驗證從庫是否接收完畢。這意味着當主伺服器或從伺服器端發生故障時,有可能從伺服器沒有接收到主伺服器發送過來的binlog日志,這就會造成主伺服器和從伺服器的資料不一緻,甚至在恢複時造成資料的丢失
半同步複制實作:
實驗準備準備環境
- 主伺服器:192.168.32.7
vim /etc/my.cnf
[mysqld]
server=1
log_bin
skip_name_reslove
innodb_file_per_table
vim master.sql
grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
mysql < master.sql
mysql -e 'show master logs' 檢視日志位置
- 從伺服器1:192.168.32.17 從伺服器2:192.168.32.27
vim salve.sql
CHANGE MASTER TO
MASTER_HOST='192.168.32.7',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=400;
start slave;
show slave status\G
mysql < salve.sql
mysql -e 'show slave status\G'
scp slave.sql 192.168.32.27:
開啟半同步配置
- 主伺服器配置:
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安裝插件
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; 開啟半同步
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000; 逾時長為1s
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%‘;
- 從伺服器配置:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 安裝插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; 開啟半同步
注意:若需長期有效需寫入配置檔案,
檢視是否開啟,如未生效可stop slave後start slave重新開啟程序
## 關閉程序後 測試:
insert teachers values(6,'d',30,'F');
真實環境:
master—slave(半同步)—slave1,2,3
MySQL複制 複制指定庫和表
讓從節點僅複制指定的資料庫,或指定資料庫的指定表
###兩種實作方式:
(1) 基于伺服器選項
binlog_do_db = 資料庫白名單清單,多個資料庫需多行實作
binlog_ignore_db = 資料庫黑名單清單
- 用法:寫入配置檔案 binlog_do_db=hellodb
- 原理:主伺服器僅向二進制日志中記錄與特定資料庫相關的事件
- 問題:基于二進制還原将無法實作;不建議使用
- 注意:此項和binlog_format相關
- 參看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
(2)基于變量複制
- 從伺服器上的複制過濾器相關變量:
replicate_do_db= 指定複制庫的白名單
replicate_ignore_db= 指定複制庫黑名單
replicate_do_table= 指定複制表的白名單
replicate_ignore_table= 指定複制表的黑名單
replicate_wild_do_table= foo%.bar% 支援通配符
replicate_wild_ignore_table=
- 用法:set global replicate_do_db='hellodb'
- 注意:需要切庫後插入測試
- 原理:從伺服器SQL_THREAD在replay中繼日志中的事件時,僅讀取與特定資料庫(特定表)相關的事件并應用于本地
- 問題:會造成網絡及磁盤IO浪費
MySQL複制加密
-
基于SSL複制:
在預設的主從複制過程或遠端連接配接到MySQL/MariaDB所有的連結通信中的資料都是明文的,外網裡通路資料或則複制,存在安全隐患。通過SSL/TLS加密的方式進行複制的方法,來進一步提高資料的安全性
-
配置實作:
參看:https://mariadb.com/kb/en/library/replication-with-secure-connections/
- 流程步驟:
1.主伺服器開啟SSL:[mysqld] 加一行ssl
2.主伺服器配置證書和私鑰;并且建立一個要求必須使用SSL連接配接的複制賬号
3.從伺服器使用CHANGER MASTER TO 指令時指明ssl相關選項
- Master伺服器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key
- Slave伺服器配置
mysql>
CHANGE MASTER TO
MASTER_HOST='MASTERIP',
MASTER_USER='rep',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
完整實驗:
生成證書準備流程:
192.168.32.7為主伺服器
192.168.32.17為從伺服器
192.168.32.27做CA并申請證書,之後scp給主從伺服器
cd /etc/my.cnf.d/
mkdir ssl
cd ssl
openssl genrsa 2048 >cakey.pem 生成2048位ca私鑰檔案
openssl rep -new -x509 -key cakey.epm -out cacert.pem -days 3650 給自己生成一個證書
CN
beijing
beijing
dushan
opt
ca.dushan.com
ll
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr 生成證書并簽名
CN
beijing
beijing
dushan
opt
master.dushan.com
ll
openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt 頒發主伺服器證書
ll
openssl req -newkey rsa:1024 -days 100 -nodes -keyout slave.key > slave.csr 生成證書并簽名
CN
beijing
beijing
dushan
opt
slave.dushan.com
ll
openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt 頒發從伺服器證書
ll
scp cacert.pem master.crt master.key 192.168.32.7:/etc/my.cnf.d/ssl/
scp cacert.pem slave.crt slave.key 192.168.32.17:/etc/my.cnf.d/ssl/
檢視ssl是否開啟
show variables like '%ssl%';
建立強制加密賬号
grant replication slave on *.* to ssluser@'192.168.32.%' identified by 'centos' require ssl;
Master伺服器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key
在從伺服器登入測試
mysql --ssl-ca=cacert.pem --ssl-cert=slave.crt --ssl-key=slave.key -ussluser -pcentos -h192.168.32.7
在主伺服器上檢視位置資訊
show master logs;
mariadb-bin.00005 412
清空從伺服器之前同步資訊
mysql>stop slave;
reset slave all;
cd /var/lib/mysql
ll 進入資料庫檔案夾檢視master.info資訊是否被清空
在從伺服器重新配置同步配置
mysql>
CHANGE MASTER TO
MASTER_HOST='192.168.32.7',
MASTER_USER='ssluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.00005',
MASTER_LOG_POS=412,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
start slave;
show slave status\G
複制的監控和維護
(1) 清理日志
PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }
RESET MASTER
RESET SLAVE
(2) 複制監控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
SHOW PROCESSLIST
(3) 從伺服器是否落後于主服務
Seconds_Behind_Master: 0
(4) 如何确定主從節點資料是否一緻
percona-tools
(5) 資料不一緻如何修複
删除從資料庫,重新複制