写在前面的话

前面做了 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 '';

如图:

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

MySQL for OPS 09:MHA + Atlas 实现读写分离高可用的更多相关文章

  1. MHA+ProxySQL实现读写分离高可用

    最近在研究ProxySQL,觉得还挺不错的,所以就简单的折腾了一下,ProxySQL目前也是Percona在推荐的一个读写分离的中间件.关于详细的介绍可以参考官方文档.https://github.c ...

  2. MHA+atlas(数据库的高可用与读写分离)

    学习完了mycat的高可用还是复习一下MHA+atlas吧,个人感觉还是比mycat好用,毕竟MHA有数据补全和切换主从的机制 1 MHA是什么? MHA(Master High Availabili ...

  3. Atlas读写分离[高可用]

    Atlas下载地址: https://github.com/Qihoo360/Atlas/releases Atlas是出于360的, 比mysql-proxy更稳定, 部署起来更方便. 环境: pr ...

  4. MHA+ProxySQL 读写分离高可用

    文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...

  5. mysql读写分离[高可用]

    顾名思义, 在mysql负载均衡中有多种方式, 本人愚钝,只了解驱动中间件和mysql_proxy两种方式, 对于驱动,利用的是ReplicationDriver,具体请看远哥的这篇文章: MySQL ...

  6. MySQL读写分离高可用集群及读操作负载均衡(Centos7)

    目录 概述 keepalived和heartbeat对比 一.环境 二.部署 部署lvs代理和keepalived MySQL+heartbeat+drbd的部署 MySQL主从复制 web服务器及a ...

  7. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡

    目录 一.MHA+ProxySQL架构 二.快速搭建MHA环境 2.1 下载MHA镜像 2.2 编辑yml文件,创建MHA相关容器 2.3 安装docker-compose软件(若已安装,可忽略) 2 ...

  8. 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想

    目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...

  9. 如何利用MHA+ProxySQL实现读写分离和负载均衡

    摘要:本文分享一下"MHA+中间件ProxySQL"如何来实现读写分离+负载均衡的相关知识. 本文分享自华为云社区<MySQL高可用架构MHA+ProxySQL实现读写分离和 ...

随机推荐

  1. spring-db-事务

    --都是之前各位大佬总结好的,我只是肤浅的汇总一下,结合我犯得错误,适合像我一样的萌新看 第一:@Transcation 引入的注解 package org.springframework.trans ...

  2. leetcode-二叉树

    树以及常用的算法 树的概念 树(Tree)的基本概念树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构.没有结点的树称为空(null或empty)树.一棵非空的树包括一个根结点 ...

  3. Python time.time()方法

    描述 Python time time()返回当前时间的时间戳. 时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(背景时间1970年01月01日08时00分00秒)起至现在的总 ...

  4. 浅谈Httpmodules

    HttpModule是ASP.NET过滤器,可以理解为HTTP请求的必经之地我们只要实现IHttpModule接口,就可以取代HttpModule namespace BookShop.Handler ...

  5. Java题库——Chapter2 基础程序设计

    1)Suppose a Scanner object is created as follows: Scanner input = new Scanner(System.in); What metho ...

  6. 雪崩利器 hystrix-go 源码分析

    阅读源码的过程,就像是在像武侠小说里阅读武功秘籍一样,分析高手的一招一式,提炼出精髓,来增强自己的内力. 之前的帖子说了一下微服务的雪崩效应和常见的解决方案,太水,没有上代码怎么叫解决方案.githu ...

  7. 代码这样写更优雅,15篇 Python 技术热文

    http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565527&idx=1&sn=840c1ce854afc29 ...

  8. Implement Property Value Validation in Code 在代码中实现属性值验证(XPO)

    This lesson explains how to set rules for business classes and their properties. These rules are val ...

  9. python 部署lvs

    import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ...

  10. java 读取 excel 表格内容

    一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...