zoukankan      html  css  js  c++  java
  • MySQL for OPS 09:MHA + Atlas 实现读写分离高可用

    写在前面的话

    前面做了 MHA 高可用,但是存在这样一个问题,我们花了 4 台机器,但是最终被利用起来的也就一台,主库。这样硬件利用率才 25%,这意味着除非发生故障,不然其他几台机器都是摆设。明显的资源浪费。那么有没有一种办法把这些机器利用起来。有,那就是读写分离,主库写,主库读。分担业务压力。本节主要说明 Atlas 的读写分离实现。

    搭建 Atlas 读写分离架构

    首先查看下理想的架构图:

    当然,我们这里比较简单,只是单节点的 Atlas 的读写分离,在生产应用中,一个完整的架构还是需要一些这样的冗余。确保我们服务真正的高可用。

    关于 Atlas,是由 360 公司根据 MySQL Proxy 进行二次开发的一个中间件,不过目前已经几年没有在维护了。但是服务已经相对稳定,不用担心。

    下载地址:

    https://github.com/Qihoo360/Atlas/releases

    下载 CentOS 6 的即可:

    完成后上传到 MHA Manager 节点安装:

    rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

    安装完成后默认安装路径为:

    在 /usr/local/mysql-proxy/conf 目录下,默认带有 test.cnf 配置文件,里面有每个参数的详细说明。

    我们可以根据自己环境创建一个:

    1. 首先对我们需要使用 Atlas 做读写分离的用户的密码进行加密:

    /usr/local/mysql-proxy/bin/encrypt 123

    这样能得到加密的密码:

    我这里的密码都是 123,所以直接使用这个。所有要使用 Atlas 做读写分离的用户都必须在配置文件中声明。

    最终我们的配置如下 demo.cnf

    [mysql-proxy]
    admin-username = user
    admin-password = pwd
    # 这里使用 VIP,确保都能写
    proxy-backend-addresses = 192.168.100.120:3306
    # 配置从库的地址
    proxy-read-only-backend-addresses = 192.168.100.112:3306,192.168.100.113:3306
    # 需要使用 Atlas 做读写分离的用户
    pwds = repl:3yb5jEku5h4=,mha:3yb5jEku5h4=
    daemon = true
    keepalive = true
    event-threads = 8
    log-level = message
    log-path = /usr/local/mysql-proxy/log
    sql-log=ON
    # 最终连接 Atlas 的端口
    proxy-address = 0.0.0.0:33060
    admin-address = 0.0.0.0:2345
    charset=utf8

    2. 启动 Atlas:

    /usr/local/mysql-proxy/bin/mysql-proxyd demo start

    demo 就是我们配置文件的名字,这意味着我们可以定义多个配置文件,然后使用同一个 Atlas 管理多个集群。

    至此,Atlas 就配置完成!超级简单是不是!

    3. 测试 Atlas 读写分离效果:

    mysql -umha -p123 -h192.168.100.101 -P 33060

    在 MHA 节点上面直接连接就能登陆上数据库:

    此时查看 server_id,可以看到每一次请求都落在不同从库上面。

    测试写入,由于想要查看真实的 server_id,所以不能是 insert 这类,我们需要事务来模拟写入:

    begin; select @@server_id; commit;

    开启事务,数据库就会认为我们是写入操作:

    最终操作落在了主库上面,由此读写分离完成!

    管理 Atlas

    1. 此时如果业务需要新增一个用户,需要如何操作:

    a. 去主库建立用户:

    grant all on *.* to app@'%' identified by '123456';

    如图:

    b. 然后到 Atlas 机器上对密码进行加密:

    /usr/local/mysql-proxy/bin/encrypt 123456

    如图:

    c. 在 Atlas 配置文件中加入该用户并重启 Atlas:

    # 添加配置
    pwds = repl:3yb5jEku5h4=,mha:3yb5jEku5h4=,app:/iZxz+0GRoA=
    
    # 重启服务
    /usr/local/mysql-proxy/bin/mysql-proxyd demo restart

    如图:

    d. 验证用户登录:

    这样一个完整的过程才算添加完一个用户,相当麻烦不说,还需要重启 Atlas,对于生产环境肯定不是能够轻易接受的。

    其实 Atlas 给我们提供了管理接口,使用配置文件中定义的则可以登录:

    mysql -uuser -ppwd -h 192.168.100.101 -P 2345

    这就是文件中定义的 admin user 的作用:

    此时可以使用命令查看帮助:

    select * from help;

    如图:

    其中包含一系列管理命令,并包含了该目录的使用方法,可以看看常用的:

    1. 查看节点:

    select * from backends;

    如图:

    甚至可以看到库的权限。

    2. 我们可以在这里动态添加删除节点:

    remove backend 2;

    如图:

    此时就剩下两个节点了。查看配置文件:

    其实配置文件并未改变。我们可以让修改保存:

    save config;

    如图:

    再度查看配置文件:

    此时可以看到已经被剔除了,并且我们不需要重启 Atlas。

    当然也可以将剔除的节点再度加上:

    add slave 192.168.100.112:3306;

    如图:

    3. 用户管理:

    正如之前做的用户管理操作,特别麻烦,这里直接可以在管理接口添加,比如添加 root 用户:

    add pwd root:123;

    如图:

    查看配置:

    用户已经加上,并且还帮我们加密了,一下子就减少了很多麻烦。

    当然,如果你密码已经加密过了,只需要换个命令即可:

    ADD ENPWD $pwd 

    小结

    Atlas 的大致功能就到这里,从他的更新也可以看出慢慢被淘汰了,至于更新更好更复杂得需求。可以看看 Percona 的 ProxySQL,MaxScale,MySQL Router 等。

    https://github.com/sysown/proxysql/releases

  • 相关阅读:
    168. Excel Sheet Column Title
    171. Excel Sheet Column Number
    264. Ugly Number II java solutions
    152. Maximum Product Subarray java solutions
    309. Best Time to Buy and Sell Stock with Cooldown java solutions
    120. Triangle java solutions
    300. Longest Increasing Subsequence java solutions
    63. Unique Paths II java solutions
    221. Maximal Square java solutions
    279. Perfect Squares java solutions
  • 原文地址:https://www.cnblogs.com/Dy1an/p/11542316.html
Copyright © 2011-2022 走看看