16-Atlas读写分离

发布时间 2023-12-27 15:05:47作者: EJW

一、企业读写分离及分库分表方案介绍

  • Mysql-proxy(oracle)
  • Mysql-router(oracle)
  • Atlas (Qihoo 360)
  • Atlas-sharding (Qihoo 360)
  • Cobar(是阿里巴巴(B2B)部门开发)
  • Mycat(基于阿里开源的Cobar产品而研发)
  • TDDL Smart Client的方式(淘宝)
  • DRDS 阿里云的产品
  • Oceanus(58同城数据库中间件)
  • OneProxy(原支付宝首席架构师楼方鑫开发 )
  • vitess(谷歌开发的数据库中间件)
  • Heisenberg(百度)
  • TSharding(蘑菇街白辉)
  • Xx-dbproxy(金山的Kingshard、当当网的sharding-jdbc )amoeba

二、Atlas简介

Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。

源码 Github:https://github.com/Qihoo360/Atlas

  1. 读写分离
  2. 从库负载均衡
  3. 自动分表
  4. IP过滤
  5. SQL语句黑白名单
  6. DBA可平滑上下线DB
  7. 自动摘除宕机的DB
  • 使用场景

Atlas是一个位于前端应用与后端MySQL数据库之间的中间件,它使得应用程序员无需再关心读写分离、分表等与MySQL相关的细节,可以专注于编写业务逻辑,同时使得DBA的运维工作对前端应用透明,上下线DB前端应用无感知。

三、Atlas安装、基本配置

1、安装软件

rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 

2、修改配置

cd /usr/local/mysql-proxy/

vim /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 10.0.0.55:3306
proxy-read-only-backend-addresses = 10.0.0.51:3306,10.0.0.52:3306
pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=  --->填写密文密码
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log=ON -->启动sql日志
proxy-address = 0.0.0.0:33060
admin-address = 0.0.0.0:2345
charset=utf8


/usr/local/mysql-proxy/bin/encrypt  123      ---->制作加密密码

3、启动atlas

/usr/local/mysql-proxy/bin/mysql-proxyd test start
ps -ef |grep proxy

4、测试

测试读写分离:

读的测试

mysql -uroot -p123 -h10.0.0.53 -P33060 
show variables like 'server_id';

写操作测试

设置两个从节点只读

set global read_only=1;

连接测试

mysql -umha -pmha -h10.0.0.53 -P33060
create database db1;

管理atlas

连接管理接口:

mysql -uuser -ppwd -h127.0.0.1 -P2345

打印帮助:

mysql> select * from help;
动态添加删除节点:
REMOVE BACKEND 3;  -->删除节点
ADD SLAVE 10.0.0.53:3306; -->添加节点
SAVE CONFIG; ---> 保存配置

三、扩展——atlas 自动分表

school.stu 1000w每个分表200w数据
id name

stu_0 stu_1 stu_2 stu_3 stu_4

以上分表方式,存数据非常均匀,取数据不均与,因为要考虑业务需求
如果业务查询热点数据集中在id是1-200w这些数据,那么读取就不均匀

通过取模分表

n/5 取余数 (0,1,2,3,4)

(1)如果是  0  则分到 stu_0
(2)如果是  1  则分到 stu_1
(3)如果是  2  则分到 stu_2
(4)如果是  3  则分到 stu_3
(5)如果是  4  则分到 stu_4

注释:取余数的方式可以解决常用数据分布不均匀的情况,但是不易扩展

配置实现

配置文件

vim /usr/local/mysql-proxy/conf/test.cnf
tables = school.stu.id.5

重启atlas

(主库)手工创建,分表后的库和表,分别为定义的school 和 stu_0 stu_1 stu_2 stu_3 stu_4

create database school;
use school
create table stu_0 (id int,name varchar(20));
create table stu_1 (id int,name varchar(20));
create table stu_2 (id int,name varchar(20));
create table stu_3 (id int,name varchar(20));
create table stu_4 (id int,name varchar(20));

测试:

insert into stu values (3,'wang5');

insert into stu values (2,'li4');

insert into stu values (1,'zhang3');

insert into stu values (4,'m6');

insert into stu values (5,'zou7');

commit;

select * from stu where id=2;
select * from stu_0;

分表后只能使用加where条件的查询,但是可以使用stu_0查询分表下边所有数据

其他配置参数

* IP过滤:client-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函数。