mysql半同步複製

  1. 數據庫配置

    1.1.半同步複製的概念:

    1.當Slave主機連接到Master時,能夠查看其是否處於半同步複製的機制。

    2.當Master上開啓半同步複製的功能時,至少應該有一個Slave開啓其功能。此時,一個線程在Master上提交事務將受到阻塞,直到得知一個已開啓半同步複製功能的Slave已收到此事務的所有事件,或等待超時。

    3.當一個事務的事件都已寫入其relay-log中且已刷新到磁盤上,Slave纔會告知已收到。

    4.如果等待超時,也就是Master沒被告知已收到,此時Master會自動轉換爲異步複製的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換爲半同步複製的機制。

    5.半同步複製的功能要在Master,Slave都開啓,半同步複製纔會起作用;否則,只開啓一邊,它依然爲異步複製。

    1.2.半同步說明

    在一主多從的場景中,主服務器會以同步的方式,只等待一臺從服務器複製完成並返回成功信息後才停止等待過程,但是在超時後會自動降級爲異步模式。

    1.3.同步,異步,半同步複製的比較:

    同步複製:Master提交事務,直到事務在所有的Slave都已提交,此時纔會返回客戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。

    異步複製:當Slave準備好纔會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。

    半同步複製:半同步複製工作的機制處於同步和異步之間,Master的事務提交阻塞,只要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它只是接收,並不用等其完全執行且提交。

    1.4.配置

    環境 :多實例 主從同步3306 3307

    在主從複製的基礎上,只需執行如下操作即可。

    # On Master

    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';#插件

    mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #啓動模塊

    mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #設置超時時間

    # On Slave

    mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #插件

    mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #啓動模塊

    mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; #重啓進程使其模塊生效

    2.配置文件配置

    如果需要開機時,自動能夠實現半同步則需要在Master和Slave的my.cnf中編輯:

    # On Master

    [mysqld]

    rpl_semi_sync_master_enabled=1 #啓動模塊

    rpl_semi_sync_master_timeout=1000 #此單位是毫秒

    # On Slave

    [mysqld]

    rpl_semi_sync_slave_enabled=1

    配置完後需要重啓服務

    3.查看是否成功

    查看從服務器上的semi_sync是否開啓:

    mysql> SHOW GLOBAL STATUS LIKE "rpl_semi%";

    查看主服務器上的semi_sync是否開啓,注意clients 變爲1 ,證明主從半同步複製連接成功:

    Rpl_semi_sync_master_no_tx:查看有多少事務沒有用半同步複製的機制進行復制。

    Rpl_semi_sync_master_yes_tx:查看有多少事務是通過半同步複製機制成功複製。

    rpl_semi_sync_master_timeout:是控制Master等待多長時間被告知Slave已收到,超時時間。

    4.證明:

    將超時時間改爲0;再測試,這個時候寫入庫,看看半同步了多少事務,看那些沒同步,查看效果,進行比較。

    mysql> SET GLOBAL rpl_semi_sync_master_timeout = 0;

    Query OK, 0 rows affected (0.00 sec)

    mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

    +--------------------------------------------+-------+

    | Variable_name | Value |

    +--------------------------------------------+-------+

    | Rpl_semi_sync_master_clients | 1 |

    | Rpl_semi_sync_master_net_avg_wait_time | 12622 |

    | Rpl_semi_sync_master_net_wait_time | 12622 |

    | Rpl_semi_sync_master_net_waits | 1 |

    | Rpl_semi_sync_master_no_times | 1 |

    | Rpl_semi_sync_master_no_tx | 1 |

    | Rpl_semi_sync_master_status | ON |

    | Rpl_semi_sync_master_timefunc_failures | 0 |

    | Rpl_semi_sync_master_tx_avg_wait_time | 0 |

    | Rpl_semi_sync_master_tx_wait_time | 0 |

    | Rpl_semi_sync_master_tx_waits | 0 |

    | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

    | Rpl_semi_sync_master_wait_sessions | 0 |

    | Rpl_semi_sync_master_yes_tx | 0 |

    | Rpl_semi_sync_slave_status | OFF |

    +--------------------------------------------+-------+

    15 rows in set (0.00 sec)

    mysql> create database yhg1111;

    Query OK, 1 row affected (0.01 sec)

    mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

    +--------------------------------------------+-------+

    | Variable_name | Value |

    +--------------------------------------------+-------+

    | Rpl_semi_sync_master_clients | 1 |

    | Rpl_semi_sync_master_net_avg_wait_time | 8908 |

    | Rpl_semi_sync_master_net_wait_time | 17816 |

    | Rpl_semi_sync_master_net_waits | 2 |

    | Rpl_semi_sync_master_no_times | 1 |

    | Rpl_semi_sync_master_no_tx | 1 |

    | Rpl_semi_sync_master_status | ON |

    | Rpl_semi_sync_master_timefunc_failures | 0 |

    | Rpl_semi_sync_master_tx_avg_wait_time | 0 |

    | Rpl_semi_sync_master_tx_wait_time | 0 |

    | Rpl_semi_sync_master_tx_waits | 0 |

    | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

    | Rpl_semi_sync_master_wait_sessions | 0 |

    | Rpl_semi_sync_master_yes_tx | 1 |

    | Rpl_semi_sync_slave_status

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章