标签:atlas 代理 mysql mysql_proxypython
这两天在学习mysql的读写分离和负载均衡,尝试了主从模式和mysql cluter,最后仍是选择了一主多从,而后读写分离,这比较适合读量大的网站。而后对于mysql的负载均衡器,起先尝试了一下SQL请求路由器 Amoeba,读写分离不错,可是不支持事务,由于我测试的网站是采起spring mvc+hibernate的。而后看到了360公司的MySQL中间层 Atlas,这是支持事务的,把本身的安装和配置记录一下。mysql
首先,先去下载Altas的rpm包,下载地址:https://github.com/Qihoo360/Atlas/releasesgit
要看清楚版本,centos 5.x:Atlas-1.0.3.el5.x86_64.rpm centos 6.x:github
个人系统是centos 6.4 ,因此下载Atlas-1.0.3.el6.x86_64.rpmspring
千万别搞错了,不然最后启动会出错。你们也能够采起源码编译安装,不过rpm安装比较省时省力,并且简单。sql
下载rpm shell
1
|
wget https:
//github
.com
/Qihoo360/Atlas/releases/download/1
.0.3
/Atlas-1
.0.3.el6.x86_64.rpm
|
安装 数据库
1
|
rpm -i Atlas-1.0.3.el6.x86_64.rpm
|
安装的目录是/usr/local/mysql-proxyvim
conf文件夹下有一个自带的配置文件test.cnf,咱们能够直接修改,下面是我修改的后端
主数据库服务器:192.168.83.11
从数据库服务器:192.168.83.12
proxy服务器:192.168.83.13
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
|
[mysql-proxy]
#Atlas加载的模块名称,不须要改
plugins = admin, proxy
#管理接口的用户名
admin-username = root
#管理接口的密码
admin-password = 123456
#实现管理接口的Lua脚本所在路径
admin-lua-script =
/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin
.lua
#Atlas后端链接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.83.11:3306
#Atlas后端链接的MySQL从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,通常开发调试时设为false,线上运行时设为true
daemon =
false
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,通常开发调试时设为false,线上运行时设为true
keepalive =
false
#工做线程数,推荐设置与系统的CPU核数相等
event-threads = 4
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message
#日志存放的路径
log-path =
/usr/local/mysql-proxy/log
#实例名称,用于同一台机器上多个Atlas实例间的区分
instance =
test
#Atlas监听的工做接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#链接池的最小空闲链接数,应设为event-threads的整数倍,可根据业务请求量大小适当调大或调小
min-idle-connections = 8
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不须要设置该项
#tables = person.mt.id.3
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,此设置项用于多个用户名同时访问同一个Atlas实例的状况,若只有一个用户名>则不须要设置该项
#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
#默认字符集,若不设置该项,则默认字符集为latin1
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
|
最后,进入到bin文件夹下,启动Altas
1
|
.
/mysql-proxy
--defaults-
file
=..
/conf/test
.cnf
|
最好配置文件中的 daemon设置为true,为后台守护运行。
原先我使用官网的
1
|
.
/mysql-proxyd
test
start
|
可是一直提示我启动失败,后来咨询了做者教我使用上面的那个带配置文件的启动,成功了。
查看Altas运行状况
1
|
.
/mysql-proxyd
instance status
|
应该有两个进程的。
我后来使用NaviCat链接工做端口,用户名和密码就是上面配置文件的管理用户和密码,成功了。
通过测试,Altas的读写分离和事务支持很好,明天发布2.0版本,增长对JDBC的支持。
详细配置:
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了不少功能特性。目前该项目在360公司内部获得了普遍应用,不少MySQL业务已经接入了Atlas平 台,天天承载的读写请求数达几十亿条。
主要功能:
* 读写分离
* 从库负载均衡
* IP过滤
* SQL语句黑白名单
* 自动分表
1、环境
OS :CentOS-6.4 x86_64
Atlas IP : 192.168.4.215
MySQL Master IP : 192.168.4.213
MySQL Slave IP : 192.168.4.214
2、MySQL受权
MySQL主从已经配置好以后,主从对Atlas进行受权
mysql> grant all on *.* to atlas@‘192.168.4.215‘ identified by ‘123456‘;
3、Atlas安装
Atlas官方文档:
https://github.com/Qihoo360/Atlas/wiki
CentOS-5.x下载地址
# wget https://github.com/Qihoo360/Atlas/releases/download/2.0.2/Atlas-2.0.2.el5.x86_64.rpm
# rpm -ivh Atlas-2.0.2.el5.x86_64.rpm
CentOS-6.x下载地址
# wget https://github.com/Qihoo360/Atlas/releases/download/2.0.2/Atlas-2.0.2.el6.x86_64.rpm
# rpm -ivh Atlas-2.0.2.el6.x86_64.rpm
Atlas安装后的文件路径
/usr/local/mysql-proxy/
4、Atlas配置
加密MySQL用户密码,获取的加密串填写到配置文件的pwds参数中。
# /usr/local/mysql-proxy/bin/encrypt 123456
/iZxz+0GRoA=
vim /usr/local/mysql_proxy/conf/test.conf
[mysql-proxy]
#带#号的为非必需的配置项目
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas后端链接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.4.213:3306
#Atlas后端链接的MySQL从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.4.214:3306@1
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = atlas:/iZxz+0GRoA=
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,通常开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有mo
nitor,通常开发调试时设为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 = OFF
#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过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, 192.168.1
#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),如有LVS且设置了client-ips则此项必须设置,不然能够不设置
#lvs-ips = 192.168.1.1
启动
/usr/local/mysql-proxy/bin/mysql-proxyd test start
关闭
/usr/local/mysql-proxy/bin/mysql-proxyd test stop
5、Atlas参数备注
instance参数
同一台机器上的多个Atlas实例,使用不一样的端口,对应不一样数据库,使用各自的配置文件
默认的黑白名单
不带where的delete会屏蔽,"sleep"会屏蔽
备注:
1.03版本已经支持set
autocommit语句,另外对于python来讲须要在链接上后执行一句conn.autocommit(True)
pwds参数
配置MySQL用户名和对应的加密过的MySQL密码,密码使用/usr/local/mysql-proxy/bin/encrypt程序进行加
密,用户名和密码用冒号分开,可使用多个用户,用逗号空格分隔。
client-ips参数
在引入中间层后,由于链接DB的是Atlas,因此DB改成对部署Atlas的机器的IP做访问受权,而client-ips参
数用来控制链接Atlas的客户端的IP
lvs-ips参数
好比LVS后面挂接两台Atlas,分别叫A和B,LVS去循环检测A和B的存活,当Atlas检测到是LVS的IP来请求时
,根据在线或不在线状态,向LVS的检测脚本返回不一样的值,这里是设置Atlas前面的LVS的物理网卡的IP。
6、Atlas管理接口使用
# mysql -u管理用户 -p管理密码 -h127.0.0.1 -P管理端口
# mysql -uuser -ppwd -h127.0.0.1 -P2345
查看管理语句参数:
mysql> select * from help;
查看DB状态:
mysql> select * from backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
| 1 | 172.16.1.20:3306 | up | rw | NULL | 0 |
| 2 | 172.16.1.30:3306 | up | ro | NULL | 0 |
+-------------+-------------------+-------+------+------+-------------------+
备注:
connected_clients这个参数有bug,不能正常显示。
7、Atlas常见问题
1、Atlas多实例启动问题:
若是配置文件中instance = instance,启动参数以下:
/usr/local/mysql-proxy/bin/mysql-proxyd instance start
若是配置文件中instance = test,启动参数以下:
/usr/local/mysql-proxy/bin/mysql-proxyd test start
可使用mysql-proxy命令启动,
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
备注:
使用脚本启动时,注意区分bin目录下面的mysql-proxy 和 mysql-proxyd 。
2、使用Atlas时出现"too many connections"
缘由是DB的max_connections设置太小
3、在管理接口发现后端DB的状态为down
a、后端DB是否已对Atlas所在机器的IP受权
b、推荐DB的my.cnf里的max_connect_errors设置为100000,默认值是10,值过小会影响Atlas对DB的存活检
测,能够修改my.cnf文件的max_connect_errors参数,或者用下面指令直接修改;
mysql> set global max_connect_errors=100000;
4、主从同步延迟,不能立刻读数据
能够在SQL语句前增长 /*master*/ ,就能够将读请求强制发往主库。