MySQL 主从复制、读写分离

MySQL 主从复制、读写分离

  • 1、MySQL 主从复制
    • 1.1什么是主从复制?
    • 1.2为什么要读写分离呢?
    • 1.3 什么时候要读写分离?
    • 1.4主从复制与读写分离
    • 1.5mysql支持的复制类型
    • 1.6主从复制的工作过程
    • 1.7MySQL 读写分离原理
    • 1.8目前较为常见的 MySQL 读写分离分为以下两种:
  • 2、搭建MySQL主从复制、读写分离
    • 2.1环境配置
    • 2.2初始环境准备
    • 2.3搭建mysql主从复制
      • 2.3.1搭建时间同步(主服务器:192.168.190.130)
      • 2.3.2搭建时间同步(从服务器:192.168.190.140、192.168.190.170)
      • 2.3.3配置主服务器(192.168.190.130)
      • 2.3.4配置从服务器(192.168.190.140、192.168.190.170)
    • 2.3.5 验证主从同步
    • 2.4搭建Amoeba 实现读写分离(192.168.190.)
      • 2.4.2配置amoeba
      • 2.4.3客户端测试

1、MySQL 主从复制

1.1什么是主从复制?

MySQL主从复制是一种数据库复制技术,用于将一个MySQL数据库服务器的更改同步到其他MySQL数据库服务器。
在主从复制中,有一个主数据库(Master)和一个或多个从数据库(Slave)。
主数据库负责接收和处理所有的写操作,而从数据库则通过复制主数据库的日志文件,将这些写操作在自身的数据库中重演,从而实现数据的同步。

1.2为什么要读写分离呢?

因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库的“读”(读10000条数据可能只要5秒钟)。 所以读写分离,解决的是,数据库的写入,影响了查询的效率。

1.3 什么时候要读写分离?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

1.4主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

1.5mysql支持的复制类型

(1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。 (3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

1.6主从复制的工作过程

(1)Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中。
(2)Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件。
(3)同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点本地的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

注:
●中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
●复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。

1.7MySQL 读写分离原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。

1.8目前较为常见的 MySQL 读写分离分为以下两种:

  • 基于程序代码内部实现 在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。 但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
  • 基于中间代理层实现 代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。

①MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。

②Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。

③Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

④Mycat。是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。

由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy内置变量和MySQL Protocol 的人来说是非常困难的。Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。

2、搭建MySQL主从复制、读写分离

2.1环境配置

master :192.168.190.130
slave1 :192.168.190.140
slave2 :192.168.190.170
Amoeba服务器: 192.168.190.101
客户端 :192.168.190.120

2.2初始环境准备

systemctl stop firewalld
setenforce 0
//关闭防火墙

2.3搭建mysql主从复制

2.3.1搭建时间同步(主服务器:192.168.190.130)

//安装时间同步服务器
yum install ntp -y//修改配置文件
vim /etc/ntp.conf  
server 127.127.59.0   //设置本地时钟源
fudge 127.127.59.0 stratum 8  //设置时间层级为8 限制在15 以内//开启服务
systemctl start ntpd 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.2搭建时间同步(从服务器:192.168.190.140、192.168.190.170)

//安装时间同步服务器、同步服务
yum install ntp -y
yum install ntpdate -y//开启服务
systemctl start ntpd//执行同步
/usr/sbin/ntpdate 192.168.190.130//计划定时任务
crontab -e
*/30 * * * *  /usr/sbin/ntpdate 192.168.190.130

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

slave2:192.168.190.170与以上操作相同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3配置主服务器(192.168.190.130)

//开启二进制日志
vim /etc/my.cnflog-bin=master-bin        //开启二进制日志
binlog_format=MIXED       //二进制日志格式
log-slave-updates=true    //开启从服务器同步//重启服务
systemctl restart mysqld.service //登入mysql,给从服务器在网段授权
mysql -uroot -pabc123
grant replication slave on *.* to 'myslave'@'192.168.190.%' identified by 'abc123';//刷新数据库
flush privileges;//查看主服务器二进制文件
show master status;
开启二进制日志

在这里插入图片描述
在这里插入图片描述

2.3.4配置从服务器(192.168.190.140、192.168.190.170)

//开启中继日志
vim /etc/my.cnf
server-id = 11 //slave1和slave2的id不能相同,我slave2设置的22
relay-log=relay-log-bin //开启中继日志
relay-log-index=slave-relay-bin.index//重启服务
systemctl restart mysqld.service //登入mysql,配置同步注意master_log_file和master_log_pos的值要和master查询的一致
mysql -uroot -pabc123
change master to master_host='192.168.190.130',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=604;
//配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致//启动同步,如果报错,执行restart slave试试
start slave;
show slave status\G;
//以下两个必须要是YES
//Slave_IO_Running: Yes
//Slave_SQL_Running: Yes

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

slave2:192.168.190.170与以上操作相同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.5 验证主从同步

主库:192.168.190.130

show databases;

在这里插入图片描述
从库:slave1 192.168.190.140

show databases;

在这里插入图片描述
从库:slave2 192.168.190.170

show databases;

在这里插入图片描述

//在主服务器上创建一个库
create database test;
//查看
show databases;

在这里插入图片描述

  • slave1:
show datatases;

在这里插入图片描述

  • slave2:
show datatases;

在这里插入图片描述

2.4搭建Amoeba 实现读写分离(192.168.190.)

cd /opt 
安装 Java 环境
//下载安装包:jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz //赋予jdk权限并执行
chmod +x jdk-6u14-linux-x64.bin./jdk-6u14-linux-x64.bin  //一路回车到底,最后输入yes 自动安装//将jdk移动到/usr/local下并改为jdk1.6
mv jdk1.6.0_14/ /usr/local/jdk1.6//配置环境并刷新
cd /etc/profile.d
vim java.shexport JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin/:$PATH:$HOME/binsource /etc/profile      //刷新配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.2配置amoeba

///usr/local目录下创建amoeba目录
mkdir /usr/local/amoeba//切换至opt解压amoeba
cd /opt/
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoebacd /usr/local/ 切换至目录查看//给目录/usr/local/amoeba赋予执行权限
chmod -R 755 /usr/local/amoeba///运行amoeba
/usr/local/amoeba/bin/amoeba配置 Amoeba读写分离 
//先在Master、Slave1mysql上开放权限给 Amoeba 访问
grant all on *.* to test@'192.168.59.%' identified by '123123';
flush privileges;//备份amoeba配置
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
cp dbserver.dtd dbserver.dtd.bak//修改amoeba配置
vim amoeba.xml									#修改amoeba配置文件
--30行--
<property name="user">amoeba</property>
--32行-- 
<property name="password">123456</property>
--115行--
<property name="defaultPool">master</property>
--117-去掉注释-
<property name="writePool">master</property>
<property name="readPool">slaves</property>cp dbServers.xml dbServers.xml.bak
vim dbServers.xml								#修改数据库配置文件
--23行--注释掉  作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释
<property name="password">123.com</property>
--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.80.10</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.80.11</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.80.12</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>//启动amoeba,并测试
/usr/local/amoeba/bin/amoeba start&
netstat -anpt | grep java	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再回到amoeba服务器配置amoeba服务
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动amoeba
在这里插入图片描述

2.4.3客户端测试

//安装mariadb
yum install mariadb mariadb-server.x86_64 -y//登入并查看数据库
mysql -uamoeba -pabc123 -h 192.168.190.101 -P8066

在这里插入图片描述
在这里插入图片描述

//测试同步
//在主服务器服务器上新建表
use test;
create table info(id int(10),name char(40));
show tables;

在这里插入图片描述

//在客户端上,插入数据会同步到所有数据库中use test;insert into info values(1,'小明');

在这里插入图片描述

//在主从服务器上查看
selext * from test;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//测试读写分离
//停止slave1和slave2的slave同步功能
stop slave;

在这里插入图片描述
在这里插入图片描述

//在master、slave1和slave2上插入数据
insert into info values(1,'master'); //在master上插入数据
insert into info values(2,'slave1');//在slave1上插入数据
insert into info values(3,'slave2');//在slave2上插入数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在客户端查询:

关闭了同步,slave1和slave2数据不同步,客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

2023年9月榜单丨飞瓜数据B站UP主排行榜(B站平台)发布!

飞瓜轻数发布2023年9月飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站UP…

微信怎样批量添加好友?批量添加好友的好处有哪些?

微信是目前最流行的社交软件之一&#xff0c;不仅可以与亲友保持联系&#xff0c;还能为企业提供更多商机和合作伙伴。为了提高工作效率和增加客户数量&#xff0c;许多企业开始寻找批量自动化添加好友的工具。 那么批量添加好友的好处有哪些呢&#xff1f; ①批量自动化添加好…

微信小程序之本地生活(九宫格)

文章目录 一.创建项目二.配置修改json三.编写WXML四.编写WXSS五.最终效果 一.创建项目 创建新的项目&#xff0c;名称为&#xff1a;本地生活 二.配置修改json 在app.json中删除其他页面 将index改为grid 自动生成新的文件 添加自己的轮播图片 源代码&#xff1a; <!--…

基于FPGA的图像缩小算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的处理结果导出到matlab中显示图像效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1p…

C语言,序列中删除指定数字

题目考点&#xff1a;对continue的运用&#xff08;也可以用&#xff01;来实现&#xff09; 先创建一个数组&#xff0c;数组大小应该要根据题目要求&#xff0c;根据数据范围&#xff0c;要设立一个大小为50的数组。 接着用scanf输入n的值&#xff0c;再设一个循环&#xff…

用ffmpeg删除视频的音轨,让视频静音

ffmpeg -i ~/video/video.mp4 -an -vcodec copy ~/video/muteVideo.mp4 删除以后我们查看muteVideo的文件信息&#xff0c;只有一个Stream&#xff1a;video信息了。 再对比看一下video.mp4的信息&#xff0c;是有两个Stream信息&#xff0c;一个video&#xff0c;一个audio。…

口袋参谋:淘宝卡首屏玩法,1步高效拉升店铺免费流量!

​淘宝上商家都希望自己的商品出现在买家的面前&#xff0c;于是就出现了卡首屏玩法。 那什么是卡首屏呢&#xff1f; 就是使用商品链接或者商品ID通过卡首屏工具&#xff0c;生成卡首屏二维码&#xff0c;使用手淘APP扫一扫后&#xff0c;指定的宝贝就会显示在首屏&#xff…

【Nuget】程序包源

程序包源地址(部分) Azure 中国区的官方 NuGet 程序包源地址 https://nuget.cdn.azure.cn/v3/index.json 官方 NuGet 程序包源地址 V2 https://www.nuget.org/api/v2 官方 NuGet 程序包源地址 V3 https://api.nuget.org/v3/index.json MyGet 上 Eto.Forms 框架的程序包源地址 h…

顺序表的应用——(通讯录)

目录 前提须知&#xff1a; 通讯录的结构&#xff1a; 通讯录的建立&#xff1a; 顺序表的重命名&#xff1a; 顺序表数据类型的更改&#xff1a; 使用通讯录结构体新名字&#xff0c;进行类型重命名的问题&#xff1a; 头文件的添加&#xff1a; 通讯录的初始化和销毁&a…

C语言重点突破(2)指针(二)

本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 1. 字符指针 在我的前一章节&#xff0c;我们提到指针也有类型的区分&#xff0c;有整型指针&#xff0c;浮点型指针&#xff0c;下面我们讲讲字符指针 字符指针的用法通常是将一个字符变量的地址存…

企业安全隐患排查治理系统—隐患上报、整改

安全生产隐患排查治理系统&#xff0c;涵盖了安全隐患排查整治工作的各项基本内容&#xff0c;能对隐患排查整治信息及时、有效地进行跟踪、整改&#xff0c;并将统计数据及时上报。该系统主要分为以下四个模块&#xff1a; 企业信息管理。通过手机扫码即可查询该企业主要风险点…

uniapp上echarts地图钻取

1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…

VALSE2023-快速总结

会议快速总结 1. 前言2. 热点词2.1 自监督预训练2.2 MIM(Masked Image Modeling)2.3 MAE(Masked Autoencoders)2.4 clip&#xff08;Contrastive Language-Image Pre-Training&#xff09;模型2.5 对比学习2.6 扩散模型&#xff08;diffustion model&#xff09;2.7 Nerf&#…

智慧工地:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地管理系统融合计算机技术、物联网、视频处理、大数据、云计算等&#xff0c;为工程项目管理提供先进的技术手段&#xff0c;构建施工现场智能监控系统&#xff0c;有效弥补传统监理中的缺陷&#xff0c;对人、机、料、法、环境的管理由原来的被动监督变成全方位的主动管…

Unity 设置Inspect上问号的跳转链接

设置Inspect上问号的跳转链接 只需要在Class上添加特性&#xff1a;HelpURL即可&#xff01;

STM32使用HAL库驱动TA6932数码管驱动芯片

TA6932介绍 8段16位&#xff0c;支持共阴共阳LED数码管。 2、STM32CUBEMX配置引脚 推挽配置即可。 3、头文件 /******************************************************************************************** * TA6932&#xff1a;8段16位数码管驱动 *******************…

计算机竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

git多分支、git远程仓库、ssh方式连接远程仓库、协同开发(避免冲突)、解决协同冲突(多人在同一分支开发、 合并分支)

1 git多分支 2 git远程仓库 2.1 普通开发者&#xff0c;使用流程 3 ssh方式连接远程仓库 4 协同开发 4.1 避免冲突 4.2 协同开发 5 解决协同冲突 5.1 多人在同一分支开发 5.2 合并分支 1 git多分支 ## 命令操作分支-1 创建分支git branch dev-2 查看分支git branch-3 分…

uni-app:文本超出部分用省略号表示

效果 前 后 核心代码 white-space: nowrap; /* 强制不换行 */ text-overflow: ellipsis; /* 超过部分省略号代替 */ overflow: hidden; /* 必须同时设置overflow:hidden才能生效 */ 完整代码 <template><view><view class"all_style"><view c…

Maven 自动化构建

自动化构建定义了这样一种场景: 在一个项目成功构建完成后&#xff0c;其相关的依赖工程即开始构建&#xff0c;这样可以保证其依赖项目的稳定。 比如一个团队正在开发一个项目 bus-core-api&#xff0c; 并且有其他两个项目 app-web-ui 和 app-desktop-ui 依赖于这个项目。 …