天天看點

Linux:MYSQL(十四)MYSQL異步複制,複制指定庫,加密登入

半同步複制

預設情況下,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) 資料不一緻如何修複

删除從資料庫,重新複制