第四階段 (七)MySQL REPLICATION(主從複製、半同步複製、複製過濾)

來源:互聯網
上載者:User

標籤: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(主從複製、半同步複製、複製過濾)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.