基于mmm实现mysql的高可用

一 .试验前规划:

实验环境:CentOS—6.5

数据库:  Mysql-5.6.19

虚拟机:VMware Workstation 10

网络拓扑结构:

三个节点非别为 master1,master2,slave. 其中master1与master2做了mysql的双主复制,slave节点基于master1做主从复制。

由于节点的限制我们将slave节点也做为监控主机。

IP地址规划:

master1: 10.43.2.81           10.43.2.99       做为提供给应用程序连接读的节点

master2: 10.43.2.93           10.43.2.100      做为提供给应用程序连接读的节点

slave:   10.43.2.93           10.43.2.101      做为提供给应用程序连接可写的节点

权限的划分:

master1与master互为主从在这两个建立复制用户 repl 密码 repl

slave通过以上建立的复制用户与master1做主从复制,这里因为是试验环境为了方便操作所以将用同一个复制用户信息,在生产环境中应该避免这个问题。

二.Mysql的相关配置

在三个几点上安装mysql这个安装可以自行查阅资料

1.master1与master2做双主复制:

修改master1的配置文件如下:

[mysqld]
character-set-server=utf8
server-id       = 1
datadir = /mydata/data
log-bin = /mydata/binglogs/master-bin
relay_log = /mydata/relaylogs/relay
binlog_format=mixed
thread_concurrency = 4
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment-offset=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[client]
default-character-set=utf8

进入master1的mysql为master2 授予一个可以用于复制的用户:repl 密码:repl

同样进入master2的mysql为master1授予一个可以用于复制的用户:repl 密码:repl

mysql> grant replication slave,replication client on *.* to ‘repl‘@‘%‘ identified by ‘repl‘    
mysql> flush privileges;

这里用 % 表示可以在远程的任意主机登录用repl用户复制master的数据;当然这里做也是为了实验方便,便于试验环境迁移。在生产环境中应该避免。

2.master1:

mysql> show master status;

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

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| master-bin.000001 |      663 |              |                  |                   |

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

1 row in set (0.00 sec)

3.修改master2的配置文件:

[mysqld]
character-set-server=utf8
server-id       = 3                    //mysql的复制应该保持此参数唯一
datadir = /mydata/data
log-bin = /mydata/binglogs/master-bin
relay_log = /mydata/relaylogs/relay
binlog_format=mixed
thread_concurrency = 4
log-slave-updates
sync_binlog=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8

4.master2:

mysql> show master status;

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

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| master-bin.000001 |      663 |              |                  |                   |

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

1 row in set (0.01 sec)

5.master2连接master1

change master to master_host=‘10.43.2.81‘,master_user=‘repl‘,master_password=‘repl‘    //生产环境中操作需要指出开始复制的主的二进制日志文件和起始点,这里由于数据比较少,二进制日志完全在就默认不用指,让其从头开始复制

start slave ;
 show slave status\G
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: 0

观察这三个参数的值如上所示表示复制正常

6.同样master1连接master2

change master to master_host=‘10.43.2.93‘,master_user=‘repl‘,master_password=‘repl‘

start slave ;
 show slave status\G
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: 0

观察这三个参数的值如上所示表示复制正常

7.slave的配置文件:

[mysqld]
character-set-server=utf8
server-id       = 3
datadir = /mydata/data
relay_log = /mydata/relaylogs/relay
binlog_format=mixed
thread_concurrency = 4
log-slave-updates
sync_binlog=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[client]
default-character-set=utf8

slave就不需要开启二进制日志,只需要开启中继日志即可。

8.slave连接上master1

change master to master_host=‘10.43.2.81‘,master_user=‘repl‘,master_password=‘repl‘

start slave ;
 show slave status\G
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Seconds_Behind_Master: 0

9.在master2上建立数据进行测试:

在master2上创建数据库sanhong

create database sanhong;

在master1上执行show master status

发现如下结果:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sanhong            |
| test               |
+--------------------+
5 rows in set (0.32 sec)

sanhong出现表示复制正常;

10.在slave上执行show master status

发现如下结果:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sanhong            |
| test               |
+--------------------+
5 rows in set (0.32 sec)

sanhong出现表示复制正常;

三.高可用相关的配置

mmm主要功能由下面三个脚本提供

mmm_mond  负责所有的监控工作的监控守护进程,决定节点的移除等等

mmm_agentd  运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点 默认监听在TCP的9989端口

mmm_control  通过命令行管理mmm_mond进程                   默认监听在TCP的9988端口

  1. 安装配置mysql-mmm:

    首先下载epel源 (对应自己操作系统的版本 CentoOS6.4)(三个节点同时安装)

    wget http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

    安装epel源

    yum install -y epel-release-6-8.noarch.rpm

    安装mysql-mmm-agent (三个节点同时安装)

    yum -y install mysql-mmm-agent

  2. 编辑mysql_common.conf  (三个节点都需要 编辑完之后复制到三个节点上)
active_master_role      writer
<host default>
    cluster_interface       eth0
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        repl
    replication_password    repl
    agent_user              agent
    agent_password          agent
</host>
<host db1>
    ip      10.43.2.81
    mode    master
    peer    db2
</host>
<host db2>
    ip      10.43.2.93
    mode    master
    peer    db1
</host>
<host db3>
    ip      10.43.2.83
    mode    slave
</host>
<role writer>
    hosts   db1, db2
    ips     10.43.2.101
    mode    exclusive
</role>
<role reader>
    hosts   db2,db3
    ips     10.43.2.99,10.43.2.100
    mode    balanced
</role>

在每个节点上修改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 db3                                          //保证这个名称为相应节点的名称,比如对于master1来说此处就应该改为 db1 (对应mmm_common.conf)

3.我们将slave做为monitor在上边安装监控所需要的包

yum install mysql-mmm* -y

编辑mmm_mon.cof

vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
    ip                  127.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_ips            10.43.2.81,10.43.2.83,10.43.2.93
    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        monitor
    monitor_password    monitor
</host>
debug 0

4.启动MMM进行测试:

三个节点都需要启动;

[[email protected] mysql-mmm]# service mysql-mmm-agent start
Starting MMM Agent Daemon:                                 [  OK  ]

监控主机节点启动监控服务:

[[email protected] mysql-mmm]# service mysql-mmm-monitor start 
Starting MMM Monitor Daemon:                               [  OK  ]

在监控主机上查看各节点数据库的状态:

[[email protected] mysql-mmm]# mmm_control  show 
  db1(10.43.2.81) master/ONLINE. Roles: writer(10.43.2.101)
  db2(10.43.2.93) master/ONLINE. Roles: reader(10.43.2.99)
  db3(10.43.2.83) slave/ONLINE. Roles: reader(10.43.2.100)

显示结果符合我们上边的规划,此时我们停掉一个数据库

[[email protected] mysql-mmm]# mmm_control set_offline db1
OK: State of ‘db1‘ changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!
[[email protected] mysql-mmm]# mmm_control  show 
  db1(10.43.2.81) master/ADMIN_OFFLINE. Roles:                                 //db1此时已经下线 vip已经流动到master2即db2上
  db2(10.43.2.93) master/ONLINE. Roles: reader(10.43.2.99), writer(10.43.2.101)
  db3(10.43.2.83) slave/ONLINE. Roles: reader(10.43.2.100)

此时我们在master2上建立一个数据库 ‘jin‘ 观察slave的情况

master2: 
mysql> create database jin;
Query OK, 1 row affected (0.02 sec)
 
slave:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jin                |
| mysql              |
| performance_schema |
| sanhong            |
| test               |
+--------------------+
6 rows in set (0.00 sec)

出现‘jin‘ 说明了 虽然slave与master1做的主从但是当master1离线后slave自动会同步master2的数据。

四:总结

经过以上步骤简单的实现了基于mmm的mysql高可用的实现。也发现了mmm优于keepalive的地方。

  1. mmm不但可以监控两个master节点的运行状态,还可以监控多个slave节点的运行状态,任何一个节点出现问题,都会将失败节点对应的虚拟IP自动实现切换到其他健康节点上,保持读、写服务的连续性和高可用性。
  2. mmm不仅能提供虚拟IP自动转移功能,更重要的是,如果活动的master节点发生故障,会自动将后端的多个slave节点转向备用的master节点继续进行同步复制,整个过程完全不需要手动更改同步复制的配置,这是其他所有mysql高可用集群方案都不具备的功能。

其实上边我们把master1的mysql进程停掉也能达到vip会流动到master2上,这里不再演示。

时间: 2024-08-12 11:30:56

基于mmm实现mysql的高可用的相关文章

基于keepalived搭建MySQL的高可用集群

http://www.cnblogs.com/ivictor/p/5522383.html 基于keepalived搭建MySQL的高可用集群 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和PXC. 对于小公司,一般推荐使用keepalived+双主,简单. 下面来部署一下 配置环境: 角色                          

基于MMM实现MariaDB的高可用

一.MMM 1.简介 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器),是关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能基于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份.节点之间重新同步功能的脚本.MySQL本身没有提供replication failover的解决

技术实战:基于 MHA 方式实现 MySQL 的高可用(转)

转自:http://os.51cto.com/art/201307/401702_all.htm MHA故障转移可以很好的帮我们解决从库数据的一致性问题,同时最大化挽回故障发生后的数据.本文分享了基于 MHA 方式实现 Mysql 的高可用的技术实战,希望对您有所帮助. AD:51CTO网+ 首届中国APP创新评选大赛火热招募中…… 数据的重要性对于人们来说重要程度不说自明,在信息时代,数据有着比人们更大的力量,我们也知道最近的斯诺登事件,军事专家对于他掌握的数据给出的评价是,相当于美军十个重装

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用

基于MyCat部署HaProxy实现高可用 在实际项目中, Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服务故障,需要有备机提供服务,需要考虑 Mycat 集群. 一.高可用方案 可以使用 HAProxy+Keepalived配合两台MyCat搭起MyCat集群,实现高可用性. HAProxy实现了MyCat多节点的集群高可用和负载均衡,而 HAProxy自身的高可用则可以通过Keepalived来实现. 架构图: 于上一个博客的环境部署(MySQL

分布式数据存储 - MySQL主从复制高可用方案

前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可用方案,因为主从节点中主节点仍然是单点的,一旦主节点宕机会导致应用中写失败.双主复制虽然很好的避免主节点的单点故障,但是未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换.本篇文章就来剖析主从复制的高可用. 一.基础概念介绍 Keep

CoroSync + Drbd + MySQL 实现MySQL的高可用集群

Corosync + DRBD + MySQL 构建高可用MySQL集群 节点规划: node1.huhu.com172.16.100.103 node2.huhu.com172.16.100.104 资源名称规划 资源名称:可以是除了空白字符外的任意ACSII码字符 DRBD设备:在双节点上,此DRBD设备文件,一般为/dev/drbdN,主设备号147 磁盘:在双方节点上,各自提供存储设备 网络配置:双方数据同步所使用的网络属性 DRBD从Linux内核2.6.33起已经整合进内核 1.配置

mysql复制(高可用架构方案的基础)

mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以在全部改变中根据业务需求选择部分库和部分表的复制复制的场景: 1.数据库容灾 2.需求:创建一个从数据服务器,做数据的测试和分析 3.负载均衡 4.复制时高可用架构方案的基础 mysql高可用架构特点1.数据库故障的检测与排除2.主从数据库的切换3.数据的备份和保护 mysql高可用架构常用方案1.

基于keepalived实现mariadb的高可用

提示: 上一篇博文己经介绍过了keepalived是什么,有那些参数,也介绍过基于corosync+pacemaker实现mairadb高可用,这次我将介绍一下如何利用keepalived对mariadb实现高可用. ----本文大纲 前言 主机环境 配置过程 测试 ----------- 一.前言 说到对mariadb实现高可用,也就是就说,当有任何一个mariadb挂掉之后在还有其它mariadb主机接管业务,完全不会影响到线上的业务,当挂掉的主机修复后重新上线,周而复始的工作,这就要对ma

基于drbd的mariaDB 的高可用集群

Distributed Replicated Block Device(DRBD)是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 数据镜像:实时.透明.同步(所有服务器都成功后返回).异步(本地服务器成功后返回) DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃. 在DRBD中,资源是特指某复制的存储设备的所有方面.包括资源名称.DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可