mysqlzhimmm集群

角色

专注于为中小企业提供网站建设、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业湄潭免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

ip

Hostname

id

Master1

192.168.1.128

Master1

1

192.168.1.100


Master2(backup)

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

 

 

在 master1、master2、slave1、slave2主机上安装mysql5.7和配置复制

master1 和master2互为主从,slave1、slave2为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';

把 master2、slave1和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)

 

在 master2、slave1和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

 

4、mysql-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 和slave1、slave2三台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 mmm_agent@192.168.1.%                                             |

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

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

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

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

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

| Grants for mmm_monitor@192.168.1.%                             |

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

| 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

 

在数据库服务器(master1、master2、slave1、slave2)上安装代理

[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

 

 

        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        #代理用户密码

 

    #master1的host名

        ip                                              192.168.1.128   #ip

        mode                                    master   #角色属性

        peer                                    master2   #对等的服务器host名

 

        ip                                              192.168.1.131

        mode                                    master

        peer                                    master1

 

 #从库的host名,多个则重复配置

        ip                                              192.168.1.132

        mode                                    slave

        ip                                              192.168.1.133

        mode                                    slave

 

 

 #写角色配置

        hosts                              master1,master2   #master1,master2#能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。

 

        ips                                             192.168.1.100  #写的虚拟ip

        mode                                    exclusive #代表只允许存在一个主,也就是只能提供一个写的IP

 

 #读角色分配置

        hosts                                   master2,slave1,slave2

        ips                                             192.168.1.130, 192.168.1.110, 192.168.1.120

        mode                                    balanced  #负载均衡

 

[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

thismaster1  #每台数据库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

 

        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

check_period 5

trap_period 10

timeout 2

restart_after 10000

max_backlog 86400

        monitor_user                    mmm_monitor

        monitor_password                123

 

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: 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_agentd:db代理进程的启动文件

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 [|all [|all]] - show checks status#执行监控检查操作

set_online - set host online #将host设置为online

set_offline - set 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] - move exclusive role to host #移除writer服务器

为指定的 host 服务器(Only use --force if you know what you are doing!)

set_ip - set role with ip to host

 

检查所有的 db 服务器群集状态:

[root@monitor1 ~]# mmm_control checks all

检查项包括:ping、mysql是否正常运行、复制线程是否正常等

检查群集环境在线状况:

[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_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参数的

影响。

 

 

总结

(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 进行多线程从复制,提高复制的性能。


当前文章:mysqlzhimmm集群
标题来源:http://hbruida.cn/article/ggidic.html