mysql的主从复制和读写分离:

mysql的主从复制和读写分离:

主从复制

面试必问:主从复制的原理

主从复制的模式:

1、mysql的默认模式:

异步模式 主库在更新完事务之后会立即把结果返回给从服务器,并不关心从库是否接受到,以及从库是否处理成功。

网络问题可能没有同步,或者是其他因素的影响导致同步失败。

快 效率高

2、全同步模式:

主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后才能继续下一个同步。安全,但是性能低。

3、半同步复制

介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库。同步完成之后有一个等待时间

等待时间是一个tcp/ip的往返时间

5毫秒左右

既在一定程度上保证了效率,也在一定程度上保证了数据的完整性。

主从复制的延迟怎么解决:

1、网络问题,防火墙的原因

2、硬件设备问题,cpu、内存和磁盘出了问题

3、配置文件写错了。

配置文件当中进行设置的方式提高数据的安全性。

数据库的存储引擎要是innodb

双一设置:

innodb_flush_log_at_trx_commit=1

每次提交都会刷新事务日志,确保事务的持久性。但是会影响性能。

sync_binlog=1

每次提交事务,将二进制日志的内容保存到磁盘,确保日志的持久性。提高了安全性。

性能化设置:

sync_binlog=N(5或者10)

最多提交几次事务会进行磁盘刷新,日志内容保存到磁盘

innodb_flush_log_at_trx_commit=2

保存在内存中,不进行刷新。(不推荐)

innodb_buffer_pool_size=60m

可以控制innodb存储引擎缓冲池的大小,增大可以提高数据库的性能,但是占用的是系统内存,配置的时候注意合理化时间。

主从复制如何实现:

实现是基于mysql的二进制日志,根据主库的二进制文件的标准位,实现主和从的同步。

主从服务器之间,服务器的时间要同步。

架构:

三台服务器

192.168.60.91 mysql 8.0 主

192.168.60.92 mysql 8.0 从

192.168.60.93 mysql 8.0 从

主:

1、

yum -y install ntpdate

2、查看三台机器的时间是否相同,不相同使用以下命令

ntpdate ntp.aliyun.com

3、更改mysql的配置文件/etc/my.cof

server-id = 1
log-bin=master-bin 
binlog_format=MIXED 
log-slave-updates=true
#允许从服务器从主库复制数据时可以写入从库自己的二进制日志中去

4、创建主的用户

mysql> CREATE USER 'myslave'@'192.168.60.%' IDENTIFIED WITH mysql_native_password BY '123456';
​
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.60.%';
​
mysql> FLUSH PRIVILEGES;
show master status;

从服务器

1、更改从的配置文件

server-id = 2
#主和从的id不能一样,从和从的id也不能一样
relay-log=relay-log-bin
#从服务器上获取二进制日志的开头,开启从库的二进制日志
relay-log-index=slave-relave-bin.index
#二进制日志的索引文件的名称
relay_log_recovery=1
#配置从服务器在启动时是否执行二进制日志的恢复操作(和主库同步),1表示开启。

2、创建从的用户并刷新

mysql> CREATE USER 'myslave'@'192.168.60.%' IDENTIFIED WITH mysql_native_password BY '123456';
​
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.60.%';
​
mysql> FLUSH PRIVILEGES;

3、

CHANGE master to master_host='192.168.60.91',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=855;
​
start slave;

4、查看

show slave status\G;
Slave_l0_Running: Yes
从库和主机的读写通信是否正常
Slave SQL Running: Yes
slave mysgl进程状态是否正常,

读写分离,MHA

主从的架构中,主库只负责写,从库只负责读。

读写分离的方式:

1、代码实现 开发人员纯靠代码完成,涉及到数据库的二次开发,性能好,不需要额外的硬件设备

2、中间层代理 代理服务器。在客户端和主从架构之间有一个代理服务器。代理服务器收到客户端的请求之后,通过客户端的sql语句进行判断,读转到从,写转到主。

Amoeba:读写分离最常见的客户端代理软件。java代码开发的一个软件。

192.168.60.91 mysql 8.0 主

192.168.60.92 mysql 8.0 从

192.168.60.93 mysql 8.0 从

192.168.60.30 jdk1.6 Amoeba 代理服务器

192.168.60.40 mysql maridb 客户端

操作:

1、安装java环境

[root@test3 opt]# ls
amoeba-mysql-binary-2.2.0.tar.gz  nginx-1.22.0
jdk-6u14-linux-x64.bin            nginx-1.22.0.tar.gz
[root@test3 opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@test3 opt]# cd /usr/local/
[root@test3 local]# chmod +x jdk-6u14-linux-x64.bin
[root@test3 local]#./jdk-6u14-linux-x64.bin
//按yes,按enter

2、将java环境的目录改个名字

[root@test3 local]#mv jdk1.6.0_14/ /usr/local/jdk1.6

3、增加java的环境变量

[root@test3 local]# vim /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/bin
[root@test3 local]# source /etc/profile         #重启配置文件

4、查看java的版本

[root@test3 local]# java -version
java version "1.6.0_14"

5、安装Amoeba软件

[root@test3 local]# mkdir /usr/local/amoeba
[root@test3 local]# cd /opt/
[root@test3 opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@test3 opt]# chmod -R 755 /usr/local/amoeba/
[root@test3 opt]# /usr/local/amoeba/bin/amoeba
amoeba start|stop       #显示这个就说明安装成功

6、在主的mysql上开发权限给Amoeba访问

CREATE USER 'amoeba'@'192.168.60.%' IDENTIFIED WITH mysql_native_password BY '123456';
​
GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.60.%';
​
GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.60.%';
​
flush privileges;

7、配置代理服务器的amoeba服务,更改配置文件amoeba.xml:

[root[root@test3 conf]# cp amoeba.xml amoeba.xml.bak
[root@test3 conf]# cp amoeba.xml amoeba.xml.bak     #备份配置文件
[root@test3 conf]# vim amoeba.xml30                                         <property name="user">amoeba</property>32                                         <property name="password">123456</property>
115                 <property name="defaultPool">master</property>
--117-去掉注释-
118                 <property name="writePool">master</property>
119                 <property name="readPool">slaves</property>

8、更改配置文件dbServers.xml

[root@test3 conf]# cp dbServers.xml dbServers.xml.bak
[root@test3 conf]# vim dbServers.xml
--23行--注释掉  作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->26                         <property name="user">amoeba</property>28                         <!--  mysql password -->29                         <property name="password">123456</property>45         <dbServer name="master"  parent="abstractServer">48                         <property name="ipAddress">192.168.60.91</property>52         <dbServer name="slave1"  parent="abstractServer">55                         <property name="ipAddress">192.168.60.92</property>
#复制上面6行粘贴,设置从服务器2的名slave2和地址58         <dbServer name="slave2"  parent="abstractServer">59                   <factoryConfig>60                           <!-- mysql ip -->61                           <property name="ipAddress">192.168.60.93</property>62                   </factoryConfig>63           </dbServer>65         <dbServer name="slaves" virtual="true">71                         <property name="poolNames">slave1,slave2</property>

9、查看端口是否起来

[root@test3 conf]# netstat -anpt | grep java
tcp6       0      0 127.0.0.1:36918         :::*                    LISTEN      20767/java          
tcp6       0      0 :::8066                 :::*                    LISTEN      20767/java          
tcp6       0      0 192.168.60.30:58678     192.168.60.91:3306      ESTABLISHED 20767/java          
tcp6       0      0 192.168.60.30:43590     192.168.60.93:3306      ESTABLISHED 20767/java          
tcp6       0      0 192.168.60.30:42896     192.168.60.92:3306      ESTABLISHED 20767/java   

10、在客户端上安装mariadb-server mariadb

[root@test4 ~]# yum install -y mariadb-server mariadb
[root@test4 ~]# systemctl start mariadb.service

11、在主从上开启查询日志

[root@mysql1 ~]# vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

12、在客户端服务器上测试:

mysql -u amoeba -p123456 -h 192.168.60.30 -P8066
MySQL [(none)]> use xy102;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
​
Database changed
MySQL [xy102]> create table test (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected, 1 warning (0.02 sec)
​
MySQL [xy102]> insert into test values('1','zhangsan','this_is_slave1');
Query OK, 1 row affected (0.01 sec)
​
MySQL [xy102]> select * from test;
+------+----------+----------------+
| id   | name     | address        |
+------+----------+----------------+
|    1 | zhangsan | this_is_slave1 |
+------+----------+----------------+
1 row in set (0.02 sec)
​
MySQL [xy102]> select * from test;
+------+----------+----------------+
| id   | name     | address        |
+------+----------+----------------+
|    1 | zhangsan | this_is_slave1 |
+------+----------+----------------+
1 row in set (0.01 sec)
#查询的时候两个从轮流转换(负载均衡)

总结+面试题

1、主从同步复制原理 2、读写分离你们使用什么方式? amoeba 代理 mycat 代码 sql_proxy 通过amoeba代理服务器,实现只在主服务器上写,只在从服务器上读; 主数据库处理事务性查询,从数据库处理select 查询; 数据库复制被用来把事务查询导致的变更同步的集群中的从数据库

3、如何查看主从同步状态是否成功 在从服务器上内输入 show slave status\G 查看主从信息查看里面有IO线程的状态信息,还有master服务器的IP地址、端口事务开始号。 当 Slave_IO_Running和Slave_SQL_Running都是YES时 ,表示主从同步状态成功

4、如果I/O不是yes呢,你如何排查? 首先排查网络问题,使用ping 命令查看从服务器是否能与主服务器通信 再查看防火墙和核心防护是否关闭(增强功能) 接着查看从服务slave是否开启 两个从服务器的server-id 是否相同导致只能连接一台 master_log_file master_log_pos的值跟master值是否一致

5、show slave status能看到哪些信息(比较重要) IO线程的状态信息 master服务器的IP地址、端口、事务开始的位置 最近一次的错误信息和错误位置 最近一次的I/O报错信息和ID 最近一次的SQL报错信息和id

6、主从复制慢(延迟)会有哪些可能?怎么解决? 主服务器的负载过大,被多个睡眠或 僵尸线程占用 导致系统负载过大,从库硬件比主库差,导致复制延迟 主从复制单线程,如果主库写作并发太大,来不及传送到从库,就会到导致延迟 慢sql语句过多 网络延迟

mysql主从复制

若主从版本不一致,从的版本一定要高于主,保证可以向下兼容 因为若主的版本更新,低版本的从无法兼容的。

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

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

相关文章

【React】package.json 文件详解

文章目录 一、package.json 文件的基本结构二、package.json 文件的关键字段1. name 和 version2. description3. main4. scripts5. dependencies 和 devDependencies6. repository7. keywords8. author 和 license9. bugs 和 homepage 三、package.json 文件的高级配置1. 配置…

分享一个Springer模板关于论文作者和单位信息的修改范例,以及Applied Intelligence期刊latex模板的下载链接

在这篇文章中&#xff0c;我写一些关于解决springer期刊提供的LaTex模板参考文献格式为作者年份时的顺序问题以及如何在正文中将参考文献格式引用成[1]这种数字格式类似的经验&#xff0c;该篇帖子里还分享了一个大佬关于springer模板完整的修改流程&#xff0c;有需要的伙伴可…

全球电脑蓝屏崩溃,为何中国没事?周鸿祎:因 90% 用 360 软件!

2024 年 7 月 19 日&#xff0c;出现了震惊世界的微软蓝屏事件&#xff0c;全球近千万台 Windows 设备集体蓝屏宕机&#xff01; 这次的事件绝对称得上是 “载入史册”&#xff01;甚至百度百科都专门针对这次的事件出了一个词条、央视新闻也专门报道了此事。 这次事件的影响有…

ActiViz实战:二维纹理贴图vtkTexture

文章目录 一、效果预览二、基本概念三、功能特性四、与C++不同五、完整示例代码一、效果预览 二、基本概念 vtkTexture是VTK(Visualization Toolkit)中用于纹理映射的一个类,它允许用户将二维图像(纹理)贴到三维物体的表面上,从而增加场景的真实感和细节。 纹理映射:是一…

PY32F071单片机,主频最高72兆,资源丰富,有USB,DAC,运放

PY32F071 系列单片机是基于32 位 ARM Cortex-M0 内核的微控制器&#xff0c;宽电压工作范围的 MCU。芯片嵌入高达 128 Kbytes flash 和 16 Kbytes SRAM 存储器&#xff0c;最高72 MHz工作频率。芯片支持串行调试 (SWD)。PY32F071单片机提供了包含了HAL和LL两种不同层次的驱动库…

自定义webIpad证件相机(webRTC)

该技术方案可用于各浏览器自定义相机开发 相机UI&#xff08;index.html&#xff09; <!DOCTYPE html> <html lang"zh" prew"-1"><head><meta charset"UTF-8"><meta name"viewport"content"user-sc…

Llama 3.1要来啦?!测试性能战胜GPT-4o

哎呀&#xff0c;Meta声称将于今晚发布的Llama 3.1&#xff0c;数小时前就在Hugging Face上泄露出来了&#xff1f;泄露的人很有可能是Meta员工&#xff1f; 还是先来看泄露出来的llama3.1吧。新的Llama 3.1模型包括8B、70B、405B三个版本。 而经过网友测试&#xff0c;该base…

Spark实时(二):StructuredStreaming编程模型

文章目录 StructuredStreaming编程模型 一、基础语义 二、事件时间和延迟数据 三、​​​​​​​​​​​​​​容错语义 StructuredStreaming编程模型 一、基础语义 Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表&#xff0c;数据源源不断的追…

年化22.8%的单因子分析:基于Alphalens做可转债全市场数据的单因子分析(附python代码+全量数据)

原创文章第597篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 因子分析是量化研究的基本技能之一。通过因子分析&#xff0c;找出有效的因子&#xff0c;通过相关性去重后&#xff0c;就可以通过机器学习、线性回归等方法把因子组合起来&#xf…

Linux基础学习day1

1.Linux系统介绍 1.常见的操作系统 1.Windows&#xff08;NT内核&#xff09;不开源 2.ubantu&#xff08;linux内核&#xff09; 3.ios&#xff08;unix内核&#xff09;不开源 4.鸿蒙&#xff08;兼容linux内核&#xff09; 5.Android&#xff08;linux内核&#xff09…

STM32(七):STM32指南者-通信实验

目录 一、基本概念通讯基本概念1、串行和并行2、同步通讯与异步通讯3、全双工、半双工、单工4、通讯速率 USART基本概念1、串口通讯基本概念2、物理层3、协议层4、指南者的串口USART I2C基本概念SPI基本概念 二、USART串口实验前期准备1、安装安装 USB 转串口驱动_CH3402、野火…

Git之repo sync -l与repo forall -c git checkout用法区别(四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

微信各平台历史版本含下载地址大全( 安卓 | Windows | MAC )

微信-windows-版本历史 https://github.com/tom-snow/wechat-windows-versions/releases 微信-windows-x86版本历史 https://github.com/tom-snow/wechat-windows-versions-x86/releases 微信安卓版本历史 https://github.com/DJB-Developer/wechat-android-history-version…

Apache DolphinScheduler 3.2.2 版本正式发布!

Apache DolphinScheduler 3.2.2 版本正式发布&#xff01; 近日&#xff0c;Apache DolphinScheduler 发布了 3.2.2 版本。此版本主要基于 3.2.1 版本进行了 bug 修复&#xff0c;新增若干特性&#xff0c;并进行了众多改进和 Bug 修复&#xff0c;以及文档修复等。 &#x1…

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29&#xff1a;滞回比较器&#xff08;施密特触发器&#xff09; 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓&#xff1a;施密特触发器&#xff0c;正反馈的妙用 参考链接4: 比较器反馈电阻选多大&#xff1f;理解滞后效应&#xff0c;轻…

【iOS】进程与多线程

目录 前言进程和线程进程和线程的区别多线程的意义时间片概念 线程的生命周期线程池的运行策略自旋锁和互斥锁自旋锁互斥锁自旋锁和互斥锁区别原子属性 iOS多线程技术方案 前言 学习此文&#xff1a;iOS多线程 在平时的iOS开发中&#xff0c;多线程是我们常会遇到的&#xff0…

新手教学系列——如何在MacOS 10.13.6(老系统)手动安装和配置Pyenv

前言 对于使用老旧系统&#xff08;如MacOS 10.13.6&#xff09;的用户来说&#xff0c;安装和管理Python版本可能会遇到一些挑战。特别是由于Homebrew不再支持老系统&#xff0c;许多软件安装变得困难重重。本文将详细介绍如何在这样的环境下手动安装和配置Pyenv&#xff0c;…

BGP选路之Next Hop

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较,以确定出去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较&#xff0c;从而决定是否将该最优BGP路由放进P路由表中…

数据代理实践

1&#xff0c;什么事数据代理机制&#xff1f; 通过访问 代理对象的属性 来向该访问 目标对象的属性 数据代理机制的视线需要依靠&#xff0c;Object.defineProperty()方法 2&#xff0c; ES6新特性&#xff1a; 在对象中的函数/方法 &#xff1a;function是可以省略的 &l…

宝塔国际版Docker Manager 3.4获取镜像列表报错解决办法

宝塔国际版安装Docker Manager 3.4,遇到获取镜像列表的时候报错。 解决办法 找到:/www/server/panel/plugin/docker/docker_main.py文件 替换函数utc_to_local 原代码 # UTC时间转换为时间戳def utc_to_local(self, utc_time_str, utc_format=%Y-%m-%dT%H:%M:%S):