16-Atlas读写分离
一、企业读写分离及分库分表方案介绍
- 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
- 读写分离
- 从库负载均衡
- 自动分表
- IP过滤
- SQL语句黑白名单
- DBA可平滑上下线DB
- 自动摘除宕机的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函数。
本文来自博客园,作者:EJW,转载请注明原文链接:https://www.cnblogs.com/ejjw/p/17930594.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix