mysql-mmm+amoeba+keepalived實現mysql高可用和讀寫分離

mysql-mmm+amoeba+keepalived架構簡介:利用mysql-mmm來實現mysql的高可用,利用amoeba來實現讀寫分離,利用keepalived來實現amoeba程序的高可用。從而從整體上實現mysql的高可用行。
一、MMM簡介:
MMMMaster-Master Replication Manager for MySQLmysql主主複製管理器)關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只有一個節點可以被寫入),這個套件也能對居於標準的主從配置的任意數量的從服務器進行讀負載均衡,所以你可以用它來在一組居於複製的服務器啓動虛擬ip,除此之外,它還有實現數據備份、節點之間重新同步功能的腳本。
MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。MMM不僅能提供浮動IP的功能,更牛的是如果當前的主服務器掛掉後,會將你後端的從自動轉向新的主服務器進行同步複製,不用手工更改同步資料。
官方網站爲:http://mysql-mmm.org
Mmm主要功能由下面三個腳本提供
l mmm_mond 負責所有的監控工作的監控守護進程,決定節點的移除等等
l mmm_agentd 運行在mysql服務器上的代理守護進程,通過簡單遠程服務集提供給監控節點
l mmm_control 通過命令行管理mmm_mond進程
二、mysql-mmm架構的搭建
1、 先來看下本文的架構圖:
master1出現故障的時候,架構圖會自動屏蔽master1,並自動將slave1slave2更改成從master2更新,架構圖變成如下:
2、 先介紹下本文的環境:
系統環境:CentOS release 5.432bit
keepalived
我用了以下的虛擬IP,他們將會在被mmm分配,這些IP都是浮動的,當出現故障的時候會自動的轉移到其他的可用服務器上。
ip
role
description
192.168.1.113
writer
你的應用程序應該連接到這個ip進行寫操作
192.168.1.111
reader
你的應用程序應該鏈接到這些ip中的一個進行讀操作
192.168.1.112
reader
192.168.1.114
reader
192.168.1.115
reader
192.168.1.170
Amoeba_vip
程序連接的Ip,實現mysql讀寫分離
mysql-mmm架構配置簡介:
u server1server2上安裝mysql,並配置爲master-master架構(就是互爲主從)----------配置很簡單,就不對着部分進行詳細解釋,有問題的話請查看:http://blog.chinaunix.net/u3/93755/showart.php?id=2213538
u 配置server4server5server1獲取更新 ------這一步很簡單,自行設置,有一點需要注意,就是設置同步不能設置浮動IP,要使用真實的IP
u server1server2server3server4server5上安裝mmm,並配置:mmm_common.confmmm_agent.conf以及mmm_mon.conf文件
3、 Mysql-mmm實戰
前提:server1server2上已經配置好mysql主主同步,server4server5設置好了利用server1爲主服務器的主從同步
u 安裝mysql-mmm(在server1server2server3server4server5上都要安裝)
CentOS軟件倉庫默認是不含這些軟件的,必須要有epel這個包的支持。故我們必須先安裝epel
keepalived
u 配置mmm代理和監控賬號的權限
server1server2server4server5上分別執行:
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' IDENTIFIED BY 'agent_password';
flush privileges;
u 配置mysql-mmm
所有的配置選項都集合在了一個叫/etc/mysql-mmm/mmm_common.conf的單獨文件中,系統中所有主機的該文件內容都是一樣的, 配置完後不要忘記了拷貝這個文件到所有的主機(包括監控主機)!,內容如下:
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mysql-mmm/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
#同步的帳號(這些要和前面設置的保持一致!)
replication_user replication
replication_password 123456 #同步的密碼
agent_user mmm_agent #mmm-agent用戶名
agent_password agent_password #mmm-agent用戶密碼
</host>
<host db1>
ip 192.168.1.161 #db1ip
mode master
peer db2
</host>
<host db2>
ip 192.168.1.162 #db2ip
mode master
peer db1
</host>
<host db3>
ip 192.168.1.164 #db3ip
mode slave
</host>
<host db4>
ip 192.168.1.165 #db4ip
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.1.113 #設置寫如的虛擬IP
mode exclusive
</role>
<role reader>
hosts db1, db2, db3, db4
ips 192.168.1.111, 192.168.1.112, 192.168.1.114, 192.168.1.115 #設置讀取的虛擬IP
mode balanced
</role>
在數據庫主機上我們需要編輯/etc/mysql-mmm/mmm_agent.conf文件,根據其他主機的不同更改db1的值(db2就將db1更改成db2…….):
include mmm_common.conf
this db1
在監控主機上我們需要編輯/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
ping_ips 192.168.1.161,192.168.1.162, 192.168.1.164,192.168.1.165 #監控服務器ip
auto_set_online 60
# 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 #mmm_monitor用戶名
monitor_password monitor_password #mmm_monitor密碼
</host>
debug 0
u 啓動MMM
啓動代理:
(在數據庫服務器上server12)編輯/etc/default/mysql-mmm-agent來開啓:
ENABLED=1
然後啓動它:
/etc/init.d/mysql-mmm-agent start
啓動監控(在監控機上):
/etc/init.d/mysql-mmm-monitor start
 
 
u 利用mmm_control監控mysql服務器狀態:
[root@server3 ~]# mmm_control show
db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.111), writer(192.168.1.113)
db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.114)
db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.112)
u 測試看兩個mysql服務器能否實現故障自動切換
停掉作爲寫的db1上的mysql,查看寫的服務器會不會自動轉移到db2上去
停掉幾秒鐘後用mmm_control show查看:
[root@server3 ~]# mmm_control show
db1(192.168.1.161) master/HARD_OFFLINE. Roles:
db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)
db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
我們可以看到已經把db2當作主寫服務器,另外server4server5原來是從server1更新的現在已經被mmm自動更改到從新的主服務器server2上更新了,很神奇!可以登錄到server4server5上用show slave status\G;命令查看!
再來看看db1恢復後會是什麼情況:
[root@server3 ~]# mmm_control show
db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114)
db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
我們可以看到當db1恢復後就充當slave的角色了!只有當db2掛了以後db1又會擔當起主服務器的寫入功能
發現個bug,不知道有沒有人遇到過:有的時候會出現服務器恢復後,服務器的狀態被設置爲:AWAITING_RECOVERY,必須要手工執行mmm_control set_online host才能恢復正常,比如:有的時候我恢復db1後,出現如下:
[root@server3 ~]# mmm_control show
db1(192.168.1.161) master/AWAITING_RECOVERY. Roles:
db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)
db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
解決辦法爲利用set_online手工更改爲在線狀態:
[root@server3 ~]# mmm_control set_online db1
OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
[root@server3 ~]# mmm_control show
db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114)
db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
解決這個問題還有一個辦法就是將auto_set_online設置小點,默認是60s,設置成10看下會不會有改善?
u mmm_control命令簡介
[root@server3 mysql-mmm]# mmm_control help
Valid commands are:
help - show this message
#查看幫助信息
ping - ping monitor
#ping監控
show - show status
#查看狀態信息
checks [<host>|all [<check>|all]] - show checks status
#顯示檢查狀態,包括(pingmysqlrep_threadsrep_backlog
set_online <host> - set host <host> online
#設置某hostonline狀態
set_offline <host> - set host <host> offline
#設置某hostoffline狀態
mode - print current mode.
#打印當前的模式,是ACTIVEMANUALPASSIVE
#默認ACTIVE模式
set_active - switch into active mode.
#更改爲active模式
set_manual - switch into manual mode.
#更改爲manual模式
set_passive - switch into passive mode.
#更改爲passive模式
move_role [--force] <role> <host> - move exclusive role <role> to host <host>
#更改host的模式,比如更改處於slavemysql數據庫角色爲write
(Only use --force if you know what you are doing!)
set_ip <ip> <host> - set role with ip <ip> to host <host>
#host設置ip,只有passive模式的時候才允許更改!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章