千家信息网

mysqlzhimmm集群

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,角色ipHostnameid写读Master1192.168.1.128Master11192.168.1.100Master2(backup)192.168.1.131Master22192.168
千家信息网最后更新 2024年11月28日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 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

在数据库服务器(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

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> #master1host

ip 192.168.1.128 #ip

mode master #角色属性

peer master2 #对等的服务器host

master2>

ip 192.168.1.131

mode master

peer master1

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

ip 192.168.1.132

mode slave

slave2>

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

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

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_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 [|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

检查项包括: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 进行多线程从复制,提高复制的性能。


0