Mysql 用中间件atlas进行读写分离(学习笔记十四)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 〇 Atlas架构介绍Atlas是Qihoo360开发的一个中间件,位于Client和MySQL Server中间层,可以作为读写分离,分库分表中间件。

〇 Atlas架构介绍

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

对于MySQL Server而言,Atlas像是个Client,而对于Client而言,Atlas则是一个DB server。

img_1963ea11fc36b844f5b3386fb4c6587b.jpe

〇 实验结构

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 read_only=1;

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

〇 Atlas部分:

Atlas开发者给出部分建议:

1、Atlas只能运行在64bit的发行版本上

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,再执行新的安装。

3、建议使用MySQL 5.6,此外,不宜小于MySQL 5.1

在proxy机上安装Atlas:

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

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配置文件内容可以参考这个:

[mysql-proxy]

# 基础设置

# 以守护进程方式启动 

daemon = true

# 设置atlas的运行方式,若为true,则表示多一个monitor,该进程会在woker进程挂掉后将其重启。若为false,则只有一个工作进程woker。

keepalive = true

# atlas实例名,便于区分一台机子上的不同atlas

instance = test

# 工作线程数,atlas开发人员推荐将其设置为CPU个数的2~4倍。

event-threads = 8

# SQL日志的开关,共有三个可选项:OFF、ON、REALTIME,分别为:不记录sql日志、记录sql日志,并等待缓冲区填满后,才会落地到磁盘、记录sql日志并实时写入磁盘。

sql-log = OFF

# 等同于客户端连接到mysql-server后输入SET names utf8;

charset = utf8

# 如果这样配置,可以通过mysql -h127.0.0.1 -P2345 -uadmin -padmin可以连接到Atlas管理界面

admin-username = admin

admin-password = admin

# 该参数设置Atlas后台管理地址和端口

admin-address = 192.168.1.187:2345

# 设置主库和从库的地址,其中主库为写库,从库为只读库

# 主库地址

proxy-backend-addresses = 192.168.1.185:3306

# 设置读库地址和端口

proxy-read-only-backend-addresses = 192.168.1.186:3306

# 若配置为主库也分担读请求,并且设置权重为 (主:从)=(1:3),则可以写作

#proxy-read-only-backend-addresses = 192.168.1.185:3306@1, 192.168.1.186:3306@3

# 设置Atlas工作监听的地址和端口,应用程序将连接到这个地址,既然客户端把Atlas当做一个mysql-server,故此处直接写成3306端口

proxy-address = 192.168.1.187:3306

# 设置用户的密码(这个密码为MySQL中dev用户通过Atlas加密程序加密后的密码),多个可以用逗号隔开

pwds = dev:A2OS3vFVUmY=

# 设置Atlas日志信息,其中log-level有message、warning、critical、error、debug五个级别

log-level = message

# 日志存放的路径,日志名为$instance_name.log,比如$log-path/test.log

log-path = /usr/local/mysql-proxy/log

# 设置允许连接Atlas的客户端ip,非必须,可以是多个,可以是精准ip也可以是ip段,比如:

#client-ips = 127.0.0.1, 192.168.1

# 挂接lvs的物理网卡ip,若有lvs结构,且设置了client-ips,则必须设置此项,反之可不设置。

#lvs-ips = 192.168.1.1 

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

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

其中test为配置文件中instance的值。

当然可以检查一下是否已经启动成功:

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

MySQL-Proxy of test is running (5176)

MySQL-Proxy of test is running (5177)

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

mysql -h192.168.1.187 -P2345 -uadmin -padmin

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

mysql> SELECT * FROM backends;

+-------------+--------------------+-------+------+

| backend_ndx | address | state | type |

+-------------+--------------------+-------+------+

| 1      | 192.168.1.185:3306 | up| rw|

| 2 | 192.168.1.186:3306 | up| ro|

+-------------+--------------------+-------+------+

2 rows in set (0.00 sec)

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

mysql> SELECT * FROM help;

+----------------------------+---------------------------------------------------------+

| command                    | description                                             |    

+----------------------------+---------------------------------------------------------+

| SELECT * FROM help         | shows this help                                         |

| SELECT * FROM backends    | lists the backends and their state                      |

| SET OFFLINE $backend_id   | offline backend server, $backend_id is backend_ndx's id |

| SET ONLINE $backend_id    | online backend server, ...                              |

| ADD MASTER $backend       | example: "add master 127.0.0.1:3306", ...               |

| ADD SLAVE $backend        | example: "add slave 127.0.0.1:3306", ...                |

| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |

| SELECT * FROM clients      | lists the clients                                       |

| ADD CLIENT $client        | example: "add client 192.168.1.2", ...                  |

| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |

| SELECT * FROM pwds        | lists the pwds                                          |

| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |

| ADD ENPWD $pwd            | example: "add enpwd user:encrypted_password", ...       |

| REMOVE PWD $pwd           | example: "remove pwd user", ...                         |

| SAVE CONFIG               | save the backends to config file                        |

| SELECT VERSION             | display the version of Atlas                            |

+----------------------------+---------------------------------------------------------+

其他参数:

sql-log-slow = 10 # 类似于mysql的long_query_time,如果设置了该选项,则日志只记录超过该值的日志记录,若没有添加这个参数选项,则表示全部记录,单位为ms 

wait-timeout = 10 # Atlas会关闭超过该时间之后一直未活跃的连接,单位s

tables = db_name.table_name.user_id.100 # 分表设置,其中格式为:【库名.表名.分表字段.子表数量】,若设置多项则用逗号分隔。注,子表必须已经存在,其中子表命名规则为:【表名_数字】,范围为【0,子表数量-1】,即百表为table_name_0 table_name_1 ... table_name_99。

〇 测试:

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

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=|

| 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.|

+-----------------------------+-----------------------------+

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。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
138 6
|
2月前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
149 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
72 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
2月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
75 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
69 1
|
3月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
4月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
60 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
4月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
170 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
4月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
40 6
|
4月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。