MySQL基於SSL的主從複製、半同步複製
(一)主從複製的架構圖
1.在主資料庫上,每執行一個有可能引起資料庫發生改變的的語句,都會記錄到二進位制日誌檔案中,並把它們儲存為事件。
2.每儲存一個事件,我們就通過mysql的伺服器3306埠傳送給另外一臺伺服器
3.另外一臺伺服器把這個事件接收下來,接收的時候先儲存到本地的中繼日誌裡面
4.然後,mysql從中繼日誌檔案裡讀一個事件,然後儲存到資料檔案
(二)一主多從 半同步架構圖
1.Master和Slave-1在同一個機房
2.Slave-2和Slave-3在其它機房
3.半同步指的是Master只保證Slave-1同步完成,Slave-2和Slave-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檢視主伺服器使用的是哪個二進位制日誌和事件位置
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
2.3啟動從伺服器
mysql>STARTSLAVE; 等價於 mysql>STARTSLAVEIO_Thread; mysql>STARTSLAVESQL_Thread;
2.4再次檢視從伺服器狀態
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連線主伺服器看是否能連線上
確定問題是repluser不能由從伺服器連線到主伺服器,於是想到是否是防火牆沒有開啟3306埠的原因,於是關閉防火牆service iptables stop臨時關閉,(chkconfig iptables off永久關閉),再次在Slave登入,可以登入了,再次重啟從伺服器,發現問題解決
4.1在Master上建立caoytDB資料庫
CREATEDATABASEcaoytDB;
4.2檢視Slave的POSITION是否改變
4.3檢視Slave上的資料庫
4.4把從伺服器設定為只讀,但對於SUPER許可權使用者不生效
mysql>SETGLOBALread_only=1;
4.5在主伺服器上某一個事物已經提交了,事務提交以後,相關的二進位制日誌事件應該寫到二進位制日誌檔案中,但是二進位制日誌有快取區,那也就意味著,事務提交以後,可能有些事件依然在緩衝區裡,還沒有寫到二進位制日誌裡面去,萬一這個時候,主伺服器奔潰了,從伺服器上,就不能得到相關的事件,也就意味著跟這個事務相關的某些操作還沒有複製過來,因為它沒有儲存到二進位制日誌當中,二進位制沒有,那麼中繼日誌就沒有,中繼日誌沒有,那麼這個事件就不能完整的執行,所以需要在主伺服器上設定只要事務提交,就必須立即寫到二進位制日誌當中,不要在緩衝區做任何停留,這樣就降低了主從不一致的可能性
sync_binlog=1
5.1要實現半同步需要在Master和Slave各自安裝一個外掛,這個外掛是由Google提供的,在資料庫的安裝目錄的lib/plugin/目錄下
5.2 Master上安裝rpl_semi_sync_master
mysql>INSTALLPLUGINrpl_semi_sync_masterSONAME'semisync_master.so';
mysql>SETGLOBALrpl_semi_sync_master_enabled=1;
5.3 Slave安裝rpl_semi_sync_slave
mysql>INSTALLPLUGINrpl_semi_sync_slaveSONAME'semisync_slave.so';
mysql>SETGLOBALrpl_semi_sync_slave_enabled=1;
5.4 檢視Master伺服器的狀態
mysql>SHOWGLOBALSTATUSLIKE'rpl%';
5.5當Rpl_semi_sync_master_clients為0的時候,需要重啟Slave的IO_THREAD;
mysql> STOPSLAVE IO_THREAD;
mysql> STARTSLAVE IO_THREAD;
6.1啟動Master/Slave的SSL功能
在【mysqld】節點下新增ssl
6.2將Master伺服器自己做成CA伺服器
#cd/etc/pki/CA/ #(umask077;opensslgenrsa-outprivate/cakey.pem2048)
opensslreq-new-x509-keyprivate/cakey.pem-outcacert.pem-days3650
#touchindex.txt #echo01>serial
6.3為Master建立證書申請並由CA伺服器簽發證書
#mkdir/usr/local/mysql/ssl #cd/usr/local/mysql/ssl/ #(umask077;opensslgenrsa-outmaster.key2048)
#opensslreq-new-keymaster.key-outmaster.csr-days3650
#opensslca-inmaster.csr-outmaster.crt-days3650
說明:圖片中標記的地方說要小寫,其實大小寫都行
6.4為Slave伺服器建立證書申請
#mkdir/usr/local/mysql/ssl #cd/usr/local/mysql/ssl #(umask077;opensslgenrsa-outslave.key2048)
#opensslreq-new-keyslave.key-outslave.csr-days3650
6.5為Slave伺服器簽署證書
【Slave】
#scpslave.csr[email protected]'MasterIP':/tmp/
【Master】
#opensslca-in/tmp/slave.csr-out/tmp/slave.crt-days3650 #scp/tmp/slave.crt[email protected]'SlaveIP':/usr/local/mysql/ssl/
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/
6.7修改Master與Slave伺服器證書屬主、屬組為"mysql"使用者
#chown-Rmysql.mysql/usr/local/mysql/ssl
【Master】
【Slave】
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#指定金鑰所在位置
【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
6.9在Master伺服器檢視SSL加密是否開啟;然後建立授權一個基於金鑰認證的使用者
mysql>GRANTREPLICATIONSLAVEON*.*TO'repluser'@'192.168.1.112' IDENTIFIEDBY'replpass'REQUIRESSL;
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
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';
7.從伺服器啟動起來以後會自動的啟動從伺服器執行緒連線到主伺服器,萬一從伺服器奔潰了,下次一啟動,它就會自動連線主伺服器去複製資料,而有些資料是希望在從伺服器上是想跳過去的,因為在主伺服器上出現了誤操作,比如DROP TABLE,所以不應該讓從伺服器一啟動就去連線主伺服器開始複製資料
skip-slave-start
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