mysqlzhimmm集羣

角色

ip

Hostname

id

Master1

192.168.1.128

Master1

1

192.168.1.100


Master2backup

192.168.1.131

Master2

2


192.168.1.110

Slave1

192.168.1.132

Slave1

3


192.168.1.120

Slave2

192.168.1.133

Slave2

4


192.168.1.130

Monitor

192.168.1.134

Monitor1



 

 

 

在所有主機上配置/etc/hosts(master1,master2,slave1,slave2,monitor1

[root@mini1 ~]# vim /etc/hosts

192.168.1.128 master1

192.168.1.131 master2

192.168.1.132 slave1

192.168.1.133 slave2

192.168.1.134 monitor1

[root@mini1 ~]# hostnamectl set-hostname master1

[root@master1 ~]# for i in master2 slave1 slave2 monitor; do scp /etc/hosts $i:/etc/hosts ;dne

 

 

perl perl-devel perl-CPAN libart_lgpl.x86_64 rrdtool.x86_64

rrdtool-perl.x86_64

#yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64

注:使用 centos7 在線 yum 源安裝

 

 

安裝 perl 的相關庫

#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl

Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP

 

 

master1master2slave1slave2 主機上安裝 mysql5.7 和配置複製

master1 master2 互爲主從,slave1slave2 master1 的從

在每個 mysql 的配置文件/etc/my.cnf 中加入以下內容, 注意 server-id 不能重複。

[root@master1 ~]# vim /etc/my.cnf

log-bin = mysql-bin

binlog_format = mixed

server-id = 1

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

log-slave-updates = 1

auto-increment-increment = 2

auto-increment-offset = 1

[root@master2 ~]# vim /etc/my.cnf

log-bin = mysql-bin

binlog_format = mixed

server-id = 2

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

log-slave-updates = 1

auto-increment-increment = 2

auto-increment-offset = 2

[root@slave1 ~]# vim /etc/my.cnf

server-id = 3

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

read_only = 1

[root@slave2 ~]# vim /etc/my.cnf

server-id = 4

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

read_only = 1

 

4 臺數據庫主機若要開啓防火牆,要麼關閉防火牆或者創建訪問規則:

[root@master1 ~]# firewall-cmd --permanent --add-port=3306/tcp

success

[root@master1 ~]# firewall-cmd --reload

Success

 

主從配置(master1 master2 配置成主主,slave1 slave2 配置成 master1 的從):

master1 上授權:

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

master2 上授權:

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

master2slave1 slave2 配置成 master1 的從庫:

master1 上執行 show master status; 獲取 binlog 文件和 Position

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000003

         Position: 451

     Binlog_Do_DB:

 Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

 

master2slave1 slave2 執行

mysql> change master to master_host='192.168.1.128',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=451;

mysql> slave start;

MySQL [(none)]> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.1.128

                  Master_User: rep

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000003

          Read_Master_Log_Pos: 451

               Relay_Log_File: relay-bin.000002

                Relay_Log_Pos: 320

        Relay_Master_Log_File: mysql-bin.000003

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

 

master1 配置成 master2 的從庫:master2 上執行 show master status ;獲取 binlog 文件和 Position

 

mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bbin.000002',master_log_pos=1045;

mysql> start slave;

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.1.131

                  Master_User: rep

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 1045

               Relay_Log_File: relay-bin.000002

                Relay_Log_Pos: 320

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

4mysql-mmm 配置:在 4 mysql 節點上創建用戶

 

創建代理賬號:

 

mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.1.%' identified by '123';

創建監控賬號:

 

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.1.%' identified by '123';

1:因爲之前的主從複製,以及主從已經是 ok 的,所以我在 master1 服務器執行就 ok 了。

 

檢查 master2 slave1slave2 三臺 db 上是否都存在監控和代理賬號

mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');

+-------------+-------------+

| user        | host        |

+-------------+-------------+

| mmm_agent   | 192.168.1.% |

| mmm_monitor | 192.168.1.% |

+-------------+-------------+

mysql> show grants for 'mmm_agent'@'192.168.1.%';

+------------------------------------------------------------------------------+

| Grants for [email protected].%                                             |

+------------------------------------------------------------------------------+

| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'mmm_agent'@'192.168.1.%' |

+------------------------------------------------------------------------------+

MySQL [(none)]>  show grants for 'mmm_monitor'@'192.168.1.%' ;

+----------------------------------------------------------------+

| Grants for [email protected].%                             |

+----------------------------------------------------------------+

| GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' |

+----------------------------------------------------------------+

 

 

monitor 主機(192.168.31.106) 上安裝監控程序

[root@monitor1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz

[root@monitor1 mysql-mmm-2.2.1]#

[root@monitor1 mysql-mmm-2.2.1]# make install

 

在數據庫服務器(master1master2slave1slave2)上安裝代理

[root@master1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz

[root@master1 ~]# cd mysql-mmm-2.2.1/

 

 

配置 mmm

編寫配置文件,五臺主機必須一致:完成安裝後,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服務器和數據庫服務器上都要包含一個共同的文件 mmm_common.conf,內容如下:active_master_rolewriter#積極的 master 角色的標示,所有的 db 服務器要開啓 read_only 參數,對於 writer 服務器監控代理會自動將 read_only 屬性關閉。

 

[root@monitor1 mysql-mmm-2.2.1]# cd /etc/mysql-mmm/

 

[root@monitor1 mysql-mmm]# vim mmm_common.conf

 

active_master_role      writer

 

 

<host default>

        cluster_interface               ens32      #網卡名

 

        pid_path                             /var/run/mmm_agentd.pid   #pid 路徑

        bin_path                             /usr/lib/mysql-mmm/   #可執行文件路徑

 

    replication_user        rep    #複製用戶    

    replication_password    123   #複製用戶密碼

 

        agent_user                           mmm_agent   #代理用戶

        agent_password                  123        #代理用戶密碼

</host>

 

<host master1>     #master1host

        ip                                              192.168.1.128   #ip

        mode                                    master   #角色屬性

        peer                                    master2   #對等的服務器host

</host>

 

<host master2>

        ip                                              192.168.1.131

        mode                                    master

        peer                                    master1

</host>

 

<host slave1>  #從庫的host名,多個則重複配置

        ip                                              192.168.1.132

        mode                                    slave

</host>

<host slave2>

        ip                                              192.168.1.133

        mode                                    slave

</host>

 

 

<role writer>  #寫角色配置

        hosts                              master1,master2   #master1,master2#能進行寫操作的服務器的 host 名,如果不想切換寫操作這裏可以只配置 master,這樣也可以避免因爲網絡延時而進行 write 的切換,但是一旦master 出現故障那麼當前的 MMM 就沒有 writer 了只有對外的 read 操作。

 

        ips                                             192.168.1.100  #寫的虛擬ip

        mode                                    exclusive #代表只允許存在一個主,也就是隻能提供一個寫的 IP

</role>

 

<role reader>  #讀角色分配置

        hosts                                   master2,slave1,slave2

        ips                                             192.168.1.130, 192.168.1.110, 192.168.1.120

        mode                                    balanced  #負載均衡

</role>

 

[root@monitor1 mysql-mmm]# for i in master1 master2 slave1 slave2; do scp /etc/mysql-mmm/mmm_common.conf $i:/etc/mysql-mmm/ ;done

 

代理文件配置編輯 4 mysql 節點機上的/etc/mysql-mmm/mmm_agent.conf

在數據庫服務器上,還有一個 mmm_agent.conf 需要修改,其內容是:

[root@master1 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf

this master1   #每臺數據庫host

 

啓動代理進程

/etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內容

source /root/.bash_profile

 

[root@master1 mysql-mmm-2.2.1]# cd /etc/init.d/

[root@master1 init.d]# chkconfig --add mysql-mmm-agent

[root@master1 init.d]# chkconfig mysql-mmm-agent on

[root@master1 init.d]# /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@master1 init.d]# ss -lanp|grep mmm

tcp    LISTEN     0      10     192.168.1.128:9989                  *:*                   users:(("mmm_agentd",pid=9680,fd=3))

[root@master1 init.d]# firewall-cmd --add-port=9989/tcp --permanent

[root@master1 init.d]# firewall-cmd --reload

 

 

 

編輯 monitor 主機上的/etc/mysql-mmm/mmm_mon.conf

[root@monitor1 mysql-mmm]# vim /etc/mysql-mmm/mmm_mon.conf

 

include mmm_common.conf

 

<monitor>

        ip                                              127.0.0.1

        pid_path                                /var/run/mmm_mond.pid

        bin_path                                /usr/lib/mysql-mmm/

        status_path                             /var/lib/misc/mmm_mond.status

        auto_set_online 0

ping_ips                                192.168.1.128, 192.168.1.131, 192.168.1.132,192.168.1.133        #四臺數據庫的真實ip

</monitor>

<check default>

check_period 5

trap_period 10

timeout 2

restart_after 10000

max_backlog 86400

</check>

<host default>

        monitor_user                    mmm_monitor

        monitor_password                123

</host>

 

debug 0

 

啓動監控進程

/etc/init.d/mysql-mmm-monitor 的腳本文件的#!/bin/sh 下面,加入如下內容

source /root/.bash_profile

添加成系統服務並設置爲自啓動

[root@monitor1 init.d]# vim /etc/init.d/mysql-mmm-monitor

[root@monitor1 init.d]# chkconfig --add mysql-mmm-monitor

[root@monitor1 init.d]# chkconfig mysql-mmm-monitor on

[root@monitor1 init.d]# ./mysql-mmm-monitor start

Daemon bin: '/usr/sbin/mmm_mond'

Daemon pid: '/var/run/mmm_mond.pid'

Starting MMM Monitor daemon: Ok

 

[root@monitor1 ~]# mmm_control show

  master1(192.168.1.128) master/HARD_OFFLINE. Roles:

  master2(192.168.1.131) master/HARD_OFFLINE. Roles:

  slave1(192.168.1.132) slave/HARD_OFFLINE. Roles:

  slave2(192.168.1.133) slave/HARD_OFFLINE. Roles:

啓動所有mysql,然後讓所有服務上線

[root@monitor1 ~]# mmm_control set_online master1

OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles!

[root@monitor1 ~]# mmm_control show

  master1(192.168.1.128) master/ONLINE. Roles: writer(192.168.1.100)

  master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130)

  slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168..120)

  slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)

[root@master1 init.d]# ip addr

2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:d8:de:a3 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.128/24 brd 192.168.1.255 scope global noprefixroute dynamic eno16777728

       valid_lft 5352004sec preferred_lft 5352004sec

    inet 192.168.1.100/32 scope global eno16777728

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fed8:dea3/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

 

master1 down vip地址則漂到master2

[root@master1 init.d]# service mysqld stop

[root@monitor1 ~]# mmm_control show

  master1(192.168.1.128) master/HARD_OFFLINE. Roles:

  master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130), writer(192.168.1.100)

  slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168.1.120)

  slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)

 

 

 

#查看整個集羣的狀態,可以看到整個集羣狀態正常

[root@monitor1 ~]# mmm_control show

 

日誌文件:

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

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

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

命令文件:

mmm_agentddb 代理進程的啓動文件

mmm_mond:監控進程的啓動文件

mmm_backup:備份文件

mmm_restore:還原文件

mmm_control:監控操作命令文件

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

 

 

mmm_control 用法

mmm_control 程序可以用於監控羣集狀態、切換 writer、設置 online\offline 操作等。

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>

 

檢查所有的 db 服務器羣集狀態:

[root@monitor1 ~]# mmm_control checks all

檢查項包括:pingmysql 是否正常運行、複製線程是否正常等

檢查羣集環境在線狀況:

[root@monitor1 ~]# mmm_control show

對指定的 host 執行 offline 操作:

[root@monitor1 ~]# mmm_controlset_offline slave2

對指定的 host 執行 onine 操作:

[root@monitor1 ~]# mmm_controlset_online slave2

執行 write 切換(手動切換):

[root@monitor1 ~]# mmm_controlmove_role writer master1

 

 

 

總結

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_OFFLINEAWAITING_RECOVERYonline

5.默認 monitor 會控制 mmm_agent 會將 writer db 服務器 read_only 修改爲 OFF,其它的

db 服務器 read_only 修改爲 ON,所以爲了嚴謹可以在所有的服務器的 my.cnf 文件中加入

read_only=1 monitor控制來控制 writer read,root 用戶和複製用戶不受read_only 參數的

影響。

 

 

總結

(1)master2備選主節點宕機不影響集羣的狀態,就是移除了master2備選節點的讀狀態。

(2)master1 主節點宕機,由 master2 備選主節點接管寫角色,slave1,slave2 指向新 master2

主庫進行復制,slave1,slave2 會自動 change master master2.

(3)如果 master1 主庫宕機,master2 複製應用又落後於 master1 時就變成了主可寫狀態,

這時的數據主無法保證一致性。

如果 master2,slave1,slave2 延遲於 master1 主,這個時 master1 宕機,slave1,slave2 將會

等待數據追上 db1 後,再重新指向新的主 node2 進行復制操作,這時的數據也無法保證

同步的一致性。

(4)如果採用 MMM 高可用架構,主,主備選節點機器配置一樣,而且開啓半同步進一步

提高安全性或採用 MariaDB/mysql5.7 進行多線程從複製,提高複製的性能。


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