• atlas读写分离


    Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。

    主要功能:
    1.读写分离
    2.从库负载均衡
    3.IP过滤
    4.自动分表
    5.DBA可平滑上下线DB
    6.自动摘除宕机的DB

    Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池

    Atlas相对于官方MySQL-Proxy的优势
    1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口
    2.重写网络模型、线程模型
    3.实现了真正意义上的连接池
    4.优化了锁机制,性能提高数十倍

    Atlas配置

    下载Atlas会有两个版本,其中有个分表的版本,但是这个需要其他的依赖,我这边不需要分表这种需求,所以安装普通的版本

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

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

    [root@localhost mysql-proxy]# ll
    total 16
    drwxr-xr-x 2 root root 4096 May 10  2017 bin
    drwxr-xr-x 2 root root 4096 Mar 11 10:05 conf
    drwxr-xr-x 3 root root 4096 May 10  2017 lib
    drwxr-xr-x 2 root root 4096 Mar 11 09:10 log
    

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

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

    2. “mysql-proxy”是MySQL自己的读写分离代理

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

    conf目录下放的是配置文件

    1.test.cnf

    [mysql-proxy]
    (必备,根据实际情况配置)管理接口的用户名
    • admin-username = user
    (必备,根据实际情况配置)管理接口的密码
    • admin-password = pwd
    (必备,根据实际情况配置)主库的IP和端口
    • proxy-backend-addresses = 192.168.0.12:3306
    (非必备,根据实际情况配置)从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔。如果想让主库也能分担读请求的话,只需要将主库信息加入到下面的配
    置项中。
    • proxy-read-only-backend-addresses = 192.168.0.13:3306@2,192.168.0.14:3306
    (必备,根据实际情况配置)用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,用户名与密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码(用户名和密
    码在主从数据库上要一致)。比如用户名为myuser,密码为mypwd,执行./encrypt mypwd结果为HJBoxfRsjeI=。如果有多个用户用逗号分隔即可。则设置如下行所示:
    • pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
    (必备,默认值即可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
    • daemon = true
    (必备,默认值即可)设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发
    调试时设为false,线上运行时设为true
    • keepalive = true
    (必备,根据实际情况配置)工作线程数,推荐设置成系统的CPU核数的2至4倍
    • event-threads = 4
    (必备)日志级别,分为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-logslow(单位:ms)的日志记录。不设置该参数则输出全部日志。
    • sql-log-slow = 10
    (可选项,可不设置)关闭不活跃的客户端连接设置。当设置了该参数时,Atlas会主动关闭经过'wait-timeout'时间后一直未活跃的连接。单位:秒
    wait-timeout = 10
    (必备,默认值即可)Atlas监听的工作接口IP和端口
    proxy-address = 0.0.0.0:1234
    (必备,默认值即可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345
    
    (可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1
    charset = utf8
    (可选项,可不设置)允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
    client-ips = 127.0.0.1, 192.168.1
    

      

      

    lib目录下放的是一些包,以及Atlas的依赖

    log目录下放的是日志,如报错等错误信息的记录

    运行Atlas
    进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或停止Atlas。
    (1). sudo ./mysql-proxyd test start,启动Atlas。
    (2). sudo ./mysql-proxyd test restart,重启Atlas。
    (3). sudo ./mysql-proxyd test stop,停止Atlas

    执行命令:mysql -h127.0.0.1 -P1234 -u用户名 -p密码,如果能连上则证明Atlas初步测试正常,可以再尝试发几条SQL语句看看执行结果是否正确

    查看主库和从库的状态使用1234端口登录mysql,

    /home/mysql/mysql_5636/bin/mysql -uuser -ppassword -P1234 -hlocalhost

    主库和从库的state 均为 ”up” 即为正常

    #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    proxy-backend-addresses = 192.168.237.128:3308
    #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
    proxy-read-only-backend-addresses = 192.168.237.130:3308@1

    测试主从分离

    • 关闭主备库复制关系,在【主库】上执行
    mysql> select * from temp2;
    +----+------+
    | id | name |
    +----+------+
    | 3 | c |
    | 1 | a |
    • 在【从库】上查看select * from temp2结果
    mysql> select * from temp2;
    +----+------+
    | id | name |
    +----+------+
    | 2 | b |

    • 在Atlas所在服务器上查询
    Select * from temp2;
    +----+------+
    | id | name |
    +----+------+
    | 2 | b |
    • 在Atlas所在服务器上执行插入语句
    Insert into temp2 values(10,’abc’);
    • 在Atlas所在服务器上查询
    Select * from temp2;
    +----+------+
    | id | name |
    +----+------+
    | 2 | b |
    • 在MySQL主库上查询数据:
    mysql> select * from temp2;
    +----+------+
    | id | name |
    +----+------+
    | 10 | abc |
    | 3 | c |
    | 1 | a |

    • 当MySQL仅有的一个从库关闭的情况下,写操作成功,读操作也漂移到主库上执行

    有两个slave时

    • 当第一个从库崩溃时执行查询语句,语句都在第二个节点查询

  • 相关阅读:
    #include "stdafx.h" 错误?
    扩频技术
    求数组中只出现一次的数字(算法)
    1.3一摞烙饼的排序
    嵌套类
    企业级邮件服务软件推荐
    关于Linq To Sql中Detach方法和一个公共基类
    asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010
    一句代码解决IE8兼容问题(兼容性视图)
    asp.net(C#)套用模板操作Excel
  • 原文地址:https://www.cnblogs.com/zhs0/p/10559206.html
Copyright © 2020-2023  润新知