案例:MySQL主从复制与读写分离

news2024/11/19 19:43:49

一、案例分析

1.案例概述

        在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说都是通过主从复制(Master-Slave)来同步数据,再通过读写分离来提升数据库并发负载能力的方案来进行部署与实施。

2.案例前置知识点

(1)MySQL主从复制原理

        MySQL的主从复制和 MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。

        MySQL支持的复制类型
        ①基于语句的复制。在主服务器上执行的 SQL语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。
        ②基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
        ③混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

(2)复制的工作过程

MySQL复制的工作过程如图所示

        在每个事务更新数据完成之前,Master将这些改变记录进二进制日志。写入二进制日志完成后,Master通知存储引擎提交事务。
        Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程--/0 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog  dump process 从 Master 的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待 Master 产生新的事件。I/0 线程将这些事件写入中继日志。
        SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 1/0 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。
        复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

2.MySQL读写分离原理

        简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。 目前较为常见的 MySQL 读写分离分为两种。

(1)基于程序代码内部实现         

        在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。 

(2)基于中间代理层实现

  代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
        ① MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断,虽然是 MySQL 官方产品,但是 MySQL 官方并不建议将 MySQL-Proxy 用到生产环境。
        ② Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由 Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
        经过上述简单的比较,通过程序代码实现 MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java 应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。本章后续案例通过 Amoeba 实现。

3.案例环境

 (1)本案例环境

本案例环境使用五台服务器模拟搭建,具体的网络拓扑如图所示

(2)案例需求

要求通过Amoeba实现MySQL数据库请求的读写分离。

(3)案例实现思路

        安装 MySQL 数据库;
        配置 MySQL 主从复制;
        安装并配置 Amoeba;
        客户端测试读写分离。

二、案例实施

1.搭建MySQL主从复制

(1).在Master、Slave1、Slave2服务器上安装MySQL数据库

(2).配置Master主服务器

        在/etc/my.cnf中修改或者增加下面的内容

[root@localhost ~]# vim /etc/my.cnf
server-id =11
log-bin = master-bin
log-slave-updates = true

        重启MySQL服务

[root@localhost ~# systemctl restart mysqld

        登录MySQL程序,给从服务器授权

[root@localhost ~]#mysql -u root -p
mySql>GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.%' IDENTIFIED BY '123456';
mySql>FLUSH PRIVILEGES:
mysql>show master status;

        其中 File 列显示日志名,Position 列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave 应从该点上进行新的更新。

(3)配置Slave从服务器

        在 Slave1、Slave2 服务器上面分别执行下面步骤。

        在/etc/my.cnf中增加以下内容,server-id不能相同

[root@localhost ~]# vim /etc/my.cnf
server-id= 22                            //两个Slave服务器的server-id不能相同
relay-log = relay-log-bin
relay-log-index= slave-relay-bin.index

        重启MySQL服务

[root@localhost ~]# systemctl restart mysqld

        登录MySQL,配置同步,按主服务器结果更改下面命令中 master_log _file 和 master _log_pos 参数。

[root@localhost ~]# mysql -u root -p
mysql>change master to master_host='192.168.1.101',master_user='myslave' master_password='123456',master_log_ file='File值',master_log_pos=Position的值;

        启动同步

mysql>start slave;

        查看Slave状态,确保Slave_IO_Running Slave_SQL_Running两个值为YES

mysql>show slave status\G;
************************1.row****************************
Slave_IO_State:Waiting for master to send event
Master Host: 192.168.1.101
Master User: myslave
Master Port: 3306
Connect Retry: 60
Master Log File: master-bin.000002
Read Master Log Pos: 410
Relay_Log_File: relay-log-bin.000002
Relay Log Pos: 284
Relay_Master Log_File: master-bin.000002
Slave_IO_Running: YesSlave SQL Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
......

(4)验证主从复制效果

在主、从服务器上登录MySQL,在主服务器新建数据库
在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功

2.搭建MySQL读写分离

        Amoeba(变形虫)项目开源框架于 2008 年发布一款 Amoeba for MySQL 软件。这个软件致力于 MySQL分布式数据库前端代理层,它主要为应用层访问 MSQL的时候充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由到相关的目标数据库、可并发请求多台数据库。通过 Amoeba 能够完成多数据源的高可用、负载均衡、数据切片的功能,目前 Amoeba 已在很多企业的生产线上使用,其版本可在官网进行下载。

(1)在Amoeda上安装Java环境 

        因为 Amoeba 基于是jdk1.5 开发的,所以官方推荐使用 jdk1.5或1.6版本,高版本不建议使用。 

[root@localhost ~]# chmod +x jdk-6u14-inux-x64.bin
[root@localhost ~]# ./jdk-6u14-linux-x64.bin    //根据提示按 Enter 键完成即可
[root@localhost ~# mv jdk1.6.0 14/ /usr/local/jdk1.6
[root@localhost ~]# vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=SCLASSPATH:$JAVA HOMEЛb:$JAVA HOME/jre/lib
export PATH=$JAVA_HOME/ib:$JAVA HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin

[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0 14"Java(TM) SE Runtime Environment (build 1.6.0 14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

(2)安装并配置Amoeba软件

[root@localhost ~# mkdir /usr/local/amoeba
[root@localhost ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@localhost ~l# chmod -R 755 /usr/localamoeba/
[root@localhost ~]# /usr/local/amoeba/bin/amoeba

(3)配置Amoeba读写分离,两个Slave读负载均衡

        在三个mysql服务器中开放权限给amoeba访问(只在master中即可,会复制到slave中)

mysql> grant all on *.* to test@'192.168.10.%' identified by '123.com';

        关闭防火墙

[root@localhost amoeba]# systemctl stop firewalld

        编辑amoeba.xml配置文件

[root@localhost ~]# cd /usr/local/amoeba/conf
[root@localhost conf]# vim amoeba.xml

 <property name="user">amoeba</property>                 ##30行
 <property name="password">123456</property>               ##32行
...
<property name="defaultPool">master</property>             ##115行
<property name="writePool">master</property>             ##118行
<property name="readPool">slaves</property>    ##119行此处的注释去掉

        编辑dbServer.xml文件

[root@localhost conf]# vim dbServers.xml

                  <property name="user">test</property>         ##26行
                  <property name="password">123.com</property>  ##29行,去掉注释符
     
  <dbServer name="master"  parent="abstractServer">         ##45行
       <factoryConfig>
            <!-- mysql ip -->
            <property name="ipAddress">192.168.10.101</property>            ##48行
                </factoryConfig>
        </dbServer>

  <dbServer name="slave1"  parent="abstractServer">	        ##52行
       <factoryConfig>
            <!-- mysql ip -->
            <property name="ipAddress">192.168.10.102</property>            ##55行
                </factoryConfig>
        </dbServer>

  <dbServer name="slave2"  parent="abstractServer">         ##这段配置复制slave1
        <factoryConfig>
             <!-- mysql ip -->
             <property name="ipAddress">192.168.10.103</property>
                </factoryConfig>
        </dbServer>

  <dbServer name="slaves" virtual="true">                    ##59行
        <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
             <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                <property name="loadbalance">1</property>
                <!-- Separated by commas,such as: server1,server2,server1 -->
                <property name="poolNames">slave1,slave2</property>          ##65行
                </poolConfig>
        </dbServer>

        启动amoeba软件

(4)启动amoeba软件
[root@localhost ~]# cd /usr/local/amoeba/
[root@localhost amoeba]# bin/amoeba start&
//当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行
[root@localhost amoeba]# netstat -anpt | grep java
tcp6  0  0  127.0.0.1:51388          :::*          LISTEN      31083/java
tcp6  0  0 :::8066              :::*           LISTEN    31083/java
tcp6  0  0  192.168.8.100:58748 192.168.10.103:3306 ESTABLISHED 31083/java
tcp6  0  0  192.168.8.100:37810 192.168.10.102:3306 ESTABLISHED 31083/java
tcp6  0  0  192.168.8.100:56066 192.168.10.101:3306 ESTABLISHED 31083/java

(4)测试

        在client上安装mysql,在master,slave1,slave2中分别添加数据,在clinent中查询,发现只有在master写入的数据,说明写入的操作是在master上。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【昇思25天学习打卡营打卡指南-第十三天】ShuffleNet图像分类

ShuffleNet图像分类 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操…

stable-diffusion-webui-colab搭建SadTalker由图生成视频人

在这里选择一个stable-diffusion-webui-colab ​​​​​​​​​GitHub - camenduru/stable-diffusion-webui-colab: stable diffusion webui colab 这里我选择是&#xff1a; https://colab.research.google.com/github/camenduru/stable-diffusion-webui-colab/blob/main…

《昇思25天学习打卡营第16天 | 昇思MindSpore基于MobileNetv2的垃圾分类》

16天 本节学习了垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#xff0c;相比于传…

百元蓝牙耳机推荐2024,百元蓝牙耳机排行榜盘点

在2024年面对琳琅满目的蓝牙耳机选项&#xff0c;消费者往往难以抉择&#xff0c;特别是在预算有限的情况下&#xff0c;如何在众多产品中挑选出既满足质量又符合预算的耳机成为了一个不小的挑战。 为了帮助大家在繁多的选择中找到真正物有所值的百元蓝牙耳机&#xff0c;我们…

Win10临时文件夹Temp无写入权限不能安装怎么解决?

网上很多解决方案&#xff0c;但其实大部分是C盘满了 使用treesize软件&#xff0c;来精准清理C盘的垃圾&#xff0c;释放空间 或者用everything来快速定位Temp的位置&#xff0c;先把里面能删的都删掉 上面两款软件都是非常好用的&#xff0c;建议大家使用

word怎么转换成pdf?分享3种PDF文件转换技巧

word怎么转换成pdf&#xff1f;在日常办公中&#xff0c;将Word转换成PDF可以带来诸多便利。首先&#xff0c;PDF格式具有跨平台的通用性&#xff0c;无论在哪个操作系统或设备上&#xff0c;都能保持文档的原始布局和格式。其次&#xff0c;PDF文件不容易被篡改&#xff0c;可…

对原生textarea加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Textarea Character Counter with Dragga…

跨模型知识融合:大模型的知识融合

大模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&#…

浅谈区块链

区块链是一种分布式数据库技术&#xff0c;也被称为分布式账本技术。它的本质是一个去中心化的数据库&#xff0c;使用密码学相关联产生的数据块串连而成&#xff0c;用于验证其信息的有效性&#xff08;防伪&#xff09;和生成下一个区块。区块链具有“不可伪造”“全程留痕”…

肆拾玖坊的商业模式,49坊新零售奖金制度体系,众筹众创+会员制

肆拾玖坊之所以能够在短时间内成为白酒行业的“现象级”企业,,不仅是依靠独特商业模式,同时也依靠的是坚持用户为核心,围绕用户需求,让用户与产品直接产生连接理念。 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工…

《昇思25天学习打卡营第21天 | 昇思MindSporePix2Pix实现图像转换》

21天 本节学习了通过Pix2Pix实现图像转换。 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN&#xff09;实现的一种深度学习图像转换模型。可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线稿图到实物图的转换。Pix2Pix是将cGAN应用于有监督的图…

【正点原子K210连载】 第十五章 按键中断实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十五章 按键中断实…

浅谈人工智能发展趋势

第三次浪潮 人类科技发展的主线正沿着“能源”和“新型”展开。AI的尽头是光伏和储能。 如今我们正在经历第三次浪潮——信息文明。 社会生产力 劳动对象 劳动工具 劳动者 生产要素 农业文明铜器铁器 材料 人力工具 农民 土地人力 工业文明机车电力 材料动力 动力…

如何在Python中实现一个简单的爬虫程序

如何在Python中实现一个简单的爬虫程序 随着互联网的发展&#xff0c;数据已成为当今社会最宝贵的资源之一。而爬虫程序则成为了获取互联网数据的重要工具之一。本文将介绍如何在Python中实现一个简单的爬虫程序&#xff0c;并提供具体的代码示例。 确定目标网站 在开始编写爬…

单片机软件架构连载(1)-枚举(enum)

今天跟大家讲一下我在产品开发时&#xff0c;用枚举(enum)的一些骚操作&#xff0c;都是实战经验&#xff0c;不难&#xff0c;但开发经验尚浅的话&#xff0c;不一定能把它灵活应用。 为什么要讲枚举呢&#xff1f; 因为我发现它是一个容易被遗忘&#xff0c;同时又非常重要的…

LeetCode刷题之HOT100之二叉树的最近公共祖先

2024 7/1 新的一个月来啦&#xff01;也算是迎来了暑假&#xff0c;可惜我们没有暑假&#xff0c;只能待实验室&#xff0c;中途会有10天小假。Anyway&#xff0c;做题啦 1、题目描述 2、算法分析 又来到了树的部分&#xff0c;要找最近的公共祖先。想到树就会想到DFS和BFS。…

护眼灯哪些牌子好?几款最好的护眼灯品牌排行榜分享

在当代社会&#xff0c;随着工作压力和学业负担的增加&#xff0c;人们的用眼时间越来越长&#xff0c;因此保护眼睛的需求变得愈发迫切。护眼台灯作为一种护眼产品&#xff0c;已经逐渐普及&#xff0c;成为许多人的助手。然而护眼灯哪些牌子好&#xff1f;今天&#xff0c;我…

3D交互可视化编辑器求推荐,最好是针对企业级使用的?

企业级使用的3D交互可视化编辑器&#xff0c;支持编辑和调整2D、3D渲染及交互设置&#xff0c;以下几款可以关注了解一下&#xff1a; 1、Unity&#xff1a;一个广泛使用的跨平台游戏引擎&#xff0c;由Unity Technologies开发。支持开发者创建2D和3D游戏、交互式应用以及虚拟…

4个文章生成器免费版分享,让文章创作更轻松便捷

在当今这个信息飞速传播的时代&#xff0c;文章创作的重要性愈发凸显。无论是从事内容创作的专业人士&#xff0c;还是偶尔需要撰写文章的普通大众&#xff0c;都希望能更高效地完成文章创作任务。而在实际操作中&#xff0c;我们常常会遇到思路卡顿、没有创作灵感的问题。今天…