(一)主從複製的架構圖mysql
1.在主數據庫上,每執行一個有可能引發數據庫發生改變的的語句,都會記錄到二進制日誌文件中,並把它們保存爲事件。linux
2.每保存一個事件,咱們就經過mysql的服務器3306端口發送給另一臺服務器sql
3.另一臺服務器把這個事件接收下來,接收的時候先保存到本地的中繼日誌裏面數據庫
4.而後,mysql從中繼日誌文件裏讀一個事件,而後保存到數據文件緩存
(二)一主多從 半同步架構圖bash
1.Master和Slave-1在同一個機房服務器
2.Slave-2和Slave-3在其它機房架構
3.半同步指的是Master只保證Slave-1同步完成,Slave-2和Slave-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查看主服務器使用的是哪一個二進制日誌和事件位置
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
2.3啓動從服務器
mysql >START SLAVE; 等價於 mysql >START SLAVE IO_Thread; mysql >START SLAVE SQL_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數據庫
CREATE DATABASEcaoytDB;
4.2查看Slave的POSITION是否改變
4.3查看Slave上的數據庫
4.4把從服務器設置爲只讀,但對於SUPER權限用戶不生效
mysql>SET GLOBAL read_only=1;
4.5在主服務器上某一個事物已經提交了,事務提交之後,相關的二進制日誌事件應該寫到二進制日誌文件中,可是二進制日誌有緩存區,那也就意味着,事務提交之後,可能有些事件依然在緩衝區裏,尚未寫到二進制日誌裏面去,萬一這個時候,主服務器奔潰了,從服務器上,就不能獲得相關的事件,也就意味着跟這個事務相關的某些操做尚未複製過來,由於它沒有保存到二進制日誌當中,二進制沒有,那麼中繼日誌就沒有,中繼日誌沒有,那麼這個事件就不能完整的執行,因此須要在主服務器上設置只要事務提交,就必須當即寫到二進制日誌當中,不要在緩衝區作任何停留,這樣就下降了主從不一致的可能性
sync_binlog=1
5.1要實現半同步須要在Master和Slave各自安裝一個插件,這個插件是由Google提供的,在數據庫的安裝目錄的lib/plugin/目錄下
5.2 Master上安裝rpl_semi_sync_master
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;
5.3 Slave安裝rpl_semi_sync_slave
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1;
5.4 查看Master服務器的狀態
mysql> SHOW GLOBAL STATUS LIKE '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/ # (umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
# 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)
# openssl req -new -key master.key -out master.csr -days 3650
# openssl ca -in master.csr -out master.crt -days 3650
說明:圖片中標記的地方說要小寫,其實大小寫都行
6.4爲Slave服務器建立證書申請
# mkdir /usr/local/mysql/ssl # cd /usr/local/mysql/ssl # (umask 077;openssl genrsa -out slave.key 2048)
# openssl req -new -key slave.key -out slave.csr -days 3650
6.5爲Slave服務器簽署證書
【Slave】
# scp slave.csr root@'Master IP':/tmp/
【Master】
# openssl ca -in /tmp/slave.csr -out /tmp/slave.crt -days 3650 # scp /tmp/slave.crt root@'Slave IP':/usr/local/mysql/ssl/
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/
6.7修改Master與Slave服務器證書屬主、屬組爲"mysql"用戶
# chown -R mysql.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>GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.112' IDENTIFIED BY'replpass' REQUIRE SSL;
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
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';
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= #通配符的方式定義哪些表不復制