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接管

posted @ 2019-06-18 15:15  司家勇  阅读(858)  评论(0编辑  收藏  举报