Atlas读写分离

    科技2025-09-26  10

    在MHA高可用架构下继续进行Atlas读写分离

    搭建MHA高可用架构,参考https://blog.csdn.net/workey/article/details/108755672

    Atlas官方链接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

    Atlas下载链接: https://github.com/Qihoo360/Atlas/releases

    主要功能 读写分离、从库负载均衡、自动分表、IP过滤

    SQL语句黑白名单、DBA可平滑上下线DB、自动摘除宕机的DB

    Atlas相对于官方MySQL-Proxy的优势

    1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口

    2.重写网络模型、线程模型

    3.实现了真正意义上的连接池

    4.优化了锁机制,性能提高数十倍 

    Atlas是一个位于应用程序与MySQL之间的中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。也就是说前端应用填写Atlas的proxy-address信息,而Atlas的proxy-backend-addresses填写虚IP信息,APP只要能连中间件就行,中间件负责连数据库。

    下载安装atlas

    链接:https://pan.baidu.com/s/1WeTe2XY_153W8g1frQqmYA  提取码:1234 

    192.168.0.60 LAMP 192.168.0.70  主 192.168.0.80  从(mha备主) 192.168.0.90  从

    192.168.0.90 在从库上,安装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

    配置Atlas配置文件

    cd /usr/local/mysql-proxy/conf/

    /usr/local/mysql-proxy/bin/encrypt 123456                  #把123456这个密码进行加密。 /iZxz+0GRoA= 编辑配置文件 vim /usr/local/mysql-proxy/conf/test.cnf

    #(非必备,根据实际情况配置)从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔。如果想让主库也能分担读请求的话,只需要将主库信息加入到下面的配置项中,这里192.168.0.80当前是从库,但是当70主库宕机,80就为主库,那么80主库也会进行读请求。 proxy-read-only-backend-addresses = 192.168.0.80:3306@1,192.168.0.90:3306@2

    启动Atlas

    /usr/local/mysql-proxy/bin/mysql-proxyd test start   #启动 /usr/local/mysql-proxy/bin/mysql-proxyd test stop    #停止 /usr/local/mysql-proxy/bin/mysql-proxyd test restart #重启  

    vim /etc/init.d/atlasd chmod +x /etc/init.d/atlasd

    #!/bin/sh Demo=test start() { echo -n $"Starting atlas: " /usr/local/mysql-proxy/bin/mysql-proxyd $Demo start } stop() { echo -n $"Shutting down atlas: " /usr/local/mysql-proxy/bin/mysql-proxyd $Demo stop } status() { echo $"Atlas status: " /usr/local/mysql-proxy/bin/mysql-proxyd $Demo status } restart() { echo $"Atlas Restart Info: " /usr/local/mysql-proxy/bin/mysql-proxyd $Demo restart } ATLAS="/usr/local/mysql-proxy/bin/mysql-proxyd" [ -f $ATLAS ] || exit 1 # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0

    检查端口是否正常 netstat -lntup|grep mysql-proxy

    Atlas管理操作

    登入管理接口 mysql -uuser -ppwd -h192.168.0.90 -P2345 查看帮助信息 mysql> SELECT * FROM help; 查看后端的代理库 mysql> SELECT * FROM backends;

    平滑摘除mysql mysql> remove backend 2; 保存到配置文件中 mysql> SAVE CONFIG;

    将节点再添加回来 mysql> add slave 192.168.0.80:3306; 保存到配置文件中 mysql> SAVE CONFIG;

    连接数据库查看负载

    通过atlas登陆数据,注意,使用的是数据库上的用户及密码

    mysql -umha -p123456 -h192.168.0.90 -P1234

    第一次查询server_id mysql> show variables like "server_id"; 第二次查询server_id mysql> show variables like "server_id";

    通过上面可以看到负载均衡成功

    可以通过php程序来查看负载均衡

    cd /usr/local/apache/htdocs vim mysql.php  

    <?php $servername = "192.168.0.90";//这里填写Atlas中间件proxy-address的信息 $username = "mha"; $password = "123456"; $dbname = "ha"; $port = "1234"; // 创建连接 $conn = mysqli_connect($servername,$username,$password,$dbname,$port); // Check connection if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sql = "SELECT id, name FROM ha.test"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 输出数据 while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . "<br>"; } } else { echo "0 结果"; } $conn->close(); ?>

     

    70主库,80和90两台从库,都执行下面语句,开启所有操作都记录日志,然后监控日志 mysql -uroot -p123456 -e "set global general_log_file='/tmp/general.log'"      #修改普通日志位置 mysql -uroot -p123456 -e "set global general_log=1"  #开启所有操作都进行日志记录,很耗费性能。 tailf /tmp/general.log

    然后访问 http://192.168.0.60/mysql.php 刷新网页,观察监控日志

     

    可以发现,读写分离负载均衡实现,php程序连接Atlas中间件,Atlas连接数据库,并把php的读请求分发给了2个从数据库,centos-70主库没有进行读操作,select 1 as value是MHA高可用架构进行的监控,4次查询失败,就会让备主(centos-80)成为主。

    show variables like "%log_output%";

    show variables like "%general_log%";

    查看tmp/general.log的信息,可以大致看到哪些sql查询/更新/删除/插入比较频繁了。比如有些表不是经常变化的,查询量又很大,就完全可以cache;对主备延迟要求不高的表,读可以放到备库;

    测试一下高可用

     

    [root@centos-60 ~]# tailf /var/log/masterha/app1/manager.log

    [root@centos-70 ~]#systemctl stop mysqld     把centos-70主库停止服务

    可以看到70主库宕机,80备主成为了主库,同时php程序仍可以正常访问,刷新页面,90从库进行了读取,而当前80主库也进行了读取操作。

    vim /usr/local/apache/htdocs/mysql.php     修改php程序进行数据读取还有写操作

    <?php $servername = "192.168.0.90";//这里填写中间件proxy-address的信息 $username = "mha"; $password = "123456"; $dbname = "ha"; $port = "1234"; // 创建连接 $conn = mysqli_connect($servername,$username,$password,$dbname,$port); // Check connection if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sql = "SELECT id, name FROM ha.test"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 输出数据 while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . "<br>"; } } else { echo "0 结果"; } $sql = "INSERT INTO ha.test (id, name) VALUES (9, 'abc')"; if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>

    刷新几次php页面,并查看80和90日志

    会发现80主库会进行写操作,也会进行读操作,90从库会进行读操作 

    所有主机关闭日志记录 mysql -uroot -p123456 -e "set global general_log=0"  #关闭日志记录

    把70故障主机重新恢复到高可用集群中参考 https://blog.csdn.net/workey/article/details/108755672

    70恢复故障以后 要修改下面这个配置 vim /usr/local/mysql-proxy/conf/test.cnf proxy-read-only-backend-addresses = 192.168.0.70:3306@1,192.168.0.90:3306@2 然后重启 /usr/local/mysql-proxy/bin/mysql-proxyd test restart 进入运维管理 mysql -uuser -ppwd -h192.168.0.90 -P2345 select * from backends;   #查看到70变为了读取

    以下为不重启,添加用户,添加删除节点。不需要修改/usr/local/mysql-proxy/conf/test.cnf 配置文件。

    ADD PWD oldguo:123456;(不重启加上oldguo这个用户,先要在主库加上这个用户并授权,然后再atlas里执行这个ADD PWD这条命令) save config;(保存配置) 移除第二个节点 mysql> remove backend 2;

    节点再添加回来 mysql> add slave 192.168.0.70:3306;

    保存到配置文件中 mysql> SAVE CONFIG;

    Processed: 0.010, SQL: 8