zoukankan      html  css  js  c++  java
  • 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时

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

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/zhs0/p/10559206.html
Copyright © 2011-2022 走看看