本博文出自51CTO博客之星李珣博主,有任何问题请进入博主页面互动讨论! |
MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写 入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实 现数据备份、节点之间重新同步功能的脚本。
MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。
MMM项目来自 Google:http://code.google.com/p/mysql-master-master
官方网站为:http://mysql-mmm.org
MMM主要功能由下面三个脚本提供
- l mmm_mond 负责所有的监控工作的监控守护进程,决定节点的移除等等
- l mmm_agentd 运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点
- l mmm_control 通过命令行管理mmm_mond进程
在两个节点的master-master环境下,MMM使用5个IP。每个单独的节点使用一个固定IP,这个固定IP永远不会变化。
2个reader IPs(read-only)和一个writer IP(updates),后面三个IP(2个reader IP和一个Writer IP)在两个节点之间迁移,如何迁移取决于节点的可用性。
正 常情况下(没有复制失败,没有复制延迟等)活动的master有两个虚拟ip(reader和writer),备用的master有一个虚拟 ip(reader),如果活动的master失败了,那么所有的reader和writer虚拟IP都会被分配给备用的master。
具体的配置信息如下所示:
- 角色 ip地址 主机名字 server-id
- monitoring 10.0.0.6 monitor -
- master1 10.0.0.4 db1 1
- master2 10.0.0.5 db2 2
- slave1 10.0.0.7 db3 3
业务中的服务ip信息如下所示:
- ip地址 角色 描述
- 10.0.0.80 write 应用程序连接该ip对主库进行写请求
- 10.0.0.90 read 应用程序连接该ip进行读请求
- 10.0.0.100 read 应用程序连接该ip进行读请求
部署架构如下图:
MySQL-MMM优缺点
优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。
缺点:Monitor节点是单点,可以结合Keepalived实现高可用。
#p#
具体的部署步骤如下:
(1)主机配置
在Azure中创建一个虚拟网络,然后在库中创建虚拟机,选择基于CENTOS Openlogic 6.5
PS:由于MMM的监控机制需要检查PING,请确保所有虚拟机在一个VNET下。
同时完成四台虚拟机的创建,分别是master1、master2、slave、monitor,如下图:
使用那个Xshell连接到VM
首先获取root权限并修改root密码,如下操作
Sudo su -
输入密码
Passwd root
在每一台服务器上用yum命令安装MYSQL服务
- # yum install mysql-server
安装完成后重启MYSQL服务
- # service mysqld restart
连接到mysql,修改mysql root密码,如下操作:
- # mysql -uroot
- use mysql
- update user set password=password('p@ssw0rd') where user='root';
- flush privileges;
select user,host,password from mysql.user
#p#
(2)配置Master-Master复制
在db1(master1)、db2(master2)、db3(slave)上编译my.conf
- #vi /etc/my.cnf
- [mysqld]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- user=mysql
- #下面为新添加的内容
- default-storage-engine = innodb
- replicate-ignore-db = mysql
- binlog-ignore-db = mysql
- server-id = 1 #每台服务器不能相同
- log-bin = /var/log/mysql/mysql-bin.log
- log_bin_index = /var/log/mysql/mysql-bin.log.index
- relay_log = /var/log/mysql/mysql-bin.relay
- relay_log_index = /var/log/mysql/mysql-bin.relay.index
- expire_logs_days = 10
- max_binlog_size = 100M
- log_slave_updates = 1
注意:
1)server-id在每台服务器上的值都是不一样,在这里依次为1、2、3、4。
2) 因为在这里把log文件配置到了/var/log/mysql下,而mysql默认的目录是在/var/lib/mysql,所以首先要新建mysql文 件夹,Mkdir /var/log/mysql,然后用chown -R mysql.mysql /var/log/mysql mysql命令将mysql的所有者修改为用户mysql。其次要保证,mysql文件夹的权限755(即-rwxr-xr-x)。
如果没 有修改权限和所有者,重启服务时就会在错误日志中出现找不到mysql-bin.log或者mysql-bin.log.index的错误(/usr /libexec/mysqld: File '/var/log/mysql/mysql-bin.log.index' not found (Errcode: 13))。
完成编译后重启MYSQL服务
检查复制状态,如下图:
show master status;
检查日志是否生成道新目录,如下
# ls /var/log/mysql
使用mysql-mmm时一共需要三个用户: replication、mmm_agent和mmm_monitor(管理服务器上用来监控cluster状态的用户,所以可以限定只能从管理服务器登录)。使用下面三条命令新建这三个用户并分配相应的权限
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'10.0.0.%' IDENTIFIED BY 'monitor';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.0.0.%' IDENTIFIED BY 'agent';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.0.0.%' IDENTIFIED BY 'replication';
接下来再db1和db2分别执行下面命令修改复制账户和密码。并启动SLAVE进程。
change master to master_host='10.0.0.4', master_port=3306, master_user='replication', master_password='replication';start slave;
change master to master_host='10.0.0.5', master_port=3306, master_user='replication', master_password='replication';start slave;
检查复制状态,如下图:
show slave status\G
#p#
(3)安装配置MYSQL-MMM
在db1、db2、db3安装MMM所需要的Perl模块(所有服务器)执行该脚本,然后 yum -y install mysql-mmm-agent来安装MMM :
- # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- # yum -y install mysql-mmm-agent
在Monitor节点安装mysql-mmm-monitor
- # yum -y install mysql-mmm-monitor*
- # yum -y install perl-Time-HiRes*
编译DB1上的mmm_common.conf配置agent:
- # sudo vim /etc/mysql-mmm/mmm_common.conf
- active_master_role writer
- cluster_interface eth0
- pid_path /var/run/mysql-mmm/mmm_agentd.pid
- bin_path /usr/libexec/mysql-mmm/
- replication_user replication
- replication_password replication
- agent_user mmm_agent
- agent_password agent
- ip 10.0.0.4
- mode master
- peer db2
- ip 10.0.0.5
- mode master
- peer db1
- ip 10.0.0.7
- mode slave
- hosts db1, db2
- ips 10.0.0.100
- mode exclusive
- hosts db2, db3
- ips 10.0.0.80, 10.0.0.90
- mode balanced
其中 replication_user 用于检查复制的用户, agent_user 为agent的用户, mode 标明是否为主或者备选主,或者从库。 mode exclusive 主为独占模式,同一时刻只能有一个主, 中hosts表示目前的主库和备选主的真实主机ip或者主机名, ips 为对外提供的虚拟机ip地址, 中hosts代表从库真实的ip和主机名, ips 代表从库的虚拟ip地址。
完成编译后通过scp复制到db2、db3、monitor节点:
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.5:/etc/mysql-mmm/
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.7:/etc/mysql-mmm/
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.6:/etc/mysql-mmm/
分别在db1,db2,db3三台主机的/etc/mysql-mmm配置mmm_agent.conf文件,分别用不同的字符标识,注意这三台机器的this db1这块要想,比如本环境中,db1要配置this db1,db2要配置为this db2,而db3要配置为this db3。
- # sudo vim /etc/mysql-mmm/mmm_agent.conf
在monitor节点编译monitor配置文件,添加ping_ips中的内容
- # sudo vim /etc/mysql-mmm/mmm_mon.conf
在db1、db2、db3启动agent服务
- # service mysql-mmm-agent start
在monitor启动monitor服务