我們先來回顧一下mmm的概念,它是一套靈活的基於perl編寫的腳本程序,自己本身不提供mysql服務的功能,它是用來對mysql replication 進行監控和故障遷移,並能管理mysql Master-Master復制的配置。(同一時間只有一個節點是可寫的)。附帶的工具套件可以實現多個slaves的read負載均衡。
被管理的mysql server機需要安裝相關的agent腳本,mysql-mmm的監控端就可以對安裝過此監控腳本的mysql server 進行監控。
但是在出現多台可寫的mysql server 時,mmm為了防止寫入沖突,保證數據有效性,在同一時間,它只允許一台mysql server進行寫入操作,所以呢,它並不適用與有着大並發寫入請求的生產環境。但是呢,當有多台可讀的mysql server 存在的時候,它可以通過一些其他軟件的配合,來實現讀取請求的負載均衡,這樣大大提高mysql server 的讀取性能。
最亮的來了,在運行某一台mysql server 處於不可用狀態的時候,mmm可以將原有的操作請求遷移到其他的mysql server,從而實現了服務的高可用性。包括寫請求遷移,讀請求遷移,主從同步的master遷移。
mmm同時也提供了一套很好的運維管理工具,可以實現簡單快捷的數據備份與維護。簡化管理員的日常維護成本。
mysql-mmm的組成以及原理
三個腳本:
mmm_mond:
監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行。
mmm_agentd:
運行在每個mysql服務器上的代理進程,完成監控的探針工作,執行簡單的遠端服務設置,此腳本需要在被監管機器上運行。
mmm_control:
提供管理mmm_mond進程的命令。
原理:
mmm的監管端會提供多個虛擬IP 我們簡稱VIP,包括一個可寫VIP,多個可讀的VIP,通過監管的管理,這些IP會綁定在可用mysql之上,當某台mysql 故障時,監管機就會將它的虛擬IP遷移到其他的mysql。
所以呢,我們要在mysql中添加相關的授權用戶,以便能夠讓mysql可以支持監理機的監控,授權的用戶一般包括2個,mmm_minitor和 mmm_agent 兩個用戶,如果你想使用mmm的備份工具呢,還需要再添加一個mmm_tools用戶。
mysql-mmm架構的實現:
拓撲:五台服務器,包括:一台建立機,兩台mysql-master,兩台mysql-slave
RHEL6.x ,64位環境。
真實IP分配:
監管機:server.uplooking.com 192.168.10.254
mysql: master1.uplooking.com 192.168.10.10
mysql: master2.uplooking.com 192.168.10.20
mysql: slave1.uplooking.com 192.168.10.30
mysql: slave2.uplooking.com 192.168.10.40
虛擬IP分配:
192.168.10.110 write
192.168.10.120 read
192.168.10.130 read
192.168.10.140 read
192.168.10.150 read
開始配置:
step1:起服務
先把源碼包的四台mysql服務器搭建好,修改主配置文件。
192.168.10.10 my.cnf
server_id=10
log_bin=mysql
log_slave_updates=1
auto_increment_increment=2
auto_increment_offset=1
skip-name-resolve
:wq
192.168.10.20 my.cnf
server_id=20
log_bin=mysql
log_slave_updates=1
auto_increment_increment=2
auto_increment_offset=2
skip-name-resolve
:wq
選項解析:my.cnf
auto_increment_offset=1 指定自增長字段的起始值
auto_increment_increment=2 指定自增長字段自增長的步長
skip-name-resolve 不做主機名解析
log_slave_updates=1 允許級聯復制
自增長字段的意義主要在於限制兩台可寫入服務器在同時收到寫入請求的時候的沖突。
--------------------------------------------
192.168.10.30 my.cnf
server_id=30
log_bin=mysql
log_slave_updates=1
:wq
192.168.1.103 my.cnf
server_id=40
log_bin=mysql
log_slave_updates=1
:wq
-------------------------------------------
你會發現我把所有的bin_log日志都命名為了mysql,僅僅是習慣問題,有些配置我們要知其然,知其所以然,比如說,我為什么要加那一條不做主機名解析? 對mysql比較了解的朋友第一時間就會反映到binlog日志的命名,默認情況下mysql是根據你的主機名命名binlog日志的,主從關系的建立也就依靠這binlog日志,說到這里,我們再來回顧下主從mysql
主從mysql在建立主從關系的時候,會涉及到兩個進程,一個是Slave_IO_running,一個是Slave_SQL_running, IO負責的是把主服務器的binlog日志里的內容拷貝到本機的ralaybinlog日志里,
SQL進程呢則是負責執行本機的relaybinlog日志里的sql語句,從而把數據寫進表里。
所以說,在你主從同步的過程中,slave需要與所指向的master的日志同步,日志中的position也要同步,所以在mmm中的主從我們需要讓他保持binlog日志的同步,不然一台master故障,在切換另一台master的時候日志是同步不過來的。
10-40 mysql-server 主機 : service mysql start
step2:配置雙主:
同步兩台master的數據庫:
master1 :mysqldump --all-database > /tmp/mysql-all.sql
scp /tmp/mysql-all.sql root@192.168.10.20:/tmp
master2:mysql < /tmp/mysql-all.sql
兩台master建立主主關系:
master1上做授權:grant replication slave on *.* to slave @”%” identified by “slave” ;
flush privileges
master2 上做授權:grant relpication slave on *.* to slave@”%” identified by “slave” ;
flush privileges
master1 上做回指:
>change master to
master_host='192.168.10.20',
master_user='slave'
master_password='slave'
master_log_file='mysql-binlog'
master_log_pos=120;
master2上做回指:
>change master to
master_host='192.168.10.10',
master_user='slave'
master_password='slave'
master_log_file='mysql-binlog'
master_log_pos=120;
可以查看一下主從狀態:
echo “show slave status\G;” | mysql
.....
slave_io_running:yes
slave_sql_running:yes
......
ok ! 雙主搭建完畢。
step3:配置兩台slave:
master1上做授權:grant replication slave on *.* to 'slave@192.168.10.40' identified by “slave”
grant replication slave on *.* to 'slave@192.168.10.30' identified by “slave”
slave1、2分別回指:
>change master to
master_host='192.168.10.10',
master_user='slave'
master_password='slave'
master_log_file='mysql-binlog'
master_log_pos=120;
兩台slave全部指向了master1
ok,slave配置完成。 基本的框架結構起來了,開始配置mmm。
step4:配置mmm
在所有服務器上安裝mysql-mmm
安裝依賴包
yum -y install perl-Class-Singleton
(啟動mysql-mmm-montior進程時需要此軟件包提供的Singleton 類)
yum -y install perl-Params-Validate
yum -y install perl-XML-DOM
yum -y install perl-XML-DOM-XPath
yum -y install perl-MailTools
rpm -ivh perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
(啟動mysql-mmm-agent進程時需要此軟件包提供的Log-Log4perl 類)
tar -zxvf Algorithm-Diff-1.1902.tar.gz
(啟動mysql-mmm-agent進程時需要此軟件包提供的Algorithm-Diff類)
cd Algorithm-Diff-1.1902
perl Makefile.PL
make
make test
make install
tar -zxvf Proc-Daemon-0.03.tar.gz
(啟動mysql-mmm-agent進程時需要此軟件包提供的Daemon類)
cd Proc-Daemon-0.03
perl Makefile.PL
make
make test
make install
cd Net-ARP-1.0.8 (分配虛擬Ip地址)
perl Makefile.PL
make
make install
安裝mysql-mmm
tar -zxvf mysql-mmm-2.2.1.tar.gz
mysql-mmm-2.2.1
make install
安裝目錄
/usr/lib/perl5/vendor_perl/5.8.8/MMM MMM 使用的 perl 模塊
/usr/lib/mysql-mmm MMM 的腳本揑件
/usr/sbin MMM 的命令保存路徑
/var/log/mysql-mmm MMM 的日志保存路徑
/etc MMM 配置文件保存的路徑
/etc/mysql-mmm MMM 配置文件保存的路徑,優先級最高
/etc/init.d/ agentd 和 monitor 的啟勱關閉腳本
在10 、20、30、40 上做用戶授權(監控用戶monitor 代理用戶agent)
grant replication client on *.* to monitor@"%" identified by "monitor";
grant replication client,process,super on *.* to agent@"%" identified by "agent";
在所有主機上編輯mmm_common.conf 文件
[root@localhost mysql-mmm]# cat /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user slave
replication_password slave
agent_user agent
agent_password agent
</host>
<host db10>
ip 192.168.10.10
mode master
peer db20
</host>
<host db20>
ip 192.168.10.20
mode master
peer db10
</host>
<host db30>
ip 192.168.10.30
mode slave
</host>
<host db40>
ip 192.168.10.40
mode slave
</host>
<role writer>
hosts db10, db20
ips 192.168.10.110 #指定負責寫操作數據庫服務器使用的虛擬ip
mode exclusive
</role>
<role reader>
hosts db20, db30,db40
ips 192.168.10.120, 192.168.10.130, 192.168.10.140 #指定負責讀操作數據庫服務器使用的虛擬ip
mode balanced
</role>
[root@localhost mysql-mmm]#
參數解釋:
peer的意思是等同,表示db1與db2是同等的。
ips指定VIP
mode exclusive 只有兩種模式:exclusive是排他,在這種模式下任何時候只能一個host擁有該角色
balanced模式下可以多個host同時擁有此角色。一般writer是exclusive,reader是balanced
在4台數據庫服務器10、20、30、40上 編輯mmm_agent.conf (此文件監控主機上可以沒有)
[root@localhost mysql-mmm]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db10 #此處修改為當前數據庫服務器的主機名(主機頭名字即可)
在4台數據庫服務器10、20、30、40上啟動代理進程agent
[root@localhost ~ ]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@localhost mysql-mmm]#ps aux | grep mmm_agentd 默認監聽9989端口
編輯監控主機254的配置文件 mmm_mon.conf
[root@localhost mysql-mmm]# cat mmm_mon.conf
include mmm_common.conf
<monitor>
ip 192.168.10.254
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmm_mond.status
ping_ips 192.168.10.10, 192.168.10.20, 192.168.10.30, 192.168.10.40 #4台數據庫服務器的真實ip地址。
</monitor>
<host default>
monitor_user monitor
monitor_password monitor
</host>
debug 0
[root@localhost mysql-mmm]#
由於文件太多,在這里做下RP:
/etc/mysql-mmm/mmm_common.conf 所有主機,大家心里有數,有幾台服務器,都扮演什么角色
/etc/mysql-mmm/mmm_agent.conf 被監控主機,告訴大家自己是什么角色.
/etc/init.d/mysql-mmm-agent start 被監控主機,運行agent進程
/etc/mysql-mmm/mmm_mon.conf 告訴mmm腳本,我是監控。
/etc/init.d/mysql-mmm-monitor start 監控主機,運行monitor進程。
在監控服務器104上查看4台數據庫服務器的狀態
監控名 mmm_control命令簡介
[root@server3 mysql-mmm]# mmm_control help
help 查看幫助信息
ping ping監控
show 查看狀態信息
checks [<host>|all [<check>|all]] 顯示檢查狀態,包括(ping、mysql、rep_threads、rep_backlog)
set_online <host> 設置某host為online狀態
set_offline <host> 設置某host為offline狀態
mode 打印當前的模式,是ACTIVE、MANUAL、PASSIVE?默認ACTIVE模式
set_active 更改為active模式
set_manual 更改為manual模式
set_passive 更改為passive模式
move_role [--force] <role> <host> - move exclusive role <role> to host <host>
#更改host的模式,比如更改處於slave的mysql數據庫角色為write
(Only use --force if you know what you are doing!)
set_ip <ip> <host> 為host設置ip,只有passive模式的時候才允許更改!
測試mysql mmm 配置:
1、在監控主機192.168.1.104上執行 mmm_control show
2、停止192.168.1.100 上的數據庫服務,再執行mmm_control show命令,發現192.168.1.101 使用虛擬Ip 192.168.1.12
3、在slave角色的數據庫服務器上 查看是否獲取到監控主機分配的虛擬ip地址 ,執行命令 ip a 或 ip addr show
使用ifconfig 命令看不到網卡獲取的虛擬Ip地址。
4、分別在2台,master角色的主機上做用戶授權:grant all on *.* to root@"%" identified by "123";
在客戶端訪問master數據庫服務器:mysql -h192.168.1.12 -uroot -p123 (能夠登陸成功說明配置成功)