標籤:linux營運
Linux營運 第四階段 (七)MySQL REPLICATION(主從複製、半同步複製、複製過濾)
一、MySQL Replication相關概念:
1、複製的作用:輔助實現備份;高可用HA;異地容災;分攤負載(scaleout);rw-spliting(mysql proxy工作在應用程式層)。
2、master有多個CPU允許事務並存執行,但往二進位記錄檔只能一條條寫;slave比master要慢;master-slave預設非同步方式傳送。
3、半同步:僅負責最近一台slave同步成功,其它的slave不管,5.5之前不支援半同步,半同步應指定timeout間隔,若逾時則降級為非同步模式繼續工作。
4、slave-server本身可以寫操作,但在master-slave架構中不允許slave寫,因為它無法同步至其它server。
5、slave可向master做冷備份。
6、master的二進位記錄檔和slave上的中繼記錄檔在檔案大小和個數上都不會一樣,還原只能用master的二進位記錄檔,不能使用中繼記錄檔。
7、本地一定要有中繼日誌和二進位日誌;slave-side只要不做多級複製,可不要二進位記錄檔;多級複製可減輕master複製壓力;slave-side儲存引擎可用blackhole。
8、master-side若宕掉,可將slave-side提升為master(執行二進位日誌),從而實現高可用。
slave-side,IO_thread用於從主端接收dump_thread發來的二進位日誌語句然後儲存為本地的中繼日誌,SQL_thread讀中繼日誌轉為資料檔案成功後再儲存二進位日誌。
9、server-id避免迴圈複製。
10、雙主無法減輕寫操作。
11、主從架構中,不使用mysql-proxy,如何讓master寫,slave讀:讓程式(PHP開發出的程式)自身具有讀寫分離的功能;雙主模型。
12、生產環境下不建議使用雙主模型。
13、雙主模型產生的問題:兩人同時更改同一表的不同欄位或插入資料,提交後可能會導致資料庫崩潰或出現非常規錯誤。
14、資料庫server壓力大時,兩種方案:scaleout;scale on
15、scale out:根據業務分庫,每個業務涉及到的庫放到一個物理伺服器上(垂直分割),但資料有熱區,例如,100G的資料,僅1個G很BUSY,其它很閑,而這1G的資料在一個表裡;拆表(水平分割),rid(row id)。
註:能不拆則不拆否則後續問題很難排查。
16、一個從只能有一個主,一主可以有多從。
17、讀寫分離:mysql-proxy、amoeba(java),設定檔xml格式
18、coba(amoeba):資料拆分。
19、複製線程:master-side(dump)、slave-side(IO_thread、SQL_thread)
20、預設情況下MySQL的複製是非同步,Master上所有的更新操作寫入Binlog之後並不確保所有的更新都被複製到Slave之上。非同步作業雖然效率高,但是在Master/Slave出現問題的時候,存在很高資料不同步的風險,甚至可能遺失資料。
21、MySQL5.5引入半同步複製功能的目的是為了保證在master出問題的時候,至少有一台Slave的資料是完整的。在逾時的情況下也可以臨時轉入非同步複製,保障業務的正常使用,直到一台salve追趕上之後,繼續切換到半同步模式。
二、主從複製、半同步複製、資料庫複寫過濾,具體操作:
1、主從複製配置步驟:
master-side:
#vi /etc/my.cnf
[mysqld]
log-bin = master-bin (開啟二進位日誌)
log-bin-index = master-bin.index (定義二進位日誌索引檔案)
server-id = 1 (與slave-side不能一樣,避免迴圈複製)
sync_binlog = 1 (此項用於事務安全,設定事務一提交就寫入二進位記錄檔)
innodb_flush_logs_at_trx_commit = 1 (每事務同步)
innodb_file_per_table = 1 (只要支援事務的此項必開,每表一個資料表空間)
datadir = /mydata/data
log_format = mixed
>GRANT REPLICATION SLAVE ON *.* TO ‘repluser’@’192.168.1.%’ IDENTIFIED BY ‘repluser’;
>FLUSH PRIVILEGES;
slave-side:
#vi /etc/my.cnf
[mysqld]
relay-log = relay-log
relay-log-index = relay-log.index
server-id = 11
read_only = 1 (slave-side不允許寫資料,僅讀,但此項對有SUPER許可權的使用者不生效)
skip_slave_start = 1 (服務啟動不執行同步,待手動開啟IO_THREAD和SQL_THREAD,用於master-side資料出錯暫不往slave-side同步,等master-side資料正常,再手動開始同步)
>CHANGE MASTER TO MASTER_USER=’repluser’,MASTER_PASSWORD=’repluser’,MASTER_HOST=’192.168.1.222’,MASTER_LOG_FILE=’master_bin.000010’,MASTER_LOG_POS=’107’;
>START SLAVE; (也可分開執行>START SLAVE IO_THREAD;>START SLAVE SQL_THREAD;)若此步出現錯誤could notinitialization master info structure...執行>RESET SLAVE;再重新執行>CHANGE MASTER TO那條語句即可。
>SHOW SLAVE STATUS\G (查看IO_THREAD和SQL_THREAD是否為ON狀態)
>STOP SLAVE IO_THREAD; (master上資料若有問題時,可將slave-side的IO_THREAD停掉)
slave-side重啟mysqld,IO_THREAD和SQL_THREAD會自動啟動,資料目錄下/mydata/data/relay-log.info和master.info這兩個檔案是replication的基礎和前提,若不想讓服務一啟動就自動執行複製,可將這兩個檔案剪下至其它地方,再重新設定slave-side
2、配置半同步複製:
#ll /usr/local/mysql/lib/
semisync_master.so semisync_slave.so (外掛程式由google提供)
MySQL在載入並開啟Semi-sync外掛程式後,每一個事務需等待備庫接收日誌後才返回給用戶端。如果做的是小事務,兩台主機的延遲又較小,則Semi-sync可以實現在效能很小損失的情況下的零資料丟失。
master-side:
>INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
>SHOW GLOBAL VARIABLES LIKE ‘%rpl_semi%’;
rpl_semi_sync_master_enabled 設為1
rpl_semi_sync_master_timeout 預設為10S (如果主備網路故障或者備庫掛了,主庫在事務提交後等待10秒,無響應則自動轉為非同步狀態)
>SET GLOBAL rpl_semi_sync_master_enabled=1; (僅當前生效,可寫入設定檔)
slave_side:
>INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
>SHOW GLOBAL VARIABLES LIKE ‘%rpl_semi%’;
>SET GLOBAL rpl_semi_sync_slave_enabled=1;
>STOP SLAVE;
>START SLAVE;
master-side:
>SHOW GLOBAL STATUS LIKE ‘%rpl%’;
Rpl_semi_sync_master_clients和Rpl_semi_sync_master_status要為開啟狀態,半同步複製才配置成功
slave-side:
>SHOW SLAVE STATUS\G
查看Seconds_Behind_Master
3、資料庫複寫過濾:
master-side:
binlog-do-db = DB_name(白名單,僅將指定某資料庫的操作記入二進位日誌)
binlog-ignore-db = DB_name(黑名單,不記錄某資料庫的操作到二進位日誌)
註:不建議在master-side操作,否則二進位日誌不完整。
slave-side:
replicate-do-db = DB_name
replicate-ignore-db = DB_name
replicate-do-table = TABLE_name
replicate-ignore-table = TABLE_name
replicate-wild-do-table = TABLE_name (支援萬用字元%和_)
replicate-wild-ignore-table = TABLE_name
舉例:在slave-side:
#vim /etc/my.cnf
[mysqld]
添加replicate-do-db = test1
replicate-ignore-db = test2
#service mysqld restart
>SHOW SLAVE STATUS\G (查看如下兩項)
Replicate_Do_DB: test1
Replicate_Ignore_DB: test2
本篇是學習《馬哥網路視頻》做的筆記。
本文出自 “Linux營運重痛點學習筆記” 部落格,謝絕轉載!
第四階段 (七)MySQL REPLICATION(主從複製、半同步複製、複製過濾)