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

一、案例分析

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/profileexport 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.mzph.cn/bicheng/38448.shtml

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

相关文章

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因&#xff1a;vite 中不支持&#xff0c;换成 ::v-deep 或:deep即可

浅谈人工智能发展趋势

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

Java web应用性能分析之【prometheus监控K8s指标说明】

常规k8s的监控指标 单独 1、集群维度 集群状态集群节点数节点状态&#xff08;正常、不可达、未知&#xff09;节点的资源使用率&#xff08;CPU、内存、IO等&#xff09; 2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册&#xff1a;https://cn.vuejs.org/guide/quick-start.html 一、找个盘符&#xff0c;新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目&#xff0c;所以有文件&#xff0c;你们初次是没有…

IT专业入门,高考假期预习指南

文章目录 一、了解IT专业的基本概念二、选择适合的编程语言入门三、掌握基本的编程工具和环境四、学习基础的数据结构和算法五、实践项目和动手实验六、利用在线资源进行学习七、参加编程竞赛和社区活动总结 高考结束后&#xff0c;许多同学将迎来大学生活&#xff0c;而对于选…

DataWhaleAI Tsak1 运行Baseline

题目背景 在当今数字化时代&#xff0c;企业积累了丰富的对话数据&#xff0c;这些数据不仅是客户与企业之间交流的记录&#xff0c;更是隐藏着宝贵信息的宝库。在这个背景下&#xff0c;群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取…

nlp--最大匹配分词(计算召回率)

最大匹配算法是一种常见的中文分词算法&#xff0c;其核心思想是从左向右取词&#xff0c;以词典中最长的词为优先匹配。这里我将为你展示一个简单的最大匹配分词算法的实现&#xff0c;并结合输入任意句子、显示分词结果以及计算分词召回率。 代码 : # happy coding…

Tektronix泰克 AWG70001A 任意波形发生器

Tektronix泰克 AWG70001A 任意波形发生器 AWG70000A 系列任意波形发生器 (AWG) 在采样率、信号保真度和波形内存方面代表着尖端水平&#xff0c;特别适合复杂器件、系统和实验的设计、测试和操作。由于高达 50 GS/s 采样率和 10 位垂直分辨率&#xff0c;它提供了优秀的信号激…

【Python】入门Python,你必须了解这些事

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言一、认识Python什么是Python&#xff1f;!Python的起源Python的特点简洁易读跨平台&#xff0c;可移植拥有强大的库和框架面向对象 Python的优缺点优点缺点 Python的应用环境扩…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法&#xff1a; 1、这里&#xff0c;-l 选项表示长格式输出&#xff08;包括文件权限、所有者、大小等&#xff09;&#xff0c;-S 选项表示按照文件大小排序&#xff0c;-h 选项表示以…

PHP留守儿童关爱之家网站-计算机毕业设计源码11079

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3 论文结构与章节安排 2 留守儿童关爱之家网站系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程和逻辑 2.5本章小结 3 留守儿童关爱之家网站总体设计 3.1系统结构设计 3.2系统功能模块设计 3.2 数…

【算法训练记录——Day38】

Day38——动态规划Ⅰ 1.理论#2.leetcode_509斐波那契数3.leetcode_70爬楼梯4.kamacoder_57爬楼梯5.leetcode_746使用最小花费爬楼梯 1.理论 一般解题步骤&#xff1a; 确定dp数组及下标含义确定递推公式数组如何初始化确定递归顺序举例推导dp数组 #2.leetcode_509斐波那契数…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面&#xff0c;它提供了用户与系统交互的接口&#xff0c;这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

linux虚拟机部署的MySQL如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透

文章目录 写在前面实现Linux的内网穿透1、官网账号注册2、在Linux部署我们自己的项目3、一键自动下载安装cpolar4、设置自己的token5、启动cpolar服务6、MySQL穿透测试 卸载方法 写在前面 相信很多小伙伴在本地搭建了一个MySQL数据库&#xff0c;想让其他同事或者合作者一起使…

BCFtools安装

记得之前安装这个软件的时候是非常简单的&#xff0c;但是今天重新安装的时候出现了很多的麻烦&#xff0c;想想还是做个记录吧! bcftools的下载地址如下&#xff1a; Releases samtools/bcftools (github.com)https://github.com/samtools/bcftools/releases/这里我们选用的…

【数据结构】(C语言):队列

队列&#xff1a; 线性的集合。先进先出&#xff08;FIFO&#xff0c;first in first out&#xff09;。两个指针&#xff1a;头指针&#xff08;指向第一个进入且第一个出去的元素&#xff09;&#xff0c;尾指针&#xff08;指向最后一个进入且最后一个出去的元素&#xff0…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如&#xff1a; aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录&#xff1a; /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码&#xff1a;include\linux\usb.h Linux 内核源码&#xff1a;drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备&#xff0c;编写的 usb_driver 驱动程序&#xff0c;支持的是"USB 接口"&#xff1a; US…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

从直播消息中找到对应的proto协议内容

这么多直播间的消息&#xff0c;我们该怎么从里面找到我们需要的消息定义呢&#xff1f; 其实只要你能找到这个里面的this对象&#xff0c;就可以看到这个对象上面有一个root > webcast > im 这里面的函数就都是用于解析直播间消息的函数&#xff1a; 想要看一下每个消息…