Atlas-mysql中间件配置应用

为了解决DB的性能和负载问题,鉴于MYSQL的特殊化性能低,解决跨库操作,以及后期的维护成本,我们采用了一种中间件的形式,在这个基础上实现mysql的读写分离,解决在高并发下的数据库中间件解决在特殊场景下的mysql的负载均衡。

背景:

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。

主要功能:

2.从库负载均衡

3.IP过滤

4.自动分表

5.DBA可平滑上下线DB

6.自动摘除宕机的DB

jiagou1

下面是Atlas的一个具体的架构说明,常规做法是:1主多从

image_thumb[1]

下面针对Altas的安装配置做一个简单的说明,以及在实际业务中的应用:

服务器配置:

Nginx1.9

Mysql5.6(mysql版本>=5.5 官方建议) 

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.2 LTS
Release:        14.04
Codename:       trusty

注:目前Altas只支持64位机,所以只能在64机上进行安装部署,后续待开放更多版本

https://github.com/Qihoo360/Atlas/releases中下载对应的版本,由于我的机器是ubuntu,下载DEB版本的即可:

1.下载安装

wget https://github.com/Qihoo360/Atlas/releases/download/2.1/Atlas-2.1-debian7.0-x86_64.deb

安装:dpkg -i  Atlas-2.1-debian7.0-x86_64.deb

centos系统安装:yum install ***即可(下载yum安装包),也可以自行编译安装,注意需要依赖glib、jemalloc,编译安装会用到。

2.修改配置文件

安装完成以后,cd /usr/lcoal/mysql-proxy下,进入conf目录,看到一个test.cnf的文件,这事启动test实例的一个配置,默认test是Altas的默认实例,默认即可,vim test.cnf

[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = root

#管理接口的密码
admin-password = 123456

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 127.0.0.1:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#proxy-read-only-backend-addresses = 127.0.0.1:3305@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = user1:T+sRVvDh0JA=, user2:T+sRVvDh0JA=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
keepalive = false

#工作线程数,对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

#实例名称,用于同一台机器上多个Atlas实例间的区分
instance = test #这个地方非常关键,涉及后期的启动会以test实例启动

#Atlas监听的工作接口IP和端口-数据产生接口
proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口 ,管理Altas的监听端口,勇于配置Altas监听mysql的参数配置
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

lvs-ips参数说明:

a、该参数是Atlas前面挂接的LVS的物理网卡的IP,不是虚IP。
b、该参数用来实现平滑重启功能,否则在重启Atlas的瞬间的那些SQL请求都会失败,如果认为应用可以接受瞬间的报错则可以直接重启。
c、平滑重启的条件:至少有两台配置相同的Atlas,且挂接在LVS之后。
d、平滑重启的原理:LVS周期性地对后端Atlas的存活检测有两种方式,一是直接去探测端口是否可连接,二是执行一个脚本,这个脚本会去尝试连接Atlas,通过脚本的返回值来决定每个后端是否可用。Atlas有两种运行状态,通常为online,可通过发信号将其置为offline。Atlas检测到来请求的IP是LVS的网卡IP时,如果处于online状态,就向LVS的检测脚本返回online,如果处于offline状态,就向脚本返回offline。比如我现在因为某种原因需要重启一台Atlas,但直接重启势必导致瞬间的SQL请求全部失败,对前端应用造成影响。因此我先发下线信号将Atlas置为offline状态,当LVS的检测脚本发现返回值是offline时,便将这台Atlas摘除,从此时开始便没有新的请求导向这台Atlas。等到已经打向这台Atlas的SQL请求处理完毕后(这是一个很短的时间),就可以安然重启Atlas而不必担心对前端造成影响了。
e、对于大多数应用来说,可能并没有那么敏感,因此不使用平滑重启功能而直接重启也是可以接受的。但在设置了client-ips参数的情况下,必须设置lvs-ips参数,否则LVS的物理网卡的IP会被Atlas拒绝,如果未设置client-ips参数,说明不开启IP过滤功能,则lvs-ips也可以不设置。

配置后>:wq 保存。

注:pwds中密码用户设置多端口登录用的,需要用Altas下的bin/encrypt ***(输入需要生成的密码) 输入生成保存到配置文件中,这点需要注意;

(3、启动myql-proxy服务

启动:/usr/local/mysql-proxy/bin/mysql-proxy test restart 
如果启动中显示:altas test is runing说明启动成功,通过ps aux|grep mysql-proxy查看进程。

停止:/usr/local/mysql-proxy/bin/mysql-proxy test stop

重启:/usr/local/mysql-proxy/bin/mysql-proxy test restart

tail -f /usr/local/mysql-proxy/test.log可以发现对应的信息,说明已经启动了:

151219_Dt7y_3267716.png

如果启动不了,在目录下执行./sbin/mysql-procyd test start。

(4、配置调试Altas:

登录管理后台:mysql -uroot -p123456 -P2345 -h127.0.0.1

登录后,我们用seelct * from help;查看对应的关联界面

这里面遇到一个坑,因为装上以后没有设置master和salve我就去登录数据接口后台:

mysql -uuser1 -p1234 -P1234 -h127.0.0.1 在登录以后发现,数据库不能用,报:proxy-plugin.c.1420: I have no server backend, closing connection

应该是没有配置master和salve:,配置管理接口的主从:

登录2345端口,

add master 127.0.0.1:3306 主数据库

add slave 127.0.0.1:3307 配置从数据库

(5、配置mysql的授权用户

为了方便测试,以及后续的方便,我们添加授权用户user1,登录本地数据库服务:

mysql -uroot -P3306 -p4f70f5007d 

先创建一个测试的数据库:create database DBproxy 

使用以下命令:
create user  user1   IDENTIFIED by '1234'; 创建新用户
set password for user1 =password('1234'); 修改密码
授权相关权限给user1
grant select,update,delete,insert  on DBproxy.* to user1@localhost identified by '1234';
flush privileges; //刷新系统权限表

这样我们就给user1授权了使用权限,user system;select * from user where user='user1' 查看授权的用户.

这时候我们重新登录链接1234端口,mysql -uuser1 -p1234 -P1234 -h127.0.0.1 登录后,user DBproxy。一切正常,说明可以正常写入主数据库数据了,测试数据:

(6、测试Altas主从数据库

insert into (name) value('测试1');//写入成功后

登录3307端口,发现数据已经同步过来了,说明主从配置成功了,至此Altas配置到应用完成。

登录本地3306端口也已经看到数据库中的数据已经写入成功,说明已经生成了数据。

PS:在安装过程中我用了2.2的版本进行安装,发现mysqllibclient组件缺失,后台补了一个组件也安装失败了,卸载掉安装2.1成功,后续大家可以跟进测试下其他版本的兼容性

进入salve:mysql -uuser1    -P3307    -h127.0.0.1 -p -P1234

进入主:mysql -uuser1    -P3306    -h127.0.0.1 -p -P1234

管理控制台:mysql -uroot    -h127.0.0.1 -p -P2345

转载于:https://my.oschina.net/heart200/blog/845584

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值