MySQL的主从复制和读写分离

目录

一、MySQL的主从复制

1、MySQL主从复制的原理

1.1 MySQL的复制类型

1.2 MySQL主从复制的工作过程

1.3 MySQL主从复制延迟

1.3.1 原因

1.3.2 解决方案

2、搭建MySQL的主从复制

实验环境

实验前提

①Mysql主从服务器时间同步

②主服务器的mysql配置

③从服务器的mysql配置

④验证主从复制效果

二、MySQL的读写分离

1、什么是读写分离

2、读写分离的原因 

3、进行读写分离的情况

4、主从复制与读写分离的联系

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

5.1 基于程序代码内部实现

5.2 基于中间代理层实现

6、基于中间件Amoeba搭建MySQL读写分离

6.1 搭建读写分离

① 安装Java环境 

② 安装Amoeba软件

③ 配置 Amoeba读写分离,两个 Slave 读负载均衡

6.2 客户端服务器测试读写分离

①测试一:客户端建表

②测试二:关闭slave功能后,在主从服务器插入数据

③从服务器开启slave服务,客户端在查看表中数据

④ 再次关闭slave功能后,客户端服务器写入数据


一、MySQL的主从复制

1、MySQL主从复制的原理

1.1 MySQL的复制类型

①基于语句的控制(STATEMENT):在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。

②基于行复制(ROW):把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

③混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

1.2 MySQL主从复制的工作过程

(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.3 MySQL主从复制延迟

1.3.1 原因

1、master服务器高并发,形成大量事务
2、网络延迟
3、主从硬件设备导致(cpu主频、内存io、硬盘io)
4、本来就不是同步复制、而是异步复制

1.3.2 解决方案
  1. 从数据库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。
  2. 从数据库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
  3. 从数据库使用SSD磁盘
  4. 网络优化,避免跨机房实现同步

2、搭建MySQL的主从复制

实验环境

Master 服务器:192.168.80.111            
Slave1 服务器:192.168.80.112            
Slave2 服务器:192.168.80.113              
Amoeba 服务器:192.168.80.114    
客户端 服务器:主机    

实验前提

#关闭防火墙自启动和selinux服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

①Mysql主从服务器时间同步

##主服务器设置##
yum install ntp -yvim /etc/ntp.conf
--末尾添加--
server 127.127.10.0                            #设置本地是时钟源,注意修改网段
fudge 127.127.10.0 stratum 8                #设置时间层级为8(限制在15内)service ntpd start##从服务器设置##
yum install ntp ntpdate -yservice ntpd start
/usr/sbin/ntpdate 192.168.80.111              #进行时间同步crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.80.111

②主服务器的mysql配置

vim /etc/my.cnf
server-id = 11
log-bin=master-bin        #添加,主服务器开启二进制日志
binlog_format = MIXED
log-slave-updates=true   
#添加,允许slave从master复制数据时可以写入到自己的二进制日志systemctl restart mysqldmysql -u root -pabc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.80.%' IDENTIFIED BY '123456';            #给从服务器授权
FLUSH PRIVILEGES;show master status;


③从服务器的mysql配置

vim /etc/my.cnf
server-id = 12                                
#修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin                        
#添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index        
#添加,定义中继日志文件的位置和名称,一般和relay-log在同一目录
relay_log_recovery = 1                      
#选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。
默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。systemctl restart mysqldmysql -u root -p123456CHANGE master to master_host='192.168.80.111',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=603;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致start slave;                       
#启动同步,如有报错执行 reset slave;
show slave status\G                    
#查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes                
#负责与主机的io通信
Slave_SQL_Running: Yes               #负责自己的slave mysql进程

#一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

④验证主从复制效果

主服务器上进入执行 
create database test01;
create database test02;去从服务器上查看 show databases;

注:如数据中途加入主从复制的库 需要导出主服务器库 的库文件并且导入到从服务器中

二、MySQL的读写分离

1、什么是读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2、读写分离的原因 

因为数据库的“写”操作是比较耗时的,但是数据库的“读”操作相对较快,所以读写分离,解决的是,数据库的写入,影响了查询的效率。

3、进行读写分离的情况

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

4、主从复制与读写分离的联系

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

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

5.1 基于程序代码内部实现

  • 在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
  • 优点:性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支
  • 缺点:需要开发人员来实现,运维人员无从下手。
  • 注意:但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

5.2 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。

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

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

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

6、基于中间件Amoeba搭建MySQL读写分离

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

注意: 读写分离是基于主从复制的基础上

6.1 搭建读写分离

① 安装Java环境 
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64
./jdk-6u14-linux-x64.bin
//按yes,按entermv jdk1.6.0_14/ /usr/local/jdk1.6vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/binsource /etc/profile
java -version

② 安装Amoeba软件
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop说明安装成功

③ 配置 Amoeba读写分离,两个 Slave 读负载均衡
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
grant all on *.* to test01@'192.168.80.%' identified by '123.com';grant all on *.* to tes02t@'192.168.80.%' identified by '123456';#再回到amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/cp amoeba.xml amoeba.xml.bak
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">123456</property>
--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.80.111</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.80.112</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.80.113</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>/usr/local/amoeba/bin/amoeba start&					#启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java							#查看8066端口是否开启,默认端口为TCP 8066

按上面配置,最后验证出现以下画面即为成功 

 

6.2 客户端服务器测试读写分离

①测试一:客户端建表

客户端服务器(192.168.80.115)

[root@client ~]# yum install -y mariadb-server mariadb
[root@client ~]# systemctl start mariadb.service
[root@client ~]# mysql -u amoeba -p123456 -h 192.168.80.114 -P8066
##通过amoeba服务器代理访问mysql,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器。
##这里通过192.168.80.114主机的8066端口使用用户amoeba登录mysql。MySQL [(none)]> use test01;MySQL [test01]> show tables;MySQL [test]> create table test(id int,name char(20));MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| ky35           |
+----------------+
1 row in set (0.01 sec)

 分别在master和slave1和slave2服务器查看test01数据库中是否都建立了ky35表

如果都能查看,说明代理成功,并实现了主从复制

②测试二:关闭slave功能后,在主从服务器插入数据

Slave1服务器

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)mysql> insert into ky35 values(1,'zhang');
Query OK, 1 row affected (0.01 sec)mysql> select * from ky35;
+------+-------+
| id   | name  |
+------+-------+
|    1 | zhang |
+------+-------+
1 row in set (0.00 sec)

 Slave1服务器

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)mysql> insert into ky35 values(2,'wang');
Query OK, 1 row affected (0.00 sec)mysql> select * from ky35;
+------+------+
| id   | name |
+------+------+
|    2 | wang |
+------+------+
1 row in set (0.00 sec)

 master服务器

mysql> insert into ky35 values(3,'xiaoming');
Query OK, 1 row affected (0.01 sec)mysql> select * from ky35;
+------+----------+
| id   | name     |
+------+----------+
|    3 | xiaoming |
+------+----------+
1 row in set (0.00 sec)

客户端去查看表的数据变化

③从服务器开启slave服务,客户端在查看表中数据

④ 再次关闭slave功能后,客户端服务器写入数据

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

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

相关文章

Linux下javaweb项目部署

javaweb项目部署测试 测试环境&#xff1a;centos7 下载安装jdk rpm -ivh jdk-8u131-linux-x64.rpm 下载安装MySQL wget https://downloads.mysql.com/archives/get/p/23/file/mysql-community-server-5.7.33-1.el7.x86_64.rpm https://downloads.mysql.com/archives/get/p…

AI预测福彩3D第19弹【2024年3月27日预测--第5套算法开始计算第1次测试】

今天早上&#xff0c;突然做了一个大胆的决定&#xff0c;直接用新的算法来搞4码定位&#xff0c;新的算法融合了冷温热的趋势分析&#xff0c;让我自己搭建的AI深度学习模型来预测相关号码的冷温热走势&#xff0c;并赋予相关权重&#xff0c;然后通过权重来进行打分排名。当然…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

vue3服务端渲染警告解决----DefinePlugin

Bundler 构建功能标志 有关 vuejs.org 的详细参考 esm-bundlerVue 的构建公开了可以在编译时覆盖的全局特性标志&#xff1a; __VUE_OPTIONS_API__ 违约&#xff1a;true启用/禁用选项 API 支持 __VUE_PROD_DEVTOOLS__ 违约&#xff1a;false在生产环境中启用/禁用 devtools 支…

2024/3/27打卡更小的数(十四届蓝桥杯)——区间DP

目录 题目 思路 代码 题目 思路 题目说求数组某个区间中的数进行翻转&#xff0c;由于区间选择多&#xff0c;首先想到DP问题。 第一版想到的方法&#xff08;错误的&#xff09;&#xff0c;当进行状态计算的时候&#xff0c;无法判定区间是否翻转后满足要求&#xff0c;…

c++|string模拟实现

目录 一、string.h 二、string.cpp 三、Test.cpp 对string的各种接口进行一个简易版的模拟实现&#xff0c;在模拟实现完之后对string的底层实现有了进一步的理解&#xff0c;了解大佬的编程写法思路。也算是对string有了一个小总结。 一、string.h 接口的声明。放在.h文件中…

MySQL安装和配置(超详细)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

武汉星起航公司助力零经验新手卖家征战亚马逊跨境电商市场

在数字化浪潮的推动下&#xff0c;亚马逊跨境电商行业正逐渐成为众多创业者和企业家们的新战场。然而&#xff0c;对于零经验的新手卖家而言&#xff0c;这片广袤的电商海洋无疑充满了未知与挑战。在这个关键时刻&#xff0c;武汉星起航公司以其专业的服务和深厚的行业积累&…

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序&#xff0c;然后右端点有两种情况。 假设是a区间&#xff0c;b区间。。。这样排列的顺序&#xff0c;那么 假设a[1]>b[0],如果a[1]>b[1]&#xff0c;就应该以b[1]为准&#xff0c;否则以a[1]为准。 class Solution { public:static bo…

老阳分享:视频号带货怎么做?有哪些方法?

在数字化浪潮中&#xff0c;视频号带货成为了一种新兴的商业模式&#xff0c;它结合了视频内容的吸引力和电商销售的便捷性&#xff0c;为品牌和商家带来了无限商机。那么&#xff0c;视频号带货究竟应该怎么做?又有哪些有效的方法呢? 首先&#xff0c;视频号带货的核心在于内…

行为管理设置能监控或者检测哪些东西

3 月 27 日&#xff0c;国新办举行“推动高质量发展”系列主题新闻发布会&#xff0c;浙江省省长王浩&#xff1a;全省市场经营主体 1040 万户&#xff0c;相当于平均每 6.5 个浙江人就有 1 个老板。 不由让小编想到&#xff0c;这么多老板&#xff0c;那么老板创办企业也怪不容…

【JavaEE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

大数据开发(离线实时音乐数仓)

大数据开发&#xff08;离线实时音乐数仓&#xff09; 一、数据库与ER建模1、数据库三范式2、ER实体关系模型 二、数据仓库与维度建模1、数据仓库&#xff08;Data Warehouse、DW、DWH&#xff09;1、关系型数据库很难将这些数据转换成企业真正需要的决策信息&#xff0c;原因如…

【快速解决】解决谷歌自动更新的问题,禁止谷歌自动更新,如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法

目录 问题描述 解决方法 1、搜索栏搜索控制面板 2、搜索&#xff1a;服务 ​编辑 3、点击Windows工具 4、点击服务 ​5、禁止谷歌更新 问题描述 由于我现在需要装一个谷歌的驱动系统&#xff0c;但是目前的谷歌驱动系统的版本都太旧了&#xff0c;谷歌自身的版本又太新了…

上海:6月1日起取消企业复工复产白名单制

财经新闻5月29日消息&#xff1a;上海市人民政府关于印发《上海市加快经济恢复振兴行动计划》的通知。 《方案》包括千方百计缓解各类市场主体困难&#xff0c;全面有序推进复工复产和市场复工复产&#xff0c;多措并举稳外资稳外贸&#xff0c;大力促进消费加速复苏&#xff0…

argocd cli工具使用

一、前言 ragocd除了使用web界面操作之外&#xff0c;也可以通过argocd cli工具进行操作&#xff0c;关于集群创建、gitlab仓库创建、app创建都是可以通过yaml 文件去操作&#xff0c;使用web界面创建的操作也需要使用argocd cli工具进行备份 二、使用 在argocd部署的章节已经…

Windows安装Odoo结合内网穿透实现公网访问本地企业管理系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

盏燕生物科技将出席2024第七届燕窝天然滋补品博览会

参展企业介绍 深圳市盏燕生物科技有限公司&#xff0c;办公室地址位于中国第一个经济特区&#xff0c;鹏城深圳&#xff0c;深圳市龙岗区平湖街道禾花社区富安大道18号亚钢工贸大楼1栋1017A&#xff0c;我公司主要提供一般经营项目是&#xff1a;初级农产品、海产品、化妆品、…

R使用netmeta程序包实现生存数据的频率学网状meta分析

之前的推文系统的介绍了使用netmeta包实现对二分类变量、连续型变量和罕见事件的网状meta分析。今天的文章介绍如何使用netmeta程序包实现生存数据的频率学网状meta分析&#xff0c;用来评估6种免疫疗法&#xff08; Camrelizumab、Tislelzumab、Toripalimab、Sintilimab、Pemb…

影视文件数字指纹签名检验系统的用户操作安全大多数

国内网盘服务大规模出现版权问题。 一些个人或团体会通过云存储客户端将主要由电影、电视、音乐组成的文件上传到网盘&#xff0c;然后在圈子里分享。 可供下载。 大量受版权保护的视频音乐就是通过这种特殊的盗版方式传播的&#xff0c;而这种传播方式暂时不受监管。 一些云存…