千家信息网

Atlas+mysql主主集群实现读写分离

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前言目前线上系统数据库采用的是主主架构。其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台),该结构很难支撑较大并发,另外双主中的另外一台机在非故障时没得到有效利用
千家信息网最后更新 2026年11月01日Atlas+mysql主主集群实现读写分离

前言

目前线上系统数据库采用的是主主架构。其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台),该结构很难支撑较大并发,另外双主中的另外一台机在非故障时没得到有效利用。 结合以上情况,拟采用数据库中间件提供读写分离功能(一主读写,一主读)。既可以提高读并发能力,又可以充分利用数据库服务器,后期可继续增加主主集群的从服务器扩充读并发性能。如下为具体架构图:

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

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

Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm


Ip及软件信息

IP

系统

软件版本

安装路径

备注

192.168.9.150

CentOS release 6.8 (Final)

Atlas-2.2.1.el6.x86_64.rpm

/usr/local/mysql-proxy

Atlas普通版 

192.168.9.175

CentOS release 6.8 (Final)

mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

/usr/local/mysql

主主集群

192.168.9.176

CentOS release 6.8 (Final)

mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

/usr/local/mysql

主主集群


MYSQL主主集群架设

基本原理:

对于一个mysql服务器, 一般有两个线程来负责复制和被复制。当开启复制之后。

1. Slave 上面的IO 线程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2. Master 接收到来自Slave 的IO 线程的请求后,通过负责复制的IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给Slave 端的IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master 端的Binary Log文件的名称以及在Binary Log 中的位置;

3. Slave 的IO 线程接收到信息后,将接收到的日志内容依次写入到Slave 端的Relay Log 文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master 端的binlog的文件名和位置记录到master-info 文件中,以便在下一次读取的时候能够清楚的高速Master"我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我"。

4. Slave 的SQL 线程检测到Relay Log 中新增加了内容后,会马上解析该Log 文件中的内容成为在Master 端真实执行时候的那些可执行的Query 语句,并在自身执行这些Query。这样,实际上就是在Master 端和Slave 端执行了同样的Query,所以两端的数据是完全一样的。

如图:

主主设置,既两台服务器互为主从的配置。

略(网上很多相关配置)

ATLAS数据库中间件安装

下载并安装ATLAS数据库中间件

cd /usr/local/src 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

安装好了,它会默认在"/usr/local/mysql-proxy"下给你生成4个文件夹,以及需要配置的文件,如下:

[root@localhost mysql-proxy]# lsbin  conf  lib  log

1.bin目录下放的都是可执行文件

2."encrypt"是用来生成MySQL密码加密的,在配置的时候会用到

3."mysql-proxy"是MySQL自己的读写分离代理

4."mysql-proxyd"是360弄出来的,后面有个"d",服务的启动、重启、停止。都是用他来执行的

编辑配置文件

cd /usr/local/mysql-proxy/conf/vim test.cnf[mysql-proxy] #带#号的为非必需的配置项目 #管理接口的用户名admin-username = user #管理接口的密码admin-password = pwd #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔。注意设置为主库仅支持写功能。若要读写要同时将该库在从库中进行设置。支持读功能。proxy-backend-addresses = 192.168.9.175:3306 #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔 。这里将主库的数据库再次配置到这里用以支持读。达到读负载均衡的目的。proxy-read-only-backend-addresses = 192.168.9.176:3306@1,192.168.9.175:3306@1 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!pwds = root:/iZxz+0GRoA= #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。daemon = true #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。keepalive = true #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置event-threads = 8 #日志级别,分为message、warning、critical、error、debug五个级别log-level = message #日志存放的路径log-path = /usr/local/mysql-proxy/log #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF#sql-log = OFF #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。#sql-log-slow = 10 #实例名称,用于同一台机器上多个Atlas实例间的区分#instance = test #Atlas监听的工作接口IP和端口proxy-address = 0.0.0.0:1234 #Atlas监听的管理接口IP和端口admin-address = 0.0.0.0:2345 #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项#tables = person.mt.id.3 #默认字符集,设置该项后客户端不再需要执行SET NAMES语句#charset = utf8 #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接#client-ips = 127.0.0.1, 192.168.1 #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置#lvs-ips = 192.168.1.1


编辑添加启动脚本

vim /etc/init.d/atlas#!/bin/sh##atlas:    Atlas Daemon## chkconfig:    - 90 25# description:  Atlas Daemon## Source function library.start(){        echo -n $"Starting atlas: "        /usr/local/mysql-proxy/bin/mysql-proxyd test start        echo }stop(){        echo -n $"Shutting down atlas: "        /usr/local/mysql-proxy/bin/mysql-proxyd test stop        echo}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)                stop                sleep 3                start                ;;        *)                echo $"Usage: $0 {start|stop|restart}"                exit 1esacexit 0

赋予启动脚本权限并添加开机启动

chmod -R 755 /etc/init.d/atlaschkconfig atlas on                                启动atlasservice atlas start

端口介绍

默认会开启两个端口1234和2345端口。(以上端口可以在配置文件中修改)

Atlas监听的工作接口IP和端口

proxy-address = 0.0.0.0:1234

Atlas监听的管理接口IP和端口

admin-address = 0.0.0.0:2345

访问管理后台并查看管理命令(注意用户名密码为缺省的,为了安全最好修改掉):

mysql -uuser -ppwd -P2345 -h 127.0.0.1mysql> 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                            |+----------------------------+---------------------------------------------------------+16 rows in set (0.00 sec)

访问工作端口

可使用NAVICAT客户端进行连接配置

读负载均衡验证(经验证会交替采用后端两台数据库服务器响应请求)

mysql> select @@hostname;+------------+| @@hostname |+------------+| db1        |+------------+1 row in setmysql> select @@hostname;+------------+| @@hostname |+------------+| db2        |+------------+1 row in set

读写分离验证

mysql> begin;select @@hostname;commit;Query OK, 0 rows affected +------------+| @@hostname |+------------+| db1        |+------------+1 row in set Query OK, 0 rows affected mysql> begin;select @@hostname;commit;Query OK, 0 rows affected +------------+| @@hostname |+------------+| db1        |+------------+1 row in set Query OK, 0 rows affected

压力测试

读写分离压力测试需要使用到Jmeter了,它是Java写第一套开源的压力测试工具,因为这个比较方便。他有专门测试MySQL的模块,需要使用MySQL的JDBC驱动jar包,配置很简单,东西很好很强大很好用。

Jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi

MySQL的JDBC :http://dev.mysql.com/downloads/connector/j/

下载下来后,分别都解压开来,打开Jmeter ( 在bin路面下的jmeter.bat ) ,在测试计划中,导入JDBC的jar包。具体步骤略



日志 文件 端口 配置 数据 线程 服务 信息 数据库 密码 接口 服务器 管理 位置 内容 端的 加密 测试 集群 代表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网黑科技 互联网是第几次科技革命的成果 科技金融是不是互联网金融 腾讯阿里互联网科技 杭州互联网科技公司 华中科技大学互联网 伴你行互联网科技有限公司 中盈科技互联网信息有限公司 岳阳华臻互联网科技有限公司 崇明区互联网教育科技售后服务 哈尔滨屹滨互联网科技有限公司 消费医药和互联网科技 银川新华互联网科技学校联系电话 天津腾达互联网科技有限公司 互联网科技的全部知识 世界互联网领先科技成果获奖 互联网金融科技公司的优势 黑云互联网科技有限公司 福州德业互联网科技 普陀区互联网教育科技管理办法 互联网是不是新科技 上海互联网科技有限公司 奇酷互联网科技 互联网科技视频素材 互联网校园科技培训 黑科技 体验场景 互联网大会 半导体是互联网高科技吗 宁波跨境商互联网科技有限公司 互联网科技博主张洲 上海旺乐尼互联网科技有限公司
0