使用MMM實現MySQL雙主複製高可用
一、MMM簡介
1. 概述
MMM(Master-Master replication manager for MySQL)是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)複製,可以說是mysql主主複製管理器。雖然叫做雙主複製,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套指令碼程式一方面實現了故障切換的功能,另一方面其內部附加的工具指令碼也可以實現多個slave的read負載均衡。MMMM是關於MySQL主主複製配置的監控、故障轉移和管理的一套可伸縮的指令碼套件(在任何時候只有一個節點可以被寫入)。這個套件也能對居於標準的主從配置的任意數量的從伺服器進行讀負載均衡,所以可以用它在一組居於複製的伺服器啟動虛擬IP,除此之外,它還有實現資料備份、節點之間重新同步功能的指令碼。
MMM提供了自動和手動兩種方式移除一組伺服器中複製延遲較高的伺服器的虛擬IP,同時它還可以備份資料,實現兩節點之間的資料同步等。由於MMM無法完全的保證資料一致性,所以MMM適用於對資料的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現伺服器的故障轉移,從而實現MySQL的高可用。對於那些對資料的一致性要求很高的業務,不建議採用MMM這種高可用架構。
2. 優缺點
- 優點:高可用性,擴充套件性好,出現故障自動切換,對於主主同步,在同一時間只提供一臺資料庫寫操作,保證的資料的一致性。
- 缺點:Monitor節點是單點,可以結合Keepalived實現高可用。
3. 工作原理
MMM是一套靈活的指令碼程式,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master複製的配置(同一時間只有一個節點是可寫的)。MMM的主要功能通過以下三個指令碼提供:
- mmm_mond:監視守護程序,它執行所有監視工作並做出有關角色切換的所有決定等等。此指令碼需要在監管機上執行。
- mmm_agentd:執行在每個mysql伺服器上(Master和Slave)的代理程序,完成監控的探針工作和執行簡單的遠端服務設定。此指令碼需要在被監管機上執行。
- mmm_control:一個簡單的指令碼,提供管理mmm_mond程序的命令。
mysql-mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP。通過監管的管理,這些IP會繫結在可用MySQL之上,當某一臺MySQL宕機時,監管會將VIP遷移至其它MySQL。在整個監管過程中,需要在MySQL中新增相關授權使用者,以便讓MySQL可以支援監理機的維護。授權的使用者包括一個mmm_monitor使用者和一個mmm_agent使用者,如果想使用mmm的備份工具則還要新增一個mmm_tools使用者。
4. 典型用例
(1)雙節點設定
雙節點架構如圖1所示。
在雙節點主-主設定中,MMM使用五個IP:每個節點的單個永久IP,兩個讀取VIP(只讀)和1個寫入VIP(更新)。最後三個IP在節點之間遷移,具體取決於節點可用性。通常在沒有複製延遲時,活動主庫有2個VIP(讀寫),備用主庫有1個讀VIP(只讀)。如果發生故障,讀寫操作都會遷移到工作節點。
(2)雙主+一個/多個從
這種架構如圖2所示。
5. 系統需求
對於使用n個MySQL伺服器的MMM設定,有以下需求:
- n + 1 個主機:每個MySQL伺服器一個主機; MMM監視器的一個主機。
- 2 * n + 1 個IP地址:每個主機一個固定IP + 讀角色一個VIP,一個寫入VIP。
- monitor user:具有用於MMM監視器的REPLICATION CLIENT特權的MySQL使用者。
- agent user:具有SUPER,REPLICATION CLIENT,MMM代理程序許可權的MySQL使用者。
- replication user:具有REPLICATION SLAVE許可權的MySQL使用者,用於複製。
- tools user:具有SUPER,REPLICATION CLIENT,RELOAD for MMM工具許可權的MySQL使用者。
監控主機需要安裝以下支援包:
(1)perl
(2)fping(如果你想以非root使用者身份執行mmm_mond)
(3)Perl模組:
- Algorithm::Diff
- Class:Singleton
- DBI and DBD::mysql
- File::Basename
- File::stat
- File::Temp
- Log::Dispatch
- Log::Log4perl
- Mail::Send
- Net::Ping
- Proc::Daemon
- Thread::Queue
- Time::HiRes
對於節點主機,初始應該在所有MySQL伺服器的配置中設定read_only=1,MMM將使用active_master_role在活動主機上將其更改為read_only=0。主機需要安裝以下支援包:
(1)perl
(2)iproute
(3)send_arp (solaris)
(4)Perl模組:
- Algorithm::Diff
- DBI and DBD::mysql
- File::Basename
- File::stat
- Log::Dispatch
- Log::Log4perl
- Mail::Send
- Net::ARP (linux)
- Proc::Daemon
- Time::HiRes
如果要使用MMM工具(mmm_backup,mmm_restore,mmm_clone),則必須將LVM用於MySQL資料庫和日誌所在的分割槽。注意,需要對回滾段空間進行自由物理擴充套件,參見“Estimating Undo Space needed for LVM Snapshot”。MMM工具還需要以下perl模組:
- Path::Class
- Data::Dumper
二、實驗設計
1. 基本環境
- 作業系統版本:CentOS Linux release 7.2.1511 (Core)
- MySQL版本:5.6.14
- 主機資訊:見表1
角色 |
IP |
主機名 |
網絡卡 |
server_id |
DB1 |
172.16.1.125 |
hdp2 |
ens32 |
125 |
DB2 |
172.16.1.126 |
hdp3 |
ens32 |
126 |
Monitor |
172.16.1.127 |
hdp4 |
- |
- |
表1
- VIP資訊:見表2
VIP |
角色 |
描述 |
172.16.1.100 |
write |
應用程式連線該VIP對主庫進行寫請求 |
172.16.1.210 |
read |
應用程式連線該VIP進行讀請求 |
172.16.1.211 |
read |
應用程式連線該VIP進行讀請求 |
表2
2. 架構設計
實驗架構如圖3所示。
三、MMM安裝配置
1. 配置雙主複製
2. 安裝MMM
在三臺主機執行下面的yum命令安裝MMM軟體包。
yum -y install mysql-mmm-*
3. 建立資料庫使用者
在DB1、DB2中建立mmm_agent和mmm_monitor使用者。
- grant super,replication client,process on *.* to 'mmm_agent'@'%' identified by '123456';
- grant replication client on *.* to 'mmm_monitor'@'%' identified by '123456';
4. 配置MMM
(1)通用配置
編輯DB1上的/etc/mysql-mmm/mmm_common.conf檔案,內容如下:
- active_master_role writer
- <host default>
- cluster_interface ens32
- pid_path /var/run/mmm_agentd.pid
- bin_path /usr/libexec/mysql-mmm/
- replication_user repl
- replication_password 123456
- agent_user mmm_agent
- agent_password 123456
- </host>
- <host db1>
- ip 172.16.1.125
- mode master
- peer db2
- </host>
- <host db2>
- ip 172.16.1.126
- mode master
- peer db1
- </host>
- <role writer>
- hosts db1, db2
- ips 172.16.1.100
- mode exclusive
- </role>
- <role reader>
- hosts db1, db2
- ips 172.16.1.210, 172.16.1.211
- mode balanced
- </role>
主要配置項說明:
- active_master_role:活動主機角色名稱,agent與monitor使用。
- replication_user:用於複製的使用者。
- agent_user:mmm-agent使用者。
- host段中的mode:標明是否為主或者備選主,或者從庫。
- role段中的mode:exclusive為獨佔模式,同一時刻只能有一個主。balanced可能有多個ips,ips將在主機之間平衡。
- <role write>中hosts:表示目前的主庫和備選主的真實主機IP或者主機名,ips為對外提供的虛擬機器ip地址。
- <role readr>中hosts:代表從庫真實的ip和主機名,ips代表從庫的虛擬ip地址。
將該檔案複製到其它所有節點(DB2、Monitor)。
- scp /etc/mysql-mmm/mmm_common.conf 172.16.1.126:/etc/mysql-mmm/
- scp /etc/mysql-mmm/mmm_common.conf 172.16.1.127:/etc/mysql-mmm/
(2)agent配置
DB1的/etc/mysql-mmm/mmm_agent.conf檔案內容為:
- include mmm_common.conf
- this db1
DB2的/etc/mysql-mmm/mmm_agent.conf檔案內容為:
- include mmm_common.conf
- this db2
(3)monitor配置
Monitor上的/etc/mysql-mmm/mmm_mon.conf檔案內容為:
- include mmm_common.conf
- <monitor>
- ip 172.16.1.127
- pid_path /var/run/mmm_mond.pid
- bin_path /usr/libexec/mysql-mmm
- status_path /var/lib/mysql-mmm/mmm_mond.status
- ping_ips 172.16.1.125,172.16.1.126
- auto_set_online 60
- </monitor>
- <host default>
- monitor_user mmm_monitor
- monitor_password 123456
- </host>
- debug 0
auto_set_online表示將節點狀態從AWAITING_RECOVERY切換到ONLINE之前等待的秒數,0表示已禁用。
四、功能測試
1. 啟動MMM
(1)在DB1、DB2上啟動agent
- /etc/init.d/mysql-mmm-agent start
- /etc/init.d/mysql-mmm-agent start
/etc/init.d/mysql-mmm-agent檔案內容分如下:
- #!/bin/sh
- #
- # mysql-mmm-agent This shell script takes care of starting and stopping
- # the mmm agent daemon.
- #
- # chkconfig: - 64 36
- # description: MMM Agent.
- # processname: mmm_agentd
- # config: /etc/mmm_agent.conf
- # pidfile: /var/run/mmm_agentd.pid
- # Cluster name (it can be empty for default cases)
- CLUSTER=''
- #-----------------------------------------------------------------------
- # Paths
- if [ "$CLUSTER</span>"</span> != <span class="hljs-string">""</span> ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_AGENTD_BIN=<span class="hljs-string">"/usr/sbin/mmm_agentd @<span class="hljs-variable">$CLUSTER"
- MMM_AGENTD_PIDFILE="/var/run/mmm_agentd-$CLUSTER</span>.pid"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">else</span> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_AGENTD_BIN=<span class="hljs-string">"/usr/sbin/mmm_agentd"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_AGENTD_PIDFILE=<span class="hljs-string">"/var/run/mmm_agentd.pid"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">echo</span> <span class="hljs-string">"Daemon bin: '<span class="hljs-variable">$MMM_AGENTD_BIN'"
- echo "Daemon pid: '$MMM_AGENTD_PIDFILE</span>'"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#-----------------------------------------------------------------------</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># See how we were called.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">case</span> <span class="hljs-string">"<span class="hljs-variable">$1" in
- start)
- # Start daemon.
- echo -n "Starting MMM Agent daemon... "
- if [ -s $MMM_AGENTD_PIDFILE</span> ] && <span class="hljs-built_in">kill</span> -0 `cat <span class="hljs-variable">$MMM_AGENTD_PIDFILE</span>` 2> /dev/null; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">" already running."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 0</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-variable">$MMM_AGENTD_BIN
- if [ "$?"</span> -ne 0 ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"failed"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 1</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Ok"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 0</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> stop)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"># Stop daemon.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> -n <span class="hljs-string">"Shutting down MMM Agent daemon"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> [ -s <span class="hljs-variable">$MMM_AGENTD_PIDFILE ]; then
- pid="$(cat $MMM_AGENTD_PIDFILE)"
- cnt=0
- kill "$pid</span>"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">while</span> <span class="hljs-built_in">kill</span> -0 <span class="hljs-string">"<span class="hljs-variable">$pid" 2>/dev/null; do
- cnt=`expr "$cnt" + 1`
- if [ "$cnt</span>"</span> -gt 15 ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">kill</span> -9 <span class="hljs-string">"<span class="hljs-variable">$pid"
- break
- fi
- sleep 2
- echo -n "."
- done
- echo " Ok"
- exit 0
- fi
- echo " not running."
- exit 0
- ;;
- status)
- echo -n "Checking MMM Agent process:"
- if [ ! -s $MMM_AGENTD_PIDFILE</span> ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="74"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">" not running."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="75"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 3</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="76"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="77"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> pid=<span class="hljs-string">"<span class="hljs-variable">$(cat $MMM_AGENTD_PIDFILE)</span>"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="78"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> ! <span class="hljs-built_in">kill</span> -0 <span class="hljs-string">"<span class="hljs-variable">$pid" 2> /dev/null; then
- echo " not running."
- exit 1
- fi
- echo " running."
- exit 0
- ;;
- restart|reload)
- $0</span> stop</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="88"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-variable">$0 start
- exit $?</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="90"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="91"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="92"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> *)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="93"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Usage: <span class="hljs-variable">$0 {start|stop|restart|status}"
- ;;
- esac
- exit 1
(2)在Monitor上啟動監控
/etc/init.d/mysql-mmm-monitor start
/etc/init.d/mysql-mmm-monitor檔案內容分如下:
- #!/bin/sh
- #
- # mysql-mmm-monitor This shell script takes care of starting and stopping
- # the mmm monitoring daemon.
- #
- # chkconfig: - 64 36
- # description: MMM Monitor.
- # processname: mmm_mond
- # config: /etc/mmm_mon.conf
- # pidfile: /var/run/mmm_mond.pid
- # Cluster name (it can be empty for default cases)
- CLUSTER=''
- #-----------------------------------------------------------------------
- # Paths
- if [ "$CLUSTER</span>"</span> != <span class="hljs-string">""</span> ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_MOND_BIN=<span class="hljs-string">"/usr/sbin/mmm_mond @<span class="hljs-variable">$CLUSTER"
- MMM_MOND_PIDFILE="/var/run/mmm_mond-$CLUSTER</span>.pid"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">else</span> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_MOND_BIN=<span class="hljs-string">"/usr/sbin/mmm_mond"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> MMM_MOND_PIDFILE=<span class="hljs-string">"/var/run/mmm_mond.pid"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">echo</span> <span class="hljs-string">"Daemon bin: '<span class="hljs-variable">$MMM_MOND_BIN'"
- echo "Daemon pid: '$MMM_MOND_PIDFILE</span>'"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#-----------------------------------------------------------------------</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># See how we were called.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">case</span> <span class="hljs-string">"<span class="hljs-variable">$1" in
- start)
- # Start daemon.
- echo -n "Starting MMM Monitor daemon: "
- if [ -s $MMM_MOND_PIDFILE</span> ] && <span class="hljs-built_in">kill</span> -0 `cat <span class="hljs-variable">$MMM_MOND_PIDFILE</span>` 2> /dev/null; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">" already running."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 0</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-variable">$MMM_MOND_BIN
- if [ "$?"</span> -ne 0 ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"failed"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 1</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Ok"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 0</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> stop)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"># Stop daemon.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> -n <span class="hljs-string">"Shutting down MMM Monitor daemon: "</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> [ -s <span class="hljs-variable">$MMM_MOND_PIDFILE ]; then
- pid="$(cat $MMM_MOND_PIDFILE)"
- cnt=0
- kill "$pid</span>"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">while</span> <span class="hljs-built_in">kill</span> -0 <span class="hljs-string">"<span class="hljs-variable">$pid" 2>/dev/null; do
- cnt=`expr "$cnt" + 1`
- if [ "$cnt</span>"</span> -gt 15 ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">kill</span> -9 <span class="hljs-string">"<span class="hljs-variable">$pid"
- break
- fi
- sleep 2
- echo -n "."
- done
- echo " Ok"
- exit 0
- fi
- echo " not running."
- exit 0
- ;;
- status)
- echo -n "Checking MMM Monitor process:"
- if [ ! -s $MMM_MOND_PIDFILE</span> ]; <span class="hljs-keyword">then</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="74"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">" not running."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="75"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">exit</span> 3</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="76"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">fi</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="77"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> pid=<span class="hljs-string">"<span class="hljs-variable">$(cat $MMM_MOND_PIDFILE)</span>"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="78"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> ! <span class="hljs-built_in">kill</span> -0 <span class="hljs-string">"<span class="hljs-variable">$pid" 2> /dev/null; then
- echo " not running."
- exit 1
- fi
- echo " running."
- exit 0
- ;;
- restart|reload)
- $0</span> stop</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="88"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-variable">$0 start
- exit $?</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="90"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="91"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="92"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> *)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="93"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Usage: <span class="hljs-variable">$0 {start|stop|restart|status}"
- ;;
- esac
- exit 1
(3)檢查MMM啟動後的狀態
mmm啟動成功後,在Monitor上執行mmm_control show和mmm_control checks命令結果如下。
- [[email protected]~]#mmm_control show
- db1(172.16.1.125) master/ONLINE. Roles: reader(172.16.1.210)
- db2(172.16.1.126) master/ONLINE. Roles: reader(172.16.1.211), writer(172.16.1.100)
- [[email protected]~]#
- [
相關推薦
使用MMM實現MySQL雙主複製高可用
一、MMM簡介
1. 概述
MMM(Master-Master replication manager for MySQL)是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Maste
004.MySQL雙主+Keepalived高可用
一 基礎環境
主機名
系統版本
MySQL版本
Heartbeat + haproxy + MySQL雙主複製 實現讀寫負載均衡及高可用
目錄
四、總結
參考:
上一篇我們使用Heartbeat的HA功能,實現MySQL主從複製的自動故障切換。它的工作原理是:當Heartbeat啟動時,會將VIP繫結到haresources檔案中指定
MySQL集群(四)之keepalived實現mysql雙主高可用
健康檢查 重連 lose 搶占 pro 資源 交換機 state nec 前面大家介紹了主從、主主復制以及他們的中間件mysql-proxy的使用,這一篇給大家介紹的是keepalived的搭建與使用!
一、keepalived簡介
1.1、keepalived介紹
mysql雙機熱備以及使用keepalived實現mysql雙主高可用
根據蒐集的資料安裝測試並在安裝測試過程中整理的文件,部分參考文件在相應位置有標記。如有不足希望不吝賜教。
mysql雙機熱備的方式有兩種:
主-從伺服器雙機熱備
主-主伺服器雙機熱備
下文以主-主伺服器雙機熱備為例,主-從配置類似。
兩臺centos7,ip分別為:
MySQL5.7 利用keepalived來實現mysql雙主高可用方案的詳細過程
伺服器準備Keepalived:192.168.13.15Keepalived:192.168.13.16Mysql-m1: 192.168.13.15Mysql-m2: 192.168.13.161,在m1、m2上準備mysql5.7環境2,在m1上部署keepalived
Linux環境下實現keepalive支援的LVS高可用性和NGINX的單主模型雙主模型高可用
實驗:實現高可用的LVS-DR模型
1、準備兩臺RS伺服器
2、將兩臺lVS安裝httpd或nginx,用來做sorry server
3、定義RS伺服器
在後端伺服器RS1寫配置指令碼
執行指令碼後,ifconfig
之後指令碼傳給RS2,執行此指令碼,同樣存在l
46、mysql雙主複製實戰
雙主複製潛在的問題:
雙主模型恰巧雙方同時操作一組資料,左伺服器鎖住A欄位修改B欄位,右伺服器鎖住B欄位修改A欄位。雙方一同步資料可能出現不一致。
1、在兩臺伺服器上各自建立一個具有複製許可權的使用者;
mysql
GRANT REPLICATION SLAVE,REPLICATION CLIEN
MySQL高可用之雙主複製模式
MySQL雙主模式高可用實現
生產案例:VIP:10.105.98.211MASTERHOSTNAME IPADDR PORTmy-prod01.oracle.com 192.168.10.97 3306 my-prod02.oracle.com 192.168.10.5 3306 SL
MySQL 高可用:主主複製(雙主複製)
###########################################################################################
linux: CentOS 5.6
mysql: 5.6.22
centos7.2 MYSQL雙主+半同步+keepalived實現高可用負載均衡
這兩天瞭解了一下mysql的叢集方案,發現有很多解決方案,有複雜的也有簡單的,有興趣的參考下面網址:http://www.cnblogs.com/Kellana/p/6738739.html
這裡,我使用中小企業最常用也是較簡單的方案,用keepalived提供一個vip(
MySQL雙主高可用架構之MMM實戰
MMM簡介:
MMM即Master-Master Replication Manager for MySQL(mysql主主複製管理器),是關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的指令碼套件(在任何時候只有一個節點可以被寫入),這個套件也能基於標準
ansible實現nginx雙主模式反代,keepalived高可用,memcached緩存
ansible實現nginx前端反代 keepalived高可用與對後端rs的配置 ansible自動化運維工具配置ngnix前端反代到後端真實機,並設置keepalived高可用,在後端一臺真實主機上配置httpd,mysql,php-fpm;設置memcached緩存服務器在這臺真實主機上;(
MYSQL雙主高可用方案部署實例
tro dmi admin route pts service firewall oop sql king01與king02互為master-slave[root@king01 ~]# mysql -uroot -pabcd.1234mysql> show slave
MySQL-MMM實現MySQL高可用群集
ade 策略 ins 結果 you fff ont 自增 sts 簡介
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL
keepalived+雙主實現數據庫的高可用
-m com 編寫 工具 mixed 通過 offset incr 一次 生產環境中一臺 mysql 主機存在單點故障,所以我們要確保 mysql 的高可用性,即兩臺 MySQL 服務器如果其中有一臺 MySQL 服務器掛掉後,另外一臺能立馬接替其進行工作。 MySQL 的
MySQL - MMM 實現 MySQL 高可用
完全 epo 時間 cli yum安裝 mysql- 配置 開啟 var
MMM (Master-Master replication manager for MySQL,MySQL 主主復制管理器)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM 使用 Perl
【MySQL進階】Keepalived1.4.0結合MySQL 5.7.19實現主備高可用
port 腳本 amp ado roo ins log openss net 1、基本環境
數據庫安裝及主備同步接上一篇文章:http://blog.51cto.com/13946719/2309514JDK 1.8_171MySQL 5.7.19CentOS 7.4Kee
MySQL-雙主高可用
主伺服器開啟binlog日誌 [mysqld]log-bin=masterlog-bin-index=masterserver-id=11.全備:[[email protected] data]# mysqldump -u root -p123 --all-databases > /tmp/a
mysql+mycat搭建穩定高可用叢集,負載均衡,主備複製,讀寫分離
資料庫效能優化普遍採用叢集方式,oracle叢集軟硬體投入昂貴,今天花了一天時間搭建基於mysql的叢集環境。
主要思路
簡單說,實現mysql主備複製-->利用mycat實現負載均衡。
比較了常用的讀寫分離方式,推薦mycat,社群活躍,效能穩定。
測試環境
MYSQL版