Mysql 用中间件atlas进行读写分离(学习笔记十四)
〇 Atlas架构介绍
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 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=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。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 应用发布后,负载(Load)分析及问题排查
响应时间用来衡量应用程序中的事务处理速度,它也可以从 HTTP 请求层和数据库层来观察。有些最慢的查询需要最优化解决,而响应时间可以缩小该查询的范围。吞吐量从另一个角度观察处理过程,并显示应用程序在给定时间域中处理多少请求,通常单位为每分钟(cpm)。 测量响应时间的方法之一就是使用像 New Relic 或者 AppDynamics(就是曾在以前的博客讨论的)那种 APM(应用性能监控工具),通过这些工具,可以追踪平均响应时间,并可以直接在主报告仪表板上与昨日或者上周的平均响应时间作比较,这些比较有助于查看新的部署如何对应用程序造成了影响。另一种方法是通过测量网页处理的百分位数,来测量 HTTP 请求完成响应所需的时间。 也可以内部监测响应时间,但是需要硬代码,例如通过 Dropwizard 指标发送数据并在 Graphite 上发布。尽管看来将这些数据和其他标准关联时会出现最有用的见解,但更多的见解仍涵盖在接下来的方法中。 要点1: 确保所使用的采集方法可以实现从不同角度观测数据,并开始进入百分位层面。 如果你还想使用自带的界面,则需要安装GnuPlot 4.2及以后版本,以及gd...
- 下一篇
使用交互式 shell 来增强你的 Python
Python 编程语言已经成为 IT 中使用的最流行的语言之一。成功的一个原因是它可以用来解决各种问题。从网站开发到数据科学、机器学习到任务自动化,Python 生态系统有丰富的框架和库。本文将介绍 Fedora 软件包集合中提供的一些有用的 Python shell 来简化开发。 Python Shell Python Shell 让你以交互模式使用解释器。这在测试代码或尝试新库时非常有用。在 Fedora 中,你可以通过在终端会话中输入 python3 来调用默认的 shell。虽然 Fedora 提供了一些更高级和增强的 shell。 IPython IPython 为 Python shell 提供了许多有用的增强功能。例如包括 tab 补全,对象内省,系统 shell 访问和命令历史检索。许多功能也被 Jupyter Notebook 使用,因为它底层使用 IPython。 安装和运行 IPython dnf install ipython3 ipython3 使用 tab 补全会提示你可能的选择。当你使用不熟悉的库时,此功能会派上用场。 如果你需要更多信息,输入 ? 命令来...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主