mysql的MMM集群的搭建
各主机之间进行解析
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.218 node2
192.168.1.238 node1
192.168.1.235 node3
简单的架构方案是二主一从一个监控端
用户:
三个用户:
minoter: 用于监控mysql数据库的状态,包括主从延时等
agent : 修改write服务器的read_only状态,执行从库重新定向新的主库等
rep : 主从、主主之间的复制用户
前两个用户在监控端不需要创建
wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
tar xf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
cd /etc/mysql-mmm/
vim mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
replication_user rep
replication_password 123
agent_user mmm_agent
agent_password 123
</host>
<host node1>
ip 192.168.1.238
mode master
peer node2
</host>
<host node2>
ip 192.168.1.218
mode master
peer node1
</host>
<host node3>
ip 192.168.1.235
mode slave
</host>
<role writer>
hosts node1, node2
ips 192.168.1.250
mode exclusive
</role>
<role reader>
hosts node2, node3
ips 192.168.1.251, 192.168.1.252
mode balanced
</role>
active_master_role writer 积极的master角色的标示,所有的db服务器都需要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭
<host default>
cluster_interface eth0 集群的网络接口
pid_path /var/run/mmm_agentd.pid pid路径
bin_path /usr/libexec/mysql-mmm/ 可执行文件路径
replication_user rep 复制用户
replication_password 123 复制用户密码
agent_user mmm_agent 代理用户,用于更改制度操作
agent_password 123 代理用户密码
</host>
<host node1> 定义master1的主机名
ip 192.168.1.238 master1的ip
mode master 角色属性,master代表的是主
peer node2 与master1对等的服务器的主机名,
</host>
<host node2> 和master1的属性一样
ip 192.168.1.218
mode master
peer node1 与master2对等的服务器的主机名
</host>
<host node3> 从库的主机名,如果存在多个库可以重复一样的配置
ip 192.168.1.235 从库的IP
mode slave slave 的角色属性,代表当前host是从
</host>
<role writer> write的角色配置
hosts node1, node2 能够进行写操作的服务器名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作
ips 192.168.1.250 对外提供写操作的虚拟IP
mode exclusive exclusive代表只允许存在一个主,也就是只能提供一个写的IP
</role>
<role reader> read的角色配置
hosts node2, node3 对外提供读操作的服务器名,这里也可以把master添加进来
ips 192.168.1.251, 192.168.1.252 对外提供读操作的虚拟ip,此处的ip个数可以不等于服务请求名的个数,只不过到时某个read的服务器有多个虚拟ip
mode balanced balanced代表负载均衡
</role>
每台服务器上都进行配置,配置不变
cat mmm_agent.conf
include mmm_common.conf
# The 'this' variable refers to this server. Proper operation requires
# that 'this' server (db1 by default), as well as all other servers, have the
# proper IP addresses set in mmm_common.conf.
this node1
只配置DB服务器,this后进行修改,改成当前服务器的hostname,backup和slave也修改成对应的主机名
启动mysql-mmm-agent
/etc/init.d/mysql-mmm-agent start
监控端的配置
vim mmm_mon.conf
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid_path /var/run/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.1.238,192.168.1.218,192.168.1.235
auto_set_online 60
# 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_minoter
monitor_password 123
</host>
debug 0
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid_path /var/run/mmm_mond.pid pid存放路径
bin_path /usr/libexec/mysql-mmm 可执行文件路径
status_path /var/lib/mysql-mmm/mmm_mond.status 集群的状态文件,也就是执行mmm_control show操作的显示来源
ping_ips 192.168.1.238,192.168.1.218,192.168.1.235 被监控的mysql数据库的ip
auto_set_online 60 设置自动online的时间,默认是超过60s就将他设为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_minoter 监控数据库的用户
monitor_password 123 监控数据库用户的密码
</host>
debug 0 0为正常模式,1为debug模式
启动监控端
/etc/init.d/mysql-mmm-monitor start
命令的使用:
mmm_control --help
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.
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> 更换主机的角色,切换角色
(Only use --force if you know what you are doing!)
set_ip <ip> <host> - set role with ip <ip> to host <host>
在线切换
mmm_control move_role write node2
OK: Role 'writer' has been moved from 'node1' to 'node2'. Now you can wait some time and check new roles info!
mmm_control show
node1(192.168.1.238) master/ONLINE. Roles:
node2(192.168.1.218) master/ONLINE. Roles: reader(192.168.1.252), writer(192.168.1.250)
node3(192.168.1.235) slave/ONLINE. Roles: reader(192.168.1.251)
===============================================================================================================
当master1宕掉时写ip自动票到master2上,但是当master1重新起来时,写ip并不会自动票到master1上,而是当master2宕掉时才会自动飘到master1上,而此时slave上则有两个读ip,
当master2回复后也不会自动飘到master2上,也需要等slave宕掉时才会自动飘到master2上。
mysql-MMM适合的场景是对数据的一致性要求不高的情况下,完全能够支持高可用的使用
===================================================================================================================
MMM+把同步复制
查询mysql是否支持动态插件
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.00 sec)
安装动态插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> select * from mysql.plugin;
+----------------------+--------------------+
| name | dl |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
| rpl_semi_sync_slave | semisync_slave.so |
+----------------------+--------------------+
注意:由于我当前的双主模式所以主和备都需要执行主从的插件,如果只是单纯的主从模式那么主执行主的插件从执行从的插件即可。
开启半同步复制:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
同样主和备上面都同时执行上面两个操作,注意必须是开启全局的变量,如果开机开启在配置文件中进行修改
重启IO线程
准备都执行
mysql> stop slave IO_THREAD; start slave IO_THREAD;
配置参数:
mysql> show variables like '%rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+------------------------------------+-------+
6 rows in set (0.00 sec)
rpl_semi_sync_master_enabled、rpl_semi_sync_slave_enabled
分别代表主从的半同步复制是否启用,因为我当前是双主模式所以即担当了主又担当了从,所以这里面存在slave的参数在里面
rpl_semi_sync_master_timeout
该参数是配置半同步复制的延时时间,当主库发生binlog到从库从库在10s内还没有返回则自动转换为异步复制,这个时间可以调整,默认是10S
注意:如果仅仅是作为slave那么只有"rpl_semi_sync_slave_enable","rpl_semi_sync_trace_level"这两个状态,其它的4个是作为master端显示的,由于我这里是配置双主模式,所有主从都存在
mysql> show status like '%rpl_%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 16138 |
| Rpl_semi_sync_master_net_wait_time | 80690 |
| Rpl_semi_sync_master_net_waits | 5 |
| Rpl_semi_sync_master_no_times | 2 |
| Rpl_semi_sync_master_no_tx | 6 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1620 |
| Rpl_semi_sync_master_tx_wait_time | 1620 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
| Rpl_semi_sync_slave_status | ON |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
这些状态参数比较重要,通常用来对半同步复制进行分析。
Rpl_semi_sync_master_clients:有多个个半同步复制的从库,对于当前的主来说只有backup是半同步复制的从库,而slave是异步复制,所以这里是1;
Rpl_semi_sync_master_net_avg_wait_time:master等待从库的平均响应时间,单位微妙
Rpl_semi_sync_master_net_wait_time: master等待从库响应的总时间,单位微妙
Rpl_semi_sync_master_net_waits:master等待从库响应的总次数
Rpl_semi_sync_master_no_times:master关闭半同步复制的次数,也就是当主从延时超过规定的时间转换为异步复制的次数。
Rpl_semi_sync_master_no_tx:master提交没有被slave响应成功的次数,也可以理解为不是同步半同步复制的次数。
Rpl_semi_sync_master_status:仅当当前服务器作为主库,是否开启了半同步复制,如果这里是OFF代表是异步复制,前提是当前查询的服务器是主服务器。
Rpl_semi_sync_master_timefunc_failures:master调用时间函数失败的次数,例如:gettimeofday().
Rpl_semi_sync_master_tx_avg_wait_time:master等待每一个事务的平均时间,单位微妙
Rpl_semi_sync_master_tx_wait_time:master等待事务的总时间,单位微妙
Rpl_semi_sync_master_tx_waits:master等待事务的总次数
Rpl_semi_sync_master_wait_pos_backtraverse:发生master写入的binlog的数量和slave响应返回的binlog数量不一致的次数。
Rpl_semi_sync_master_wait_sessions:当前等待slave响应的回话数量,该状态可以反应当前主从延时包括压力的情况
Rpl_semi_sync_master_yes_tx:master提交被slave成功响应的次数
Rpl_semi_sync_slave_status:仅当当前服务器作为从库,半同步复制是否开启,on代表开启。
注意:如果仅仅是作为slave那么只有"rpl_semi_sync_slave_status"这1个状态,其它的状态是作为master端显示的,由于我这里是配置双主模式,所有主从都存在。
测试:
模拟停掉slave
mysql> stop slave;
mysql> show status like '%Rpl_semi_sync_slave_status%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------+
1 row in set (0.00 sec)
在master端插入操作;
查看状态得到数值不一样
当从库重新启动复制之后,半同步复制也同样开启,刚才的插入记录也被异步复制应用了过来。
注意:开启半同步复制要加入到my.cnf文件中才能保证重启mysql服务后半同步复制也启用