Atlas Sharding 安装、配置及简单测试
2015-10-15 14:02
309 查看
1、软件下载地址:
https://github.com/Qihoo360/Atlas/releases |
2、Atlas Sharding简介
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将不会再有效. 关于垂直切分与水平切分的区别与优缺点, 在这里就不详细解释了. |
3、兼容性
Atlas支持非sharding跟sharding的表共存在同一个Atlas中, 2.2.1之前的配置可以直接运行.之前的配置如: …….. proxy-backend-addresses=172.19.200.1:3306 proxy-read-only-backend-addresses = 172.19.200.3:3306 ………. 此处配置了一个master和一个slave, 这属于非sharding的组,所有非sharding的表跟语句都会发往这个组内.所以之前没有Sharding的Atlas的表可以无缝的在新版上使用,注意: 非Sharding的组只能配置一个,而sharding的组可以配置多个.下面的配置, 配置了Sharding的组,注意与上面的配置区分 …… [group-0] proxy-backend-addresses = 172.19.200.1:3306 proxy-read-only-backend-addresses = 172.19.200.3:3306 [group-1] proxy-backend-addresses = 172.19.200.2:3306 …… |
4、安装:
1)RPM安装:
RPM包安装(推荐): 请到 https://github.com/Qihoo360/Atlas/releases/ 下载相应的rpm包(Sharding2.2.1)直接安装即可. |
2)源码安装
源码安装: sharding是以sharding分支发布的: git clone https://github.com/Qihoo360/Atlas.git git checkout sharding git pull origin sharding 编译sharding分支的Atlas还需要安装lemon: git clone https://github.com/winkyao/lemon[/code]cd lemonmkdir build && cd build && cmake ..makemake install |
5、Atlas Sharding架构:
Atlas是无状态的,对于后端的多个组,可以配置任意多个Atlas实例,这一点与MongoDB的mongos类似. |
6、Sharding数据库组
在Atlas中, 将一个组看做是数据存储的单位, 一个组由一台master, 零台或者多台slave组成(mysql主从同步需要由用户自己配置). 每个组之间的数据独立, 没有关系, 表的数据的各个部分存储在各个组中. 组内读写分离 与非sharding的方案一样, Atlas sharding也支持组内的读写分离, 也就是说Atlas在命中了某个组之后, 还是会对这个组内的master和slave执行读写分离(读发送到slave, 写发送到master). |
7、Sharding 数据切分策略
shard key 每一个shard table都有一个shard key, 其可以是主键, 也可以是非主键, 但是这个列必须是一个整数. Atlas会利用这个shard key来判断应该把这条记录存放到哪一个数据库组中. 现在Atlas Shardingh支持两种类型的数据切分: Range方式和Hash方式. Range 方式 如上图中, shard Key范围在0-1000的数据存放在DbGroup0中, 范围在1000-2000的数据存放在DbGroup1中, 2000-MaxInt 的数据存放在DbGroup2 中. 这些范围的大小不需要相同.比如id为shard key的话, sql: "select * from test where id = 1500;", Atlas会将此语句发往DbGroup1. 暂时Atlas的range是静态的, 不支持动态的增加范围. 优点: 对于range的sql查询如(where id > 100 or id < 1000), range方式的sharding可以精确的命中后端的数据组, 不需要将sql发到各个mysql去请求数据, 节约了网络传输的消耗. 缺点 如果shard key是递增的, 那么可能会在一段时间内的所有sql都命中到同一个数据组, 没有体现出sharding的优势, range不适用于这种场景. 适用场景 range适用于对范围查询有大量需求, 并且shard key相对离散插入的情景 hash 方式 目前Atlas使用取模的方式实现Hash, 也就是说Hash(id) = id % dbgroup_count, 如id = 10, id % 3 = 1, 所以会命中到DbGroup1中. 优缺点 hash跟range方式是恰好相反的,hash 可以应对数据递增的情景, 即使是在递增的情况下, sharding的数据也是均匀分布在各个数据组内的, 但是其缺点就是对于范围的查询通常都需要查询所有的dbgroup, 网络的消耗比较大. 适用场景 hash 适用于shard key顺序增长, 并对范围查询的需求比较小的情景 |
8、关于支持的语句
Atlas sharding只对sql语句提供有限的支持, 目前支持基本的Select, insert/replace, delete, update语句, 支持全部的Where语法(SQL-92标准), 不支持DML, DML请直连MYSQL执行, 对于以下语句, 如果语句命中了多台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等函数 这些语句Atlas会返回"ERROR 1105 (HY000): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL"错误. 请不要在Sharding的表上使用这些特性, 如果对这种特性有需求请不要让此表sharding. 注意: 1、子查询在Sharding中可能会返回不正确的结果,也请不要使用子查询. 请把语句拆分成多句执行 2、对于写操作,如果写操作命中了多个数据库组, 由于部分成功(某个组执行失败)需要回滚的问题,暂时不支持写操作命中多个数据组的语句.请拆分成多个sql语句执行. |
9、增加节点
注意:暂时只支持range方式的节点扩展, hash方式由于需要数据迁移,暂时未做支持. 扩展节点在保证原来节点的范围不改变的情况下,如已有dbgroup0为范围0 - 999, dbgroup1为范围 1000 - 1999,这个时候可以增加范围>2000的节点.如增加一个节点为2000 - 2999,修改配置文件, 重启Atlas即可. |
10、Atlas sharding部分新增配置项
shardrule. 一个shardrule对应一个分表规则,不同的shardrule通过下划线后面的数字区分。例如shardrule-0, shardrule-1....。一个shardrule里面有以下几项: [[code]shardrule-0] table = test.test # 分表名,由数据库 + 表名 组成 type = 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. 一个group一般包含一主多从,由master(proxy-backend-addresses)和slave(proxy-read-only-backend-addresses)组成。group之间的区别也是通过通过下划线后面的数字区分。 [group-0] proxy-backend-addresses = 172.19.200.1:3306 proxy-read-only-backend-addresses = 172.19.200.3:3306 [group-1] proxy-backend-addresses = 172.19.200.2:3306 |
11、关于事务支持
事务在Atlas的非sharding的表是完全支持的,但是对于sharding的表, Atlas只能提供部分的支持(不支持跨dbgroup的事务). Atlas只支持事务中涉及单个dbgroup的语句。换句话说,如果是hash方式sharding的表,基本上事务是无法支持的,因为hash的表,大部分操作都是会涉及多个dbgroup的。 |
12、Sharding启动、停止、重启和查看状态
Atlas默认安装在/usr/local/mysql-proxy [root@Atlas-2 bin]# /usr/local/mysql-proxy/bin/mysql-proxyd Usage: /usr/local/mysql-proxy/bin/mysql-proxydinstance {start| stop|restart |status} |
13、Sharding配置
cd /usr/local/mysql-proxy/conf vim test.cnf [mysql-proxy] #带#号的为非必需的配置项目 #管理接口的用户名 admin-username = admin #管理接口的密码 admin-password = admin123 log-path = /usr/local/mysql-proxy/log #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔 #proxy-backend-addresses = 127.0.0.1:3306 proxy-backend-addresses=172.19.200.1:3306 proxy-read-only-backend-addresses = 172.19.200.3: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:+jKsgB3YAG8=, user2:GS+tr4TPgqc= pwds = root:JWkWJtWSfiw= #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。 daemon = 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= on #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。 #sql-log-slow = 10 #实例名称,用于同一台机器上多个Atlas实例间的区分 #instance = test instance = test #Atlas监听的工作接口IP和端口 proxy-address = 172.19.200.7:1234 #Atlas监听的管理接口IP和端口 admin-address = 172.19.200.7: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 [shardrule-0] table = test.test type = range shard-key = id groups = 0:0-999,1:1000-1999 [shardrule-1] table = test.tab01 type = range shard-key = id groups = 0:0-999,1:1000-1999 [group-0] proxy-backend-addresses = 172.19.200.1:3306 proxy-read-only-backend-addresses = 172.19.200.3:3306 [group-1] proxy-backend-addresses = 172.19.200.2:3306 |
14、测试
1)Insert:
mysql> insert into test (id,name) values (2,'t02') ; Query OK, 1 row affected (0.01 sec) mysql> insert into test (id,name) values (3,'t03'),(4,'t04'); Query OK, 2 rows affected (0.01 sec) --此处成功是由于值都命中了group0 mysql> insert into test (id,name) values (5,'t05'),(1001,'t1001'); ERROR 1105 (sqlst): Proxy Warning - write operation is only allow to one dbgroup! --此处失败是由于id为5命中group0,id为1001命中group1,这在sharding的表中是不允许的。 --在以hash类型sharding的表也是同样的 mysql> insert into tab_hash (id,name) values (4,'hash04'); Query OK, 1 row affected (0.01 sec) mysql> insert into tab_hash (id,name) values (5,'hash05'),(7,'hash07'); Query OK, 2 rows affected (0.00 sec) mysql> insert into tab_hash (id,name) values (6,'hash06'),(9,'hash09'); ERROR 1105 (sqlst): Proxy Warning - write operation is only allow to one dbgroup! |
2)Select:
mysql> select * from test; +------+----------+ | id | name | +------+----------+ | 1000 | test0001 | | 1002 | t1002 | | 1001 | t1001 | | 1 | test01 | | 2 | t02 | | 3 | t03 | | 4 | t04 | +------+----------+ 7 rows in set (0.01 sec) mysql> select * from test where id in (1,1000); +------+----------+ | id | name | +------+----------+ | 1 | test01 | | 1000 | test0001 | +------+----------+ 2 rows in set (0.02 sec) mysql> select * from test where id between 3 and 1001; +------+----------+ | id | name | +------+----------+ | 3 | t03 | | 4 | t04 | | 1000 | test0001 | | 1001 | t1001 | +------+----------+ 4 rows in set (0.02 sec) mysql> select * from test where id >3 and id <1001; +------+----------+ | id | name | +------+----------+ | 4 | t04 | | 1000 | test0001 | +------+----------+ 2 rows in set (0.00 sec) mysql> select * from test where id <5 or id <1002; +------+----------+ | id | name | +------+----------+ | 1000 | test0001 | | 1001 | t1001 | | 1 | test01 | | 2 | t02 | | 3 | t03 | | 4 | t04 | +------+----------+ 6 rows in set (0.00 sec) mysql> select * from test where id >5 limit 3; +------+----------+ | id | name | +------+----------+ | 1000 | test0001 | | 1002 | t1002 | | 1001 | t1001 | +------+----------+ 3 rows in set (0.00 sec) mysql> select * from test where id >5 limit 3 ,2; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL --不支持Limit Offset mysql> select * from test order by id desc; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL --不支持跨goup的order by mysql> select * from test where id >1000 order by id desc; +------+-------+ | id | name | +------+-------+ | 1002 | t1002 | | 1001 | t1001 | +------+-------+ 2 rows in set (0.00 sec) --在单个group内支持order by mysql> select id from test where group by name ; ERROR 1105 (HY000): Proxy Warning - near "group": syntax error --跨goup不支持 group by ; mysql> select id from test where id >999 group by name ; +------+ | id | +------+ | 1001 | | 1002 | | 1000 | +------+ 3 rows in set (0.01 sec) --在单个group内支持group by ; mysql> select count(*) from test; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL --跨group不支持count; mysql> select count(*) from test where id <100; +----------+ | count(*) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec) --单个group支持count; mysql> select max(id) from test where id <100; +---------+ | max(id) | +---------+ | 4 | +---------+ 1 row in set (0.00 sec) --单个group内支持max; mysql> select max(id) from test ; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL --跨group不支持max; mysql> select min(id) from test; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL ---跨group不支持min; mysql> select min(id) from test where id <100; +---------+ | min(id) | +---------+ | 1 | +---------+ 1 row in set (0.00 sec) --单个group支持min; mysql> select * from test t join tab01 k on k.id=t.id and tab01=1; ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL --不支持JOIN; |
3)delete
mysql> delete from test; ERROR 1105 (HY000): Proxy Warning - Syntax Forbidden! mysql> delete from test where id <2; Query OK, 1 row affected (0.01 sec) --只支持在单个group内; |
4)update
mysql> update test set name='test_update' ; ERROR 1105 (HY000): Proxy Warning - Syntax Forbidden! mysql> update test set name='test_update' where id <5 ; Query OK, 3 rows affected (0.01 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from test; +------+-------------+ | id | name | +------+-------------+ | 2 | test_update | | 3 | test_update | | 4 | test_update | | 5 | t05 | | 1000 | test0001 | | 1002 | t1002 | | 1001 | t1001 | +------+-------------+ 7 rows in set (0.03 sec) --只支持单个group内; |
5)测试事务支持
--测试事务支持; mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into test values (5,'t05'); Query OK, 1 row affected (0.01 sec) mysql> insert into test values (1003,'t1003'); ERROR 1179 (sqlst): Proxy Warning - sharding dbgroup is in trans, transaction will not work across multi dbgroup --此处的id=1003是group1,跨越id=5时的group0; mysql> select * from test where id <1000; +------+--------+ | id | name | +------+--------+ | 1 | test01 | | 2 | t02 | | 3 | t03 | | 4 | t04 | | 5 | t05 | +------+--------+ 5 rows in set (0.00 sec) mysql> select * from test ; ERROR 1179 (sqlst): Proxy Warning - sharding dbgroup is in trans, transaction will not work across multi dbgroup mysql> commit; Query OK, 0 rows affected (0.01 sec) --提交事务 mysql> select * from test; +------+----------+ | id | name | +------+----------+ | 1 | test01 | | 2 | t02 | | 3 | t03 | | 4 | t04 | | 5 | t05 | | 1000 | test0001 | | 1002 | t1002 | | 1001 | t1001 | +------+----------+ 8 rows in set (0.00 sec) --故对于sharding的表,Atlas只能提供部分的支持(不支持跨dbgroup的事务). Atlas只支持事务中涉及单个dbgroup的语句 |
相关文章推荐
- JobSchedule之源码分析-第一讲
- linux文件类型
- 为iPhone6设计自适应布局(二)
- 购物车动画
- MySQL 系列--安装配置
- URI参数签名算法【转载】
- Android中Textview显示带html文本三-------【Textview显示网络图片】
- 雷达扫描动画
- UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)
- jvm垃圾收集器与内存分配策略
- Echarts Map 值域为小数的原因
- 大写标识符
- Linux 中 CURL常用命令详解
- netfilter之NAT代码解读
- 你不知道的故事——被藏起来的婚鞋
- 你不知道的故事——被藏起来的婚鞋
- SOE传入参数过长出错,
- 为iPhone6设计自适应布局(一)
- 文章标题
- CSS3-2D转换