Atlas读写分离

第1章 介绍

1.1 企业读写分离机分库分表方案:

    Mysql-proxyoracle

    Mysql-routeroracle

    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前端应用无感知

Atlas读写分离_第1张图片

第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执行(SELECTDELETEUPDATEINSERTREPLACE)操作时,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这个IP192.168.2.*这个段的IP可以连接Atlas,其他IP均不能连接。如果该参数不设置,则任意IP均可连接Atlas。如果设置了client-ips参数,且Atlas前面挂有LVS,则必须设置lvs-ips参数,否则可以不设置lvs-ips

SQL语句黑白名单功能: Atlas会屏蔽不带where条件的deleteupdate操作,以及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架构:

Atlas读写分离_第2张图片

1.1 sharding配置示例:

Atlas支持非shardingsharding的表共同存在同一个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的表跟语句都会发往这个组内,所以治安没有shardingatlas的表而已无缝的在新版本上使用

注意:没有分片的组只能配置一个,而分片的组可以配置多个,下面的配置,配置了分片的组

[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即可.