首頁  >  文章  >  資料庫  >  詳解MySQL高可用MMM搭建方案及架構原理_MySQL

詳解MySQL高可用MMM搭建方案及架構原理_MySQL

WBOY
WBOY原創
2016-09-09 08:13:391224瀏覽

先來看看架構,如下圖:

部署

1.修改hosts

在所有的伺服器中執行相同的操作。

vim /etc/hosts

192.168.137.10 master
192.168.137.20 backup
192.168.137.30 slave
192.168.137.40 monitor

2.新增mysql用戶

只需要在所有的資料庫端執行即可,監控端不需要。

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.137.%' IDENTIFIED BY 'mmm_monitor'; 
GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.137.%' IDENTIFIED BY 'mmm_agent';
flush privileges;

注意:repl用戶在搭建主從服務的時候已經創建好了。

 3.安裝監控軟體

注意:監控端全部安裝,但監控端只需要用到mysql-mmm-monitor,mysql-mmm-agent不需要啟動。

資料庫端只需要安裝mysql-mmm-agent

1.在監控伺服器執行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum –y install mysql-mmm*

2.在資料庫伺服器上執行,每個資料庫伺服器上都要執行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum -y install mysql-mmm-agent

路徑說明:

4.設定檔

db伺服器設定檔:mmm_agent.conf,mmm_common.conf

監控伺服器的設定檔:mmm_mon.conf,mmm_common.conf(該檔案所有伺服器一樣)

設定db伺服器

1.修改master伺服器

vim /etc/mysql-mmm/mmm_common.conf

active_master_role  writer  ###积极的master角色的标示,所有的db服务器都需要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。

<host default>
 cluster_interface  eth0  #####群集的网络接口
 pid_path    /var/run/mysql-mmm/mmm_agentd.pid ####pid路径
 bin_path    /usr/libexec/mysql-mmm/    #####可执行文件路径 
 replication_user  repl   #######复制用户
 replication_password repl   #######复制用户密码
 agent_user    mmm_agent  #######代理用户,用于更改只读操作
 agent_password   mmm_agent  #######代理用户密码
</host>

<host master>   ##########master1的host名
 ip  192.168.137.10 #####master1的ip
 mode master  ########角色属性,master代表是主
 peer backup  ########与master1对等的服务器的host名,也就是master2的服务器host名
</host>

<host backup>  ####和master的概念一样
 ip  192.168.137.20
 mode master
 peer master
</host>

<host slave>  #####从库的host名,如果存在多个从库可以重复一样的配置
 ip  192.168.137.30 ####从的ip
 mode slave #####slave的角色属性代表当前host是从
</host>

<role writer> ####writer角色配置
 hosts master,backup ####能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
 ips  192.168.137.100 #####对外提供的写操作的虚拟IP
 mode exclusive #####exclusive代表只允许存在一个主,也就是只能提供一个写的IP
</role>

<role reader> #####read角色配置
 hosts backup,slave ######对外提供读操作的服务器的host名,当然这里也可以把master加进来
 ips  192.168.137.120,192.168.137.130,192.168.137.140 ###对外提供读操作的虚拟ip,这两个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip
 mode balanced ###balanced代表负载均衡
</role>

同時將這個檔案拷貝到其它的伺服器包括監控伺服器,配置不變

scp /etc/mysql-mmm/mmm_common.conf slave:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf backup:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf monitor:/etc/mysql-mmm/

2.代理檔案配置

vim /etc/mysql-mmm/mmm_agent.conf

 

注意:這個配置只配置db伺服器,監控伺服器不需要配置,this後面的host名稱改成目前伺服器的host指令,master2和slave也改成對應的伺服器的host名稱。

3.啟動代理程式 

chkconfig mysql-mmm-agent on

service mysql-mmm-agent start

每台db伺服器上都需要啟動

設定監控伺服器

vim /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 #####群集的状态文件,也就是执行mmm_control show操作的显示来源。
 ping_ips   192.168.137.10,192.168.137.20,192.168.137.30 ######被监控的db服务器的ip地址
 auto_set_online  0 ####设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online

 # 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 ####监控db服务器的用户
 monitor_password mmm_monitor ####监控db服务器的密码
</host>

debug 0  #######debug 0正常模式,1为debug模式

注意:設定檔中的註解是為了便於理解,在部署的時候最好把註解去掉以免因為註解造成的潛在影響。

啟動監控進程

chkconfig mysql-mmm- monitor on
service mysql-mmm-monitor start

注意:無論是在db端還是在監控端如果有對設定檔進行修改操作都需要重新啟動代理程式和監控進程。

操作分析

日誌檔

日誌檔案往往是分析錯誤的關鍵,所以要善於利用日誌檔案進行問題分析。

db端:/var/log/mysql-mmm/mmm_agentd.log

監控端:/var/log/mysql-mmm/mmm_mond.log

命令檔

     mmm_agentd :db代理程式的啟動檔案

     mmm_mond :監控進程的啟動檔案  

     mmm_backup :備份檔案

     mmm_restore :還原檔案

     mmm_clone   

     mmm_control:監控操作指令檔    

db伺服器端只有mmm_agentd程序,其它的都是在monitor伺服器端。

mmm_control用法

mmm_control程式可以用來監控群集狀態、切換writer、設定onlineoffline操作等。

Valid commands are:
 help        - show this message ###帮助信息
 ping        - ping monitor ###ping当前的群集是否正常
 show        - show status ####群集在线状态检查
 checks [<host>|all [<check>|all]] - show checks status #####执行监控检查操作
 set_online <host>     - set host <host> online ####将host设置为online
 set_offline <host>    - set host <host> offline ###将host设置为offline
 mode        - print current mode. ####打印输出当前的mode
 set_active      - switch into active mode.
 set_manual      - switch into manual mode.
 set_passive      - switch into passive mode.
 move_role [--force] <role> <host> - move exclusive role <role> to host <host> ####移除writer服务器为指定的host服务器
          (Only use --force if you know what you are doing!)
 set_ip <ip> <host>    - set role with ip <ip> to host <host>

1.檢查所有的db伺服器群集狀態

[root@monitor mysql-mmm]# mmm_control checks all
master ping   [last change: 2016/06/07 16:31:24] OK
master mysql  [last change: 2016/06/07 16:31:24] OK
master rep_threads [last change: 2016/06/07 16:31:24] OK
master rep_backlog [last change: 2016/06/07 16:31:24] OK: Backlog is null
slave ping   [last change: 2016/06/07 16:31:24] OK
slave mysql  [last change: 2016/06/07 16:31:24] OK
slave rep_threads [last change: 2016/06/07 16:31:24] OK
slave rep_backlog [last change: 2016/06/07 16:31:24] OK: Backlog is null
backup ping   [last change: 2016/06/07 16:31:24] OK
backup mysql  [last change: 2016/06/07 16:31:24] OK
backup rep_threads [last change: 2016/06/07 16:31:24] OK
backup rep_backlog [last change: 2016/06/07 16:31:24] OK: Backlog is null

檢查項目包括:ping、mysql是否正常運作、複製執行緒是否正常等

2.檢查群集環境線上狀況

[root@monitor mysql-mmm]# mmm_control show
 backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
 master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
 slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.對指定的host執行offline操作

[root@monitor mysql-mmm]# mmm_control set_offline backup
OK: State of 'backup' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!
[root@monitor mysql-mmm]# mmm_control show
 backup(192.168.137.20) master/ADMIN_OFFLINE. Roles: 
 master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
 slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)

4.對指定的host執行onine操作

[root@monitor mysql-mmm]# mmm_control set_online backup
OK: State of 'backup' changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor mysql-mmm]# mmm_control show
 backup(192.168.137.20) master/REPLICATION_FAIL. Roles: 
 master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
 slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)

[root@monitor mysql-mmm]# mmm_control show
 backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
 master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
 slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

5.執行write切換

1.查看目前的slave對應的master

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
     Master_Host: 192.168.137.10
     Master_User: repl
     Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000073
   Read_Master_Log_Pos: 1461
    Relay_Log_File: mysql-relay-bin.000006
    Relay_Log_Pos: 283
  Relay_Master_Log_File: mysql-bin.000073
    Slave_IO_Running: Yes
   Slave_SQL_Running: Yes

2.writer切換,要確保mmm_common.conf檔案中的writer屬性有配置對應的host,否則無法切換

[root@monitor mysql-mmm]# mmm_control move_role writer backup
OK: Role 'writer' has been moved from 'master' to 'backup'. Now you can wait some time and check new roles info!
[root@monitor mysql-mmm]# mmm_control show
 backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120), writer(192.168.137.100)
 master(192.168.137.10) master/ONLINE. Roles: 
 slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.save從庫自動切換到了新的master

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
     Master_Host: 192.168.137.20
     Master_User: repl
     Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000039
   Read_Master_Log_Pos: 120
    Relay_Log_File: mysql-relay-bin.000002
    Relay_Log_Pos: 283
  Relay_Master_Log_File: mysql-bin.000039
    Slave_IO_Running: Yes
   Slave_SQL_Running: Yes

其它處理問題

 如果不想让writer从master切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉3612df8997eca9306e1f789dddf71f78中的backup

<role writer> ####writer角色配置
 hosts master ###这里只配置一个Hosts
 ips  192.168.137.100 #####对外提供的写操作的虚拟IP
 mode exclusive #####exclusive代表只允许存在一个主,也就是只能提供一个写的IP
</role>

 这样的话当master出现故障了writer写操作不会切换到backup服务器,并且slave也不会指向新的master,此时当前的MMM之前对外提供写服务。

总结

主从的延时会导致写VIP的切换。

       1.对外提供读写的虚拟IP是由monitor程序控制。如果monitor没有启动那么db服务器不会被分配虚拟ip,但是如果已经分配好了虚拟ip当monitor程序关闭了原先分配的虚拟ip不会立即关闭外部程序还可以连接访问(只要不重启网络),这样的好处就是对于monitor的可靠性要求就会低一些,目前还不知道能维持多长的时间,但是如果这个时候其中的某一个db服务器故障了就无法处理切换,也就是原先的虚拟ip还是维持不变,挂掉的那台DB的虚拟ip会变的不可访问。

       2.agent程序受monitor程序的控制处理write切换,从库切换等操作。如果monitor进程关闭了那么agent进程就起不到什么作用,它本身不能处理故障。

       3.monitor程序负责监控db服务器的状态,包括Mysql数据库、服务器是否运行、复制线程是否正常、主从延时等;它还用于控制agent程序处理故障。

       4.monitor会每隔几秒钟监控db服务器的状态,如果db服务器已经从故障变成了正常,那么monitor会自动在60s之后将其设置为online状态(默认是60s可以设为其它的值),有监控端的配置文件参数“auto_set_online”决定,群集服务器的状态有三种分别是:HARD_OFFLINE→AWAITING_RECOVERY→online

       5.默认monitor会控制mmm_agent会将writer db服务器read_only修改为OFF,其它的db服务器read_only修改为ON,所以为了严谨可以在所有的服务器的my.cnf文件中加入read_only=1由monitor控制来控制writer和read,root用户和复制用户不受read_only参数的影响

以上就是本文的全部内容,希望本文对大家学习mysql有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn