一、Atlas介绍

Atlas是360开源的一个Mysql Proxy,以下是官方介绍:

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。

https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

以下是其github代码库:https://github.com/Qihoo360/Atlas

主要功能:

1.读写分离

2.从库负载均衡

3.IP过滤

4.自动分表

5.DBA可平滑上下线DB

6.自动摘除宕机的DB

“自动分表”需要打引号,对于新表是没问题的;

如果是一张有历史数据的表需要拆分,Atlas是不会帮我们拆分的,就需要自己写工具迁移。

二、安装

1、从官网下载相应版本,我们选择的是2.2.1;

https://github.com/Qihoo360/Atlas/releases

分表的方式有2种,1是单机分表,另1种是支持跨机器分表,可以根据情况选择,我们选择的是单机分表的,即一张总表拆成多张子表,子表和总表都在一个Mysql实例上。

2、安装

因为是rpm安装,直接用rpm命令安装就可以了:

rpm -i Atlas-2.2.1.el6.x86_64.rpm

默认安装目录为 /usr/local/mysql-proxy。

启动命令

/usr/local/mysql-proxy/bin/mysql-proxyd test start

test表示哪个实例

配置文件在 usr/local/mysql-proxy/conf下,每个配置文件表示一个实例;

3、配置说明

以下是常用的配置项:

配置

说明

admin-username 后台管理员账号
admin-password 后台管理员密码
proxy-backend-addresses Mysql实例,多项以,(逗号)分隔
pwds

密码,必须和Mysql实例的密码一样,

用安装目录 bin目录下的加密程序encrypt加密

event-threads 工作线程数,对性能影响大
sql-log SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘
proxy-address Atlas监听的工作接口IP和端口
tables  分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项

关键参数:

proxy-backend-addresses:后端Mysql实例地址

tables:分表参数,格式:

数据库名.表名.分表字段.子表数量

举1个栗子,假如我们在做社区,社区主要功能是发帖和回帖,那主要是2张表(只是为了演示,不会把真实实际场景所有字段加上):

帖子表(posts)

字段名 类型 说明
tid int 帖子id
title varchar(200) 帖子标题
content text 帖子内容

回复表(replies)

字段名 类型 说明
pid int 回复id
tid int 帖子id
uid int 用户id
content text 回复内容
create_time datetime 插入时间

假设这些表都在数据库forums中,

如果我们要对replies进行分表,则tables这样设置

forums.replies.tid.64

上面表示对replies进行分表,分表字段为tid,即所有tid相同的回复会在同一张表,总共分64张表。

三、踩过的坑

1、Atlas不支持压缩选项,以下连接是不行的

mysql_connect($dbhost, $dbuser, $dbpw, 1, MYSQL_CLIENT_COMPRESS);

正确的写法

mysql_connect($dbhost, $dbuser, $dbpw, 1);

2. Count语句问题

分表后,count返回的结果会是针对多个表查询的多个值(count结果为0的不返回),具体示例如下(当前分表为4张):

3.  分表后,如果删掉主表,则不带分表字段的查询会报错(如下图);如果保留主表,则查询的是主表数据。

4. 分页问题

以上面举例的场景来说,如果要从回复表查询uid为123,并且tid为100-200之间的记录的第2页(Discuz里就是这样查用户的回复的),每页显示10条,按时间倒序,就有可能返回为空了;

为什么这样呢,设想这样一个场景,用户一共有40条回复,假设分布在4张表中,并且分布很均匀,每张表10条记录,因为从每张子表取偏移10-20的记录,子表返回为空了,实际是用户是有数据的,正确的做法是从每张表取出前20条记录,再合并然后进行分页。

关于这个问题,我已经在另一篇文章详细说明了,Mysql中间件360 Atlas踩坑

四、总结

1、如果你是新表,并且预见以后数据很大,可以用上Atlas来解决数据量的问题;

2、旧表的话,你还得自己写脚本导数据,核对数据;

3、如果有些分页查询的话,还需要自己重写;

4、确定你的所有场景的查询是否都有分表字段作为where,没有的话,需要自己再写工具将子表的数据同步到总表;

可以看到Atlas如果需要产品化还要做很多的事情,如果确定上面都不是问题,就大胆的用吧~

往期精彩文章:

FastDFS不同步怎么破

Dubbo2.7试用

redis-port支持前缀迁移

扩展Redis:增加Redis命令

360 Atlas生产环境使用心得的更多相关文章

  1. .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)

    最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...

  2. 结合Git实现Mysql差异备份,可用于生产环境

    埋头苦干多年一直没写过文章,今天突发狂想,为LNMP阵营贡献一些力量.就从平时工作过程中的心得和一些技巧分享出来.今天就猿们最熟悉的Mysql开始宅鸟的开篇博客文章.欢迎猿们拍砖.转载. 注意:宅鸟的 ...

  3. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  4. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

  5. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产环境下的追踪系统

    前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的问题: 从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点 ...

  6. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  7. django生产环境中部署

    https://www.cnblogs.com/chenice/p/6921727.html 本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如 ...

  8. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  9. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

随机推荐

  1. PythonCrashCourse 第七章习题

    编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如"Let me see if I can find you a Subaru" car =input("Wha ...

  2. Vue Axios 的封装使用

    目录 Axios 说明 安装 Axios 请求配置 响应结构 常用请求方法 默认值配置 全局的 请求配置项 自定义实例默认值 配置的优先顺序 拦截器 个人完整 axios 配置 Axios 说明 Ax ...

  3. Dubbo系列之 (五)服务订阅(2)

    辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...

  4. linux下udev和mdev的使用

    linux下设备文件系统有devfs.udev和mdev这三种. 一.devfs devfs是由Linux 2.4内核引入的,引入时被许多工程师给予了高度评价,它的出现使得设备驱动程序能自主地管理自己 ...

  5. Mac本软件安装之后打不开的解决办法

    Mac本软件安装之后打不开的解决办法 MacOS系统版本10.15.3 一,安装Axure RP 9 问题:安装之后打不开 提示“Axure RP 9已损坏,无法打开”或“打不开 Axure RP 9 ...

  6. Vue的数据响应式

    getter和setter怎么用 示例代码 getter ,关键词为 get ,用于获取一个值.定义时为函数,但是使用时不用加括号. setter 用于对数据的改写 Object.defineProp ...

  7. JVM系列.历史上出现过的Java虚拟机

    HotSpot绝对是当今商用虚拟机的王者,但是在Java历史上出现过很多Java虚拟机,这篇文章就来整理下历史上出现过的Java虚拟机以及他们的特性. Sun Classic Sun Classic虚 ...

  8. py_递归实例:汉诺塔问题

    递归的两个特点 调用自身 结束条件 # _*_coding:utf-8 ''' 递归实例:汉诺塔问题 n----盘子总数 a----第一个柱子 b----第二个柱子 c----第三个柱子 n个盘子时: ...

  9. 常用的android弹出对话框 几乎包含了所有(1)

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...

  10. 《我想进大厂》之mysql夺命连环13问

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 1. 能说下myisam 和 innodb的区别吗? myisam引擎是5.1版本之前的默认引擎,支持全文检索.压缩 ...