msyql -3m架構詳解


 


    我們先來回顧一下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  (能夠登陸成功說明配置成功) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM