第100讲:MHA+Atlas实现MySQL主从复制读写分离分布式集群

文章目录

    • 1.Atlas读写分离简介
    • 2.搭建MHA高可用MySQL主从复制集群
    • 3.部署配置Atlas读写分离中间件
      • 3.1.安装Atlas读写分离中间件
      • 3.2.配置读写分离
      • 3.3.启动Atlas读写分离
    • 4.读写分离集群测试
    • 5.生产环境中创建一个用户通过Atlas使用
    • 6.Atlas通过管理接口实现在线管理
    • 7.Atlas自动分表

1.Atlas读写分离简介

Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。

360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。

Atlas下载地址:https://github.com/Qihoo360/Atlas/releases

Atlas读写分离中间件的架构图:

业务平台直接连接Atlas中间件,由Atlas中间件连接Mysql主从复制集群,当有读取操作时,Atlas会将读取操作路由到从库进行处理,当有写入操作时,Atlas胡一江写入的操作路由到主库进行处理。

在这里插入图片描述

MHA+Atlas实现MySQL主从复制读写分离高可用分布式集群的规划。

IP主机名主从复制角色端口号组件
192.168.20.11mysql-1master3306mysql
192.168.20.12mysql-2slave3306mysql
192.168.20.13mysql-3slave3305mysql、mha、atlas
192.168.20.15MHA针对主库实现的漂移IP

2.搭建MHA高可用MySQL主从复制集群

略,查看前面的文章。

搭建MHA集群、VIP漂移、Binlog服务器、邮箱告警。

3.部署配置Atlas读写分离中间件

3.1.安装Atlas读写分离中间件

[root@mysql-3 ~]# ll Atlas-2.2.1.el6.x86_64.rpm 
-rw-r--r-- 1 root root 4963681 628 2019 Atlas-2.2.1.el6.x86_64.rpm[root@mysql-3 ~]# yum install -y Atlas*[root@mysql-3 ~]# ll /usr/local/mysql-proxy/
总用量 0
drwxr-xr-x 2 root root  75 79 22:18 bin
drwxr-xr-x 2 root root  22 79 22:18 conf
drwxr-xr-x 3 root root 331 79 22:18 lib
drwxr-xr-x 2 root root   6 1217 2014 log

3.2.配置读写分离

[root@mysql-3 ~]# cd /usr/local/mysql-proxy/conf/
[root@mysql-3 conf]# cp test.cnf test.cnf.bak[root@mysql-3 conf]# vim test.cnf
[mysql-proxy]
#管理接口的用户名和密码,非数据库用户名密码
admin-username = user					
admin-password = pwd#Atlas后端连接的MySQL主库地址,所有的写操作会路由到这个数据库中,这里我们配置MHA的漂移地址,即使主库故障,从库切换后也不会应读写分离
proxy-backend-addresses = 192.168.20.15:3306#Atlas后端连接的Mysql从库地址,所有的读操作会路由到这个数据库中,多个地址以逗号分隔
proxy-read-only-backend-addresses = 192.168.20.12:3306,192.168.20.13:3306#通过Atlas连接数据库的账号,也就是允许Atlas使用数据库中的那些账号登陆主从复制集群。
#将复制用户和mha用户都写进去,密码通过Atlas/bin/encrypt工具加密即可
pwds = repl:/iZxz+0GRoA=,mha:/iZxz+0GRoA=#后台运行
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker
keepalive = true
#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关,打开后所有被Atlas处理的SQL都会记录下来
sql-log=ON#Atlas监听端口,程序等都是通过这个地址连接Atlas实现读写分离的
proxy-address = 0.0.0.0:33060#Atlas监听的管理接口的端口
admin-address = 0.0.0.0:2345
charset=utf8

3.3.启动Atlas读写分离

启动Atlas时,需要指定配置文件名称的前缀。例如test.cnf就写test。

[root@mysql-3 conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started[root@mysql-3 conf]# ps aux | grep mysql-proxy
root     23274  0.0  0.0  65832  5192 ?        S    22:37   0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
root     23275  0.0  0.3 170392 27108 ?        Sl   22:37   0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf

4.读写分离集群测试

配置完读写分离集群后,要通过Atlas的33060端口进行连接,否则是没有读写分离效果的。

1)测试读操作

[root@mysql-3 ~]# mysql -umha -p123456 -h 192.168.20.13 -P 33060
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           3 |
+-------------+
1 row in set (0.01 sec)

可以看到第一次读返回的server_id是2,server_id=2也就是192.168.20.12这台从库,第二次读返回的server_id是3,也就是192.168.20.13这台从库,读操作都落在了从库上。

2)测试写操作

开启一个事务,就可以模拟出写的操作。

mysql> begin;
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
mysql> commit;

可以看到写操作返回的是server_id=1,server_id=1是192.168.20.11这台主库,读写分离成功。

5.生产环境中创建一个用户通过Atlas使用

需求:开发人员申请一个用户,用于操作预发布的数据库,需要拥有增改查的权限,并且开发人员不知道后端主从架构的数据库地址,只知道Atlas读写分离中间件的地址,这个用户需要通过Atlas中间件使用数据库。

1)在主库中创建一个用户

只需要在主库创建即可,会同步到从库上。

mysql> grant select,update,insert on *.* to ceshi@'192.168.20.%' identified by 'ceshi@123';

2)在Atlas中配置上新建的用户

首先要对ceshi这个用户的密码使用encrypt进行加密,否则是无法填写在Atlas配置文件中。

[root@mysql-3 ~]# /usr/local/mysql-proxy/bin/encrypt ceshi@123
03pnSSwackWTZ6zxvGQr9A==

然后将测试这个用户添加到Atlas配置文件中,否则是不能使用这个用户通过Atlas访问数据库。

[root@mysql-3 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
pwds = repl:/iZxz+0GRoA=,mha:/iZxz+0GRoA=,ceshi:03pnSSwackWTZ6zxvGQr9A==

重启Atlas一定要进入到conf目录。

[root@mysql-3 ~]# cd /usr/local/mysql-proxy/conf/
[root@mysql-3 conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started

3)测试登陆

[root@mysql-3 conf]# mysql -uceshi -pceshi@123 -h 192.168.20.13 -P 33060
mysql> 

6.Atlas通过管理接口实现在线管理

通过管理接口,无需再重启Atlas,就可以实现配置的更新

1)登陆管理接口

登陆管理接口的账号面是Atlas配置文件中最顶部指定的user账号。

[root@mysql-3 ~]# mysql -uuser -ppwd -h 192.168.20.13 -P 2345
mysql> 

2)查看命令帮助

可以查看命令帮助,看看在管理接口能执行什么动作

mysql> 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                            |
+----------------------------+---------------------------------------------------------+

3)查看后端所有节点

mysql> select * from backends;
+-------------+--------------------+-------+------+
| backend_ndx | address            | state | type |
+-------------+--------------------+-------+------+
|           1 | 192.168.20.15:3306 | up    | rw   |
|           2 | 192.168.20.12:3306 | up    | ro   |
|           3 | 192.168.20.13:3306 | up    | ro   |
+-------------+--------------------+-------+------+

4)动态添加节点

mysql> remove backend 3;

5)动态删除节点

mysql> add slave 192.168.20.16:3306;

6)添加用户

mysql> add pwd hah:3yb5jEku5h4=;

7)删除用户

mysql> remove pwd hah:3yb5jEku5h4=;

8)保存配置到配置文件

mysql> save config;

7.Atlas自动分表

使用Atlas的分表功能时,首先需要在配置文件test.cnf设置tables参数。
tables参数设置格式:数据库名.表名.分表字段.子表数量,
比如:你的数据库名叫school,表名叫stu,分表字段叫id,总共分为2张表,那么就写为school.stu.id.2,如果还有其他的分表,以逗号分隔即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/260989.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下解压tar.xz文件的命令

tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 ------------------------------------------ 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的…

【 Maven 】花式玩法之多模块项目

目录 一、认识Maven多模块项目 二、maven如何定义项目的发布策略 2.1 版本管理 2.2 构建配置 2.3 部署和发布 2.4 依赖管理 2.5 发布流程 三、使用Jenkins持续集成Maven项目 四、总结 如果你有一个多模块项目,并且想将这些模块发布到不同的仓库或目标位置&…

拿捏c语言指针(下)

前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针(上)和 拿捏c语言指针(中) ​​​​​​没有看的小伙伴要抓紧喽~ 欢迎关注​​个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误&#x…

Cache-M语言 通用工具类

链接:M语言通用工具类

MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案

项目场景 有时候,遇到数据库重复数据,需要将数据进行分组,并取出其中一条来展示,这时就需要用到group by语句。 但是,如果mysql是高版本,当执行group by时,select的字段不属于group by的字段的…

设计模式——观察者模式

定义: 定义一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 作用: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通…

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层: 连接层:负责跟客户…

今日必读的9篇大模型论文

1.来自普林斯顿大学的研究团队及其合作者提出了 TutorEval 和 TutorChat。TutorEval 是首个结合了长上下文、自由形式生成和跨学科科学知识的基准,它有助于衡量 LMs 作为科学助手在现实生活中的可用性。TutorChat 是一个包含 80000 篇关于教科书的长篇合成对话的数据…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis?Hibernate 和 MyBatis的区别?Mybatis的下载和使用Mybatis的工作原理 作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中,insert的语法和mysql等数据库的语法类似,并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种: insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…

2024-02-21(Spark)

1.Spark程序中的相关端口 4040:是一个运行的Application在运行的过程中临时绑定的端口,用以查看当前任务的状态。4040被占用会顺延到4041,4042等。4040是一个临时端口,当前程序运行完成后,4040就会被注销。 4040和Dr…

防火墙——计算机网络

前述基于密码的安全机制不能有效解决以下安全问题: 用户入侵: 利用系统漏洞进行未授权登录; 授权用户非法获取更高级别权限等。 软件入侵: 通过网络传播病毒、蠕虫和特洛伊木马。 拒绝服务攻击等。 解决方法: 防火墙&a…

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023 摘要关键词 1 资料和方法1. 1 研究区域与观测数据1. 2 机器学习模型构建与验证方法1. 3 SHAP 可解释性方法 2 主要结果2. 1 不同模型的模拟性能和泛化能力2. 2 不同模型的可解释性分析2. 3 5 km 分辨率格点蒸散发…

Linux内核解读

来自鹅厂架构师 作者:aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构,用户态运行在ring3,内核态运行在ring0,两个特权等级。 (1)内核、一些特权指令,例…

强化学习(GPS)

GPS——Guided Policy Search引导策略搜索 GPS目前被作为基础算法广泛应用于各种强化学习任务中,其出发点在于纯粹的策略梯度方法在更新参数时不会用到环境模型因而属于一种无模型强化学习算法。由于没有利用任何环境的内在属性,使得其训练只能完全依靠…

【开源】在线办公系统 JAVA+Vue.js+SpringBoot+MySQL

目录 1 功能模块1.1 员工管理模块1.2 邮件管理模块1.3 人事档案模块1.4 公告管理模块 2 系统展示3 核心代码3.1 查询用户3.2 导入用户3.3 新增公告 4 免责声明 本文项目编号: T 001 。 \color{red}{本文项目编号:T001。} 本文项目编号:T001。…

Docker Compose映射卷的作用是什么,dockerfile这个文件有什么区别和联系?

Docker Compose中映射卷(Volumes)的作用和Dockerfile之间既有区别也有联系。下面详细解释两者的作用、区别和联系: Docker Compose映射卷的作用 在Docker Compose中,卷(Volumes)用于数据持久化和数据共享…

沁恒CH32V30X学习笔记11---使用外部时钟模式2采集脉冲计数

使用外部时钟模式2采集脉冲计数 使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或下降沿计数。将 ECE 位置位时,将使用外部时钟源模式 2。使用外部时钟源模式 2 时,ETRF 被选定为 CK_PSC。ETR 引脚经过可选的反相器(ETP),分频器(ETPS)后成为 ETRP,再经过滤波…

Excel练习:日历

Excel练习:日历 ‍ 题目:制作日历 ‍ ​​ 用rows和columns函数计算日期单元格偏移量 一个公式填充所有日期单元格 ​​ ‍

PyTorch使用Tricks:学习率衰减 !!

文章目录 前言 1、指数衰减 2、固定步长衰减 3、多步长衰减 4、余弦退火衰减 5、自适应学习率衰减 6、自定义函数实现学习率调整:不同层不同的学习率 前言 在训练神经网络时,如果学习率过大,优化算法可能会在最优解附近震荡而无法收敛&#x…