Atlas读写分离
第1章 介绍
1.1 企业读写分离机分库分表方案:
Mysql-proxy(oracle)
Mysql-router(oracle)
Atlas (Qihoo 360)
Atlas-sharding (Qihoo 360)
Cobar(是阿里巴巴(B2B)部门开发)
Mycat(基于阿里开源的Cobar产品而研发)
TDDL Smart Client的方式(淘宝)
Oceanus(58同城数据库中间件)
OneProxy(原支付宝首席架构师楼方鑫开发 )
vitess(谷歌开发的数据库中间件)
Heisenberg(百度)
TSharding(蘑菇街白辉)
Xx-dbproxy(金山的Kingshard、当当网的sharding-jdbc )
amoeba
1.2 Atlas简介:
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条
Atlas官方链接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
Atlas下载链接: https://github.com/Qihoo360/Atlas/releases
1.3 主要功能:
1. 读写分离,从库负载均衡,自动分表,IP过滤
2. sql语句黑白名单,DBA平滑上下线,自动摘除故障机
1.4 使用场景:
Atlas是一个位于前端应用于后端数据库之间的中间件,它使得应用程序员无需在关心读写分离,分表等于mysql相关的细节,可以专注于编写业务逻辑,同时使得DBA运维工作对全段应用透明,上下线DB前端应用无感知
第1章 安装Atlas
软件获取地址:https://github.com/Qihoo360/Atlas/releases
1.1 下载安装:
curl https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
这里已经下载好软件,yum本地安装即可:
yum localinstall -y Atlas-2.2.1-2.el7.centos.x86_64_\(1\).rpm Atlas-devel-2.2.1-2.el7.centos.x86_64_\(1\).rpm
1.1.1 Atlas都为我们安装了什么:
[root@db03 bin]# rpm -ql Atlas
/etc/mysql-proxy/mysql-proxy.cnf
/etc/rc.d/init.d/mysql-proxy #启动脚本
/usr/bin/encrypt #制作密码工具
/usr/bin/mysql-binlog-dump
/usr/bin/mysql-myisam-dump
/usr/bin/mysql-proxy
1.2 配置Atlas配置文件:
Atlas配置文件中的密码需要进行加密,可以使用软件自带的加密工具进行加密
1.2.1 制作加密密码:
[root@db03 bin]# encrypt 123
3yb5jEku5h4=
1.2.2 编写配置文件:
[root@db03 mysql-proxy]# pwd
/etc/mysql-proxy
[root@db03 mysql-proxy]# vim mysql-proxy.cnf
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 10.0.0.51:3306 写操作节点,也就是高可用的vip地址
proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306 读操作节点
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /var/log/mysql-proxy/
sql-log=ON
proxy-address = 0.0.0.0:33060 atlas代理的端口
admin-address = 0.0.0.0:2345 atlas管理节点的端口
charset=utf8
1.3 启动atlas服务:
/etc/rc.d/init.d/mysql-proxy start
第2章 Atlas管理操作:
2.1 登录管理接口:
mysql -uuser -ppwd -h127.0.0.1 -P2345
2.2 查看帮助信息:
mysql> SELECT * FROM help;
2.3 查看后端代理库:
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+----------------+-------+------+
| 1 | 10.0.0.55:3306 | down | rw |
| 2 | 10.0.0.52:3306 | down | ro |
| 3 | 10.0.0.53:3306 | up | ro |
+-------------+----------------+-------+------+
3 rows in set (0.00 sec)
2.4 平滑摘除代理库:
mysql> REMOVE BACKEND 2;
Empty set (0.00 sec)
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+----------------+-------+------+
| 1 | 10.0.0.55:3306 | down | rw |
| 2 | 10.0.0.53:3306 | up | ro |
+-------------+----------------+-------+------+
2 rows in set (0.00 sec)
2.5 保存配置文件:
mysql> save config;
2.6 添加节点:
mysql> add slave 10.0.0.52:3306;
Empty set (0.00 sec)
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+----------------+-------+------+
| 1 | 10.0.0.55:3306 | down | rw |
| 2 | 10.0.0.53:3306 | up | ro |
| 3 | 10.0.0.52:3306 | down | ro |
+-------------+----------------+-------+------+
3 rows in set (0.00 sec)
mysql> save config;
Empty set (0.01 sec)
2.7 数据库查看负载情况:
通过atlas登录数据库,注意,这里使用的是数据库上存在的用户及密码
mysql -umha -pmha -h127.0.0.1 -P33060
mysql> show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
1 row in set (0.37 sec)
mysql> show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
1 row in set (0.00 sec)
第3章 Atlas读写分离
读写分离说明:
atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行
3.1 从库负载均衡配置:
proxy-read-only-backend-addresses=ip1:port1@权重,ip2:port2@权重
3.2 读写分离测试
1. 设置从库为只读模式:
mysql> set global read_only=1;
2. 在主库中添加普通用户:
mysql> grant select ,update ,delete ,insert,create,drop on
-> *.* to appuser@'10.0.0.%' identified by '123';
3. 添加到配置文件中
vim /etc/mysql-proxy/mysql-proxy.cnf
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=,appuser:3yb5jEku5h4=
3. 重启altas服务
4. /etc/rc.d/init.d/mysql-proxy restart
登录数据库
mysql -uappuser -p123 -h 10.0.0.53 -P 33060
进行写操作进行测试:
mysql> create database jiang;
第4章 Atlas高级功能
4.1 企业中分库分表的策略:
1. 垂直拆分---分库
2. 垂直拆分---分表
3. 水平拆分---拆表
4. 水平拆分---分片
4.2 自动分表(取模):
使用自动分表时,首先需要在配置文件中设置tables参数tables参数设置格式:数据库名;表明;分表字段;子表数量
比如:
你的数据库名叫school,表名叫stu,分表字段叫id,总共分为2张表,那么就写为school.stu.id.2,如果还有其他的分表,以逗号分隔即可。
用户需要手动建立2张子表(stu_0,stu_1,注意子表序号是从0开始的)。
所有的子表必须在DB的同一个database里。
当通过Atlas执行(SELECT、DELETE、UPDATE、INSERT、REPLACE)操作时,Atlas会根据分表结果(id%2=k),定位到相应的子表(stu_k)。
例如,执行select * from stu where id=3;,Atlas会自动从stu_1这张子表返回查询结果。
但如果执行SQL语句(select * from stu;)时不带上id,则会提示执行stu表不存在。
4.2.1 atlas功能说明:
atlas暂不支持自动渐变耦合跨库分表的功能
目前支持分表的语句有select delete update insert replace
4.3 IP过滤Lclient-ips
该参数用来实现IP过滤功能:
在传统的开发模式中,应用程序直接连接DB,因此DB会对部署应用的机器(比如web服务器)的IP作访问授权。
在引入中间层后,因为连接DB的是Atlas,所以DB改为对部署Atlas的机器的IP作访问授权,如果任意一台客户端都可以连接Atlas,就会带来潜在的风险。
client-ips参数用来控制连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔写在一行上即可。
如: client-ips=192.168.1.2, 192.168.2
这就代表192.168.1.2这个IP和192.168.2.*这个段的IP可以连接Atlas,其他IP均不能连接。如果该参数不设置,则任意IP均可连接Atlas。如果设置了client-ips参数,且Atlas前面挂有LVS,则必须设置lvs-ips参数,否则可以不设置lvs-ips。
SQL语句黑白名单功能: Atlas会屏蔽不带where条件的delete和update操作,以及sleep函数。
第5章 Atlas-sharding版本
5.1 版本介绍:
sharding的基本思想就是把一个数据表中的数据切分成多个部分,存放到不同的主机上去,从而缓解单台机器的压力
sharding是一种水平切分,适用于单表数据庞大的情景,目前atlas支持静态的
sharding方案,暂时不支持数据的自动迁移以及数据组的动态加入
Atlas以表为单位sharding,同一个数据库内可以同时共有sharding的表和不sharding的表,不sharding的表数据存在未sharding的数据库组中
目前Atlas sharding支持insert, delete, select, update语句, 只支持不跨shard的事务. 所有的写操作如insert, delete, update只能一次命中一个组, 否则会报"ERROR 1105 (HY000):write operation is only allow to one dbgroup!"错误.
由于sharding取替了Atlas的分表功能, 所以在Sharding分支里面, Atlas单机分表的功能已经移除, 配置tables将不会再有效.
5.2 Atlas-sharding架构:
1.1 sharding配置示例:
Atlas支持非sharding跟sharding的表共同存在同一个atlas中,2.2.1之前的配置可以直接运行,之前的配置如:
proxy-backend-addresses = 192.168.0.12:3306
proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306 ...
这配置了一个master和两个slave,这属于非sharding的组,所有非sharding的表跟语句都会发往这个组内,所以治安没有sharding的atlas的表而已无缝的在新版本上使用
注意:没有分片的组只能配置一个,而分片的组可以配置多个,下面的配置,配置了分片的组
[shardrule-0]
table = test.sharding_test
分表名,有数据库+表名组成 t
ype = range
sharding类型:range 或 hash
shard-key = id
sharding 字段
groups = 0:0-999,1:1000-1999
分片的group,如果是range类型的sharding,则groups的格式是:group_id:id范围。如果是hash类型的sharding,则groups的格式是:group_id。例如groups = 0, 1
[group-0]
proxy-backend-addresses=192.168.0.15:3306
proxy-read-only-backend-addresses=192.168.0.16:3306
[group-1]
proxy-backend-addresses=192.168.0.17:3306
proxy-read-only-backend-addresses=192.168.0.18:3306
1.2 Sharding限制
关于支持的语句
Atlas sharding只对sql语句提供有限的支持, 目前支持基本的Select, insert/replace, delete,update语句,支持全部的Where语法(SQL-92标准), 不支持DDL(create drop alter)以及一些管理语句,DDL请直连MYSQL执行, 请只在Atlas上执行Select, insert, delete, update(CRUD)语句.
对于以下语句, 如果语句命中了多台dbgroup, Atlas均未做支持(如果语句只命中了一个dbgroup, 如 select count(*) from test where id < 1000, 其中dbgroup0范围是0 - 1000, 那么这些特性都是支持的)Limit Offset(支持Limit)
Order by
Group by Join
ON
Count, Max, Min等函数
增加节点
注意: 暂时只支持range方式的节点扩展, hash方式由于需要数据迁移, 暂时未做支持.
扩展节点在保证原来节点的范围不改变的情况下, 如已有dbgroup0为范围0 - 999, dbgroup1为范围 1000-1999, 这个时候可以增加范围>2000的节点. 如增加一个节点为2000 - 2999, 修改配置文件, 重启Atlas即可.