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

第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都为我们安装了什么:

[[email protected] 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 制作加密密码:

[[email protected] bin]# encrypt 123

3yb5jEku5h4=

1.2.2 编写配置文件:

[[email protected] mysql-proxy]# pwd

/etc/mysql-proxy

[[email protected] 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 [email protected]'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这个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即可.

原文地址:http://blog.51cto.com/13520772/2109337

时间: 2024-10-09 20:01:18

Atlas读写分离的相关文章

Atlas 读写分离

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同城数据库中间件)    

Gtid+MGR+atlas读写分离以及负载均衡高可用架构

MySQL5.7.24 Gtid+MGR+atlas读写分离以及负载均衡高可用架构 一.服务器环境介绍: 腾讯云的云主机安装360开源的mysql中间键Atlas腾讯云机器的外网ip:119.29.97.131沧州233测试物理机器的外网ip192.168.1.233(安全起见故意写成内网的ip,其实是外网ip) 二.mysqlGtid+MGR安装 参考博文地址: 三.中间键Atlas简介 (摘抄自https://github.com/Qihoo360/Atlas) Atlas 是由 Qihoo

MySQL-高可用MHA+Atlas读写分离

公司最近为新的MySQL架构进行调整,要求给出方案,我这边提出使用MHA+Atlas做高可用集群读写分离架构,就多方讨论最终确认方案,进行实施: 一.简单说下MHA的工作原理 1个管理节点可以管理多套mysql架构,可以不装在mysql主机上 通过管理节点,来对其它数据节点上的mysql做监控,会每隔几秒做心跳检测 二.MHA的简单架构图 三.部署MHA 1,环境准备(依赖包.软件包.创建存放目录等)所有节点进行 #安装依赖包 [[email protected] ~]#yum install 

数据切分——Atlas读写分离Mysql集群的搭建

关于数据切分的原理可以参见博客: http://blog.csdn.net/jhq0113/article/details/44226789 关于Atlas的介绍可以参见博客: http://blog.csdn.net/jhq0113/article/details/44239823 Atlas源代码用C语言编写,它对于Web Server相当于是DB,相对于DB相当于是Client,如果把Atlas的逻辑放到Web Server程序里去处理,这样会大大增加Web Server程序的复杂度,同时

Atlas读写分离[高可用]

Atlas下载地址: https://github.com/Qihoo360/Atlas/releases Atlas是出于360的, 比mysql-proxy更稳定, 部署起来更方便. 环境: proxy:192.168.99.60 master:192.168.99.61 slave:192.168.99.62 1.安装 由于我使用的是rpm包, 直接安装 rpm -ivh Atlas-2.2.el6.x86_64.rpm 就是这么简单, 安装完成. 目录默认在: /usr/local/my

mysql-MHA预发布环境架构分享(四)之Atlas读写分离

rpm -ivh Atlas-2.2.1.el5.x86_64.rpm   [rpm包直接安装] rpm -ql Atlas [查看安装路径] grep -v '^#' /usr/local/mysql-proxy/conf/test.cnf  |grep -v '^$'  > lipengfei  [过滤垃圾提示符] mv test.cnf test.cnf.old cat lipengfei > test.cnf /usr/local/mysql-proxy/bin/encrypt mys

MySQL中间件atlas读写分离

安装atlas 软件并做相关的配置[mysql-proxy]admin-username = admin //管理接口的账号admin-password = admin //管理接口的密码proxy-backend-addresses = 10.2.6.10:3307 //主库的地址以及端口proxy-read-only-backend-addresses = 10.2.6.11:3307,10.2.6.12:3307 //从库的地址以及端口pwds =atlas:TWbz0dlu35U= //

实验2 安装Atlas实现读写分离

系统版本:        windows7x64 虚拟机:          centos 6.5x64 ip规划:          主数据库服务器:192.168.0.44 从数据库服务器:192.168.0.54 proxy服务器:192.168.0.29 ssh连接工具:    ssh secure shell client vpn工具:        ssl vpn-plus client 实验内容:        1.为proxy服务器下载安装Atlas 2.配置Atlas 3.运行

采用Atlas实现MySQL读写分离

##采用Atlas实现MySQL读写分离 一.基础介绍 ========================================================================================== 1.背景描述 目前我们的高可用DB的代理层采用的是360开源的Atlas,从上线以来,已稳定运行2个多月.无论是从性能上,还是稳定性上, 相比其他开源组件(amoeba.cobar.MaxScale.MySQL-Proxy等),还是很出色的. 当初我们之所以选择