myslq Atlas中间件与读写分离
Atlas 读写分离
Atlas简介
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。
1.Atlas主要功能
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB
2.读写分离工具
#工具
1.Atlas
2.MySQL-Proxy
#Atlas相对于官方MySQL-Proxy的优势
1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口
2.重写网络模型、线程模型
3.实现了真正意义上的连接池
4.优化了锁机制,性能提高数十倍
3.安装Atlas
#下载地址:https://github.com/Qihoo360/Atlas/releases
1.上传安装包
[root@db03 ~]# rz Atlas-sharding_1.0.1-el6.x86_64.rpm
2.安装
[root@db03 ~]# yum localinstall -y Atlas-sharding_1.0.1-el6.x86_64.rpm
4.编辑配置文件
1.相关目录及文件
[root@db03 ~]# ll /usr/local/mysql-proxy/
total 8
drwxr-xr-x 2 root root 125 Nov 11 18:22 bin
drwxr-xr-x 2 root root 22 Nov 11 18:22 conf
drwxr-xr-x 2 root root 4096 Nov 11 18:22 include
drwxr-xr-x 4 root root 4096 Nov 11 18:22 lib
drwxr-xr-x 2 root root 6 May 19 2015 libexec
drwxr-xr-x 2 root root 22 Nov 11 18:22 log
drwxr-xr-x 3 root root 17 Nov 11 18:22 share
2.编辑配置文件
[root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
管理接口的用户名
admin-username = user
管理接口的密码
admin-password = pwd
atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 172.16.1.51:3306
Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,
用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 172.16.1.52:3306,172.16.1.53:3306
用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt
加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
设置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 = 8
日志级别,分为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 = ON
慢日志输出设置。当设置了该参数时,
则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。
不设置该参数则输出全部日志。
#sql-log-slow = 10
实例名称,用于同一台机器上多个Atlas实例间的区分
instance = test
Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
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
Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),
若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1
5.启动Atlas
#1.启动
[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
#2.验证启动
[root@db03 ~]# ps -ef | grep mysql-proxy
[root@db03 ~]# netstat -lntp
6.Atlas的使用
#1.连接Atlas
[root@db03 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
#2.操作命令
mysql> SELECT * FROM help;
+---------------------------------------+---------------------------------------------------------+
| command | description |
+---------------------------------------+---------------------------------------------------------+
| SELECT * FROM help | 查看帮助
| SELECT * FROM backends | 查看后端数据库列表和状态
| SET OFFLINE $backend_id | DBA平滑下线后端数据库
| SET ONLINE $backend_id | DBA平滑上线后端数据库
| ADD MASTER $backend | 添加主库 add master 172.16.1.54:3306;
| ADD SLAVE $backend | 添加从库 add slave 172.16.1.56:3306;
| ADD GMASTER $group_id $backend | example: "add gmaster 1 127.0.0.1:3306", ...
| ADD GSLAVE $group_id $backend | example: "add gslave 1 127.0.0.1:3306", ...
| REMOVE BACKEND $backend_id | 摘除后端数据库 remove backend 6;
| REMOVE GBACKEND $group_id $backend_id | example: "remove gbackend 1 1", ...
| SELECT * FROM clients | 查看客户端列表 add client 172.16.1.53;
| ADD CLIENT $client | 添加客户端
| REMOVE CLIENT $client | 移除客户端
| SELECT * FROM pwds | 查看用户列表
| ADD PWD $pwd | 添加用户 add pwd lhd:123;
| ADD ENPWD $pwd | 添加用户 add enpwd qiudao:3yb5jEku5h4=;
| REMOVE PWD $pwd | 移除用户
| SAVE CONFIG | 永久保存到配置文件
| SELECT VERSION | 查看Atlas版本
+---------------------------------------+----------------------------------------------------
19 rows in set (0.00 sec)
三、Atlas集合MHA故障恢复
Atlas我们写死了主库和从库的配置,如果这个时候主库挂了,怎么办?
1.思路
#MHA切换主库后,Atlas需要做什么
1.找到挂掉的主库
2.把Atlas对应的节点移除
3.恢复挂掉的节点启动
4.添加重新恢复的节点到Atlas
5.Atlas永久保存到配置文件
2.编写脚本
[root@db03 ~]# cat /scripts/reconf_Atlas.sh
#!/bin/bash
#1.定义新的主库变量
new_master=`mysql -e "show slave status\G" | awk 'NR==3 {print $2}'`
#2.获取新的主库在Atlas中的从库信息
new_master_id=`mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "select * from backends;" 2> /dev/null| grep $new_master | awk '{print $5}'`
#3.移除Atlas中新主库的从库信息
mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "remove backend $new_master_id;save config" 2> /dev/null
#4.找到down掉的主机
down_ip=`grep "is down" /service/mha/manager | tail -1 | awk -F '[ (]' '{print $2}'`
#5.连接挂掉的机器执行恢复脚本
ssh $down_ip "sh /scripts/start_mha.sh"
#6.把新的从库信息
new_slave=`grep "is down" /service/mha/manager | tail -1 | awk -F '[()]' '{print $2}'`
#7.把新的从库加到Atlas,并永久保存配置
mysql -uuser -ppwd -h127.0.0.1 -P2345 -e "add slave $new_slave;save config" 2> /dev/null
[root@db01 ~]# cat /scripts/start_mha.sh
#!/bin/bash
#1.mysql进程数赋值
mysqlpid=`ps -ef | grep [m]ysql | wc -l`
#2.判断MySQL是否假死,如果假死杀掉重启,如果关闭则启动
if [ $mysqlpid -eq 0 ];then
systemctl start mysqld
else
pkill mysqld
systemctl start mysqld
fi
sleep 3
#3.获取配置主从语句
change=`ssh 172.16.1.53 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'`
#4.执行主从语句并启动线程
mysql -e "$change; start slave" 2>&1
#5.远程执行启动mha脚本
ssh 172.16.1.53 "sh /scripts/recovery.sh"
[root@db03 ~]# cat /scripts/recovery.sh
#!/bin/bash
#1.获取主节点IP
master_ip=`mysql -e 'show slave status\G' | awk 'NR==3 {print $2}'`
#2.进入保存binlog目录
cd /data/mysql/binlog
#3.启动实时获取binlog进程
mysqlbinlog -R --host=$master_ip --user=mha --password=mha --raw --stop-never mysql-bin.000001&> /dev/null &
#4.替换MHA配置文件
/usr/bin/cp /service/mha/app1.bak /service/mha/app1.cnf
#5.启动MHA
nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/app1/manager.log 2>&1 &