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
16SELECT * 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
18vim 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 许可协议。转载请注明来自 奥利奥の麦旋风!