mysqlmmm架构详解.docx
- 文档编号:25414499
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:22
- 大小:86.47KB
mysqlmmm架构详解.docx
《mysqlmmm架构详解.docx》由会员分享,可在线阅读,更多相关《mysqlmmm架构详解.docx(22页珍藏版)》请在冰豆网上搜索。
mysqlmmm架构详解
MySQL-mmm架构详解
一、MMM架构介绍
1.1MySQL-MMM概述
MMM即Master-MasterReplicationManagerforMySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。
MySQL本身没有提供replicationfailover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。
MMM不仅能提供浮动IP的功能,更可贵的是如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。
这个方案是目前比较成熟的解决方案。
1.2MySQL-MMM优缺点
优点:
高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。
缺点:
Monitor节点是单点,可以结合Keepalived实现高可用。
1.3MySQL-MMM工作原理
MMM(Master-MasterreplicationmanagerforMysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysqlreplication进行监控和故障迁移,并能管理mysqlMaster-Master复制的配置(同一时间只有一个节点是可写的)。
mmm_mond:
监控进程,负责所有的监控工作,决定和处理所有节点角色活动。
此脚本需要在监管机上运行。
mmm_agentd:
运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。
此脚本需要在被监管机上运行。
mmm_control:
一个简单的脚本,提供管理mmm_mond进程的命令。
mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql。
在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。
授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。
1.4需求描述
1.4.1系统环境
操作系统:
CentOS6.4_X64
数据库:
MySQL5.5
MMM:
MySQL-MMM2.2.1
1.4.2IP分配
数据库分配:
function
ip
hostname
serverid
master1
192.168.0.65
M1
1
master2
192.168.0.66
M2
2
slave1
192.168.0.67
Slave1
3
monitoringhost
192.168.0.68
monitor
4
虚拟IP地址(VIP):
ip
role
192.168.0.70
writer
192.168.0.71
reader
192.168.0.72
reader
192.168.0.73
reader
1.4.3数据库用户权限
数据库同步需要的用户:
function
description
privileges
monitoruser
mmm监控用于对mysql服务器进程健康检查
REPLICATION CLIENT
agentuser
mmm代理用来更改只读模式,复制的主服务器等
SUPER, REPLICATIONCLIENT,PROCESS
replicationuser
用于复制
REPLICATIONSLAVE
1.5MySQL-MMM架构图
二、MySQLM-M-S同步复制
2.1MySQL安装
2.1.1检查系统是否安装过MYSQL
#rpm-qa|grepmysql #如果有,使用以下命令先卸载
#yumremovemysql*
2.1.2下载MYSQL软件,编译安装,在四台机器上都需要做
具体安装步骤见《mysql5.5安装》
2.2DB配置
2.2.1M1配置
1)修改M1的f,确定有以下内容
port =3306
server-id=1
log-bin=mysql-bin
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
skip-name-resolve
2)创建mysql复制用户
GRANTREPLICATIONSLAVEON*.*TO 'slave'@'192.168.0.%' IDENTIFIEDBY'slave';
flushprivileges;
2.2.2M2配置
1)修改M2的f,确定有以下内容
port=3306
server-id=2
log-bin=mysql-bin
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2
skip-name-resolve
2)创建mysql复制用户
GRANTREPLICATIONSLAVEON*.*TO 'slave'@'192.168.0.%' IDENTIFIEDBY'slave';
flushprivileges;
2.2.3slave1配置
修改slave1的f,确定有以下内容
port=3306
server-id=3
log-bin=mysql-bin
log-slave-updates
skip-name-resolve
2.2.4monitor配置
修改monitor的f,确定有以下内容
Port=3306
server-id=4
log-bin=mysql-bin
log-slave-updates
2.3同步数据
2.3.1锁表
1)将M1数据库的表进行锁定,禁止服务器写入数据
mysql>flushtableswithreadlock;
2)确定同步复制POS起始位置
mysql>showmasterstatus\G
***************************1.row***************************
File:
mysql-bin.000001
Position:
409
Binlog_Do_DB:
Binlog_Ignore_DB:
1rowinset(0.00sec)
2.3.2导库
将M1的数据导出,并复制到M2和slave1,然后分别导入到M2和slave1数据库
2.4配置复制关系
2.4.1配置M2复制M1的数据
M2配置:
mysql>CHANGEMASTERTO
->MASTER_HOST='192.168.0.65',
->MASTER_USER='slave',
->MASTER_PASSWORD='slave',
->MASTER_PORT=3306,
->MASTER_LOG_FILE='mysql-bin.000001',
->MASTER_LOG_POS=409,
->MASTER_CONNECT_RETRY=10;
mysql>startslave;
QueryOK,0rowsaffected(0.00sec)
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
192.168.0.65
Master_User:
slave
Master_Port:
3306
Connect_Retry:
10
Master_Log_File:
mysql-bin.000001
Read_Master_Log_Pos:
409
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
251
Relay_Master_Log_File:
mysql-bin.000001
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
2.4.2配置M1复制M2的数据
M2的POS起始位置
mysql>showmasterstatus\G
***************************1.row***************************
File:
mysql-bin.000001
Position:
325
Binlog_Do_DB:
Binlog_Ignore_DB:
M1配置:
mysql>CHANGEMASTERTO
->MASTER_HOST='192.168.0.66',
->MASTER_USER='slave',
->MASTER_PASSWORD='slave',
->MASTER_PORT=3306,
->MASTER_LOG_FILE='mysql-bin.000001',
->MASTER_LOG_POS=325,
->MASTER_CONNECT_RETRY=10;
QueryOK,0rowsaffected(0.01sec)
mysql>startslave;
QueryOK,0rowsaffected(0.00sec)
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
192.168.0.66
Master_User:
slave
Master_Port:
3306
Connect_Retry:
10
Master_Log_File:
mysql-bin.000001
Read_Master_Log_Pos:
325
Relay_Log_File:
zj14-relay-bin.000002
Relay_Log_Pos:
251
Relay_Master_Log_File:
mysql-bin.000001
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
2.4.2配置slave1复制M1的数据
mysql>CHANGEMASTERTO
->MASTER_HOST='192.168.0.65',
->MASTER_USER='slave',
->MASTER_PASSWORD='slave',
->MASTER_PORT=3306,
->MASTER_LOG_FILE='mysql-bin.000001',
->MASTER_LOG_POS=409,
->MASTER_CONNECT_RETRY=10;
mysql>startslave;
QueryOK,0rowsaffected(0.00sec)
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
192.168.0.65
Master_User:
slave
Master_Port:
3306
Connect_Retry:
10
Master_Log_File:
mysql-bin.000001
Read_Master_Log_Pos:
409
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
251
Relay_Master_Log_File:
mysql-bin.000001
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
2.5M-M-S测试
在M1的test目录建立一张表
M1:
mysql>usetest
Databasechanged
mysql>createtablet(idint(11)notnullauto_increment,namevarchar(30),primarykey(id));
QueryOK,0rowsaffected(0.00sec)
mysql>insertintot(name)values('andy.feng');
QueryOK,1rowaffected(0.00sec)
mysql>select*fromt;
+----+-----------+
|id|name |
+----+-----------+
| 1|andy.feng|
+----+-----------+
1rowinset(0.00sec)
在M2上查询,并且也插入一条数据,到M1再查看,是否两边同步,并且注意id的值
M2:
mysql>usetest
Databasechanged
mysql>select*fromt;
+----+-----------+
|id|name |
+----+-----------+
| 1|andy.feng|
+----+-----------+
1rowinset(0.00sec)
mysql>insertintot(name)values('');
QueryOK,1rowaffected(0.00sec)
mysql>insertintot(name)values('mysql-mmm');
QueryOK,1rowaffected(0.00sec)
mysql>select*fromt;
+----+-----------+
|id|name |
+----+-----------+
| 1|andy.feng|
| 2| |
| 4|mysql-mmm|
+----+-----------+
3rowsinset(0.00sec)
M1:
mysql>select*fromt;
+----+-----------+
|id|name |
+----+-----------+
| 1|andy.feng|
| 2| |
| 4|mysql-mmm|
+----+-----------+
3rowsinset(0.00sec)
Slave1:
mysql>usetest
Databasechanged
mysql>select*fromt;
+----+-----------+
|id|name |
+----+-----------+
| 1|andy.feng|
| 2| |
| 4|mysql-mmm|
+----+-----------+
3rowsinset(0.00sec)
这样看来,master-master-slave复制是搭建成功了。
三、MySQL-MMM安装
CentOS默认没有mysql-mmm软件包,官方推荐使用epel的网络源,四台都安装epel
注意:
如果是rhel6或者centos6,32位版本,下载地址为:
http:
//dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
如果是rhel6或者centos6,64位版本,下载地址为:
http:
//dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
我在本地将mysql-mmm的所有依赖包下载做了一个yum本地源,不用下载epel,直接yuminstallmysql-mmm*
3.1mysql添加agentd的用户
M1,M2,slave1:
mysql>grantsuper,replicationclient,processon*.*to 'mmm_agent'@'192.168.0.%' identifiedby'mmm_agent';
(由于M1和M2有复制,只需要在其中一台执行就可以了。
Slave1需要单独执行一遍)
3.2配置mysql-mmm
3.2.1M1配置
#cat/etc/mysql-mmm/mmm_agent.conf
includemmm_common.conf
thisM1
=====================================================
#cat/etc/default/mysql-mmm-agent
ENABLED=1
=====================================================
#cat/etc/mysql-mmm/mmm_common.conf
active_master_role writer
cluster_interface eth0
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user slave
replication_password slave
agent_user mmm_agent
agent_password mmm_agent
mysql_port 3306
ip192.168.0.65
modemaster
peerM2
ip192.168.0.66
modemaster
peerM1
ip192.168.0.67
modeslave
hostsM1,M2
ips192.168.0.70
modeexclusive
hostsM1,M2,slave1
ips192.168.0.71,192.168.0.72,192.168.0.73
modebalanced
将M1的/etc/mysql-mmm/mmm_common.conf文件拷贝到M2,slave1,monitor相同的位置
3.2.2M2配置
M2:
#cat/etc/mysql-mmm/mmm_agent.conf
includemmm_common.conf
thisM2
=====================================================
#cat/etc/default/mysql-mmm-agent
ENABLED=1
3.2.3slave1配置
slave1:
#cat/etc/mysql-mmm/mmm_agent.conf
includemmm_common.conf
thisslave1
=====================================================
#cat/etc/default/mysql-mmm-agent
ENABLED=1
3.2.4启动MYSQL-MMM_AGENT
M1,M2,slave1:
#/etc/init.d/mysql-mmm-agentstart
查看进程
[root@mysql-master-1~]#ps-ef|grepmmm
root1151210May21?
00:
00:
00mmm_agentd
root11514115120May21?
00:
01:
39mmm_agentd
root14450342011:
26pts/000:
00:
00grep--colormmm
Note:
如果不能启动,可以查看/var/log/mysql-mmm/mmm_agentd.log文件的提示,或者启动时候的报错,最大的可能是perl对应模块没有安装成功,成功安装对应的模块就可以解决问题了。
3.3配置MYSQL-MMM-MONITOR
3.3.1创建mmm-monitor的mysql用户
创建mmm-monitor使用的mysql用户,在M1,M2,slave1上
M1,M2,slave1:
mysql>grantreplicationclienton*.*to 'mmm_monitor'@'192.168.0.%' identifiedby'mmm_monitor';
3.3.2修改mmm_mon.conf
monitor:
includemmm_common.conf
ip127.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
ping_ips192.168.0.65,192.168.0.66,192.168.0.67
auto_set_online10
#Thekill_host_bindoesnotexistbydef
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysqlmmm 架构 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)