MySQL基於SSL的主從複製、半同步複製




(一)主從複製的架構圖mysql

wKiom1WfGwfzcPSOAADjpHjwXyM796.jpg

1.在主數據庫上,每執行一個有可能引發數據庫發生改變的的語句,都會記錄到二進制日誌文件中,並把它們保存爲事件。linux

2.每保存一個事件,咱們就經過mysql的服務器3306端口發送給另一臺服務器sql

3.另一臺服務器把這個事件接收下來,接收的時候先保存到本地的中繼日誌裏面數據庫

4.而後,mysql從中繼日誌文件裏讀一個事件,而後保存到數據文件緩存




(二)一主多從 半同步架構圖bash

wKioL1WbiMniAxmfAADeGozQnps665.jpg

1.MasterSlave-1在同一個機房服務器

2.Slave-2Slave-3在其它機房架構

3.半同步指的是Master只保證Slave-1同步完成,Slave-2Slave-3就無論了,異步完成,只要Slave-1返回信息確認成功了,就能夠了異步








一:Master配置ide

二:Slave配置

三:錯誤

四:驗證是否主從複製

五:半同步複製

六:基於SSL的複製

七:skip-slave-start參數

八:複製過濾







1.1修改/etc/my.cnf

log_bin=/MySQL_BIN_LOG/master-bin
log_bin_index=/MySQL_BIN_LOG/maste-bin.index
binlog_format=mixed
server-id= 1
innodb_file_per_table=1



1.2建立具備複製權限的用戶

GRANTR EPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.112' IDENTIFIEDBY 'replpass';




2.1修改/etc/my.cnf

2.1.1添加配置(中繼日誌)

relay_log=/MySQL_BIN_LOG/relay-log
relay_log_index=/MySQL_BIN_LOG/relay-log.index
server-id= 2


 

2.1.2關閉二進制日誌

#log_bin=/MySQL_BIN_LOG/mysql-bin



2.2鏈接到主服務器執行復制,並指定相關條件

2.2.1查看主服務器使用的是哪一個二進制日誌和事件位置

wKiom1Wbbyyj8OgbAADOAp_1xHA141.jpg



2.2.2執行鏈接到主服務器,並指定從什麼地方複製

mysql>CHANGE MASTER TO 
      MASTER_HOST='192.168.1.111', 
      MASTER_USER='repluser',
      MASTER_PASSWORD='replpass',
      MASTER_LOG_FILE='master-bin.000001',
      MASTER_LOG_POS=342;




2.2.3查看從服務器狀態

mysql>SHOW SLAVE STATUS \G

wKioL1WbccqzMMhuAAHB9cxEnAo066.jpg

wKiom1WbcDiR_qW5AACTAr1Ptq8442.jpg




2.3啓動從服務器

mysql >START SLAVE;
    等價於
mysql >START SLAVE IO_Thread;
mysql >START SLAVE SQL_Thread;




2.4再次查看從服務器狀態

wKioL1WbdhvifvjWAAB09KmjKaU396.jpg




3.分析以及解決錯誤

3.1從新到Master服務器修改密碼,並執行FLUSH PRIVILEGES;並在Slave重啓從服務器STOP SLAVE; START SLAVE;發現問題並無解決,說明不是密碼錯誤緣由致使的


3.2查看selinux的狀態,若是是enabled,則執行setenforce 0臨時關閉,永久關閉須要編輯/etc/sysconfig/selinux文件進行修改

# /usr/sbin/sestatus -v


3.3在Slave服務器上使用repluser鏈接主服務器看是否能鏈接上

wKioL1WbeJLRGzF9AAB0wyfV9zk097.jpg

肯定問題是repluser不能由從服務器鏈接到主服務器,因而想到是不是防火牆沒有打開3306端口的緣由,因而關閉防火牆service iptables stop臨時關閉,(chkconfig iptables off永久關閉),再次在Slave登陸,能夠登陸了,再次重啓從服務器,發現問題解決



4.1在Master上建立caoytDB數據庫

CREATE DATABASEcaoytDB;


 

 

4.2查看Slave的POSITION是否改變

wKiom1Wbd1bQfijtAAE9X2qP6oo598.jpg




4.3查看Slave上的數據庫

wKioL1WbeVmzqT3gAACMHiD9np4750.jpg




4.4把從服務器設置爲只讀,但對於SUPER權限用戶不生效

wKioL1WbeX7xY1y-AADHnmVgnIU664.jpg

mysql>SET GLOBAL read_only=1;




4.5在主服務器上某一個事物已經提交了,事務提交之後,相關的二進制日誌事件應該寫到二進制日誌文件中,可是二進制日誌有緩存區,那也就意味着,事務提交之後,可能有些事件依然在緩衝區裏,尚未寫到二進制日誌裏面去,萬一這個時候,主服務器奔潰了,從服務器上,就不能獲得相關的事件,也就意味着跟這個事務相關的某些操做尚未複製過來,由於它沒有保存到二進制日誌當中,二進制沒有,那麼中繼日誌就沒有,中繼日誌沒有,那麼這個事件就不能完整的執行,因此須要在主服務器上設置只要事務提交,就必須當即寫到二進制日誌當中,不要在緩衝區作任何停留,這樣就下降了主從不一致的可能性

sync_binlog=1

wKiom1WbeCew_AOhAAAra8s4_W4712.jpg

wKiom1Wbd_yQO2fLAACVF9MUQEM281.jpg




5.1要實現半同步須要在Master和Slave各自安裝一個插件,這個插件是由Google提供的,在數據庫的安裝目錄的lib/plugin/目錄下

wKioL1WbeinwTtJgAAJKPOpI0rc600.jpg




5.2 Master上安裝rpl_semi_sync_master

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

wKiom1WbeImQUu0iAAEDtBv2jYA013.jpg



mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;

wKioL1Wbe6DT_aL7AAGeTiCjjtI352.jpg


wKioL1Wbe8OxUxetAAJWE4VK-Wo938.jpg




5.3 Slave安裝rpl_semi_sync_slave

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

wKiom1WbejCRp-abAADXkI6kkG0386.jpg



mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1;

wKioL1WbfG_wH5qGAAEwXVPZ68g508.jpg


wKiom1WbesSzqxivAAHcOTnxBYQ147.jpg




5.4 查看Master服務器的狀態

mysql> SHOW GLOBAL STATUS LIKE 'rpl%';

wKiom1WbeyjRmCbXAAG0KjfI_Go497.jpg




5.5當Rpl_semi_sync_master_clients爲0的時候,須要重啓Slave的IO_THREAD;

mysql> STOPSLAVE IO_THREAD;

mysql> STARTSLAVE IO_THREAD;




6.1啓動Master/Slave的SSL功能

wKioL1WbfT3ibS_qAAC_qHTiWWE821.jpg


在【mysqld】節點下添加ssl


wKiom1Wbfp7zUhjVAABkGW5rRdc032.jpg

wKiom1Wbfr2SX2rFAAC15Cd4HuQ573.jpg





6.2將Master服務器本身作成CA服務器

# cd /etc/pki/CA/
# (umask 077;openssl genrsa -out private/cakey.pem 2048)

wKiom1WbfviiI4RTAABrhfIIAWw983.jpg



openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650

wKioL1WbgO6hHf3iAAFE-MKm8EE522.jpg



# touch index.txt

# echo 01 > serial





6.3爲Master建立證書申請並由CA服務器簽發證書

# mkdir /usr/local/mysql/ssl

# cd /usr/local/mysql/ssl/

# (umask 077;openssl genrsa -out master.key 2048)

wKioL1WbgUCz95JUAACLGQ9T1RE767.jpg



# openssl req -new -key master.key -out master.csr -days 3650

wKioL1WbgWrgIVDEAAGJLWWGopI535.jpg



# openssl ca -in master.csr -out master.crt -days 3650

wKioL1WbgZnwQj8ZAAFm5cnLjEI839.jpg

說明:圖片中標記的地方說要小寫,其實大小寫都行




6.4爲Slave服務器建立證書申請

# mkdir /usr/local/mysql/ssl

# cd /usr/local/mysql/ssl

# (umask 077;openssl genrsa -out slave.key 2048)

wKiom1WbgMWxcgKZAACGwnKyYsQ358.jpg



# openssl req -new -key slave.key -out slave.csr -days 3650

wKioL1WbgrSzkukUAAFwNpfjwTU311.jpg





6.5爲Slave服務器簽署證書

【Slave】

# scp slave.csr root@'Master IP':/tmp/

wKiom1WbgSCBUrbMAAAxW74iFSI505.jpg



【Master】

# openssl ca -in /tmp/slave.csr -out /tmp/slave.crt -days 3650

# scp /tmp/slave.crt root@'Slave IP':/usr/local/mysql/ssl/

wKiom1WbgVXA_2dWAAA1war5zQI330.jpg




6.6將CA證書拷貝到Slave服務器併爲Master拷貝一份

# scp /etc/pki/CA/cacert.pem root@'Slave IP':/usr/local/mysql/ssl/

# cp /etc/pki/CA/cacert.pem /usr/local/mysql/ssl/

wKiom1WbgYGT_STNAABIOWATai4025.jpg




6.7修改Master與Slave服務器證書屬主、屬組爲"mysql"用戶

# chown -R mysql.mysql /usr/local/mysql/ssl


Master

wKioL1Wbg5HxmYfzAACkIXtrov4215.jpg



Slave

wKiom1Wbgd3RwhyaAACtVG_ujI4929.jpg




6.8在Master與Slave服務器修改主配置文件開啓SSL加密功能

Master

ssl                          #開啓SSL功能
ssl_ca  = /usr/local/mysql/ssl/cacert.pem      #指定CA文件位置
ssl_cert = /usr/local/mysql/ssl/master.crt      #指定證書文件位置
ssl_key  = /usr/local/mysql/ssl/master.key      #指定密鑰所在位置


wKiom1WbghKBFOeQAACGfrSPFMM762.jpg




Slave

ssl_ca  = /usr/local/mysql/ssl/cacert.pem
ssl_cert = /usr/local/mysql/ssl/slave.crt
ssl_key  = /usr/local/mysql/ssl/slave.key

wKioL1WbhM_hXPZmAACA-B6xgwM724.jpg




6.9在Master服務器查看SSL加密是否開啓;而後建立受權一個基於密鑰認證的用戶

mysql>GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.112' 
      IDENTIFIED BY'replpass' REQUIRE SSL;

wKioL1WbhVLi3HcPAABWeMDd1MY416.jpg




6.10測試使用加密用戶指定密鑰鏈接Master服務器

# mysql -urepluser -preplpass -h 192.168.1.111 
    --ssl-ca=/usr/local/mysql/ssl/cacert.pem
    --ssl-cert=/usr/local/mysql/ssl/slave.crt
    --ssl-key=/usr/local/mysql/ssl/slave.key

wKiom1Wbg76hNIyFAACSYtgrMM0371.jpg





6.11鏈接Master服務器

CHANGE MASTER TO  
MASTER_HOST='192.168.1.111',  
MASTER_USER='repluser',  
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='master-bin.000006',
MASTER_LOG_POS=107,  
MASTER_SSL=1,  
MASTER_SSL_CA='/usr/local/mysql/ssl/cacert.pem',
MASTER_SSL_CERT='/usr/local/mysql/ssl/slave.crt',
MASTER_SSL_KEY='/usr/local/mysql/ssl/slave.key';

wKiom1Wbg_eDzV58AAD7aEYubes313.jpg




7.從服務器啓動起來之後會自動的啓動從服務器線程鏈接到主服務器,萬一從服務器奔潰了,下次一啓動,它就會自動鏈接主服務器去複製數據,而有些數據是但願在從服務器上是想跳過去的,由於在主服務器上出現了誤操做,好比DROP TABLE,因此不該該讓從服務器一啓動就去鏈接主服務器開始複製數據

skip-slave-start

wKioL1WbhfGRgEbmAAAk36_5ET0279.jpg






8.1在Master端和Slave分別提供了兩類服務器變量用於定義實現複製過濾功能

 

 

8.2【Master】

binlog-do-db=           #白名單,僅將指定數據庫的相關修改操做記錄二進制日誌

binlog-ignore-db=       #黑名單,忽略哪些


雖然有這樣的定義,可是不建議在Master端使用,這樣會致使Master和Slave兩端的二進制日誌不一致

 




8.3【Slave】

replicate-do-db=           #白名單,只複製那個數據庫的事件

replicate-ignore-db=        #黑名單,忽略哪些數據庫的事件

replicate-do-table=         #僅複製哪些表

replicate-do-table=         #忽略哪些表
 
 
%和_  (百分號和下劃線)

replicate-wild-do-table=     #通配符的方式定義哪些表複製

replicate-wild-ignore-table=   #通配符的方式定義哪些表不復制
相關文章
相關標籤/搜索