1. 程式人生 > 實用技巧 >MySQL基於SSL的主從複製、半同步複製

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




(一)主從複製的架構圖

wKiom1WfGwfzcPSOAADjpHjwXyM796.jpg

1.在主資料庫上,每執行一個有可能引起資料庫發生改變的的語句,都會記錄到二進位制日誌檔案中,並把它們儲存為事件。

2.每儲存一個事件,我們就通過mysql的伺服器3306埠傳送給另外一臺伺服器

3.另外一臺伺服器把這個事件接收下來,接收的時候先儲存到本地的中繼日誌裡面

4.然後,mysql從中繼日誌檔案裡讀一個事件,然後儲存到資料檔案




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

wKioL1WbiMniAxmfAADeGozQnps665.jpg

1.MasterSlave-1在同一個機房

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

3.半同步指的是Master只保證Slave-1同步完成,Slave-2Slave-3就不管了,非同步完成,只要Slave-1返回資訊確認成功了,就可以了








一:Master配置

二: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建立具有複製許可權的使用者

GRANTREPLICATIONSLAVEON*.*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>CHANGEMASTERTO
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>SHOWSLAVESTATUS\G

wKioL1WbccqzMMhuAAHB9cxEnAo066.jpg

wKiom1WbcDiR_qW5AACTAr1Ptq8442.jpg




2.3啟動從伺服器

mysql>STARTSLAVE;
等價於
mysql>STARTSLAVEIO_Thread;
mysql>STARTSLAVESQL_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資料庫

CREATEDATABASEcaoytDB;


4.2檢視Slave的POSITION是否改變

wKiom1Wbd1bQfijtAAE9X2qP6oo598.jpg




4.3檢視Slave上的資料庫

wKioL1WbeVmzqT3gAACMHiD9np4750.jpg




4.4把從伺服器設定為只讀,但對於SUPER許可權使用者不生效

wKioL1WbeX7xY1y-AADHnmVgnIU664.jpg

mysql>SETGLOBALread_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>INSTALLPLUGINrpl_semi_sync_masterSONAME'semisync_master.so';

wKiom1WbeImQUu0iAAEDtBv2jYA013.jpg



mysql>SETGLOBALrpl_semi_sync_master_enabled=1;

wKioL1Wbe6DT_aL7AAGeTiCjjtI352.jpg


wKioL1Wbe8OxUxetAAJWE4VK-Wo938.jpg




5.3 Slave安裝rpl_semi_sync_slave

mysql>INSTALLPLUGINrpl_semi_sync_slaveSONAME'semisync_slave.so';

wKiom1WbejCRp-abAADXkI6kkG0386.jpg



mysql>SETGLOBALrpl_semi_sync_slave_enabled=1;

wKioL1WbfG_wH5qGAAEwXVPZ68g508.jpg


wKiom1WbesSzqxivAAHcOTnxBYQ147.jpg




5.4 檢視Master伺服器的狀態

mysql>SHOWGLOBALSTATUSLIKE'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/
#(umask077;opensslgenrsa-outprivate/cakey.pem2048)

wKiom1WbfviiI4RTAABrhfIIAWw983.jpg



opensslreq-new-x509-keyprivate/cakey.pem-outcacert.pem-days3650

wKioL1WbgO6hHf3iAAFE-MKm8EE522.jpg



#touchindex.txt

#echo01>serial





6.3為Master建立證書申請並由CA伺服器簽發證書

#mkdir/usr/local/mysql/ssl

#cd/usr/local/mysql/ssl/

#(umask077;opensslgenrsa-outmaster.key2048)

wKioL1WbgUCz95JUAACLGQ9T1RE767.jpg



#opensslreq-new-keymaster.key-outmaster.csr-days3650

wKioL1WbgWrgIVDEAAGJLWWGopI535.jpg



#opensslca-inmaster.csr-outmaster.crt-days3650

wKioL1WbgZnwQj8ZAAFm5cnLjEI839.jpg

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




6.4為Slave伺服器建立證書申請

#mkdir/usr/local/mysql/ssl

#cd/usr/local/mysql/ssl

#(umask077;opensslgenrsa-outslave.key2048)

wKiom1WbgMWxcgKZAACGwnKyYsQ358.jpg



#opensslreq-new-keyslave.key-outslave.csr-days3650

wKioL1WbgrSzkukUAAFwNpfjwTU311.jpg





6.5為Slave伺服器簽署證書

【Slave】

#scpslave.csr[email protected]'MasterIP':/tmp/

wKiom1WbgSCBUrbMAAAxW74iFSI505.jpg



【Master】

#opensslca-in/tmp/slave.csr-out/tmp/slave.crt-days3650

#scp/tmp/slave.crt[email protected]'SlaveIP':/usr/local/mysql/ssl/

wKiom1WbgVXA_2dWAAA1war5zQI330.jpg




6.6將CA證書拷貝到Slave伺服器併為Master拷貝一份

#scp/etc/pki/CA/cacert.pem[email protected]'SlaveIP':/usr/local/mysql/ssl/

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

wKiom1WbgYGT_STNAABIOWATai4025.jpg




6.7修改Master與Slave伺服器證書屬主、屬組為"mysql"使用者

#chown-Rmysql.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>GRANTREPLICATIONSLAVEON*.*TO'repluser'@'192.168.1.112'
IDENTIFIEDBY'replpass'REQUIRESSL;

wKioL1WbhVLi3HcPAABWeMDd1MY416.jpg




6.10測試使用加密使用者指定金鑰連線Master伺服器

#mysql-urepluser-preplpass-h192.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伺服器

CHANGEMASTERTO
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=#萬用字元的方式定義哪些表不復制








轉載於:https://blog.51cto.com/fanfusuzi/1671708