Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql 用中间件atlas进行读写分离(学习笔记十四)

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

作者头像
用户5760343
发布于 2022-05-23 10:00:07
发布于 2022-05-23 10:00:07
8550
举报
文章被收录于专栏:sktjsktj

〇 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

# 日志存放的路径,日志名为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 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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL主从+Atlas 实现读写分离
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。
全栈程序员站长
2021/06/10
9000
MySQL主从+Atlas 实现读写分离
Mysql中间件——Atlas
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。
aox.lei
2018/08/30
1.3K0
Atlas中间件实现Mysql读写分离[通俗易懂]
Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。
全栈程序员站长
2022/08/31
8290
Mysql之读写分离架构-Atlas
​ Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。 它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性; ​ 360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条;
iginkgo18
2021/04/25
1.2K0
Mysql之读写分离架构-Atlas
Atlas实现MySQL主从分离
Atlas源代码用C语言编写,它对于Web Server相当于是DB,相对于DB相当于是Client,如果把Atlas的逻辑放到Web Server程序里去处理,这样会大大增加Web Server程序的复杂度,同时Web Server和DB之间的耦合度也相当高,因为只要DB增加/减少服务,Web Server就有可能要发生代码改变,若代码不改变,就得通过中间关系表与心跳机制来维护Server之间的关系,这样会带来性能的损耗,而Atlas是架设在Web Server与DB之间的一个中间件,Web Server与DB之间的耦合关系放到了Atlas来处理,既做到了灵活也保留了性能,这也是Atlas存在的价值。
星哥玩云
2022/08/17
7070
Atlas实现MySQL主从分离
mysql读写分离(使用Atlas实现)
  mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,等,但其不支持大数据量的分库分表且性能较差。下面介绍几款能代替其的mysql开源中间件产品:Atlas,tddl,Mycat。   mysql中间件研究原文:Mysql中间件研究(Atlas,cobar,TDDL)
全栈程序员站长
2022/08/31
3010
MHA高可用架构与Atlas读写分离
  MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在10~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
惨绿少年
2019/05/24
1.3K0
MySQL工具Atlas的安装使用
Atlas是由Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性 360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条 下载地址 :https://github.com/Qihoo360/Atlas/releases
仙人技术
2021/08/31
7980
Mysql代理中间件Atlas安装和配置
前提得配置好主从参考:http://www.cnblogs.com/super-d2/p/4802990.html
BUG弄潮儿
2022/06/30
3890
使用mysql-proxy配置mysql读写分离
简介 对于很多大型网站(pv值百万、千万)来说,在所处理的业务中,其中有70%的业务是查询(select)相关的业务操作(新闻网站,插入一条新闻。查询操作),剩下的则是写(insert、update、delete,只要能对MySQL的数据造成更改的操作都叫写操作)操作。在使用负载均衡集群之后,可以很大程度的提升网站的整体性能,但是最终的数据处理的压力还是会落到MySQL数据库上,所有很有必要使用一些技术来提升MySQL的负载能力。(读写分离) 写操作专门交给写服务器处理(一般网站来说写是比较少的 读写比 4
老七Linux
2018/05/09
1.6K0
Altas mysql-proxy读写分离中间件
Atlas下载地址: https://github.com/Qihoo360/Atlas/releases
用户5760343
2022/05/14
3460
Altas  mysql-proxy读写分离中间件
『互联网架构』软件架构-mysql主从(二)
PS:其实很多公司都是通过代理的方式来管理主从数据库的。它可以有选择控制从哪个数据库走。感觉挺爽的,102走的是insert,103走的是select。
IT架构圈
2019/03/04
7810
『互联网架构』软件架构-mysql主从(二)
mysql 读写分离altas
1、altas2.2.1,只能安装在64位系统上 2、1台管理机,2台DB,1主1从。配置主从同步 3、主从配置管理机登录账号 GRANT ALL ON . TO 'altas'@'x.x.x.x' IDENTIFIED BY 'x';   flush privileges; 4、管理机安装altas rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 5、给连接的主从数据库密码加密并记录 cd /usr/local/mysql-proxy/bin ./encrypt altas 6、配置altas cd /usr/local/mysql-proxy/conf vi test.conf
用户5760343
2019/11/12
1.2K0
MySQL主从复制+读写分离原理及配置实例
MySQL的主从复制和MySQL的读写分离两者不分家,基于主从复制的架构才可实现数据的读写分离。
小手冰凉
2019/10/12
7410
MySQL主从复制+读写分离原理及配置实例
mysql一主多从 读写分离_MySQL主从复制原理
  在企业应用中,成熟的业务通常数据量都比较大。单台 mysql 在安全性、高可用性和高并发方面都无法满足实际的需求,实际生产环境中经常会配置多台主从数据库服务器以实现读写分离。
全栈程序员站长
2022/09/22
1.7K0
mysql一主多从 读写分离_MySQL主从复制原理
MYSQL数据库读写分离实例
描述:在做PHP读写分离前需要拿到运维部门给好的读写数据库的连接地址,提前定义好数据库的操作类程序,然后编写开发文档让所有的开发同时都统一调用这个类来执行SQL语句;
全栈工程师修炼指南
2022/09/28
5.4K0
MYSQL数据库读写分离实例
数据库中间件Atlas调研笔记
前篇: 《假如让你来设计数据库中间件》 《数据库中间件TDDL调研笔记》 《数据库中间件cobar调研笔记》 《数据库中间件mysql-proxy调研笔记》 13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。 一、Atlas是什么 奇虎360的一个mysql数据库中间层项目 在mysql官方推出的mysql-proxy0.8.2的基础上改的 基于服务端的中间件 画外音:数据库中间件有基于服务端的,也有基于客户端的,TDDL属于后者;而cobar和Atlas是一个中间层服务,属于前者。 二
架构师之路
2018/03/02
1.7K0
MySQL 读写分离
一 什么是读写分离 MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库
李海彬
2018/03/27
5.7K0
MySQL 读写分离
Mysql 实现数据库读写分离
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
误入歧途
2024/05/08
3270
Mysql 实现数据库读写分离
第十一章· MHA高可用及读写分离
松信嘉範: MySQL/Linux专家 2001年索尼公司入职 2001年开始使用oracle 2004年开始使用MySQL 2006年9月-2010年8月MySQL从事顾问 2010年-2012年 DeNA 2012年~至今 Facebook
DriverZeng
2022/09/26
5860
第十一章· MHA高可用及读写分离
相关推荐
MySQL主从+Atlas 实现读写分离
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档