免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2636 | 回复: 0
打印 上一主题 下一主题

[ZT]MySQL Master-Master Replication Manager 問答 [复制链接]

论坛徽章:
160
酉鸡
日期:2013-10-08 17:08:46丑牛
日期:2013-11-15 14:57:11双鱼座
日期:2014-02-14 01:12:01狮子座
日期:2014-03-27 10:36:09子鼠
日期:2014-05-22 13:34:36戌狗
日期:2014-07-29 14:29:35酉鸡
日期:2014-08-12 08:52:06水瓶座
日期:2014-08-12 12:18:45午马
日期:2014-10-30 22:49:57金牛座
日期:2014-11-19 09:52:57天蝎座
日期:2014-11-20 11:16:17射手座
日期:2014-11-27 17:52:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-23 17:44 |只看该作者 |倒序浏览
Tsung's Blog
Tsung
Tsung's Blog
is about »

MySQL Master-Master Replication Manager 完結篇, 就來做個問與答吧~(這三篇文章都是 MMM 1.0 版)
不知道什麼是 MySQL Master-Master Replication Manager(MMM) 的, 請先看下述文章:

MMM 的問與答
將其中一台 MySQL 關掉, Mon 該如何動作?
  • Mon 會自動把 IP 轉到另外一台, 等 MySQL 回復後自然會還原.
  • mmm_control show # 若沒有自動還原
  • mmm_control set_online db1 # 將沒有還原(假設是 db1)那台的設定上線.
    先將 mmmd_agent kill 掉, 再把 MySQL kill 掉, 然後再把 MySQL start, Mon 會如何動作?
  • 因為 Mon 是自動去連 MySQL 的, 所以不會因為 mmmd_agent 砍掉而有影響, MySQL kill 掉時, Mon 一樣會知道那台是掛掉的,(master/HARD_OFFLINE)
  • 此時於 另外一台 MySQL 寫的資料, 於此台 MySQL start 時, 會自動寫入, 不過 Mon 無法將這台回復的機器登記入可以讀寫,(master/AWAITING_RECOVERY)
  • 因為這台的 mmmd_agent 還沒起來, 沒辦法知道是否已經跟上 replication 沒.
  • 所以要先啟動 mmmd_agent, Mon 再 mmm_control set_online db1.
    Mon 的 mmmd_mon kill 掉, 對其它有沒有影響?
    沒有影響, /usr/local/mmm/scripts/init.d/mmm_mon start 即可.
    Master 測試重新開機 shutdown -n -f -r now
    重新開機完後的處理步驟:

    • 於 重開機的機器(Master)
    • /etc/init.d/mysql start # 這種重開法, MySQL 不一定能正常啟動.
    • ps aux | grep mmm # 看 mmmd_agent 是否有正常啟動.
    • 於 Mon 的機器
    • mmm_control show # 會發現啟動後, master 的狀態會由 HARD_OFFLINE -> AWAITING_RECOVERY
    • mmm_control set_online db1 # 讓它啟動接受服務.

    Mon 測試重新開機 shutdown -n -f -r now
    重新開機完後的處理步驟:
    於 Mon 的機器
  • ps aux | grep mmm # 看 mmm_mon 是否有正常啟動, 沒有正常啟動就執行 /etc/init.d/mmm_mon start
  • mmm_control show # 看監控的機器是否都還正常
    Master 死掉, 然後造成 Reader 和 Writer 互換, 若 Mon 重新啟動會回復原始設定嗎? 若不會, 想要互換要怎麼換?
  • 不會回復原始設定, 用的是最後跑的狀態.
  • 想要將設定的互換, 步驟如下:
  • master mysql restart
  • slave mysql> start slave;
  • 這樣子就會互換了 (因為 Master MySQL restart, Slave 那台 replication 會停掉, 所以 Mon 會將所有 IP 都指向 Master, 再將 Slave replication 搞定, 就會再把 reader 指回 slave 了)
  • 設定互換的另一種方法, 就是把另外一台先設 mmm_control set_offline, 再 set_online 即可.
  • 設定互換的另一種方法, 使用 mmm_control move_role writer db1, 設定設回 Writer 去.(不過此方法我測試似乎不會動)
    寫入, 讀取應該要用的IP, 要用本機IP 還是設定的 db-r, db-w IP?
    寫入/讀取要用的 IP, 是要用設定的 db-r, db-w 的IP, 設定的 db-r 的 IP(只要 Writer 沒有指到此 IP), INSERT/UPDATE/DELETE 的動作會把你擋掉, 會出現 ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement 的錯誤訊息.(不過 CREATE/DROP Table 等動作不會被擋掉.)
    在 Master 上的 mmm/bin/* 有很多檔案, 要怎麼讓他可以使用?
    要先讓它有存取 MySQL 的權限, 於 mysql> 就這樣子下: (帳號/密碼/IP 請自行修改)
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.181' identified by 'RepAgent';
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.182' identified by 'RepAgent';
  • mysql> FLUSH PRIVILEGES;
  • 不過 mysql_deny_write 並不會讓它不能寫入.(此程式會幫你執行: set global read_only=1, 不過 CREATE/DROP 還是可以使用. XD)
    想要一台 Mon 管理多台 agent 要怎麼設定?
  • 將 /usr/local/mmm/etc/mmm_mon.conf 改名成 mmm_mon_c1.conf
  • 就可以 mmm_control @c1 show 來管理 c1 的 Cluster, 就可由此來做其它 Cluster 的 Mon 設定囉~
    mmm_control 哪些狀態可以將機器 set_online?
    master/AWAITING_RECOVERY 或 master/ADMIN_OFFLINE 的狀態.
    mmm_contorl 全部狀態有哪些?
    mmm_control show 會看到機器有下述的狀態: (原文可見:
    HowToUse - mysql-master-master
    )

    • master/ONLINE - 此機器沒有任何問題, 正常執行.

    • master/AWAITING_RECOVERY - 此機器的 MySQL 可能有重開, 並沒有被設定上線, 於 replication 跟上進度後(若 replication 有損壞的狀況, 需自行修復), 使用 mmm_control @C1 set_online 機器名稱 的命令讓他上線.
    • master/ADMIN_OFFLINE - 管理者設定讓這台機器下線.
    • master/HARD_OFFLINE - 此 MySQL 是沒辦法 ping 到, 可能是網路問題或者機器當掉或重開等等.
    • master/REPLICATION_FAIL - MySQL 的 replication error. 遇到先修復 replication 的狀況, 才能讓它再上線.
    • master/REPLICATION_DELAY - MySQL 死掉時, 可能 MMM 自動移動 reader 的角色到 Master 去, 但是 Reader 起來後, Replication 還根不上進度, 需要等它跟上才能恢復上線.

    於 lvm 的環境下, 如何快速建立一台 Master (Master-Master) 架構?
  • LVM 安裝: apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs # LVM 詳細安裝步驟可參考:
    A Beginner's Guide To LVM

  • 設定好 /usr/local/mmm/etc/mmm_lvm.conf
  • 就可以於 db2# mmm_clone --host db1 --clone-mode master-master (此指令會將 db2 的 MySQL 停掉, 再 scp 過來)
  • 註: 不過這個我也沒試過.
    讀取都是透過 Mon 指定的那兩個 Writer/Reader 的 IP, 但是 Mon 死掉的話, 會不會就無法寫入/讀取?
    不會, 因為 Mon 是透過 Address Resolution Protocol (ARP), 而 ARP 在每台機器是都會有暫存區, 存: IP  Mac Address 的資料, 所以 Mon 死掉在 ARP Cache 過期前, 都不會有影響.
    常見 FAQ


    by jon at 7:52 PM
    under
    news-technology


    » MySQL Master-Master Replication Manager(2) - 環境建置、架設
    前一篇
    MySQL Master-Master Replication Manager(1) - 簡介
    看完後, 再來就是要建置這個環境囉~(註: 目前 MMM 是 stable 1.0 版)
    此文假設已經玩過 MySQL Replication, 所以 Replication 設定的部份不多做解釋, 若有不懂的, 可以參考:
    MySQL 設定 Replication (Master - Slave)

    MySQL Master-Master Replication Manager 前置作業
    MySQL Master-Master 的架構, 需要準備的資訊如下:

    • 機器 3台以上(最少3台): 2台做 MySQL Server, 1台做 Monitor(監控機器可與 Apache 等共用即可).
    • IP 5個以上(2N+1): MySQL Server 有幾台, 需要的 IP 是 MySQL Server 台數 x 2, 再加上 Monitor 要一個 IP.

    MMM 前置作業手上該有的資訊:

    • db-1  192.168.1.181
    • db-2  192.168.1.182
    • db-mon  192.168.1.183
    • db-r  192.168.1.184 # 這個不用設進 db-1、db-2, db-mon 會自動設給它.(但需先決定db-1, db-2 哪台要先當 reader 或 writer)
    • db-w  192.168.1.185 # 這個不用設進 db-1、db-2, db-mon 會自動設給它.(但需先決定db-1, db-2 哪台要先當 reader 或 writer)
    • MySQL Replication 要設定的帳號: replication、密碼: slave.                                                                     
    • Monitor 存取 MySQL 需要的帳號: rep_monitor、密碼: RepMonitor.                                                                 
    • MySQL Agent 要設定的帳號: rep_agent、密碼: RepAgent.                                                                          

    開始之前, 除了上述該有的資訊外, 手上應該要有 3台機器, 3台機器設定分別如下:

    • db-1  192.168.1.181
    • db-2  192.168.1.182
    • db-mon  192.168.1.183
    • 若有要用到 mmm_clone, mmm_backup, mmm_restore 等功能, 需要 LVM 支援, 除此之外, 沒有 LVM 還是能正常監控/轉換等, 下述環境也是在沒有 LVM 的狀況下測試的.

    MySQL Master-Master Replication Manager 環境建置、架設
    下述設定參考自:
    Master-Master Replication Example using MMM
    (設定檔參考:
    Configuration Examples
    )
    註: 下述環境、設定檔位置 是以 Debian Lenny 為主.
    建置環境步驟
    建置環境步驟主要如下述:
  • db-1, db-2 安裝 mysql-server
  • db-1, db-2 互設對方為 Master, 自己是對方的 Slave
  • 抓取 mmm 的檔案, 裝需要的 Package 後, 執行 install.pl
  • 設定 mmm_agent.conf 後, 於 db-1, db-2 跑 mmm_agent
  • db-mon 安裝需要的 Package 後, 執行 install.pl
  • 設定 mmm_mon.conf 後, 於 db-mon 跑 mmm_mon
  • 將 db-1, db-2 設定上線 mmm_control set_online db1, mmm_control set_online db2
  • 測試 mmm_control show 是否正常, 將 /usr/local/mmm/scripts/init.d, logrotate.d 設定到 /etc 去.
  • 使用 rcconf 設定開啟啟動即可.
    實際執行步驟 - db-, db-2 互設 Replication, db-mon 建置
    db-1 192.168.1.181
  • apt-get install mysql-server
  • vim /etc/mysql/my.cnf
    # bind-address = 127.0.0.1                                                                                                  
    server-id = 1                                                                                                               
    log_bin = /var/log/mysql/mysql-bin.log
  • /etc/init.d/mysql restart
    做完此步驟, 請跳到 db-2 也先把此步驟做完.(順便抄下 db-2 的 show master status)
    db-2 做完上述步驟後, 再繼續下面:
  • mysql -u root
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'192.168.1.183' identified by 'RepMonitor';
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.181' identified by 'RepAgent';
  • mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
  • mysql> change master to master_host='192.168.1.182', master_port=3306, master_user='replication', master_password='slave'; # 文件上寫的做法
  • mysql> change master to master_host='192.168.1.182', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98; # 我喜歡保守點的做法.(抓 db-2 mysql> show master status 資料)
  • /etc/init.d/mysql restart
  • mysql -u root
  • mysql> slave start;
  • mysql> show slave status \G
    這樣子應該 Replication 已經設定完成, Master 是 db2, 自己是 Slave, 再下來就是架設 MMM 囉~
    架設 MMM 步驟如下:
  • apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl  # for perl
  • apt-get install iproute
  • wget http://mysql-master-master.googlecode.com/files/mmm-1.0.tar.bz2
  • tar xvf mmm-1.0.tar.bz2
  • cd mmm-1.0
  • ./install.pl
  • cp /usr/local/mmm/etc/examples/mmm_agent.conf.example /usr/local/mmm/etc/mmm_agent.conf
  • vim /usr/local/mmm/etc/mmm_agent.conf # 下述只將修改部份列出
    cluster_interface eth0
    # Define current server id
    this db1
    mode master
    # For masters
    peer db2
    # Cluster hosts addresses and access params
    host db1
       ip 192.168.1.181
       port 3306
       user rep_agent
       password RepAgent
    host db2
       ip 192.168.1.182
       port 3306
       user rep_agent
       password RepAgent
  • mmmd_agent # 執行 agent, 或者 /usr/local/mmm/scripts/init.d/mmm_agent start
  • ps aux | grep mmmd
    root  16115  0.0  0.0  41936  6904 ?  S 15:02 0:00 perl /usr/local/sbin/mmmd_agent
  • 修改完成的設定檔參考可下載:
    mmm_agent.conf

  • 再來就繼續下述 db-2 的設定囉~
    db-2 192.168.1.182
  • apt-get install mysql-server
  • vim /etc/mysql/my.cnf
  • # bind-address = 127.0.0.1
    server-id = 2
    log_bin = /var/log/mysql/mysql-bin.log
  • /etc/init.d/mysql restart 做完此步驟, 再回 db-1 繼續. (順便抄下 db-1 的 show master status)
  • mysql -u root
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'192.168.1.183' identified by 'RepMonitor';
  • mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
  • mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.182' identified by 'RepAgent';
  • mysql> change master to master_host='192.168.1.181', master_port=3306, master_user='replication', master_password='slave'; # 文件上寫的做法
  • mysql> change master to master_host='192.168.1.181', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98; # 我喜歡保守點的做法.(抓 db-1 mysql> show master status 資料)
  • /etc/init.d/mysql restart
  • mysql -u root
  • mysql> slave start;
  • mysql> show slave status \G
    這樣子應該 Replication 已經設定完成, Master 是 db1, 自己是 Slave, 再下來就是架設 MMM 囉~(下述步驟與上面一致, 只有設定檔有差異而已)
    架設 MMM 步驟如下:
  • apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl  # for perl
  • apt-get install iproute
  • wget http://mysql-master-master.googlecode.com/files/mmm-1.0.tar.bz2
  • tar xvf mmm-1.0.tar.bz2
  • cd mmm-1.0
  • ./install.pl
  • cp /usr/local/mmm/etc/examples/mmm_agent.conf.example /usr/local/mmm/etc/mmm_agent.conf
  • vim /usr/local/mmm/etc/mmm_agent.conf
    cluster_interface eth0
    # Define current server id
    this db2
    mode master
    # For masters
    peer db1
    # Cluster hosts addresses and access params
    host db1
       ip 192.168.1.181
       port 3306
       user rep_agent
       password RepAgent
    host db2
       ip 192.168.1.182
       port 3306
       user rep_agent
       password RepAgent
  • mmmd_agent # 執行 agent, 或者 /usr/local/mmm/scripts/init.d/mmm_agent start
  • ps aux | grep mmmd
    root  8837  0.0  0.0  41936  6904 ?  S 15:02 0:00 perl /usr/local/sbin/mmmd_agent
  • 修改完成的設定檔參考可下載:
    mmm_agent.conf

    db-mon 192.168.1.183
  • apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl # for perl
  • apt-get install iproute
  • apt-get install subversion # 目前 1.0 stable 的 mmm_mon 程式有 bug, 所以需要直接 checkout trunk 的來用
  • svn checkout http://mysql-master-master.googlecode.com/svn/trunk/ mysql-master-master-read-only
  • cd mysql-master-master-read-only/
  • ./install.pl
  • cp /usr/local/mmm/etc/examples/mmm_mon.conf.example /usr/local/mmm/etc/mmm_mon.conf
  • vim /usr/local/mmm/etc/mmm_mon.conf
    email root@localhost # 修改成有狀況要通知的 Email.
    host db1
        ip 192.168.1.181
        port 3306
        user rep_monitor
        password RepMonitor
        mode master
        peer db2
    host db2
        ip 192.168.1.182
        port 3306
        user rep_monitor
        password RepMonitor
        mode master
        peer db1
    # Mysql Reader role
    role reader
        mode balanced
        servers db1, db2
        ip 192.168.1.185, 192.168.1.184
    # Mysql Writer role
    role writer
        mode exclusive
        servers db1, db2
        ip 192.168.1.185
  • /usr/local/mmm/scripts/init.d/mmm_mon start
  • mmm_control show
  • mmm_control set_online db1 # 讓 db1 上線
  • mmm_control set_online db2 # 讓 db2 上線
  • mmm_control show # 看到下述就成功了~
    Config file: mmm_mon.conf
    Daemon is running!
    Servers status:
      db1(192.168.1.181): master/ONLINE. Roles: reader(192.168.1.185;), writer(192.168.1.185;)
      db2(192.168.1.182): master/ONLINE. Roles: reader(192.168.1.184;)
  • 修改完成的設定檔參考可下載:
    mmm_mon.conf

    設定 log rotate
    下面這些步驟分別在 db1, db2, mon 設定即可.
  • cp /usr/local/mmm/scripts/logrotate.d/mmm /etc/logrotate.d/
  • vim /etc/logrotate.d/mmm
    /opt/mmm/var/*.log { 修改成 /usr/local/mmm/var/*.log
    olddir /opt/mmm/var/old 修改成 olddir /usr/local/mmm/var/old
    設定開機自動啟動
    db1, db2 設定開機自動啟動
  • cp /usr/local/mmm/scripts/init.d/mmm_agent /etc/init.d/
  • apt-get install rcconf
  • rcconf
  • 選取 mmm_agent 即可
    mon 設定開機自動啟動
  • cp /usr/local/mmm/scripts/init.d/mmm_mon /etc/init.d/
  • apt-get install rcconf
  • rcconf
  • 選取 mmm_mon 即可
    再下來就只要會 mmm_control show, mmm_control set_online, mmm_control set_offline 即可.
    當機/重開機的 SOP
    若有重開機等狀況, 檢查步驟:
  • mysql -u root # 看 MySQL 是否有啟動, 若沒啟動 /etc/init.d/mysql start
  • ps aux | grep mmm # 看 mmm_agent 或 mmm_mon 是否有啟動, 若沒啟動 /etc/init.d/mmm_[agent|mon] start
  • 再來在 mon 的機器下: mmm_control show, 若沒上線, 發現已經在 AWAITING_RECOVERY 狀態, 就可以 set_online 讓他上線囉~
    測試
  • db1, db2 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'mmm'@'%' IDENTIFIED BY 'mmm_password';
  • db1, db2 mysql> FLUSH PRIVILEGES;
  • 寫程式去對 192.168.1.184, 192.168.1.185 做寫入/讀取的動作, 並試著重開等看看反應~
  • 註: 目前測試狀況, 機器死掉時, 在 2秒內就會自動切換過去. :)
    MMM LVM 設定
    因為機器安裝時沒設 LVM, 所以沒辦法測試, 不過需要安裝的 Package 和設定大概如下:
  • apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs
  • MMM LVM 設定範例: mmm_lvm.conf # 此設定範例需要另外建立 /backup, /mmm_snapshot 目錄
  • 設 LVM 可以直接在 db2 將 db1 的資料 clone 過來, ex: db2# mmm_clone --host db1 --clone-mode master-master # db2 的 MySQL 會幫你停掉, 然後再 scp db1 data 過來.
    MySQL Master-Master Replication Manager(1) - 簡介
    什麼是 MySQL Master-Master Replication Manager(MMM)?

    • MMM (MySQL Master-Master Replication Manager) 是整合 Script 做 監控/管理 MySQL Master-Master replication cluster 的設定配置.
    • Master-Master 的意思不是同時有兩台 Master 應付寫入的動作, 而是要做備援, 若 Master 死掉, 可於最短的時間內(幾秒內), 將備援的 Master 替換上線, 而這台備援的 Master, 平常也可以當 Slave (Reader).
    • 當 Slave 的 Replication Failed 時, 會自動讓此 Slave 停止提供服務, 避免不同步的狀況發生.
    • MMM 可解決 Master 死掉時, 需要停機或停止所有寫入的問題.

    MMM 的特色
    上述的事情, 只要在程式判斷 Master 死掉, 之後就永遠寫 Slave 等, 就可以做到(Master 回復時, 再手動去做切換), 但是 MMM 能夠多處理哪些東西呢? MMM 的設定/原理大概是怎麼樣呢?

    • MMM 的基本設定是 Master-Master (就是兩台 MySQL Server 互相設對方為自己的 Master, 自己是對方的 Slave), 所以在任何一台正常回復, 會將資料自動透過 Replication 同步.
    • MMM 能夠在 Master(db1) 死掉時, 在最短的時間, 自動切換到另一台當 Master(db2). 當 Master(db1) 回復時, 會直接當現在 Master(db2) 的 Slave, 不過不會直接上線, 要等資料 sync 同步後, MMM 才會允許手動設定上線.
    • 另可參考:
      Typical Use Cases 使用情境
      (常見使用架構)

    MMM 的運作原理
    MMM 主要做法是 Master(db1), Master(db2) 設定固定 IP, 然後 Monitor 也設定一個固定 IP, 再來 Monitor 的設定再加上兩個 IP(Writer, Reader), 程式讀取/寫入 都是透過 Monitor 另外設的這兩個 IP, 當任何一台機器死掉(不管是 Reader/Writer), Monitor 會自動將 IP 設
    到另一台機器上.
    註: 透過
    ARP(Address Resolution Protocol)

    iproute
    將 IP 指到另一台.
    設定依正常設定, 兩台 MySQL Server 各設自己原本的 IP, Monitor 會依照設定檔另外再綁上各自讀寫用的 IP, 跟之前主要的差異是, 兩台
    MySQL Server 要多跑 mmm_agent daemon, Monitor 要跑 mmm_mon daemon.
    MMM 是透過下述 check MySQL servers 是否活著:
  • IP connectivity (fping)
  • MySQL connectivity (mysql connect and SELECT NOW())
  • MySQL IO and SQL threads status (SHOW SLAVE STATUS)
  • MySQL replication backlog - seconds behind master (SHOW SLAVE STATUS)
    MMM 的官方資源

    MMM 的更多介紹、說明


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/98494/showart_1974834.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP