MMM高可用mysql方案

開始之前:

雙主互備架構:在此基礎上添加多個slave節點,將會出現問題,因爲在Master節點切換到備用節點之後,多個slave節點的“Master Host” 無法自動切換到備用Master節點,從而導致整個mysql高可用架構出現問題。

mmm集羣套件可解決以上問題

方案簡介

1.通過perl編寫

2.基於mysql主從複製

3.由一個管理端(monitor)和多個代理端(agent)構成

4.監控和管理mysql狀態

5.故障時自動切換

6.讀寫分離

7.任何時候同一時刻只有一個master是可寫的

mmm套件腳本

1.mmm_mond
這是一個監控進程,運行在管理節點上,主要負責對所有數據庫的監控工作同時決定和處理所有節點的角色切換。

2.mmm_control
管理腳本

3.mmm_agent
代理進程

安裝步驟:

MMM高可用mysql方案

具體的配置信息如下所示:

角色 ip地址 主機名字 server-id
monitoring 192.168.0.30 db2 -
master1 192.168.0.60 db1 1
master2 192.168.0.50 db2 2
slave1 192.168.0.40 db3 3
業務中的服務ip信息如下所示:

ip地址 角色 描述
192.168.0.108 write 應用程序連接該ip對主庫進行寫請求
192.168.0.88 read 應用程序連接該ip進行讀請求
192.168.0.98 read 應用程序連接該ip進行讀請求
具體的配置步驟如下:

(1)主機配置

配置/etc/hosts,在所有主機中,添加所有的主機信息:

[[email protected] ~]# cat /etc/hosts
192.168.0.60 db1
192.168.0.50 db2
192.168.0.40 db3
[[email protected] ~]#
(2)首先在3臺主機上安裝mysql和搭建複製(192.168.0.60和192.168.0.50互爲主從,192.168.0.40爲192.168.0.60的從)具體的複製搭建這裏就省略,要是這都不會,那麼該文章對你就沒意思了。然後在每個mysql的配置文件中加入以下內容,注意server_id 不能重複。

db1(192.168.0.60)上:

server-id = 1
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
db2(192.168.0.50)上:

server-id = 2
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
db3(192.168.0.40)上:

server-id = 3
log_slave_updates = 1
上面的id不一定要按順序來,只要沒有重複即可。

(3)安裝MMM所需要的Perl模塊(所有服務器)執行該腳本,也可以安裝epel源,然後yum -y install mysql-mmm*來安裝MMM:

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install mysql-mmm*
複製代碼
[[email protected] ~]# cat install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat > /root/list << EOF
install Algorithm::Diff
install Class::Singleton
install DBI
install DBD::mysql
install File::Basename
install File::stat
install File::Temp
install Log::Dispatch
install Log::Log4perl
install Mail::Send
install Net::ARP
install Net::Ping
install Proc::Daemon
install Thread::Queue
install Time::HiRes
EOF

for package in cat /root/list
do
cpanm $package
done
[[email protected] ~]#
複製代碼
(4)

下載mysql-mmm軟件,在所有服務器上安裝:

[[email protected] ~]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
[[email protected] ~]# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
[[email protected] ~]# tar xf mysql-mmm-2.2.1.tar.gz
[[email protected] ~]# cd mysql-mmm-2.2.1
[[email protected] mysql-mmm-2.2.1]# make install
mysql-mmm安裝後的主要拓撲結構如下所示(注意:yum安裝的和源碼安裝的路徑有所區別):

複製代碼
目錄 介紹
/usr/lib/perl5/vendor_perl/5.8.8/MMM MMM使用的主要perl模塊
/usr/lib/mysql-mmm MMM使用的主要腳本
/usr/sbin MMM使用的主要命令的路徑
/etc/init.d/ MMM的agent和monitor啓動服務的目錄
/etc/mysql-mmm MMM配置文件的路徑,默認所以的配置文件位於該目錄下
/var/log/mysql-mmm 默認的MMM保存日誌的位置
複製代碼
到這裏已經完成了MMM的基本需求,接下來需要配置具體的配置文件,其中mmm_common.conf,mmm_agent.conf爲agent端的配置文件,mmm_mon.conf爲monitor端的配置文件。

(5)配置agent端的配置文件,需要在db1,db2,db3上分別配置。

在db1主機上配置agent配置文件:

複製代碼
[[email protected] ~]# cd /etc/mysql-mmm/
[[email protected] mysql-mmm]# cat mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth1

    pid_path                                /var/run/mmm_agentd.pid
    bin_path                                /usr/lib/mysql-mmm/
    replication_user                        repl
    replication_password                    123456
    agent_user                              mmm_agent
    agent_password                          mmm_agent

</host>
<host db1>
ip 192.168.0.60
mode master
peer db2
</host>
<host db2>
ip 192.168.0.50
mode master
peer db1
</host>
<host db3>
ip 192.168.0.40
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.0.108
mode exclusive
</role>

<role reader>
hosts db2, db3
ips 192.168.0.88, 192.168.0.98
mode balanced
</role>
[[email protected] mysql-mmm]#
複製代碼
其中replication_user用於檢查複製的用戶,agent_user爲agent的用戶,mode標明是否爲主或者備選主,或者從庫。mode exclusive主爲獨佔模式,同一時刻只能有一個主,<role write>中hosts表示目前的主庫和備選主的真實主機ip或者主機名,ips爲對外提供的虛擬機ip地址,<role readr>中hosts代表從庫真實的ip和主機名,ips代表從庫的虛擬ip地址。

由於db2和db3兩臺主機也要配置agent配置文件,我們直接把mmm_common.conf從db1拷貝到db2和db3兩臺主機的/etc/mysql-mmm下。

注意:monitor主機要需要:

scp /etc/mysql-mmm/mmm_common.conf db2:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf db3:/etc/mysql-mmm/
分別在db1,db2,db3三臺主機的/etc/mysql-mmm配置mmm_agent.conf文件,分別用不同的字符標識,注意這三臺機器的this db1這塊要想,比如本環境中,db1要配置this db1,db2要配置爲this db2,而db3要配置爲this db3。

在db1(192.168.0.60)上:

[[email protected] ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
[[email protected] ~]#
在db2(192.168.0.50)上:

[[email protected] ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db2
[[email protected] ~]#
在db3(192.168.0.40)上:

[[email protected] ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
[[email protected] ~]#
在db2(192.168.0.30)配置monitor的配置文件:

複製代碼
[[email protected] ~]# cat /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.0.40,192.168.0.50,192.168.0.60
auto_set_online 60
</monitor>

<host default>
monitor_user mmm_monitor
monitor_password mmm_monitor
</host>

debug 0
[[email protected] ~]#
複製代碼
這裏只在原有配置文件中的ping_ips添加了整個架構被監控主機的ip地址,而在<host default>中配置了用於監控的用戶。

(6)創建監控用戶,這裏需要創建3個監控用戶,具體描述如下:

用戶名 描述 權限
monitor user MMM的monitor端監控所有的mysql數據庫的狀態用戶 REPLICATION CLIENT
agent user 主要是MMM客戶端用於改變的master的read_only狀態用戶 SUPER,REPLICATION CLIENT,PROCESS
repl 用於複製的用戶 REPLICATION SLAVE
在3臺服務器(db1,db2,db3)進行授權,因爲我之前的主主複製,以及主從已經是ok的,所以我在其中一臺服務器執行就ok了。用於複製的賬號之前已經有了,所以這裏就授權兩個賬號。

複製代碼
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON . TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'mmm_agent';
Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION CLIENT ON . TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'mmm_monitor';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

mysql>
複製代碼
如果是從頭到尾從新搭建,則加上另外一個複製賬戶(分別在3臺服務器都需要執行這3條SQL):

GRANT REPLICATION SLAVE ON . TO 'repl'@'192.168.0.%' IDENTIFIED BY '123456';
(7)啓動agent服務。

最後分別在db1,db2,db3上啓動agent,並在db2(192.168.0.30)上啓動monitor程序:

[[email protected] ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmmagentd.pid'
Starting MMM Agent daemon... Ok
[[email protected] ~]#
[[email protected] ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[[email protected] ~]#
因爲我有些使用yum安裝的,所以啓動信息有些不一樣。^
^

[[email protected] ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[[email protected] ~]#
啓動monitor:

[[email protected] ~]# /etc/init.d/mysql-mmm-monitor start
Starting MMM Monitor Daemon: [ OK ]
[[email protected] ~]#
其中agent的日誌存放在/var/log/mysql-mmm/mmm_agentd.log,monitor日誌放在/var/log/mysql-mmm/mmm_mond.log,啓動過程中有什麼問題,通常日誌都會有詳細的記錄。

(8)在monitor主機上檢查集羣主機的狀態:

複製代碼
[[email protected] ~]# mmm_control checks all
db2 ping [last change: 2014/04/18 00:29:01] OK
db2 mysql [last change: 2014/04/18 00:29:01] OK
db2 rep_threads [last change: 2014/04/18 00:29:01] OK
db2 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db3 ping [last change: 2014/04/18 00:29:01] OK
db3 mysql [last change: 2014/04/18 00:29:01] OK
db3 rep_threads [last change: 2014/04/18 00:29:01] OK
db3 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db1 ping [last change: 2014/04/18 00:29:01] OK
db1 mysql [last change: 2014/04/18 00:29:01] OK
db1 rep_threads [last change: 2014/04/18 00:29:01] OK
db1 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null

[[email protected] ~]#
複製代碼
(9)在monitor主機上檢查集羣環境在線狀況:

[[email protected] ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[[email protected] ~]#
(10)online(上線)所有主機:

我這裏主機已經在線了,如果沒有在線,可以使用下面的命令將相關主機online

[[email protected] ~]# mmm_control set_online db1
OK: This host is already ONLINE. Skipping command.
[[email protected] ~]#
提示主機已經在線,已經跳過命令執行了。

到這裏整個集羣就配置完成了。從輸出中可以看到虛擬ip 192.168.0.108已經順利添加到主機192.168.0.60上作爲主對外提供寫服務,虛擬ip 192.168.0.88添加到主機192.168.0.50上對外提供讀服務,而虛擬ip 192.168.0.98添加到192.168.0.40上對外提供讀服務。

MMM高可用測試

我們已經完成高可用環境的搭建了,下面我們就可以做MMM的HA測試咯。首先查看整個集羣的狀態,可以看到整個集羣狀態正常。

[[email protected] ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[[email protected] ~]#
模擬db2(192.168.0.50 )宕機,手動停止mysql服務,觀察monitor日誌:

[[email protected] ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2014/04/18 00:55:53 FATAL State of host 'db2' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
從日誌發現db2的狀態有ONLINE轉換爲HARD_OFFLINE

重新查看集羣的最新狀態:

[[email protected] ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/HARD_OFFLINE. Roles:
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.88), reader(192.168.0.98)

[[email protected] ~]#
重啓db2,可以看到db2由HARD_OFFLINE轉到AWAITING_RECOVERY。這裏db2再次接管讀請求。

[[email protected] ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[[email protected] ~]#
模擬db1主庫宕機:

查看集羣狀態:

[[email protected] ~]# mmm_control show
db1(192.168.0.60) master/HARD_OFFLINE. Roles:
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88), writer(192.168.0.108)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[[email protected] ~]#
查看MMM日誌:

[[email protected] ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2014/04/18 01:09:20 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
從上面可以發現,db1由以前的ONLINE轉化爲HARD_OFFLINE,移除了寫角色,因爲db2是備選主,所以接管了寫角色,db3指向新的主庫db2,應該說db3實際上找到了db2的sql現在的位置,即db2 show master返回的值,然後直接在db3上change master to到db2。

db1,db2,db3之間爲一主兩從的複製關係,一旦發生db2,db3延時於db1時,這個時刻db1 mysql宕機,db3將會等待數據追上db1後,再重新指向新的主db2,進行change master to db2操作,在db1宕機的過程中,一旦db2落後於db1,這時發生切換,db2變成了可寫狀態,數據的一致性將會無法保證。

總結:

MMM不適用於對數據一致性要求很高的環境。但是高可用完全做到了。

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