centos 7 Atlas keepalived 实现高可用 MySQL 5.7 MHA环境读写分离

时间:2023-03-09 19:07:03
centos 7 Atlas keepalived 实现高可用 MySQL 5.7 MHA环境读写分离

简介

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。

它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。而且安装方便。配置的注释写的蛮详细的,都是中文。

主要功能

  • 读写分离
  • 从库负载均衡
  • IP过滤
  • 自动分表
  • DBA可平滑上下线DB
  • 自动摘除宕机的DB

相关链接

环境准备

本次环境主要依赖于 MySQL 高可用架构 之 MHA 这篇文章。

各位可根据自己的环境进行配置修改即可。

Atlas 环境

操作系统 内核版本 主机名 ip地址 角色
centos 7.5 5.1.3-1.el7 master.atlas 10.0.20.196 Manager
centos 7.5 5.1.3-1.el7 slave.atlas 10.0.20.197 node01 mysql-master

VIP 地址: 10.0.20.198


MySQL 集群环境

操作系统 内核版本 主机名 MySQL 版本 ip地址 角色
centos 7.5 5.1.3-1.el7 manager.mha MySQL 5.7.18 10.0.20.200 Manager
centos 7.5 5.1.3-1.el7 node01.mha MySQL 5.7.18 10.0.20.201 node01 mysql-master
centos 7.5 5.1.3-1.el7 node02.mha MySQL 5.7.18 10.0.20.202 node02 mysql-slave
centos 7.5 5.1.3-1.el7 node03.mha MySQL 5.7.18 10.0.20.203 node03 mysql-slave
centos 7.5 5.1.3-1.el7 node04.mha MySQL 5.7.18 10.0.20.204 node04 mysql-slave

主库VIP 地址: 10.0.20.199

Atlas 安装 和 配置

安装和配置atlasmasterslave的配置要完全相同,一下操作在masterslave上均要操作

[root@master ~]# cd /opt/soft/
[root@master soft]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
[root@master soft]# ls
Atlas-2.2.1.el6.x86_64.rpm
[root@master soft]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:Atlas-2.2.1-1 ################################# [100%]
[root@master soft]# rpm -qa | grep Atlas
Atlas-2.2.1-1.x86_64

安装完成后,会在/usr/local/mysql-proxy/下生成四个目录

[root@master soft]# ll /usr/local/mysql-proxy/
total 0
drwxr-xr-x 2 root root 75 Jun 18 09:50 bin
drwxr-xr-x 2 root root 22 Jun 18 09:50 conf
drwxr-xr-x 3 root root 331 Jun 18 09:50 lib
drwxr-xr-x 2 root root 6 Dec 17 2014 log

bin下有三个可执行文件

[root@master soft]# ll /usr/local/mysql-proxy/bin/
total 44
-rwxr-xr-x 1 root root 9696 Dec 17 2014 encrypt
-rwxr-xr-x 1 root root 23564 Dec 17 2014 mysql-proxy
-rwxr-xr-x 1 root root 1552 Dec 17 2014 mysql-proxyd
-rw-r--r-- 1 root root 6 Dec 17 2014 VERSION

bin目录下放的都是可执行文件

  1. “encrypt”是用来生成MySQL密码加密的,在配置的时候会用到
  2. “mysql-proxy”是MySQL自己的读写分离代理
  3. “mysql-proxyd”是360弄出来的,后面有个“d”,服务的启动、重

剩下三个目录分别是:

  • conf目录下放的是配置文件 “test.cnf”只有一个文件,用来配置代理的,可以使用vim来编辑
  • lib目录下放的是一些包,以及Atlas的依赖
  • log目录下放的是日志,如报错等错误信息的记录

为数据库的密码加密

在配置文件中,填写的数据库的密码不是明文的,而是可以通过自带的加密工具加密后得到的内容填写进去,这里使用的最简单的123456密码测试

[root@master soft]# /usr/local/mysql-proxy/bin/encrypt 123456
/iZxz+0GRoA=

修改配置文件

[root@master conf]# cat test.cnf 

[mysql-proxy]
#带#号的为非必需的配置项目 #管理接口的用户名
admin-username = user #管理接口的密码
admin-password = pwd #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 10.0.20.199:3306 #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 10.0.20.202:3306@1,10.0.20.203:3306@1,10.0.20.204:3306@1 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = java:Q6gAt5tl+GUa8s/oWZlMvQ==, root:/iZxz+0GRoA= #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 16 #日志级别,分为message、warning、critical、error、debug五个级别
log-level = message #日志存放的路径
log-path = /usr/local/mysql-proxy/log #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
#sql-log = OFF #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
sql-log-slow = 10 #实例名称,用于同一台机器上多个Atlas实例间的区分
instance = dev #Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:3306 #Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345 #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3 #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
#charset = utf8 #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1 #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1

启动

[root@master conf]# /usr/local/mysql-proxy/bin/mysql-proxyd dev start
OK: MySQL-Proxy of dev is started
[root@master conf]# ps aux|grep mysql
root 9173 0.0 0.3 65844 7080 ? S 10:45 0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/dev.cnf
root 9174 0.0 1.2 235972 26032 ? Sl 10:45 0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/dev.cnf
[root@master conf]# netstat -lntup | grep mysql
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 9174/mysql-proxy
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 9174/mysql-proxy

加入开机启动项

[root@master conf]# echo '/usr/local/mysql-proxy/bin/mysql-proxyd dev start' >> /etc/rc.local

注意: 这里master配置完成了,slave需要相同一模一样的配置。

Keepalived 安装配置

安装

master 和 slave 节点都需要安装

yum install keepalived -y

master 配置

配置文件

[root@master keepalived]# vim keepalived.conf
! Configuration File for keepalived global_defs {
router_id mysql_proxy_196
} vrrp_script chk_atlas_proxy
{
script "/etc/keepalived/che_atlas.sh"
interval 2
weight -2
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 151
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.20.198/24 dev bond0 label bond0:1
}
track_script {
chk_atlas_proxy
}
}

che_atlas.sh 脚本

[root@master keepalived]# cat /etc/keepalived/che_atlas.sh
#!/bin/bash
if [ `ps aux|grep mysql | grep -v grep | wc -l` -ne 2 ];then
systemctl stop keepalived
fi

启动master上的keepalived服务

# 启动服务
[root@master keepalived]# systemctl start keepalived
# 开机启动服务
[root@master keepalived]# systemctl enable keepalived
# 关闭服务
[root@master keepalived]# systemctl stop keepalived
# 查看服务状态
[root@master keepalived]# systemctl status keepalived

查看状态:

[root@master keepalived]# ps aux | grep keep
root 8983 0.0 0.0 118700 1956 ? Ss 09:37 0:00 /usr/sbin/keepalived -D
root 8984 0.0 0.2 118700 5580 ? S 09:37 0:00 /usr/sbin/keepalived -D
root 8985 0.0 0.1 118700 3752 ? S 09:37 0:01 /usr/sbin/keepalived -D
root 9449 0.0 0.1 112712 2276 pts/0 S+ 13:35 0:00 grep --color=auto keep
[root@master keepalived]# ip a | grep 20
inet 10.0.20.196/24 brd 10.0.20.255 scope global bond0
inet 10.0.20.198/24 scope global secondary bond0:1

Keepalive 脚本不执行的坑

请查看文章 CentOS 7 Keepalive 脚本不执行解决

slave 配置

[root@slave ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
router_id mysql_proxy_197
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 151
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.20.198/24 dev bond0 label bond0:1
}
}

启动slave上的keepalived服务

# 启动服务
[root@slave keepalived]# systemctl start keepalived
# 开机启动服务
[root@master keepalived]# systemctl enable keepalived

查看状态

[root@slave ~]# ps aux | grep keep
root 9082 0.0 0.0 118700 2012 ? Ss 09:36 0:00 /usr/sbin/keepalived -D
root 9083 0.0 0.2 118700 5476 ? S 09:36 0:00 /usr/sbin/keepalived -D
root 9084 0.0 0.1 118700 3656 ? S 09:36 0:00 /usr/sbin/keepalived -D
root 9484 0.0 0.1 112712 2188 pts/0 S+ 13:36 0:00 grep --color=auto keep

测试宕机

手动停止master上的 atlas服务,查看keepalive的服务状态以及vip飘移是否正常

停止Atlas服务

[root@master keepalived]# /usr/local/mysql-proxy/bin/mysql-proxyd dev stop
OK: MySQL-Proxy of dev is stopped

查看Master日志:

Jun 18 15:17:30 master systemd: Stopping LVS and VRRP High Availability Monitor...
Jun 18 15:17:30 master Keepalived[10367]: Stopping
Jun 18 15:17:30 master Keepalived_vrrp[10369]: VRRP_Instance(VI_1) sent 0 priority
Jun 18 15:17:30 master Keepalived_vrrp[10369]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun 18 15:17:30 master Keepalived_healthcheckers[10368]: Stopped
Jun 18 15:17:31 master Keepalived_vrrp[10369]: Stopped
Jun 18 15:17:31 master Keepalived[10367]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Jun 18 15:17:31 master systemd: Stopped LVS and VRRP High Availability Monitor.

查看slave状态

[root@slave keepalived]# ip a | grep 20
inet 10.0.20.197/24 brd 10.0.20.255 scope global bond0
inet 10.0.20.198/24 scope global secondary bond0:1

VIP已经被Slave接管