14.MySQL读写分离方案Atlas
[toc]
中间件Atlas的概述

Atlas简介
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。
它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。
Atlas主要功能
- 读写分离
- 从库负载均衡
- IP过滤
- 自动分表
- DBA可平滑上下线DB
- 自动摘除宕机的DB
Atlas相对于官方MySQL-Proxy的优势
- 将主流程中所有Lua代码用C重写,Lua仅用于管理接口
- 重写网络模型、线程模型
- 实现了真正意义上的连接池
- 优化了锁机制,性能提高数十倍
Atlas的安装及配置
Atlas安装
- 官方提供的Atlas有两种: - Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
- tlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm
 
- 安装流程 - 1 
 2
 3
 4
 5
 6
 7- # 在数据库服务器下载Atlas 
 wget httpss://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
 # 安装
 rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
 Preparing... ########################################### [100%]
 1:Atlas ########################################### [100%]
Atlas配置
| 1 | # 1.编辑配置文件 | 
Atlas多实例
| 1 | # 1.配置文件修改实例名称 | 
Atlas管理接口
Atlas管理接口语法
| 1 | # mysql -uuser -ppwd -h127.0.0.1 -P2345 | 
语法结构
- Atlas管理接口语法 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- SELECT * FROM help # 获取Atlas管理语法帮助 
 SELECT * FROM backends # 查看后端代理的所有数据库以及状态
 SET OFFLINE $backend_id # 下线指定DB
 SET ONLINE $backend_id # 上线指定DB
 ADD MASTER $backend # 添加一台主库
 ADD SLAVE $backend # 添加一台从库
 REMOVE BACKEND $backend_id # 删除一个代理的后端DB
 SELECT * FROM clients # 查看过滤允许的客户端
 ADD CLIENT $client # 添加一个客户端(允许连接atlas的客户端)
 REMOVE CLIENT $client # 删除一个客户端(不允许连接atlas的客户端)
 SELECT * FROM pwds # 查看atlas支持的MySQL用户和密码
 ADD PWD $pwd # 使用接口添加用户(输入密码自动加密)
 ADD ENPWD $pwd # 使用接口添加用户(手动输入加密密码)
 REMOVE PWD $pwd # 使用接口删除用户和密码
 SAVE CONFIG # 将所有操作保存到配置文件
 SELECT VERSION # 查看Atlas版本
- 管理接口语法示例 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127- # 查看后端代理的所有数据库以及状态 
 mysql> SELECT * FROM backends;
 +-------------+------------------+-------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+-------+------+
 | 1 | 172.16.1.55:3306 | down | rw |
 | 2 | 172.16.1.52:3306 | up | ro |
 | 3 | 172.16.1.53:3306 | up | ro |
 | 4 | 172.16.1.54:3306 | up | ro |
 +-------------+------------------+-------+------+
 # 下线指定DB
 mysql> set offline 2;
 +-------------+------------------+---------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+---------+------+
 | 2 | 172.16.1.52:3306 | offline | ro |
 +-------------+------------------+---------+------+
 # 上线指定DB
 mysql> set online 2;
 +-------------+------------------+---------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+---------+------+
 | 2 | 172.16.1.52:3306 | unknown | ro |
 +-------------+------------------+---------+------+
 # 添加一台主库
 mysql> add master 172.16.1.88:3306;
 mysql> SELECT * FROM backends;
 +-------------+------------------+-------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+-------+------+
 | 1 | 172.16.1.55:3306 | down | rw |
 | 2 | 172.16.1.88:3306 | down | rw |
 | 3 | 172.16.1.53:3306 | up | ro |
 | 4 | 172.16.1.54:3306 | up | ro |
 | 5 | 172.16.1.52:3306 | up | ro |
 +-------------+------------------+-------+------+
 # 添加一台从库
 mysql> add slave 172.16.1.89:3306;
 mysql> SELECT * FROM backends;
 +-------------+------------------+---------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+---------+------+
 | 1 | 172.16.1.55:3306 | down | rw |
 | 2 | 172.16.1.88:3306 | down | rw |
 | 3 | 172.16.1.53:3306 | up | ro |
 | 4 | 172.16.1.54:3306 | up | ro |
 | 5 | 172.16.1.52:3306 | up | ro |
 | 6 | 172.16.1.89:3306 | unknown | ro |
 +-------------+------------------+---------+------+
 # 删除一个后端代理节点
 mysql> remove backend 2;
 # 查看过滤允许的客户端
 SELECT * FROM clients
 mysql> select * from clients;
 +----------+
 | client |
 +----------+
 | 10.0.0.7 |
 +----------+
 # 添加一个客户端(允许连接atlas的客户端)
 mysql> add client 10.0.0.7;
 mysql> save config;
 # 删除一个客户端(不允许连接atlas的客户端)
 mysql> remove client 10.0.0.7;
 mysql> SELECT * FROM clients;
 # 查看atlas支持的MySQL用户和密码
 mysql> select * from pwds;
 +----------+--------------------------+
 | username | password |
 +----------+--------------------------+
 | root | igdHsEAe7Uca8s/oWZlMvQ== |
 | mha | O2jBXONX098= |
 +----------+--------------------------+
 # 使用接口添加用户
 mysql> add pwd hcl:123;
 mysql> select * from pwds;
 +----------+--------------------------+
 | username | password |
 +----------+--------------------------+
 | root | igdHsEAe7Uca8s/oWZlMvQ== |
 | mha | O2jBXONX098= |
 | hcl | 3yb5jEku5h4= |
 +----------+--------------------------+
 # 使用接口添加一个加过密的密码用户
 mysql> add enpwd hcl2:O2jBXONX098=;
 mysql> select * from pwds;
 +----------+--------------------------+
 | username | password |
 +----------+--------------------------+
 | root | igdHsEAe7Uca8s/oWZlMvQ== |
 | mha | O2jBXONX098= |
 | hcl | 3yb5jEku5h4= |
 | hcl2 | O2jBXONX098= |
 +----------+--------------------------+
 # 删除用户和密码
 mysql> remove pwd hcl2;
 mysql> select * from pwds;
 +----------+--------------------------+
 | username | password |
 +----------+--------------------------+
 | root | igdHsEAe7Uca8s/oWZlMvQ== |
 | mha | O2jBXONX098= |
 | hcl | 3yb5jEku5h4= |
 +----------+--------------------------+
 # 将所有操作保存到配置文件
 mysql> save config;
 # 查看Atlas版本
 mysql> SELECT VERSION;
 +---------+
 | version |
 +---------+
 | 2.2.1 |
 +---------+
MHA结合Atlas使用
- 编写Atlas自动转移读写分离脚本 - 脚本执行流程 - 1 
 2
 3
 4- # Atlas结合MHA一起使用(MHA切换时) 
 mysql> remove backend 4; # 摘除被提升为主库的从库
 mysql> add slave 172.16.1.52:3306; # 将旧主库加入到从库中
 mysql> save config; # 保存atlas配置
- 编写脚本 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18- vim atlas_auto.sh 
 #!/bin/bash
 atlas_user='user'
 atlas_pass='pwd'
 atlas_port='2345'
 atlas_ip='172.16.1.51'
 atlas_manager="mysql -u${atlas_user} -p${atlas_pass} -h${atlas_ip} -P${atlas_port}"
 mha_log_path='/etc/mha/app1/log/manager.log'
 old_master_ip=`sed -nr 's#(.*)\(.*\) \(current master\)$#\1#gp' ${mha_log_path}|head -1`
 new_master_ip=`sed -nr 's#(.*)\(.*\) \(new master\)$#\1#gp' ${mha_log_path}`
 new_master_id=`$atlas_manager -e 'select * from backends'|grep ${new_master_ip}|awk '{print $1}'`
 # 摘除被提升为主库的从库
 ${atlas_manager} -e "remove backend ${new_master_id}"
 # 将旧主库加入到从库中
 ${atlas_manager} -e "add slave ${old_master_ip}:3306"
 # 保存atlas配置
 ${atlas_manager} -e "save config"
 
- 在MHA执行脚本中调用自动转移读写分离脚本 - 1 
 2
 3
 4
 5
 6- # 编辑mha执行脚本文件 
 vim /etc/mha/app1/script/master_ip_failover
 sub start_vip() {
 `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
 `/bin/sh -x /etc/mha/app1/script/atlas_auto.sh`
 }
- 测试执行结果 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35- # 1.启动MHA 
 [root@db03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/log/manager.log 2>&1 &
 # 2.检查mha状态
 [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
 app1 (pid:20045) is running(0:PING_OK), master:172.16.1.51
 # 3.查询后端代理的所有数据库以及状态
 mysql -uuser -ppwd -h172.16.1.51 -P2345 -e 'select * from backends'
 +-------------+------------------+-------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+-------+------+
 | 1 | 172.16.1.55:3306 | down | rw |
 | 2 | 172.16.1.53:3306 | up | ro |
 | 3 | 172.16.1.54:3306 | up | ro |
 | 4 | 172.16.1.52:3306 | up | ro |
 +-------------+------------------+-------+------+
 # 停止主库
 /etc/init.d/mysqld stop
 Shutting down MySQL............ SUCCESS!
 # 查询后端代理的所有数据库以及状态
 mysql -uuser -ppwd -h172.16.1.51 -P2345 -e 'select * from backends'
 +-------------+------------------+-------+------+
 | backend_ndx | address | state | type |
 +-------------+------------------+-------+------+
 | 1 | 172.16.1.55:3306 | down | rw |
 | 2 | 172.16.1.53:3306 | up | ro |
 | 3 | 172.16.1.54:3306 | up | ro |
 | 4 | 172.16.1.51:3306 | up | ro |
 +-------------+------------------+-------+------+
 # 执行从库自动恢复脚本
 sh /etc/mha/app1/script/mha.sh
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 奥利奥の麦旋风!




