MySQL MMM高可用方案

来源:http://www.cnblogs.com/chenmh/archive/2016/08/08/5563778.html
-Advertisement-
Play Games

介紹 本篇文章主要介紹搭建MMM方案以及MMM架構的原理。這裡不介紹主從、主主的搭建方法,MMM方案不適用對數據一致性要求很高的業務。 架構 部署 1.修改hosts 在所有的伺服器中執行相同的操作。 vim /etc/hosts 192.168.137.10 master 192.168.137. ...


介紹

本篇文章主要介紹搭建MMM方案以及MMM架構的原理。這裡不介紹主從、主主的搭建方法,MMM方案不適用對數據一致性要求很高的業務。

 

 

 架構

部署

1.修改hosts

在所有的伺服器中執行相同的操作。

vim /etc/hosts

192.168.137.10 master
192.168.137.20 backup
192.168.137.30 slave
192.168.137.40 monitor

2.添加mysql用戶

只需要在所有的資料庫端執行即可,監控端不需要。

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.137.%' IDENTIFIED BY 'mmm_monitor'; 
GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.137.%' IDENTIFIED BY  'mmm_agent';
flush privileges;

 註意:repl用戶在搭建主從服務的時候已經創建好了。

 3.安裝監控軟體

註意:監控端全部安裝,但是監控端只需要用到mysql-mmm-monitor,mysql-mmm-agent不需要啟動。資料庫端只需要安裝mysql-mmm-agent

1.在監控伺服器執行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum –y  install mysql-mmm*

2.在資料庫伺服器上執行,每個資料庫伺服器上都要執行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum -y install mysql-mmm-agent

路徑說明:

4.配置文件

db伺服器配置文件:mmm_agent.conf,mmm_common.conf

監控伺服器的配置文件:mmm_mon.conf,mmm_common.conf(該文件所有伺服器一樣)

配置db伺服器

1.修改master伺服器

vim /etc/mysql-mmm/mmm_common.conf
active_master_role      writer     ###積極的master角色的標示,所有的db伺服器都需要開啟read_only參數,對於writer伺服器監控代理會自動將read_only屬性關閉。

<host default>
    cluster_interface       eth0      #####群集的網路介面
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid    ####pid路徑
    bin_path                /usr/libexec/mysql-mmm/              #####可執行文件路徑 
    replication_user        repl           #######複製用戶
    replication_password    repl           #######複製用戶密碼
    agent_user              mmm_agent      #######代理用戶,用於更改只讀操作
    agent_password          mmm_agent      #######代理用戶密碼
</host>

<host master>            ##########master1的host名
    ip      192.168.137.10   #####master1的ip
    mode    master       ########角色屬性,master代表是主
    peer    backup       ########與master1對等的伺服器的host名,也就是master2的伺服器host名
</host>

<host backup>     ####和master的概念一樣
    ip      192.168.137.20
    mode    master
    peer    master
</host>

<host slave>      #####從庫的host名,如果存在多個從庫可以重覆一樣的配置
    ip      192.168.137.30   ####從的ip
    mode    slave    #####slave的角色屬性代表當前host是從
</host>

<role writer>   ####writer角色配置
    hosts   master,backup   ####能進行寫操作的伺服器的host名,如果不想切換寫操作這裡可以只配置master,這樣也可以避免因為網路延時而進行write的切換,但是一旦master出現故障那麼當前的MMM就沒有writer了只有對外的read操作。
    ips     192.168.137.100  #####對外提供的寫操作的虛擬IP
    mode    exclusive    #####exclusive代表只允許存在一個主,也就是只能提供一個寫的IP
</role>

<role reader>   #####read角色配置
    hosts   backup,slave  ######對外提供讀操作的伺服器的host名,當然這裡也可以把master加進來
    ips     192.168.137.120,192.168.137.130,192.168.137.140  ###對外提供讀操作的虛擬ip,這兩個ip和host不是一一對應的,並且ips也hosts的數目也可以不相同,如果這樣配置的話其中一個hosts會分配兩個ip
    mode    balanced   ###balanced代表負載均衡
</role>

同時將這個文件拷貝到其它的伺服器包括監控伺服器,配置不變

scp  /etc/mysql-mmm/mmm_common.conf slave:/etc/mysql-mmm/
scp  /etc/mysql-mmm/mmm_common.conf backup:/etc/mysql-mmm/
scp  /etc/mysql-mmm/mmm_common.conf monitor:/etc/mysql-mmm/

 2.代理文件配置

vim /etc/mysql-mmm/mmm_agent.conf

 

註意:這個配置只配置db伺服器,監控伺服器不需要配置,this後面的host名改成當前伺服器的host命令,master2和slave也改成對應的伺服器的host名。

3.啟動代理進程

 

chkconfig mysql-mmm-agent on
service mysql-mmm-agent start

每台db伺服器上都需要啟動

配置監控伺服器

vim /etc/mysql-mmm/mmm_mon.conf

 

include mmm_common.conf
<monitor>
    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status  #####群集的狀態文件,也就是執行mmm_control show操作的顯示來源。
    ping_ips            192.168.137.10,192.168.137.20,192.168.137.30  ######被監控的db伺服器的ip地址
    auto_set_online     0   ####設置自動online的時間,預設是超過60s就將它設置為online,預設是60s,這裡將其設為0就是立即online

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #
</monitor>

<host default>
    monitor_user        mmm_monitor   ####監控db伺服器的用戶
    monitor_password    mmm_monitor   ####監控db伺服器的密碼
</host>

debug 0       #######debug 0正常模式,1為debug模式

註意:配置文件中的註釋是為了便於理解,在部署的時候最好把註釋去掉以免因為註釋造成的潛在影響。

啟動監控進程

chkconfig mysql-mmm- monitor on
service mysql-mmm-monitor start

註意:無論是在db端還是在監控端如果有對配置文件進行修改操作都需要重啟代理進程和監控進程。

 

操作分析

日誌文件

日誌文件往往是分析錯誤的關鍵,所以要善於利用日誌文件進行問題分析。

db端:/var/log/mysql-mmm/mmm_agentd.log

監控端:/var/log/mysql-mmm/mmm_mond.log

命令文件

mmm_agentd :db代理進程的啟動文件
mmm_mond :監控進程的啟動文件   
mmm_backup :備份文件 
mmm_restore :還原文件
mmm_clone    
mmm_control:監控操作命令文件   

 

db伺服器端只有mmm_agentd程式,其它的都是在monitor伺服器端。

mmm_control用法

mmm_control程式可以用於監控群集狀態、切換writer、設置online\offline操作等。

Valid commands are:
    help                              - show this message    ###幫助信息
    ping                              - ping monitor ###ping當前的群集是否正常
    show                              - show status  ####群集線上狀態檢查
    checks [<host>|all [<check>|all]] - show checks status #####執行監控檢查操作
    set_online <host>                 - set host <host> online ####將host設置為online
    set_offline <host>                - set host <host> offline  ###將host設置為offline
    mode                              - print current mode.  ####列印輸出當前的mode
    set_active                        - switch into active mode.
    set_manual                        - switch into manual mode.
    set_passive                       - switch into passive mode.
    move_role [--force] <role> <host> - move exclusive role <role> to host <host>  ####移除writer伺服器為指定的host伺服器
                                        (Only use --force if you know what you are doing!)
    set_ip <ip> <host>                - set role with ip <ip> to host <host>

1.檢查所有的db伺服器群集狀態

[root@monitor mysql-mmm]# mmm_control checks all
master  ping         [last change: 2016/06/07 16:31:24]  OK
master  mysql        [last change: 2016/06/07 16:31:24]  OK
master  rep_threads  [last change: 2016/06/07 16:31:24]  OK
master  rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is null
slave   ping         [last change: 2016/06/07 16:31:24]  OK
slave   mysql        [last change: 2016/06/07 16:31:24]  OK
slave   rep_threads  [last change: 2016/06/07 16:31:24]  OK
slave   rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is null
backup  ping         [last change: 2016/06/07 16:31:24]  OK
backup  mysql        [last change: 2016/06/07 16:31:24]  OK
backup  rep_threads  [last change: 2016/06/07 16:31:24]  OK
backup  rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is null

檢查項包括:ping、mysql是否正常運行、複製線程是否正常等

2.檢查群集環境線上狀況

[root@monitor mysql-mmm]# mmm_control show
  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.對指定的host執行offline操作

[root@monitor mysql-mmm]# mmm_control set_offline backup
OK: State of 'backup' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!
[root@monitor mysql-mmm]# mmm_control show
  backup(192.168.137.20) master/ADMIN_OFFLINE. Roles: 
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)

4.對指定的host執行onine操作

[root@monitor mysql-mmm]# mmm_control set_online backup
OK: State of 'backup' changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor mysql-mmm]# mmm_control show
  backup(192.168.137.20) master/REPLICATION_FAIL. Roles: 
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)

[root@monitor mysql-mmm]# mmm_control show
  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

5.執行write切換

1.查看當前的slave對應的master

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.137.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000073
          Read_Master_Log_Pos: 1461
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000073
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.writer切換,要確保mmm_common.conf文件中的writer屬性有配置對應的host,否則無法切換

[root@monitor mysql-mmm]# mmm_control move_role writer backup
OK: Role 'writer' has been moved from 'master' to 'backup'. Now you can wait some time and check new roles info!
[root@monitor mysql-mmm]# mmm_control show
  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120), writer(192.168.137.100)
  master(192.168.137.10) master/ONLINE. Roles: 
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.save從庫自動切換到了新的master

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.137.20
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000039
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000039
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

 

其它處理問題

 如果不想讓writer從master切換到backup(包括主從的延時也會導致寫VIP的切換),那麼可以在配置/etc/mysql-mmm/mmm_common.conf時,去掉<role write>中的backup

<role writer>   ####writer角色配置
    hosts   master   ###這裡只配置一個Hosts
    ips     192.168.137.100  #####對外提供的寫操作的虛擬IP
    mode    exclusive    #####exclusive代表只允許存在一個主,也就是只能提供一個寫的IP
</role>

 這樣的話當master出現故障了writer寫操作不會切換到backup伺服器,並且slave也不會指向新的master,此時當前的MMM之前對外提供寫服務。

 

之前寫的複製相關文章:

主從複製:http://www.cnblogs.com/chenmh/p/5089919.html

主主複製:http://www.cnblogs.com/chenmh/p/5153184.html

總結

主從的延時會導致寫VIP的切換,下一篇文章會寫關於半同步複製結合MMM方案,可以更有效的解決切換數據不一致性的問題,歡迎關註。

1.對外提供讀寫的虛擬IP是由monitor程式控制。如果monitor沒有啟動那麼db伺服器不會被分配虛擬ip,但是如果已經分配好了虛擬ip當monitor程式關閉了原先分配的虛擬ip不會立即關閉外部程式還可以連接訪問(只要不重啟網路),這樣的好處就是對於monitor的可靠性要求就會低一些,目前還不知道能維持多長的時間,但是如果這個時候其中的某一個db伺服器故障了就無法處理切換,也就是原先的虛擬ip還是維持不變,掛掉的那台DB的虛擬ip會變的不可訪問。

2.agent程式受monitor程式的控制處理write切換,從庫切換等操作。如果monitor進程關閉了那麼agent進程就起不到什麼作用,它本身不能處理故障。

3.monitor程式負責監控db伺服器的狀態,包括Mysql資料庫、伺服器是否運行、複製線程是否正常、主從延時等;它還用於控制agent程式處理故障。

4.monitor會每隔幾秒鐘監控db伺服器的狀態,如果db伺服器已經從故障變成了正常,那麼monitor會自動在60s之後將其設置為online狀態(預設是60s可以設為其它的值),有監控端的配置文件參數“auto_set_online”決定,群集伺服器的狀態有三種分別是:HARD_OFFLINE→AWAITING_RECOVERY→online

5.預設monitor會控制mmm_agent會將writer db伺服器read_only修改為OFF,其它的db伺服器read_only修改為ON,所以為了嚴謹可以在所有的伺服器的my.cnf文件中加入read_only=1由monitor控制來控制writer和read,root用戶和複製用戶不受read_only參數的影響

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接。

《歡迎交流討論》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是最近一個iOS項目需要使用的K線的繪製,在網上大量查閱資料無果,只好自行繪製。 實現功能包括K線主副圖、趨勢圖、成交量、滾動、放大縮小、MACD、KDJ,長按顯示輔助線等功能 預覽圖 最後的最後,這是項目的開源地址:https://github.com/yate1996/Y_KLine,如果幫到 ...
  • iOS的筆記-項目中的常見文件 新建一個項目之後,有那麼多的文件,下麵介紹一下主要的幾個。 1.文件名 (1)AppDelegate UIApplication的代理,app收到干擾的時候,進行處理系統事件。比如,來電話,記憶體警告,應用啟動。。 (2)ViewController 控制器,可以通過x ...
  • Android中圖片的左右切換隨處可見,今天我也試著查閱資料試著做了一下,挺簡單的一個小Demo,卻也發現了一些問題,話不多說,上代碼~: 只是用了一個ImageView作為顯示圖片的容器 ...
  • Swift - UITableView狀態切換效果 效果 源碼 https://github.com/YouXianMing/Swift-Animations ...
  • 1.數學函數:操作一個數據,返回一個結果 --取上限ceiling select code,name,ceiling(price) from car ; --取下限 floor select floor(price) from car --ABS 絕對值 --派 PI(),圓周率,括弧里不需要加東西 ...
  • 一、資料庫操作 create database 資料庫名稱 ——創建drop database 資料庫名稱 ——刪除use 資料庫名稱 ——使用go 兩條SQL語句之間分隔 二、表的操作 create table 表名( 列名 類型 其它,列名 id類型 其它 ) ——使用primary key — ...
  • 1.索引添加索引,設計界面,在任何一列前右鍵--索引/鍵--點擊進入添加某一列為索引 2.視圖 視圖就是我們查詢出來的虛擬表創建視圖:create view 視圖名 as SQL查詢語句,分組,排序,in 等都不能寫視圖的用法: select * from 視圖名 3.SQL編程 定義變數:decl ...
  • mysql簡介 1、什麼是資料庫 ? 資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...