MySQL 中间件Atlas 实现读写分离

原创 MySQL 作者:神谕丶 时间:2016-08-05 17:07:51  2410  0
〇 Atlas架构介绍

<span "="">Atlas是Qihoo360开发的一个中间件,位于Client和MySQL Server中间层,可以作为读写分离,分库分表中间件。
<span "="">对于MySQL Server而言,Atlas像是个Client,而对于Client而言,Atlas则是一个DB server。


〇 实验结构
<span "="">
OS: CentOS 6.5 64bit
MySQL version: 5.6.30

Master:192.168.1.185
Slave:192.168.1.186
proxy(Atlas):192.168.1.187
客户端:192.168.1.192
<span "="">


〇 MySQL部分: <span "="">
(主从建立步骤略)
主/从上建立具有增删改查账号:

  1. <span "="">GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev';
  • <span "="">FLUSH PRIVILEGES;

从库上可以设置:

  1. SET GLOBAL read_only=1;

<span "="">如果该从库永远不用做master,可以写到配置文件中。


〇 Atlas部分:
Atlas开发者给出部分建议:
<span "="">1、Atlas只能运行在64bit的发行版本上
<span "="">2、若曾经安装过,在新安装时会报错:如“file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64”,此时需要sudo rpm –e Atlas-1.0.3-1.x86_64,再执行新的安装。
<span "="">3、建议使用MySQL 5.6,此外,不宜小于MySQL 5.1

在proxy机上安装Atlas:

  1. wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
  2. rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

通过rpm包安装方式,默认的配置文件在
/usr/local/mysql-proxy/conf/test.cnf

首先可以先获取一下之前步骤中,dev@'192.168.1.187'这个用户加密后的密码:
# /usr/local/mysql-proxy/bin/encrypt dev
A2OS3vFVUmY=
因为之前给dev用户的密码的明文是dev,所以此处也对dev加密,加密后的密码输出在其后,也就是A2OS3vFVUmY=这个密码稍后要添加到Atlas配置文件中。

test.cnf配置文件内容可以参考这个:

  1. [mysql-proxy]
  2. # 基础设置
  3. # 以守护进程方式启动
  4. daemon = true
  5. # 设置atlas的运行方式,若为true,则表示多一个monitor,该进程会在woker进程挂掉后将其重启。若为false,则只有一个工作进程woker。
  6. keepalive = true
  7. # atlas实例名,便于区分一台机子上的不同atlas
  8. instance = test
  9. # 工作线程数,atlas开发人员推荐将其设置为CPU个数的2~4倍。
  10. event-threads = 8
  11. # SQL日志的开关,共有三个可选项:OFF、ON、REALTIME,分别为:不记录sql日志、记录sql日志,并等待缓冲区填满后,才会落地到磁盘、记录sql日志并实时写入磁盘。
  12. sql-log = OFF
  13. # 等同于客户端连接到mysql-server后输入SET names utf8;
  14. charset = utf8
  15. # 如果这样配置,可以通过mysql -h127.0.0.1 -P2345 -uadmin -padmin可以连接到Atlas管理界面
  16. admin-username = admin
  17. admin-password = admin
  18. # 该参数设置Atlas后台管理地址和端口
  19. admin-address = 192.168.1.187:2345
  20. # 设置主库和从库的地址,其中主库为写库,从库为只读库
  21. # 主库地址
  22. proxy-backend-addresses = 192.168.1.185:3306
  23. # 设置读库地址和端口
  24. proxy-read-only-backend-addresses = 192.168.1.186:3306
  25. # 若配置为主库也分担读请求,并且设置权重为 (主:从)=(1:3),则可以写作
  26. #proxy-read-only-backend-addresses = 192.168.1.185:3306@1, 192.168.1.186:3306@3
  27. # 设置Atlas工作监听的地址和端口,应用程序将连接到这个地址,既然客户端把Atlas当做一个mysql-server,故此处直接写成3306端口
  28. proxy-address = 192.168.1.187:3306
  29. # 设置用户的密码(这个密码为MySQL中dev用户通过Atlas加密程序加密后的密码),多个可以用逗号隔开
  30. pwds = dev:A2OS3vFVUmY=
  31. # 设置Atlas日志信息,其中log-level有message、warning、critical、error、debug五个级别
  32. log-level = message
  33. # 日志存放的路径,日志名为$instance_name.log,比如$log-path/test.log
  34. log-path = /usr/local/mysql-proxy/log
  35. # 设置允许连接Atlas的客户端ip,非必须,可以是多个,可以是精准ip也可以是ip段,比如:
  36. #client-ips = 127.0.0.1, 192.168.1
  37. # 挂接lvs的物理网卡ip,若有lvs结构,且设置了client-ips,则必须设置此项,反之可不设置。
  38. #lvs-ips = 192.168.1.1

配置好后,直接启动就好:

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

其中test为配置文件中instance的值。
当然可以检查一下是否已经启动成功:

  1. /usr/local/mysql-proxy/bin/mysql-proxyd test status
  2. MySQL-Proxy of test is running (5176)
  3. MySQL-Proxy of test is running (5177)

比如这样就可以连接到Atlas后台界面:

  1. mysql -h192.168.1.187 -P2345 -uadmin -padmin

进去之后可以查看当前配置的DBserver和状态。

  1. mysql> SELECT * FROM backends;
  2. +-------------+--------------------+-------+------+
  3. | backend_ndx | address            | state | type |
  4. +-------------+--------------------+-------+------+
  5. | 1           | 192.168.1.185:3306 | up    | rw   |
  6. | 2           | 192.168.1.186:3306 | up    | ro   |
  7. +-------------+--------------------+-------+------+
  8. 2 rows in set (0.00 sec)

当然更多的选项可以通过SELECT * FROM help;来获取:

  1. <span "="">mysql> SELECT * FROM help;
  • <span "="">+----------------------------+---------------------------------------------------------+
  • <span "=""><span "="">| command <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> | description<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |<span "="">    
  • <span "="">+----------------------------+---------------------------------------------------------+
  • <span "=""><span "="">| SELECT * FROM help <span "="">    <span "="">   <span "=""> | shows this help<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| SELECT * FROM backends <span "="">   <span "=""> | lists the backends and their state <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| SET OFFLINE $backend_id <span "="">  <span "=""> | offline backend server, $backend_id is backend_ndx's id |
  • <span "=""><span "="">| SET ONLINE $backend_id <span "="">   <span "=""> | online backend server, ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| ADD MASTER $backend <span "="">    <span "="">  <span "=""> | example: "add master 127.0.0.1:3306", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| ADD SLAVE $backend <span "="">    <span "="">   <span "=""> | example: "add slave 127.0.0.1:3306", ... <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| REMOVE BACKEND $backend_id | example: "remove backend 1", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| SELECT * FROM clients <span "="">    <span "=""> | lists the clients<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "="">|
  • <span "=""><span "="">| ADD CLIENT $client <span "="">    <span "="">   <span "=""> | example: "add client 192.168.1.2", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| REMOVE CLIENT $client <span "="">    <span "=""> | example: "remove client 192.168.1.2", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| SELECT * FROM pwds <span "="">    <span "="">   <span "=""> | lists the pwds <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "=""> |
  • <span "=""><span "="">| ADD PWD $pwd <span "="">    <span "="">    <span "="">     <span "=""> | example: "add pwd user:raw_password", ... <span "="">    <span "="">    <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| ADD ENPWD $pwd <span "="">    <span "="">    <span "="">   <span "=""> | example: "add enpwd user:encrypted_password", ... <span "="">    <span "=""> <span "=""> |
  • <span "=""><span "="">| REMOVE PWD $pwd <span "="">    <span "="">    <span "="">  <span "=""> | example: "remove pwd user", ... <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "=""> |
  • <span "=""><span "="">| SAVE CONFIG <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> | save the backends to config file <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">  <span "=""> |
  • <span "=""><span "="">| SELECT VERSION <span "="">    <span "="">    <span "="">   <span "=""> | display the version of Atlas<span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">    <span "="">   <span "=""> |
  • <span "="">+----------------------------+---------------------------------------------------------+

<span "="">

 

其他参数:<span "="">

  1. sql-log-slow = 10 # 类似于mysql的long_query_time,如果设置了该选项,则日志只记录超过该值的日志记录,若没有添加这个参数选项,则表示全部记录,单位为ms 
  2. wait-timeout = 10 # Atlas会关闭超过该时间之后一直未活跃的连接,单位s
  3. tables = db_name.table_name.user_id.100 # 分表设置,其中格式为:【库名.表名.分表字段.子表数量】,若设置多项则用逗号分隔。注,子表必须已经存在,其中子表命名规则为:【表名_数字】,范围为【0,子表数量-1】,即百表为table_name_0 table_name_1 ... table_name_99。

<span "="">〇 测试:
<span "="">
为了方便看到请求是否读写分离,可以先在master & slave两个实例上打开general_log,并放入表中:

  1. SET GLOBAL log_output='TABLE';
  2. SET GLOBAL general_log=on;

master上创建一张测试表:

  1. master> CREATE TABLE test.a(id int);
  2. Query OK, 0 rows affected (0.03 sec)

然后再到客户端(192.168.1.192)尝试对Atlas(192.168.1.187)发起增删改查请求:

此处写了一个php脚本来模拟请求:

  1. <?php
  2. $con = mysql_connect("192.168.1.187","dev","dev");
  3. if (!$con){
  4.   die('connect error: ' . mysql_error());
  5.   }
  6. mysql_select_db("my_db", $con);
  7. mysql_query("INSERT INTO test.a SELECT 1;");
  8. mysql_query("UPDATE test.a SET id=222 WHERE id=1;");
  9. mysql_query("DELETE FROM test.a WHERE id=222;");
  10. mysql_query("INSERT INTO test.a SELECT 123456;");
  11. mysql_query("SELECT count(1) FROM test.a;");
  12. mysql_close($con);
  13. ?>

此处可以通过 yum install -y php php-mysql 来安装一下php相关依赖。

执行这个php脚本后,可以分别检查一下master(192.168.1.185)和从库(192.168.1.186)的general log:

  1. master> SELECT user_host, argument
  2.     -> FROM mysql.general_log 
  3.     -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
  4. +-----------------------------+-------------------------------------+
  5. | user_host                   | argument                            |
  6. +-----------------------------+-------------------------------------+
  7. | dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 1         |
  8. | dev[dev] @ [192.168.1.187]   | UPDATE test.a SET id=222 WHERE id=|
  9. | dev[dev] @ [192.168.1.187]  | DELETE FROM test.a WHERE id=222     |
  10. | dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 123456    |
  11. +-----------------------------+-------------------------------------+
  12. 4 rows in set (0.00 sec)
  13. slave> SELECT user_host, argument
  14.    -> FROM mysql.general_log 
  15.    -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
  16. +-----------------------------+-----------------------------+
  17. | user_host                   | argument                    |
  18. +-----------------------------+-----------------------------+
  19. | dev[dev] @ [192.168.1.187 | SELECT count(1) FROM test.|
  20. +-----------------------------+-----------------------------+
  21. 1 rows in set (0.00 sec)

最后再检查一下跑完这个php脚本后的test.a表的数据,是否和预期的一致:

  1. slave> SELECT * FROM test.a;
  2. +--------+
  3. | id     |
  4. +--------+
  5. | 123456 |
  6. +--------+
  7. 1 row in set (0.00 sec)

当然,显然是与预期一致。
显然Atlas作为proxy,已经将写请求提交给master(192.168.1.185),将读请求提交给slave(192.168.1.186)。
对于客户端和开发人员,只需要获取一个Atlas的服务器地址、端口、用户名及密码便可使用读写分离。

Atlas也可以实现分表功能,此处可自行翻阅Atlas Home

mySql 数据库中间件 atlas的使用的更多相关文章

  1. 【MySQL】数据库中间件Atlas

    1.介绍 Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改 ...

  2. mysql数据库中间件研究

    随着互联网的发展,数据量的不断增大. 单台实例已经远远无法满足业务的需要. 对数据库分库分表的需求不断的增加随之而来的就是数据库中间件的开发. 一. 单台实例主要面临下面几个问题: 1.  数据量太大 ...

  3. 【Jmeter】压测mysql数据库中间件mycat

    背景 因为博主所负责测试的项目需要数据库有较大的吞吐量,在最近进行了升级,更新了一个数据库中间件 - - mycat.查询了一些资料,了解到这是阿里的一个开源项目,基于mysql,是针对磁盘的读与写, ...

  4. Mysql 数据库中间件

    读写分离:简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力.主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作.当主数据库 ...

  5. mysql分布式数据库中间件对比

    目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及使用场景也都有些心的.所以总结一个关于中间件比较的系列,希望可以对大家有帮助. 1. 什么是中间件 传统的架构模式就是 应用 ...

  6. mysql中间件 -> Atlas简介&安装

    Atlas简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上, ...

  7. 项目那几步走:先配置setting路径文件、创建数据库、执行数据库迁移命令、配置mysql数据库信息、注册app、注释中间件、pymysql替换mysqldb-配置urls路由-继续视图函数-然后HTML页面展示-HTML里面导入css文件、models配置数据库表、

    django使用mysql数据库: 首先cmd创建库 1.settings: """Django settings for day42 project. Generate ...

  8. 分布式数据库中间件TDDL、Amoeba、Cobar、MyCAT架构比较分

    比较了业界流行的MySQL分布式数据库中间件,关于每个产品的介绍,网上的资料比较多,本文只是对几款产品的架构进行比较,从中可以看出中间件发展和演进路线 框架比较 TDDL Amoeba Cobar M ...

  9. 转:阿里开源Mysql分布式中间件:Cobar

    原文来自于:http://hualong.iteye.com/blog/2102798 这几天研究了下Cobar, Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成 ...

随机推荐

  1. tinyproxy代理配置

    tinyproxy代理配置 应用场景: 生产机处于内网,无法直接访问外网,程序安装和漏洞修复等操作需要进行联网操作:通过在办公网(可访问外网)上设置代理服务器,生产机通过代理由办公网访问外网 代理服务 ...

  2. Hive中数据加载失败:root:supergroup:drwxr-xr-x

    Hive中数据加载失败:inode=:root:supergroup:drwxr-xr-x 在执行hive,数据加载的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,背后原理也 ...

  3. python 全栈开发笔记 1

    将自己的姓名用进制表示出来 #自己姓名的进制表示 name=input('请输入你的名字:') for i in name: print(i) # python 3 中是按字符进行循环的 bytes_ ...

  4. 从0到1用eclipse用maven搭建web项目

    1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ...

  5. Openresty 进行限流的方法

    1.使用Openresty进行限流, 使用漏桶原理进行设计 和路由系统设计类似. LUA脚本去通过变量去redis取值,从redis中得到队列的大小.漏和桶的大小. 然后通过比较,队列大小与漏和桶进行 ...

  6. springboot整合mybatics PLUS

    首先添加maven依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactI ...

  7. Flutter 开发小技巧

    1.命令行运行flutter run之后iOS报错:Could not install build/ios/iphones/Runner.app on XXXXX. try lunching Xcod ...

  8. scrapy安装问题记录

    ubuntu小白一枚,由于对于ubuntu的不了解所以导致有的问题解决不了只能白痴的重装一遍. 总结一下问题: 1.pip安装自带scrapy版本过低官方不提供维护,卸载不完全导致重装最新版不成功 # ...

  9. Struts2 前台显示问题

    遇到的问题: 查询字段相同值的和的时候用到了sum函数,导致和实体类的不一样,无法取到. 开始的时候的代码. ; 这样的话SUM(o_count)无法显示. 我想把SUM(o_count)设置为实体类 ...

  10. 页面商城总结(一)——HTML部分

    学习编程,与君共勉. 在做过一些页面并且参考了许多商城页面后,对代码的书写和风格也有所体会,再次将我的经验分享给大家,希望大家也能够写出整洁有效的代码.本文主要是针对排版的问题进行总结,代码量较少,希 ...