您的位置:首页 > 其它

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 lemon

mkdir build && cd build && cmake ..

make

make install

之后就可以编译了(glib jemalloc libffi libevent等依赖请自行安装):

./bootstrap.sh

make

make 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的语句

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: