MySQL读写分离实战

2023-11-12

1. MySQL读写分离概念

MYSQL读写分离的原理其实就是让Master数据库处理事务性增加、删除、修改、更新操作(create、insert、update、delete),而让Slave数据库处理查询(select)操作,MySQL读写分离前提是基于MySQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端的数据。

1.1 读写分离实现方式

实现MySQL读写分离可以基于第三方插件,也可以通过开发修改代码实现,具体实现的读写分离的常见方式有如下四种:

  • Amoeba读写分离;

  • MySQL-Proxy读写分离;

  • MyCAT读写分离;

  • 基于程序读写分离(效率很高,实施难度大,开发改代码);

Amoeba:是阿里08年开源的以MySQL为底层数据存储,并对WEB、APP应用提供MySQL协议接口的Proxy。它集中地响应WEB应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行,基于此可以实现负载均衡、读写分离、高可用性等需求。

MySQL-Proxy:是MySQL官方提供的MySQL中间件服务,支持无数客户端连接,同时后端可连接若干台MySQL-Server服务器,MySQL-Proxy自身基于MySQL协议,连接MySQL-Proxy的客户端无需修改任何设置, 跟正常连接MySQL Server没有区别,无需修改程序代码。

MyCAT:是基于阿里12年开源的cobar开发的一个数据库中间件,在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,它可实现读写分离,分库分表。

2. 基于MySQL-Proxy实现读写分离

Proxy:  192.168.48.182
Master: 192.168.48.183
Slave:  192.168.48.184
Slave:  192.168.48.185

2.1 工作原理图解

 

2.2 配置Proxy

Proxy可以选择和mysql部署在同一台服务器,也可以选择单独部署在另一台独立服务器。

# 下载MySQL-Proxy:
[root@node02 ~]# cd /usr/src/
[root@node02 src]# 
[root@node02 src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
​
# 解压:
[root@node02 src]# tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
[root@node02 src]#
[root@node02 src]# mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
​
# 配置环境变量:
[root@node02 src]# echo "export PATH=/usr/local/mysql-proxy/bin:$PATH" > /etc/profile.d/mysql-proxy.sh
[root@node02 src]# 
[root@node02 src]# . /etc/profile.d/mysql-proxy.sh
[root@node02 src]# echo $PATH
/usr/local/mysql-proxy/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node02 src]# 
​
# 启动MYSQL-Proxy中间件:
[root@node02 src]# useradd -r mysql-proxy
[root@node02 src]# 
[root@node02 src]# mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.48.183:3306" --proxy-read-only-backend-addresses="192.168.48.184:3306" --proxy-read-only-backend-addresses="192.168.48.185:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
[root@node02 src]# 
​
# 查看端口/日志:
[root@node02 src]# netstat -ntlp |grep 404
tcp        0      0 0.0.0.0:4040            0.0.0.0:*               LISTEN      11803/mysql-proxy   
tcp        0      0 0.0.0.0:4041            0.0.0.0:*               LISTEN      11803/mysql-proxy   
[root@node02 src]# 

2.3 启动的相关参数

# Mysql-Proxy的相关参数详解如下:
--help-all                                    # 获取全部帮助信息;
--proxy-address=host:port                     # 代理服务监听的地址和端口,默认为4040;
--admin-address=host:port                     # 管理模块监听的地址和端口,默认为4041;
--proxy-backend-addresses=host:port           # 后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port # 后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name                  # 完成mysql代理功能的Lua脚本;
--daemon                                      # 以守护进程模式启动mysql-proxy;
--keepalive                                   # 在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name             # 日志文件名称;
--log-level=level                             # 日志级别;
--log-use-syslog                              # 基于syslog记录日志;
--plugins=plugin                              # 在mysql-proxy启动时加载的插件;
--user=user_name                              # 运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name       # 默认使用的配置文件路径,其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling                        # 禁用profile;
--pid-file=/path/to/pid_file_name             # 进程文件名;

2.4 启动master/slave

[root@node03 ~]# systemctl start mariadb
[root@node04 ~]# systemctl start mariadb
[root@node05 ~]# systemctl start mariadb

2.5 查看读写分离状态

基于4041端口MySQL-Prox

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL读写分离实战 的相关文章

  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤

随机推荐

  • Vue基础知识(Web开发技术)(四)—路由

    这章非常重要哈 编程编程编程 随缘上代码 导读 本章重点 了解vue router的实现原理 熟练路由的安装与使用 掌握路由对象的常用属性和动态路由的匹配及路由嵌套的方法 掌握命名路由 命名视图和编程式导航及query params传参方式
  • VSCode无法在终端使用`conda activate`命令来更换python环境解决方法

    VSCode无法在终端使用conda activate命令来更换python环境 现象 在终端输入conda activate命令后出现如下图所示的报错 原因 powershell默认没有打开脚本加载功能 无法加载conda init 解决
  • 无线传感网络

    第一 二章 无线传感网络的定义 无线传感网络是大量的静止节点或移动的传感器以自组织和多跳的方式构成的无线网络 目的是协作地探测 处理和传输网络覆盖区域内感知对象的监测信息 并报告给用户 传感器节点的组成 数据处理 数据采集模块 传感器 A
  • 最好的网页浏览器_谷歌浏览器双击关闭标签的步骤_如何使Chrome能够双击关闭标签页...

    我们在使用浏览器浏览网页的时候 经常会打开多个书签 很多浏览器都支持双击标签页就可以直接关闭 但是有不少用户使用谷歌浏览器chrome却发现无法直接双击关闭标签页 那么如何使Chrome能够双击关闭标签页呢 我们需要借助扩展程序 现在随小编
  • 最短路径——迪杰斯特拉(Dijkstra)算法

    如果你要从一个城市到另一个城市 中途可以有很多种换乘方法 根据不同人的需求 怎么样才能实现价格最少 价格和路程成正比 怎么样能实现换乘次数最少 有很多种可能的情况 这时候怎么样找到合适的方案呢 这就需要研究图的最短路径问题 不过在网图和非网
  • 12、【创业必备企业架构,可开发任意项目】SpringCloud大型企业分布式微服务云架构源码之MySQL 排序

    MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据 如果我们需要对读取的数据进行排序 我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序 再返回搜索结果 语法
  • Shell-打印文件空行行号

    1 写一个 bash脚本以输出一个文本文件 nowcoder txt中空行的行号 可能连续 从1开始 awk s print NR nowcoder txt 2 去掉文件的空行输出 方法1 awk if 0 print 0 nowcoder
  • 【Python 3.7】河流:创建一个字典,在其中存储三条大河流及其流经的国家。其中一个键 — 值对可能是 'nile': 'egypt' 。

    Python 3 7 河流 创建一个字典 在其中存储三条大河流及其流经的国家 其中一个键 值对可能是 nile egypt 题目 河流 创建一个字典 在其中存储三条大河流及其流经的国家 其中一个键 值对可能是 nile egypt 使用循环
  • acwing算法基础课笔记7

    时间复杂度分析
  • easyui toolbar工具div form放外面表单无法清空重置

    form 一定要放在div内部才行 这也是我自己踩过的坑
  • Unity中的资源管理-使用Profile分析内存使用情况

    本文分享Unity中的资源管理 使用Profile分析内存使用情况 在上一篇文章中 我们介绍了Ab的加载和使用 并简单列举了其内存分布情况 今天我们继续探索Ab的内存 观察和实验其在各种阶段的分布情况 Profile性能分析工具 在一切开始
  • 掌握Python的X篇_17_循环语句(while;for var in ;range)

    文章目录 1 为什么需要循环 2 while循环 3 for in循环 4 range函数 1 为什么需要循环 循环语句方便我们做重复的事情 比如 for i in range 0 3 print 重要的事情说三遍 运行效果如下 Pytho
  • C++ 中内存分区总结

    背景 C 中最基本的存储单位是字节 C 中所有的数据都是由对象组成的 每一个对象都包含了一个或多个内存位置 C 中有多种不同类型的内存区域 不同区域存放不同的数据 赋予数据不同的生命周期 程序在执行时将供用户使用内存大致划分为以下区域 常量
  • 激光灯

    激光等中使用的通讯方式 简介 通讯介绍 DMX512通讯 DMX512通讯物理层 DMX512通讯应用层 ILDA通讯 ILDA通讯物理层 DMX512通讯应用层 Art Net 网络通讯 简介 本文作为起始书写的第一篇 但可能不是专栏中的
  • Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    Error Program type already present android support design widget CoordinatorLayout 原因是在页面中使用recyclerView导致的 主要是design和co
  • Cache-Control max-age=0

    http blog csdn net ysdaniel article details 7969766 Cache Control no cache 强制每次请求直接发送给源服务器 而不经过本地缓存版本的校验 这对于需要确认认证应用很有用
  • 第二章 下载AOSP WiFi相关的代码

    第一章 国内下载AOSP最新源码的方法 文章目录 前言 一 需下载的仓库清单 二 下载命令 三 代码仓目录结构 总结 前言 WiFi相关的仓库包括Settings SettingsLib wifi service wpa supplican
  • micropython移植教程_Micropython移植篇——从点亮一个灯开始

    收到论坛申请的 MicroPython入门指南 已经两天了 看到了第四章 没有再往下看了 感觉应该先找个硬件移植 然后再往下看 跟着学习 这样才有意义 好了 先说下移植的过程吧 硬件采用的是STM32F429DISC 具体步骤 第一步 下载
  • Matlab 学习笔记 (部分内容系转载)

    由于要参加数学建模比赛的原因 我需要在不到一周的时间内初步地学习Matlab 因此 我希望把我在学习过程中阅读的资料记录下来 方便跟我一样需要在较短时间内速成Matlab的同学 基本上我记录的东西都是从网上的资料总结而来 所以这篇文章更偏向
  • MySQL读写分离实战

    1 MySQL读写分离概念 MYSQL读写分离的原理其实就是让Master数据库处理事务性增加 删除 修改 更新操作 create insert update delete 而让Slave数据库处理查询 select 操作 MySQL读写分