首页 > 数据库 > MySQL > 正文

MySQL 中间件Atlas 实现读写分离

2024-07-24 12:31:23
字体:
来源:转载
供稿:网友
       Atlas是Qihoo360开发的一个中间件,位于Client和MySQL Server中间层,可以作为读写分离,分库分表中间件。
      对于MySQL Server而言,Atlas像是个Client,而对于Client而言,Atlas则是一个DB server。
 
      实验结构
 
      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;
 
从库上可以设置:
SET GLOBAL log_output='TABLE';
SET GLOBAL general_log=on;
 
master上创建一张测试表:
master> CREATE TABLE test.a(id int);
Query OK, 0 rows affected (0.03 sec)
 
然后再到客户端(192.168.1.192)尝试对Atlas(192.168.1.187)发起增删改查请求:
 
此处写了一个php脚本来模拟请求:
<?php
$con = mysql_connect("192.168.1.187","dev","dev");
if (!$con){
  die('connect error: ' . mysql_error());
  }
 
mysql_select_db("my_db", $con);
 
mysql_query("INSERT INTO test.a SELECT 1;");
mysql_query("UPDATE test.a SET id=222 WHERE id=1;");
mysql_query("DELETE FROM test.a WHERE id=222;");
mysql_query("INSERT INTO test.a SELECT 123456;");
mysql_query("SELECT count(1) FROM test.a;");
 
mysql_close($con);
?>
 
此处可以通过 yum install -y php php-mysql 来安装一下php相关依赖。
 
执行这个php脚本后,可以分别检查一下master(192.168.1.185)和从库(192.168.1.186)的general log:
master> SELECT user_host, argument
    -> FROM mysql.general_log
    -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
+-----------------------------+-------------------------------------+
| user_host                   | argument                            |
+-----------------------------+-------------------------------------+
| dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 1         |
| dev[dev] @ [192.168.1.187]   | UPDATE test.a SET id=222 WHERE id=1 |
| dev[dev] @ [192.168.1.187]  | DELETE FROM test.a WHERE id=222     |
| dev[dev] @ [192.168.1.187]  | INSERT INTO test.a SELECT 123456    |
+-----------------------------+-------------------------------------+
4 rows in set (0.00 sec)
 
slave> SELECT user_host, argument
   -> FROM mysql.general_log
   -> WHERE user_host='dev[dev] @ [192.168.1.187]' ;
+-----------------------------+-----------------------------+
| user_host                   | argument                    |
+-----------------------------+-----------------------------+
| dev[dev] @ [192.168.1.187]  | SELECT count(1) FROM test.a |
+-----------------------------+-----------------------------+
1 rows in set (0.00 sec)
 
最后再检查一下跑完这个php脚本后的test.a表的数据,是否和预期的一致:
slave> SELECT * FROM test.a;
+--------+
| id     |
+--------+
| 123456 |
+--------+
1 row in set (0.00 sec)
 
 
当然,显然是与预期一致。
显然Atlas作为proxy,已经将写请求提交给master(192.168.1.185),将读请求提交给slave(192.168.1.186)。
对于客户端和开发人员,只需要获取一个Atlas的服务器地址、端口、用户名及密码便可使用读写分离。
 
Atlas也可以实现分表功能,此处可自行翻阅Atlas Home。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表