mysql主从复制和读写分离

什么叫主从复制?

主从复制架构图和数据流向

主MySQL上的数据、新增、修改库、表、表里的数据。都会同步到从MySQL上

面试题:MySQL的主从复制模式

1、 异步复制:MySQL的默认复制就是异步复制。工作中也一般使用异步复制。只要执行完之后,客户端提交事务主MySQL会立即把结果返回给从服务器主MySQL并不关心从MySQL是否已经接受并且处理。主一旦崩溃,主MySQL已经提交的事务可能没有传到从MySQL。

这个时候如果强行把从服务器提升为主服务器,可能导致新的主MySQL数据不完整。(情况很少见。工作中都是异步复制)

异步:类似于udp。只管发送,不管有没有收到

2、 全同步复制:主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端因为需要等待所有从库全部执行完成性能必然下降(对数据一致性,和数据完整要求很高的场景)

3、 半同步复制:介于异步复制和全同步复制之间。主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后才会给客户端。半同步在一定程度上提高了数据的安全性。和全同步复制一样,也会有一定的延迟延迟的时间一般是一个tcp/ip的往返时间(从发送到接收的时间,单位是毫秒)。半同步复制最好是在低延迟的网络中使用。

时间<1ms:round-trip time RTT

如何实现主从复制?

架构主从复制和读写分离

MySQL:主 20.0.0.50

MySQL2:从 20.0.0.60

MySQL3:从 20.0.0.70

test1:读写分离的服务器 20.0.0.20

test3:客户端 20.0.0.30

yum -y install ntp #时间同步工具


关闭五台主机的防火墙
回到三台MySQL
主从服务器的时间也要同步:
yum -y install ntp
#保证主从服务器时间必须一致设置MySQL2和MySQL3与主MySQL同步MySQL1:vim /etc/ntp.conf
#在尾行添加
server 127.127.0.0
fudge 127.127.0.0 stratum 8server 127.127.0.0
fudge 127.127.0.0 stratum 8
#数字越小,时间精确度越高,设置fudge 8 时间层级是8 最高到15.从本地获取时间源同步,不走网络。
systemctl restart ntpd开启两台从MySQL2和MySQL3的ntp服务
/usr/sbin/ntpdate 20.0.0.50
#两台从服务器的时间源分别指向主MySQL 20.0.0.50
crontab -u root -e
*/30 * * * * /usr/sbin/ntpdate 20.0.0.50
#生产环境中一般创建一个定时任务创建完成后查看一下三台主机的时间
date回到主:
vim /etc/my.conf
log-bin=master-bin
#主服务器开启二进制日志
binlog_format=MIXED
#处理方式开启混合模式,如果并发量变高会自动切换成row
log-slave-updates=ture
#允许从服务器复制数据时,可以从主的二进制日志写到自己的二进制日志当中
systemctl restart mysqldmysql -u root -p123456
#进入主数据库grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
#给从库授权可以访问主库。创建一个用户名称叫myslave来自20.0.0.%这个网段,密码是123456.给从库授权可以访问主库
flush privileges;
#刷新一下权限
show master status;
#查看主MySQL的位置点到从库MySQL2:
hostnamectl set-hostname
#改名从库,可做可不做vim /etc/my.conf
server-id = 2
#id千万不能相同
relay-log=relay-log-bin
#修改日志的名称
relay-log-index=slave-relay-bin.index
#告诉你中继日志的索引名称叫这个
relay_log_recovery=1
#默认是0,1表示开启中继日志的恢复。如果从服务器出现异常或者崩溃时,从服务器会从主服务器的二进制日志正确读取和应用中继日志。起同步作用,会自动从主服务器获取,完成同步
systemctl restart mysqld
#重启从MySQL服务到从库MySQL3:
vim /etc/my.conf
server-id = 3
#id千万不能相同
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1systemctl restart mysqld
#重启从MySQL服务现在两台从MySQL都修改完成
mysql -u root -p123456
mysql -u root -p123456
#两台从MySQL都进入MySQL
两个从服务器都要:
CHANGE master to CHANGE master to master_host='20.0.0.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=自己的号码;start slave;show slave status\G
#纵向查看进入工具验证一下
连接三台服务器
create database kgc;
#创建库
查看一下是否同步实现主从复制。
create table test (name varchar(10));
#创建一个表测试一下
在表内写一点数据测试一下
主从服务完成!在从上创建一个库
create database kgc1;
#主从复制是单向的只能从主复制到从服务器

Slave_IO_Running:yes #负责和主库的io通信。获取主库的io通信

Slave_SQL_Running:yes #负责自己的sql进程。写入从库

Slave_IO_Running:no #如果这里出问题,可能是配置文件错了、密码写错了、防火墙没有关

主从复制是单向的只能从主复制到从服务器

主从复制总结

主从复制的工作过程:

1、 主节点的数据记录发生变化都会记录在二进制日志

2、 slave节点会在一定时间内对主库的二进制文件进行探测。探测是否发生变化。如果有变化从库会开启一个IO的线程。请求主库的二进制事件。

3、 主库会给每一个I/O的线程启动一个dump线程,用于发送二进制事件给从库。从库通过I/O线程获取跟新,slave_sql负责将更新写入到从库本地,实现主从一致。

主从复制的问题:

1、 只能在主库上发生变化,然后同步到从。从库的更新不会同步到主

2、复制的过程是串行化过程,在从库上复制是串行的。主库的并行更新不能在从库上并行操作。

3、 主从复制的设计目的:就是为了在主库上写,在从库上查。读写分离,实现高可用。

如何实现读写分离?

要实现读写分离必须要先实现主从复制

读写分离:所有的写入操作都在主库,从库只负责读。(select)如果有更新,是从主库复制到从库。

为什么要有读写分离?

1、 数据库在写入数据时,比较耗时(MySQL写一万条数据需要3分)

2、 数据库在读的时候,速度很快(读一万条数据需要4.96秒)

3、 读写分离之后,数据库的写入和读取时分开的。哪怕写入的数据量比较大,但是不影响查询的效率。

什么场景下需要读写分离?

数据库不是一定需要读写分离的。只有在某些程序在使用数据库过程中,更新少,但是查询角度,这种情况可以考虑读写分离。

如果读和查的需求差不多,也可以考虑读写分离。

生产库一般都会做读写分离。

测试库一般不管。

在工作中,数据库的读写不会在同一个库中完成。既不安全,也不能满足高可用,也不能实现高并发。工作中都会做读写分离。

MySQL读写分离的原理:

1、 根据脚本实现。在代码中实现路由分类。select insert进行路由分类。这种方式时最多的。性能好,在代码中就可以实现,不需要额外的硬件设备。缺点:开发实现的,跟我们无关。如果大型的复杂的应用,涉及改动的代码非常多。

2、 基于中间代理层实现:mysql-proxy自带的开源项目,基于自带的lua脚本。这些lua脚本不是现成的,要自己写,不熟悉他的内置变量写不出来。

atlas 360内部自己使用的代理工具:不对外公开。每天的读写请求承载量可以到几十亿条,还支持事务,还支持存储过程。

3、 Amoeba 是由java开发的一个开源软件。不支持事务也不支持存储过程。但是Amoeba还是用的最多的,功能比较强大的软件。

Amoeba来实现读写分离

架构主从复制和读写分离

MySQL:主 20.0.0.50

MySQL2:从 20.0.0.60

MySQL3:从 20.0.0.70

test1:读写分离的服务器 Amoeba 20.0.0.20

test3:客户端 20.0.0.30

jdk1.5开发的,官方推荐使用1.5或者1.6

读写分离架构图和数据流向

配置读写分离:
java -version
#查看java版本cd /opt
#拖入两个文件
cp jdk /usr/local
cd usr/local
chmod +x jdk
./
ctrl+c
yesmv jdk/ jdk1.6vim /etc/profilesource /etc/profilejava -version
#java环境配置完成安装Amoeba
cd /opt
mkdir /usr/local/amoeba
tar -xf amoeba tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba
./usr/local/amoeba/bin/amoeba
#出现start|stop表示安装成功回到主MySQL和两个从MySQL都要配置
grant all on *.* to 'amoeba'@'20.0.0.%' identified by '123456';
flush privileges;回到Amoeba客户端
cd /usr/local/amoeba/conf/
ls
amoeba.xml:配置用户信息
dbServers.xml:配置数据库信息
cp amoeba.xml amoeba.xml.bak.2023.11.13vim amoeba.xml
set nu
#11行查看一下端口号8066
"user">amoeba
#到30行修改
"passord">123456
#到32行插入密码
name="defaultPool">master
#到115行
"writePool">master
"readPool">slaves
#到117行去掉注释 删除<!--和-->cp dbServers.xml dbServers.xml.bak.2023.11.13
#备份一下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">amoeba</property>--28-30--去掉注释
<property name="password">123456</property>--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.233.21</property>--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.233.22</property>--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.233.23</property>--65行--修改
<dbServer name="slaves" virtual="true">--71行--修改
<property name="poolNames">slave1,slave2</property>/usr/local/amoeba/bin/amoeba start &
#启动amoeba并且后台运行amoebanetstat -antp | grep java
#查看端口是否启动看看端口到客户端查看测试
systemctl restart mariadbnatstat -antp | grep mariadb回到主从服务器打开查询日志记录
vim /etc/my.conf
general_log=ON
general_log_file=
#开启日志记录systemctl restart mysqld
#三台MySQL都重启mysql服务tail -f /usr/log/mysql/data/mysql
#打开三台MySQL的日志回到客户端连接amoeba服务器来测试mysql -u amoeba -p123456 -h20.0.0.20 -P8066
#登录amoeba指定端口20.0.0.20 -P指定端口8066
use kgc;
show tables;
insert into test values('test2')
#插入一条新的数据
回到三台MySQL查看报文是否有写入数据回到客户端
select * from test;
回到从MySQL服务器查看日志是否有查询记录回到客户端
select * from test;
回到从MySQL服务器查看日志是否有查询记录
#两次查询还可以实现轮询读写分离实验完成!

Slave_IO_Running:no如何处理?

1、 网络问题。ping一下主机是否能通

2、 配置文件错误 my.conf配置文件写错了

3、 CHANGE master to CHANGE master to master_host='20.0.0.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=自己的号码; 指定主和从的时候,可能是文件名错误,也可能是位置偏移量不对。

4、 防火墙和安全机制问题(面试中别说)

MySQL的主从复制模式问题

1、 异步复制:MySQL的默认复制就是异步复制。工作中也一般使用异步复制。只要执行完之后,客户端提交事务主MySQL会立即把结果返回给从服务器主MySQL并不关心从MySQL是否已经接受并且处理。主一旦崩溃,主MySQL已经提交的事务可能没有传到从MySQL。

这个时候如果强行把从服务器提升为主服务器,可能导致新的主MySQL数据不完整。(情况很少见。工作中都是异步复制)

异步:类似于udp。只管发送,不管有没有收到

2、 全同步复制:主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端因为需要等待所有从库全部执行完成性能必然下降(对数据一致性,和数据完整要求很高的场景)

3、 半同步复制:介于异步复制和全同步复制之间。主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后才会给客户端。半同步在一定程度上提高了数据的安全性。和全同步复制一样,也会有一定的延迟延迟的时间一般是一个tcp/ip的往返时间(从发送到接收的时间,单位是毫秒)。半同步复制最好是在低延迟的网络中使用。

主从复制延迟问题

1、 网络延迟

2、 主从硬件设备(cpu主频。内存的IO、硬件的IO)

3、 同步复制而不是异步复制

解决方案:

1、 硬件方面:主库一般不需要动的太多,从库的硬件配置要更好。提升随机写的性能。例如:硬盘可以考虑换成固态的,升级cpu的核数,扩展一下内存。尽量使用物理机(不要用云服务器)。

2、 从网络层面解决问题:主从服务器都配置在一个局域网内,尽量避免跨网段或者跨机房。

3、 架构方面:读写分离,把写入控制设置在主库,从库负责读。减轻从库的负载,降低从库的压力。

4、 MySQL的配置方面:从配置文件的角度实现性能最大化。

如果追求安全性的配置:
innodb_flush_log_at_trx_commit=1
#每次事务提交时都会刷新事务日志以却表持久性。这是最高级别的数据安全性,但是会影响性能,默认就是1.(只要安全就这样配)
#0就是事务提交时不会立刻刷新,而是每秒刷新1次。可以提高性能,但是发生故障会导致数据丢失。
#2就是事务提交时,事务日志不会写入硬盘而是保存在系统缓存,不会进行刷新。有一定的安全性和性能。内存要求比较高。
#生产中默认就是1sync_binlog=1
#1是默认值,也就是每次提交事务之后。直接把二进制日志刷新到磁盘。以确保日志的持久性。会占用比较高的性能,但是安全性高。(只要安全就这样配)
#0会把二进制日志写入到缓存,也不会刷新日志。故障发生也会丢失数据,同时对内存的要求也提高了
#3表示每3个事务执行一次刷新到磁盘。可以提高性能,但是一旦发生崩溃,数据会大量丢失。追求性能化:
sync_binlog=0 (不建议)
innodb_flush_log_at_trx_commit=2 (不建议)
logs-slave-updates=0 (强烈不建议)
#从库的更新不会写入二进制日志。(强烈不建议)
innodb_buffer_pool_size 300M 500G
#innodb存储引擎缓冲池的大小,设置的数据越高,可以提高innodb的性能。更多的数据和索引都可以缓存在内存中。可以减少磁盘的访问次数。对系统内存要求比较高。建议舍弃掉一部分性能,追求安全方面。数据无价。

如果Slave_IO_Running:no 排查思路是什么?

答:85%配置文件问题。

show slave status\G 能看到的信息有哪些呢

1、 I/O和sql的线程状态信息

2、 master服务器的ip地址、端口、事务开始的位置

3、 最近一次的错误信息和错误的位置

4、 最近一次的I/O报错的信息

5、 最近一次sql的报错信息

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

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

相关文章

Halcon WPF 开发学习笔记:HSmartWindowControlWPF正常加载

文章目录 加载问题相关文章彻底解决 加载问题 我们在WPF中使用Halcon的时候&#xff0c;会出现图片被拉伸的问题&#xff0c;需要拖动才可以解决&#xff0c;我网上找了好久&#xff0c;终于找到了如何成功解决这个问题。 相关文章 3.7 Halcon 窗体显示对象消失问题 【halcon】…

【springboot】Failed to start bean ‘webServerStartStop‘;

新同事新建了一个项目springboot项目&#xff0c;启动时候报错。 具体错误如下&#xff1a; Failed to start bean webServerStartStop; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server 未能启动bea…

关于淘宝API接口你必须了解的API2.0

据说API从1.0升级到2.0啦&#xff1f;今天我们来聊一聊关于淘宝API接口你必须了解的API2.0 然而 作为新手小白 …… 并不懂API是毛线 好吧 …… 今天 我们就来上一堂小白入门课 几句话聊聊API 高级淘客 请忽略 请批评 请交流 还有请看到最底下 有重磅消息&#xf…

[论文阅读] CLRerNet: Improving Confidence of Lane Detection with LaneIoU

Abstract 车道标记检测是自动驾驶和驾驶辅助系统的重要组成部分。采用基于行的车道表示的现代深度车道检测方法在车道检测基准测试中表现出色。通过初步的Oracle实验&#xff0c;我们首先拆分了车道表示组件&#xff0c;以确定我们方法的方向。我们的研究表明&#xff0c;现有…

SpringBoot Web开发

SpringBoot3-Web开发 SpringBoot的Web开发能力&#xff0c;由SpringMVC提供。 Web开发的三种方式 方式处理过程注意事项实现效果全自动直接编写控制逻辑全部使用自动给配置默认效果手自一体Configuration、 配置WebMvcConfigurer、 配置WebMvcRegistrations不要标注 EnableWeb…

通讯协议学习之路(实践部分):UART开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…

Xmind 24 for Mac思维导图软件

XMind是一款流行的思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 以下是XMind的主要特点&#xff1a; - 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同用户的需求。 - 强大…

中小企业数字化转型进程加速,CRM系统前景如何?

自疫情不断反复之后&#xff0c;中小企业数字化转型进程开始加速。作为当下最热门的企业级应用&#xff0c;CRM客户管理系统的前景还是被看好的。相比于美国企业CRM系统7成的使用率&#xff0c;中国的CRM市场还有很大的发展空间。下面来详细说说&#xff0c;CRM系统的前景如何&…

通信世界扫盲基础二(原理部分)

上次我们刚学习了关于通信4/G的组成和一些通识&#xff0c;今天我们来更深层次了解一些原理以及一些新的基础~ 目录 专业名词 LTE(4G系统) EPC s1 E-UTRAN UE UU X2 eNodeB NR(5G系统) NGC/5GC NG NG-RAN Xn gNodeB N26接口 手机的两种状态 空闲态 连接态 …

Python照片压缩教程:如何轻松减小图片大小

在日常的编程工作中&#xff0c;我们经常需要处理图像&#xff0c;例如上传、下载、显示、编辑等。有时候&#xff0c;我们需要对图像进行压缩&#xff0c;以减少占用的空间和带宽&#xff0c;提高加载速度和用户体验。那么&#xff0c;如何用Python来实现图像压缩呢&#xff1…

C51--PC通过串口(中断)点亮LED

B4中的&#xff1a;REN允许 / 禁止串行接收控制位 REN 1为允许串行接收状态。 接收数据必须开启。所以SCON&#xff1a;0101 0000 &#xff1b;即0x50 如何知道数据已经接收 RI位&#xff1a;当收到数据后 RI 1&#xff08;由硬件置一&#xff09; 硬件置一后必须用软件…

解决npm报错Error: error:0308010C:digital envelope routines::unsupported

解决npm报错Error: error:0308010C:digital envelope routines::unsupported。 解决办法&#xff1b;终端执行以下命令&#xff08;windows&#xff09;&#xff1a; set NODE_OPTIONS--openssl-legacy-provider然后再执行 npm命令成功&#xff1a;

算法——图——bsf 广度优先搜索算法 (Breadth First Search)

图遍历算法——bsf 广度优先搜索算法 &#xff08;Breadth First Search&#xff09; 算法 概述算法过程步骤一&#xff1a;初始化原点到队列步骤二&#xff1a;将队列的头顶点放入到已完成集合步骤三&#xff1a;将订单的关联顶点放入到队列中步骤四&#xff1a;将u顶点设置为…

【正点原子STM32连载】 第五十章 FATFS实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

【JAVA学习笔记】69 - 多用户通信系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/QQClient https://github.com/yinhai1114/Java_Learning_Code/tree/main/QQServer 〇、环境设置以及前言 该项目内会弱化UI界面的设计&#xff0c;因为JAVA本质不是用来开发界面的。 项目开发流程 对于…

汽车标定技术(九)--标定常量与#pragma的趣事

目录 1. 不添加#pragma语句 2. 添加#pragma语句 3. 标定量只给flash空间&#xff0c;不给ram指定空间 4. 总结 在之前不会使用overlay机制的时候&#xff0c;我们想要做汽车标定&#xff0c;标定常量编译出来的地址一般都应该是ram的地址&#xff0c;而且在链接文件中都会指…

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码&#xff1a;https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图&#xff1a; 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请&#xff0c;免费的。 申请地址&#xff1a;https://xinghuo.xfyun.cn/ 注册之…

代码随想录算法训练营第23期day49| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 一、&#xff08;leetcode 123&#xff09;买卖股票的最佳时机III 二、&#xff08;leetcode 188&#xff09;买卖股票的最佳时机IV 一、&#xff08;leetcode 123&#xff09;买卖股票的最佳时机III 力扣题目链接 增加了两次的限制&#xff0c;相应的就是需要考虑的状…

【AI】自回归 (AR) 模型使预测和深度学习变得简单

自回归 (AR) 模型是统计和时间序列模型&#xff0c;用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域&#xff0c;包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关&#xff0c;这使得它们可用于建模和预测时…