温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL 中间件Atlas 实现读写分离

发布时间:2020-08-11 06:39:36 来源:ITPUB博客 阅读:264 作者:神谕丶 栏目:MySQL数据库
〇 Atlas架构介绍

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

MySQL 中间件Atlas 实现读写分离





〇 实验结构

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




〇 MySQL部分:
(主从建立步骤略)
主/从上建立具有增删改查账号:
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev';
  • FLUSH PRIVILEGES;

  • 从库上可以设置:
    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=1 |
    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.a |
    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。



    〇 参考文档:
    https://github.com/Qihoo360/Atlas/releases
    https://github.com/Qihoo360/Atlas/wiki

    作者微信公众号(持续更新)
    MySQL 中间件Atlas 实现读写分离




    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI