『Mysql集群』Mysql高可用集群之读写分离(二)

前言

主从复制: 解决了Mysql的单点故障问题以及提高MySQL的整体服务性能.

读写分离: 解决的是数据库的读性能问题,分担主库的压力,提高系统的可用性和稳定性。

分库分表: 数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。

主从复制在前篇文章中已经讲过,此篇主要讲解读写分离.

读写分离实现有哪几种方案?

  • Atlas  奇虎360的一个开源中间代理,是在mysql官方mysql-proxy 0.8.2的基础上进行了优化,增加一些新的功能特性。 项目地址: https://github.com/Qihoo360/Atlas ,该项目当前已经有4.4k的点赞量。
  • Cobar 阿里提供的一个中间件,已经停止更新。项目地址:https://github.com/alibaba/cobar 

  • Mycat 前身就是cobar,活跃度比较高,完全使用java语言开发。 项目地址:https://github.com/MyCATApache/Mycat-Server ,该项目当前已经有8.3k的点赞量,但现在发现Myscat的下载地址 http://dl.mycat.org.cn/2.0/ 已经访问不了,感觉应该是不维护了。
  • Mysql Proxy 一个轻量的中间代理,是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,依靠内部一个lua脚本实现读写语句的判断。项目地址: https://github.com/mysql/mysql-proxy ,该项目已经六七年没有维护了,官方也不建议应用于生成环境。
  • MySQL Router 是MySQL官方提供的一个轻量级中间件, 最早是作为 MySQL-Proxy的替代方案出现的,官方推荐使用MySQLRouter. 项目地址: https://github.com/mysql/mysql-router
  •  ......

案例:Atlas配置读写分离

介绍
Atlas 是由 Qihoo 360 公司 Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它在 MySQL 官方推出的 MySQL - Proxy 0.8.2 版本 的基础上,修改了大量 bug ,添加了很多功能特 性。该项目在 360 公司内部得到了广泛应用,很多 MySQL 业务已经接入了 Atlas 平台,每天承载的读写请 求数达几十亿条。同时,有超过 50 家公司在生产环境中部署了 Atlas
安装
# 下载rpm
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm# 卸载rpm包
rpm -e Atlas# 安装rpm包
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 
安装好了,它会默认在 /usr/local/mysql - proxy 下给你生成 4 个文件夹
[root@vm log]# cd /usr/local/mysql-proxy
[root@vm mysql-proxy]# ll
总用量 0
drwxr-xr-x 2 root root  75 10月 16 17:44 bin
drwxr-xr-x 2 root root  22 10月 16 18:10 conf
drwxr-xr-x 3 root root 331 10月 16 17:44 lib
drwxr-xr-x 2 root root  38 10月 16 18:17 log
  • bin 目录下放的都是可执行文件
    • encrypt是用来生成MySQL密码加密的,在配置的时候会用到

    • mysql-proxy MySQL 自己的读写分离代理
    • mysql-proxyd 360 弄出来的,后面有个 “d” ,服务的启动、重启、停止。都是用他来执行的
  • conf 目录下放的是配置文件
    • test.cnf 只有一个文件,用来配置代理的,可以使用vim来编辑
  • lib 目录下放的是一些包,以及Atlas的依赖
  • log 目录下放的是日志,如报错等错误信息的记录
配置

进入bin目录,使用encrypt来对数据库的密码进行加密,我的MySQL数据的用户名是root,密码是root,我需要对密码进行加密

[root@vm mysql-proxy]# /usr/local/mysql-proxy/bin/encrypt root
DAJnl8cVzy8=

配置Atlas,使用vim进行编辑

[root@vm mysql-proxy]# vim /usr/local/mysql-proxy/conf/test.cnf

进入后,可以在Atlas进行配置,360写的中文注释都很详细,根据注释来配置信息,其中比较重要,需要说明的配置如下:

这是用来登录到Atlas的管理员的账号与密码,与之对应的是“#Atlas监听的管理接口IP和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是2345,也可以指定IP登录,指定IP后,其他的IP无法访问管理员的命令界面。方便测试,我这里没有指定IP和端口登录。
# 管理接口的用户名
admin-username = hero
# 管理接口的密码
admin-password = hero

这是用来配置主数据的地址与从数据库的地址,这里配置的主数据库是130,从数据库是131

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

这个是用来配置MySQL的账户与密码的,我的MySQL的用户是root,密码是root,刚刚使用Atlas提供的工具生成了对应的加密密码

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码! 
pwds = root:DAJnl8cVzy8=

这是设置工作接口与管理接口的,如果ip设置的”0.0.0.0”就是说任意IP都可以访问这个接口,当然也可以指定IP和端口,方便测试我这边没有指定,工作接口的用户名密码与MySQL的账户对应的,管理员的用户密码与上面配置的管理员的用户密码对应

#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
启动
[root@vm mysql-proxy]# /usr/local/mysql-proxy/bin/mysql-proxyd test start

使用如下命令,进入Atlas的管理模式 mysql -h127.0.0.1 -P2345 -uhero -phero,能进去说明Atlas正常运行,因为它会把自己当成一个MySQL数据库,所以在不需要数据库环境的情况下,也可以进入到MySQL数据库模式。

[root@vm gorgor]# mysql -h127.0.0.1 -P2345 -uhero -phero
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-adminCopyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>

 可以访问“help”表,来看MySQL管理员模式都能做些什么。可以使用SQL语句来访问

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                            |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)mysql>
测试

主库user表数据

从库user表数据

在Atlas 执行查询user的数据发现,只能查出从库的数据,测试成功。

root@vm gorgor]# mysql -uroot -proot -P1234 --protocol=tcp -e"use gorgor; select * from user;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+--------+-----+---------------------+-------------+
| id | name   | age | create_time         | update_time |
+----+--------+-----+---------------------+-------------+
|  1 | gorgor |  30 | 2024-10-15 15:56:25 | NULL        |
|  2 | fairy  |  28 | 2024-10-15 17:47:56 | NULL        |
+----+--------+-----+---------------------+-------------+

案例:MySQL Router配置读写分离【要求】

介绍
MySQL Router 最早是作为 MySQL-Proxy 的替代方案出现的。作为一个轻量级中间件, MySQL Router 可在应用程序和后端 MySQL 服务器之间提供透明路由和负载均衡,从而有效提高 MySQL 数据库服务的高可 用性与可伸缩行。
MySQL Router 2.0 是其初始版本,适用于 MySQL Fabric 用户,但已被弃用,不再支持。
MySQL Router 2.1 为支持 MySQL InnoDB Cluster 而引入, MySQL Router 8.0 则是 MySQL Router 2.1上的扩展 ,版本号与 MySQL 服务器版本号保持一致。即 Router 2.1.5 作为 Router 8.0.3 (以及 MySQL Server 8.0.3 )发布, 2.1.x 分支被 8.0.x 取代。这两个分支完全兼容。当前最新版本为 8.0.17 MySQL 烈建议使用 Router 8 MySQL Server 8 5.7 一起使用。

一个简单的MySQL Router部署图如下。

安装 
wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Router/mysql-router-8.0.20-el7-x86_64.tar.gz
MySQL Router 的安装过程依赖于所使用的操作系统和安装介质,二进制包的安装通常非常简单,而源码包则需要先编译再安装。例如在 Linux 上的安装最新的 MySQL Router 二进制包,只需要用 mysql 用户 执行一条解压命令就完成了:
tar zxf mysql-router-8.0.20-el7-x86_64.tar.gz
配置

在mysql-router-8.0.20-el7-x86_64的conf文件下,创建mysqlrouter.conf并写入如下内容:

[logger]
level = INFO[routing:secondary]
bind_address = localhost
bind_port = 7001
destinations = 192.168.68.133:3306,192.168.68.134:3306
routing_strategy = round-robin[routing:primary]
bind_address = localhost
bind_port = 7002
destinations = 192.168.68.132:3306
routing_strategy = first-available
  1. 这里设置了两个路由策略:

    • 通过本地7001端口,配置读取服务,循环连接到192.168.68.133:3306、192.168.68.134:3306三个实例,由round-robin路由策略所定义;

    • 通过本地7002端口,配置写入服务,并设置首个可用策略。

      • 首个可用策略:使用目标列表中的第一个可用服务器,即当192.168.68.132:3306可用时,所有7002端口的连接都转发到它,否则转发到后面的服务器,以此类推。Router不会检查数据包,也不会根据分配的策略或模式限制连接

  2. 因此应用程序可以据此确定将读写请求发送到不同的服务器。

  3. 本例中可将读请求发送到本地7001端口,将读负载均衡到两台服务器。同时将写请求发送到7002,这样只写一个服务器,从而实现的读写分离

启动
./mysqlrouter -c mysqlrouter.conf &
测试
mysql -uroot -proot -P7001 --protocol=tcp -e"select @@hostname"

由上可见,发送到本地7001端口的请求,被循环转发到两个服务器,而发送到本地7002端口的请求,全部被转发到192.168.68.132:3306。

routing_strategy是MySQL Router的核心选项,从8.0.4版本开始引入,当前有效值为first-available、next-available、round-robin、round-robin-with-fallback。

顾名思义,该选项实际控制路由策略,即客户端请求最终连接到哪个MySQL服务器实例。相对于以前版本mode的选项,routing_strategy选项更为灵活,并且不能同时设置routing_strategy和mode,静态路由的设置只能选择其中之一。对于InnoDB Cluster而言,该设置时可选的,缺省使用round-robin策略。

  • round-robin:每个新连接都以循环方式连接到下一个可用的服务器,以实现负载平衡。

  • round-robin-with-fallback:用于InnoDB Cluster。每个新的连接都以循环方式连接到下一个可用的secondary服务器。如果secondary服务器不可用,则以循环方式使用primary服务器。

  • first-available:新连接从目标列表路由到第一个可用服务器。如果失败,则使用下一个可用的服务器,如此循环,直到所有服务器都不可用为止。

  • next-available:与first-available类似,新连接从目标列表路由到第一个可用服务器。与first-available不同的是,如果一个服务器被标记为不可访问,那么它将被丢弃,并且永远不会再次用作目标。重启Router后,所有被丢弃服务器将再次可选。

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

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

相关文章

计算机网络——应用层(DNS域名系统、文件传输协议FTP、远程终端协议TELNET、万维网)

应用层概述 不同网络应用的应用进程之间,还需要用不同的通信规则。因此在运输层协议之上,还需要有应用层协议。 每个应用层协议都是为了解决某一类应用问题,而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成。…

网络七层架构

目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介: 网络七层架构是指ISO/OSI模型,它是国际标准化组织(ISO)制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次&#xff0c…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

信息抽取数据集处理——RAMS

引言 RAMS数据集(RAMS:Richly Annotated Multilingual Schema-guided Event Structure)由约翰斯霍普金斯大学于2020年发布,是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件,涵盖了139种不同的事件类型和65种…

客户案例 | Ansys与台积电和微软合作加速光子仿真

Ansys与台积电和微软展开合作,将硅光子器件的仿真和分析速度提高10倍以上 主要亮点 借助使用NVIDIA图形处理单元(GPU)的Microsoft Azure虚拟机,Ansys Lumerical™ FDTD 3D电磁仿真的光子器件仿真速度实现了10倍提升 凭借Azure云…

k8s系列-Rancher 上操作的k8s容器网络配置总结

Rancher 上操作的k8s容器网络配置总结 要在 Rancher 中配置Spring Boot 应用 ykhd-zhjgyw-xpwfxfjfl 服务,正确的配置方式如下: 1. 应用程序监听端口 在 application.yaml 文件中,配置的应用监听端口是 10001,并且应用的上下文…

C++ | Leetcode C++题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {int maxCount 0, count 0;int n nums.size();for (int i 0; i < n; i) {if (nums[i] 1) {count;} else {maxCount max(maxCount, count);coun…

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long.

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long. 解决方案&#xff1a; 1、打开Edit Configurations 2、点击Modify options设置&#xff0c;勾选Shorten command line 3、在Edit Configurations界面下方新增的Shorten command line选项中…

01 设计模式-创造型模式-工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 通过使用工厂模式…

【wpf】06 HTTP/HTTPS请求的相关设计

这篇文章主要记录在用wpf开发应用程序从服务器端获取数据之前的准备工作。 1 HTTP标头信息 首先需要说明一下HTTP标头的信息&#xff0c;在使用wpf发送请求的过程中需要设置部分信息&#xff0c;大部分暂时用不到。 HTTP头信息 头信息由“键&#xff1a;值”组成。它们描述…

语音识别与语音控制

硬件平台 机器硬件&#xff1a;OriginBot(导航版/视觉版)PC主机&#xff1a;Windows&#xff08;>10&#xff09;/Ubuntu(>20.04)扩展硬件&#xff1a;X3语音版 运行案例 首先进入OriginBot主控系统&#xff0c;运行一下指令。请注意&#xff0c;部分操作OriginBot内暂…

第三课:python学习之安装pygame

首先确定自己的python已经将环境变量配置完成 第二步&#xff1a;敲击python命令看环境变量是否配置成功 第三步&#xff1a;敲击命令pip可以查看pip下有很多的命令&#xff0c;都有提示 第四步&#xff1a;我们开始安装pygame,我们使用pip install pygame命令进行安装 第五步…

【优选算法】——双指针(上篇)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C刷题算法总结&#x1f516;克心守己&#xff0c;律己则安 目录 前言&#xff1a;双指针 1. 移动零&#xff08;easy&#xff09; 2. 复写零&#xff08;easy&#xff09; 3…

Run the FPGA VI 选项的作用

Run the FPGA VI 选项的作用是决定当主机 VI 运行时&#xff0c;FPGA VI 是否会自动运行。 具体作用&#xff1a; 勾选 “Run the FPGA VI”&#xff1a; 当主机 VI 执行时&#xff0c;如果 FPGA VI 没有正在运行&#xff0c;系统将自动启动并运行该 FPGA VI。 这可以确保 FPG…

基于SpringBoot+Vue+uniapp的个人财务系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【C++进阶】set的使用

1. 序列式容器和关联式容器 前面&#xff0c;我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧…

《深度学习》OpenCV LBPH算法人脸识别 原理及案例解析

目录 一、LBPH算法 1、概念 2、实现步骤 3、方法 1&#xff09;步骤1 • 缩放 • 旋转和平移 2&#xff09;步骤2 二、案例实现 1、完整代码 1&#xff09;图像内容&#xff1a; 2&#xff09;运行结果&#xff1a; 一、LBPH算法 1、概念 在OpenCV中&#xff0c;L…

【Spring AI】Java实现类似langchain的第三方函数调用_原理与详细示例

Spring AI 介绍 &#xff1a;简化Java AI开发的统一接口解决方案 在过去&#xff0c;使用Java开发AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;导致开发者需要针对不同的AI服务提供商分别学习和对接各自的API&#xff0c;这增加了开发难度与迁移成本。而Sprin…

vue elementui table编辑表单时,弹框增加编辑明细数据

需求: 前端进行新增表单时&#xff0c;同时增加表单的明细数据。明细数据部分&#xff0c;通过弹框方式增加或者编辑。 效果图&#xff1a; 代码&#xff1a; <!-- 新增主表弹窗 Begin --><el-dialog:title"titleInfo"top"5vh"centerwidth"…