实验环境
实验拓扑
主机配置环境说明
主机名 | 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;
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、查看从节点的状态
主要留意”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;
再各节点使用命令“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
5、查看集群运行状态
[root@monitor ~]# mmm_control checks all
集群节点的状态有以下几种
-
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上
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;
5、查看此时连入的mysql主机名称
mysql> SHOW VARIABLES LIKE "%hostname%";
#可以看到,Write IP对应的VIP是主节点master1上
6、在其他从节点上查看数据库列表,可以看到此时其他的从节点能复制主节点新创建的数据库。
测试读操作
1、使用客户端mysql-client连接读权限的VIP
[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.201 –p
2、查看数据库表
3、查看当前mysql主机名
mysql> SHOW VARIABLES LIKE "%hostname%";
4、测试写操作
mysql> CREATE DATABASE testdb1;
#可以看到是无法写操作的
模拟主节点故障
1、在主节点master1关闭mysql服务
[root@master1 ~]# service mysqld stop
2、在monitor上查看各节点状态
[root@monitor ~]# mmm_control show
# 可以看到主节点master1已经检测到为OFFLINE
3、在从节点slave1上查看从节点状态
MariaDB [(none)]> SHOW SLAVE STATUS\G
#可以看到从节点已经将主服务器指向备节点
4、在备节点master2查看IP地址
[root@master2 ~]# ip addr
5、在备节点master2创建MS2db数据库,然后再次查看数据库列表
6、使用mysql-client使用上面的方法,再次测试读写操作,结果和预想一致。
模拟故障恢复
1、在主节点master1启动mysqld服务
[root@master1 ~]# service mysqld start
Starting MySQL.. SUCCESS!
2、在monitor重新查看节点状态
[root@monitor ~]# mmm_control show
#经过一段时间后,master1节点恢复ONLINE状态。
至此,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条)
可以方便指导下么,我做mysql主从+读写分离遇到点问题? 留个QQ
@Net20_赤羽:大家互相学习,我QQ是 835387292