MySQL-MMM实现MySQL高可用读写分离

实验环境

实验拓扑

2016-06-01_155200.png

主机配置环境说明

主机名 IP地址 角色/用途 MySQL Server_ID
master1 192.168.80.101 MySQL主节点,可读写操作 11
master2 192.168.80.102 MySQL备节点,可读写操作 12
slave1 192.168.80.103 MySQL从节点,仅能读 13
slave2 192.168.80.104 MySQL从节点,仅能读 14
monitor 192.168.80.105 MMM管理端

虚拟IP环境说明

虚拟IP地址 用途 说明
192.168.80.200 写操作 有点类似VIP,该IP会在正常主节点上使用,那么此时只有主节点能写操作
192.168.80.201 读操作 将多个具有读操作的读虚拟IP应用到各从节点及主、备节点,能分担读操作。可以通过LVS、HAProxy对读VIP进行负载均衡
192.168.80.202 读操作 将多个具有读操作的读虚拟IP应用到各从节点及主、备节点,能分担读操作。可以通过LVS、HAProxy对读VIP进行负载均衡
192.168.80.203 读操作 将多个具有读操作的读虚拟IP应用到各从节点及主、备节点,能分担读操作。可以通过LVS、HAProxy对读VIP进行负载均衡
192.168.80.204 读操作 将多个具有读操作的读虚拟IP应用到各从节点及主、备节点,能分担读操作。可以通过LVS、HAProxy对读VIP进行负载均衡

MySQL部署工作

安装MySQL

各节点部署MySQL 5.5.36 
下面演示master1节点部署MySQL

[root@master1 local]# groupadd -r mysql    # 创建mysql组
[root@master1 local]# useradd -g mysql -r mysql  #创建mysql用户
[root@master1 ~]# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/  # 将程序包解压至对应的路径下
[root@master1 ~]# cd /usr/local/
[root@master1 local]# ln -s mariadb-5.5.36-linux-x86_64/ mysql  #创建软连接
[root@master1 local]# chown -R root.mysql mysql/*    #将mysql目录下所有的文件及文件夹赋权
[root@master1 local]# cd mysql/
[root@master1 mysql]# mkdir /etc/mysql/
[root@master1 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf  #拷贝配置文件至指定路径
[root@master1 mysql]# vim /etc/mysql/my.cnf  #修改配置文件,在mysqld字段下修改和增加下面参数
datadir=/mydata/data   #mysql 的数据目录
read_only = 1         #设置所有的mysql都只是只读模式
#备注:read_only参数对超级管理权限的用户无效
log-bin=/mydata/binlogs/master1-bin  #设置二进制日志路径(建议)
server-id       = 11    #设置不同的server-id,目的是为了防止环回复制
relay-log       = /mydata/relaylogs/relay-log  # 设置中继日志路径
[root@master1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld  #复制脚本文件至指定的路径
[root@master1 mysql]# chmod +x /etc/rc.d/init.d/mysqld # 为脚本文件赋执行权限
[root@master1 mysql]# chkconfig mysqld on   #设置开机自动启动
[root@master1 ~]# mkdir -pv /mydata/{data,relaylogs,binlogs}  #创建数据文件、中继日志、二进制日志文件的文件夹
[root@master1 ~]# chown mysql.mysql /mydata/*  # 为每个文件夹赋权
[root@master1 mysql]# ./scripts/mysql_install_db --datadir=/mydata/data  #初始化mysql
[root@master1 mysql]# service mysqld start  #启动服务
[root@master1 mysql]# vim /etc/profile.d/mysql.sh   #由于默认PATH环境没有mysql客户端脚本,所以修改环境变量
export PATH=/usr/local/mysql/bin:$PATH
[root@master1 mysql]# source /etc/profile.d/mysql.sh  #让配置的环境变量立即生效

使用相同的二进制安装mysql的方式安装 master2、slave1、slave2服务器,注意,mysql配置文件中的my.cnf中的“server-id”一定要修改,否则造成环回复制。Slave1和slave2中的二进制日志可以关闭,因为从节点无需被其他从节点复制,所以关闭可以节省I/O压力。

创建复制账号权限

在master1和master2创建拥有复制的权限的账号和密码

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'192.168.80.%' IDENTIFIED BY 'replp@ss';

设置各节点复制指向主节点

1、查看主节点master1的二进制日志的位置

MariaDB [(none)]> SHOW MASTER STATUS;

1464768995471.png

2、将复制的主节点指向master1,包括master2,slave1,slave2。而将master1复制主节点指向master2。

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.80.101',MASTER_USER='repluser',MASTER
_PASSWORD='replp@ss',MASTER_LOG_FILE='master1-bin.000004',MASTER_LOG_POS=421;

3、上述配置在每个节点配置完成后,每个节点开启复制进程

MariaDB [(none)]> START SLAVE;

4、查看从节点的状态

1464769119568.png

主要留意”Slave_IO_Running”和“Slave_IO_Running” 是否处于“Yes”状态

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

测试复制功能

在主节点master1上创建testdb数据库,用于测试各节点复制功能是否正常

MariaDB [(none)]> CREATE DATABASE testdb;
MariaDB [(none)]> SHOW DATABASES;

1464769170939.png

再各节点使用命令“SHOW DATABASES”查看,是否已经复制成功。如果各节点均能查看到此数据库,表示复制正常。

在MMM服务器安装MMM套件

1、配置好epel源

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

2、monitor安装所有mmm套件

[root@monitor ~]# yum -y install mysql-mmm*

3、安装完后的配置文件说明

默认配置文件目录为/etc/mysql-mmm

  • mmm_mon.conf:定义监控参数,只需在服务器端配置

  • mmm_common.conf: 设置读、写节点的IP及配置虚拟,每个节点均需一样

  • mmm_agent.conf:设置每个节点的标识

4、修改mmm_common.conf配置文件

[root@monitor mysql-mmm]# vim mmm_common.conf
active_master_role      writer   #前面安装mysql时,设定read_only=1参数,而这里的参数是MMM是判断某个节点状态,会自动在可写的节点上设置“set global read_only=0”,那么此时就打开了写的权限,而其他还是只读的状态
<host default>                  #定义默认主机信息
   cluster_interface       eth0   #配置的网络接口
   pid_path                /var/run/mysql-mmm/mmm_agentd.pid   #pdi文件路径
   bin_path                /usr/libexec/mysql-mmm/     # MMM可执行文件路径
   replication_user        repluser    # 拥有复制权限的账号
   replication_password    replp@ss   # 拥有复制权限的密码
   agent_user              mmm_agent   # 更改只读操作用户的账号
   agent_password          agent_password  #更改只读操作用户的密码
</host>
<host db1>                  #设置db1的配置信息,该名字在mmm_agent.conf中间中定义
   ip      192.168.80.101    # db1的物理IP地址
   mode    master          # db1角色,可选有master 和 slave
   peer    db2             # 设置与db1对等的主机名,表示db1和db2均为master角色
</host>
<host db2>
   ip      192.168.80.102
   mode    master
   peer    db1
</host>
<host db3>
   ip      192.168.80.103
   mode    slave        # 设置db3的角色为 slave
</host>
<host db4>
   ip      192.168.80.104
   mode    slave
</host>
<role writer>                   #设置具有可写mysql操作的角色模式
   hosts   db1, db2          # 指定可具有写操作的主机
   ips     192.168.80.200    # 具有写操作的虚拟IP地址
   mode    exclusive        # 设置角色的模式为互斥,表示同一时间,只有一台主机具有此IP
</role>
<role reader>                   # 设置具有可读操作的角色模式
hosts   db1,  db2,  db3, db4  # 指定可读操作的主机
ips     192.168.80.201, 192.168.80.202, 192.168.80.203, 192.168.80.204.   #指定可读操作的虚拟IP地址
mode    balanced            # 负载均衡模式,上面指定的虚拟IP地址会均衡废品到各只读操作的主机上。这类表示轮训
</role>

5、将mmm_common.conf配置文件拷贝到各节点上

[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.101:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.102:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.103:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.104:/etc/mysql-mmm/

6、配置mmm_mon.conf配置文件

[root@monitor mysql-mmm]# vim mmm_mon.conf
include mmm_common.conf
<monitor>
   ip                  127.0.0.1    # 仅在本地监听,为了使安全,mmm_mond默认监听的端口是99988
   pid_path            /var/run/mysql-mmm/mmm_mond.pid  #PDI文件位置
   bin_path            /usr/libexec/mysql-mmm              # 可执行文件位置
   status_path         /var/lib/mysql-mmm/mmm_mond.status   # 集群状态文件
ping_ips            192.168.80.101, 192.168.80.102, 192.168.80.103, 192.168.80.104, 192.168.80.1
#用于测试可用性的IP地址清单
   auto_set_online     60      # 是否自动上线,如果此值大于0,表示抖动的主机在抖动范围后,会自动上线。抖动时间范围是3600s
   # 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_monitor         # monitor user的账号
   monitor_password    monitor_password    # monitor password密码
</host>
debug 0

安装MySQL MMM 客户端

1、 使用上面的方法各节点配置好epel源 
2、各节点安装mysql-mmm-agent

[root@slave2 mysql]# yum -y install mysql-mmm-agent

3、在各节点上创建下列两个账号

  • Monitor user账号:用于MMM管理服务器对MySQL服务器做健康状态检查

  • Monitor agent账号:用于切换只读模式和同步master信息

MariaDB [(none)]> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.80.%' IDENTIFIED BY 'monitor_password';
MariaDB [(none)]> GRANT SUPER,REPLICATION CLIENT,PROCESS ON *.* TO 'mmm_agent'@'192.168.80.%' IDENTIFIED BY 'agent_password';

4、配置mysql-mmm-agent

[root@master1 ~]# vim /etc/default/mysql-mmm-agent
# mysql-mmm-agent defaults
ENABLED=1       # 表示agent是否启用状态

5、配置mmm_agent.conf

[root@master1 mysql-mmm]# vim mmm_agent.conf
include mmm_common.conf
this db1      # mmm_common.conf中标识的名称,那么剩余的节点名称分别为db2,db3,db4,请根据要求再各节点上进行修改,这里不再详细列举。

启动MMM服务,并查看MMM集群状态

1、MMM服务端的服务为 mysql-mmm-monitor,在服务端启动服务,并设置开机自动启动

[root@monitor ~]# service mysql-mmm-monitor start
[root@monitor ~]# chkconfig mysql-mmm-monitor on

2、MMM客户端的服务为 mysql-mmm-agent,再各节点启动服务,并设置开机自动启动

[root@master1 mysql-mmm]# service mysql-mmm-agent start
[root@master1 ~]# chkconfig mysql-mmm-agent on

3、mmm_control命令介绍

在安装MMM后,可以通过mmm_contril管理MMM集群,MMM集群的运行日志一般保存在/var/log/mysql_mmm目录下,下面介绍mmm_control使用

[root@monitor ~]# mmm_control mode
   help                              #显示帮助信息
   ping                              #测试网络运行状态
   show                             #显示MMM节点的状态
   checks [<host>|all [<check>|all]] - show checks status  #显示MMM集群中指定节点/所有节点的状态
   set_online <host>                 # 将某个节点设置为online状态
   set_offline <host>                 # 将某个节点设置为offline状态
   mode                           #显示MMM运行模式
   set_active                        #切换MMM集群为active模式.
   set_manual                       #切换MMM集群为manual模式.
   set_passive                       #切换MMM集群为passive模式.
   move_role [--force] <role> <host> - move exclusive role <role> to host <host>
                                   # 在互斥模式下切换角色  
   set_ip <ip> <host>                #在被动模式下操作角色

4、mmm_control checks all显示所有节点详细运行状态

[root@monitor ~]# mmm_control checks all

 1464769998007.png5、查看集群运行状态

[root@monitor ~]# mmm_control checks all

1464770127661.png

集群节点的状态有以下几种

  • ONLINE:表示节点运行正常,处于在线状态

  • ADMIN_OFFLINE:表示节点是管理员关闭的

  • HARD_OFFLINE:表示节点处于离线状态,有可能是因为MMM集群测试ping时失败或检测MySQL失败而切换的一种状态

  • AWAITING_RECOVERY:表示等待恢复状态,若集群mode设置是active运行模式,那么此状态会自动回复到ONLINE状态

  • REPLICATION_FAIL:表示主从复制失败状态,一般是复制主线程(IO线程)没有运行

  • REPLICATION_DELAY:表示复制日志有延时,一般由于检查日志失败导致。

创建允许mysql用户

在主节点上创建mysql用户,允许让客户端能允许访问mysql

MariaDB [(none)]> CREATE USER pangxie1@192.168.80.107 IDENTIFIED BY 'redhat';
MariaDB [(none)]> GRANT CREATE ON *.* TO pangxie1@192.168.80.107;

测试MMM实现MySQL高可用

测试写操作

1、在主节点master1上查看IP地址

[root@master1 ~]# ip addr
#可以看到write IP位于主节点master1上

1464770871972.png

2、使用客户端mysql-client连接写节点的VIP

[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.200 -p

3、创建数据库

mysql> CREATE DATABASE pangxiedb;
Query OK, 1 row affected (0.01 sec)

4、查看创建完成后的数据库列表

mysql> SHOW DATABASES;

1464770923463.png

5、查看此时连入的mysql主机名称

mysql> SHOW VARIABLES LIKE "%hostname%";
#可以看到,Write IP对应的VIP是主节点master1上

1464770943342.png

6、在其他从节点上查看数据库列表,可以看到此时其他的从节点能复制主节点新创建的数据库。

测试读操作

1、使用客户端mysql-client连接读权限的VIP

[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.201 –p

2、查看数据库表

1464771034716.png

3、查看当前mysql主机名

mysql> SHOW VARIABLES LIKE "%hostname%";

1464771160108.png

4、测试写操作

mysql> CREATE DATABASE testdb1;
#可以看到是无法写操作的

1464771184468.png

模拟主节点故障

1、在主节点master1关闭mysql服务

[root@master1 ~]# service mysqld stop

2、在monitor上查看各节点状态

[root@monitor ~]# mmm_control show
# 可以看到主节点master1已经检测到为OFFLINE

1464771226859.png

3、在从节点slave1上查看从节点状态

MariaDB [(none)]> SHOW SLAVE STATUS\G
#可以看到从节点已经将主服务器指向备节点

1464771280112.png

4、在备节点master2查看IP地址

[root@master2 ~]# ip addr

1464771302070.png

5、在备节点master2创建MS2db数据库,然后再次查看数据库列表

1464771313881.png

6、使用mysql-client使用上面的方法,再次测试读写操作,结果和预想一致。

模拟故障恢复

1、在主节点master1启动mysqld服务

[root@master1 ~]# service mysqld start
Starting MySQL.. SUCCESS!

2、在monitor重新查看节点状态

[root@monitor ~]# mmm_control show
#经过一段时间后,master1节点恢复ONLINE状态。

1464771357841.png

至此,MySQL-MMM实现MySQL的高可用就配置完成。

需要注意地方及建议

1、 在配置MySQL时,需要留意Server-id,一定要保证各节点的Server-id不一致,否则会导致出现环回复制的情况,这种情况一般是在实现双主模型时出现 
2、 数据文件、二进制日志文件、中继日志文件建议最好是分开存放,或者说是独立存放,不使用默认路径。二进制日志在MySQL复制中尤为重要。 
3、 为保证数据不出现脑裂情况,要在mysql配置文件中my.cnf的mysqld中配置“read_only=1”,设置此项目的就是为了防止脑裂。 
4、如果使用到iptables,请记得放行mysql的端口,以及IO进程访问主服务器端的端口。

原创文章,作者:螃蟹,如若转载,请注明出处:http://www.178linux.com/17323

评论列表(2条)

  • Net20_赤羽
    Net20_赤羽 2016-06-16 11:00

    可以方便指导下么,我做mysql主从+读写分离遇到点问题? 留个QQ