当前位置: 首页 > news >正文

mysql的主从复制和读写分离

1、主从复制的模式

1.1mysql的默认模式

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

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

特点:快,效率高

1.2全同步模式

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

特点:安全,但是性能受到影响

1.3半同步复制

介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库。同步完成之后有一个等待时间,等待时间是一个tcp/ip的往返时间,在5毫秒左右

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

2、主从复制的特点

架构模式:高可用架构一般都是奇数台。小架构

一般是一主两从,大一点的是二主三从

主可以复制到从,从不可以复制到主

主主模式:都是主,可以互相复制

3、主从复制的延迟

3.1如何解决

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

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

3、配置文件写错了

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

数据库的存储引擎要是innodb

查看:vim /etc/my.cnf

3.2双一设置

innodb_flush_log_at_trx_commit=1

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

sync_binlog=1

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

3.3性能化设置

sync_binlog=N

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

innodb_flush_log_at_trx_commit=2

每次更新都保存在内存中,不进行刷新

innodb_buffer_pool_size=60m

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

4、主从复制如何实现

实现是基于mysql二进制日志,根据主库的二进制文件的标志位,实现主和从的分布

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

架构

三台服务器:192.168.230.21 mysql8.0主

                     192.168.230.22 mysql8.0从

                     192.168.230.23 mysql8.0从

systemctl  stop firewalldsetenforce 0#安装ntpdate
yum -y install ntpdate#date查看时间是否同步
如果不同步 ntpdate ntp.aliyun.com#配置主vim /etc/my.cnf
log-bin=master-bin
binlog_format=MIXED
log-slave-updates=true
#允许从服务器从主库复制数据时,可以写入从库自己的二进制日志当中#重启mysqld,进入数据库mysql -u root -p123456
CREATE USER 'myslave'@'192.168.230.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.230.%';
FLUSH PRIVILEGES;show master status;查看position#配置从1vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
#从服务器上获取二进制日志的开头,开启从库的二进制日志
relay-log-index=slave-relay-bin.index
#二进制日志的索引文件的名称
relay_log_recovery=1
#配置从服务器在启动时是否执行二进制日志的回复操作(和主库同步),1表示开启#重启mysql#配置从2vim /etc/my.cnf
server-id=3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1#重启mysql#进入从数据库mysql -u root -p123456
CREATE USER 'myslave'@'192.168.230.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.230.%';
FLUSH PRIVILEGES;
change master to master_host='192.168.230.21',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=857;start slave;
show slave status\G;
#查看主从是否同步Slave_IO_Running: Yes
#从库和主机的读写通信是否正常
Slave_SQL_Running: Yes
#slave mysql进程状态是否正常

5、读写分离

5.1原理

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

5.2读写分离的方式

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

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

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

5.3实现读写分离

架构:

192.168.230.21 mysql8.0主

192.168.230.22 mysql8.0从

192.168.230.23 mysql8.0从

192.168.230.20 jdk1.6 amoeba 代理服务器

192.168.230.30 mysql maridb 客户端

实验步骤:

systemctl stop firewalldsetenforce 0#安装java
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local
[root@localhost opt]# cd /usr/local#给执行权限
[root@localhost local]# chmod 777 jdk-6u14-linux-x64.bin#执行
[root@localhost local]# ./jdk-6u14-linux-x64.bin#改名
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6#打开全局配置文件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@localhost local]# source /etc/profile#查看版本号
[root@localhost local]# java -version#创建目录,解压amoeba
[root@localhost opt]# mkdir /usr/local/amoeba
[root@localhost opt]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz  -C /usr/local/amoeba#赋权
[root@localhost local]# chmod -R 755 /usr/local/amoeba#查看是否安装成功
[root@localhost local]# /usr/local/amoeba/bin/amoeba
amoeba start|stop#进入主库
[root@localhost ~]# mysql -u root -p123456#创建用户
mysql> CREATE USER 'amoeba'@'192.168.230.%' IDENTIFIED WITH mysql_native_passwword BY '123456';#赋权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.230.%';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.230.%';#刷新
mysql> flush privileges;#进入代理服务器
[root@localhost ~]# cd /usr/local/amoeba/conf#复制
[root@localhost conf]# cp amoeba.xml amoeba.xml.bak.2024.07.23#打开主配置文件vim amoeba.xml
30行 
<property name="user">amoeba</property>       <property name="password">123456</property> 115行
<property name="defaultPool">master</property>117行取消注释
<property name="writePool">master</property>
<property name="readPool">slaves</property>#复制
[root@localhost conf]# cp dbServers.xml dbServers.xml.bak.2024.07.23#进入配置文件vim dbServers.xml
23行注释掉
<!-- mysql schema                    <property name="schema">test</property>
-->27行
<property name="user">amoeba</property>29行取消注释
30行
<property name="password">123456</property>46行
<dbServer name="master"  parent="abstractServer">
49行
<property name="ipAddress">192.168.230.21</    property>53行
<dbServer name="slave1"  parent="abstractServer">
56行
<property name="ipAddress">192.168.230.22</property>添加一个dbserver
<dbServer name="slave2"  parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.230.23</property>
</factoryConfig>
</dbServer>66行
<dbServer name="slaves" virtual="true">72行
<property name="poolNames">slave1,slave2</p    roperty>#开启服务
[root@localhost conf]# /usr/local/amoeba/bin/amoeba start &#查看端口8066是否开启
[root@localhost conf]# netstat -antp | grep java#客户端安装mariadb
[root@localhost ~]# yum -y install mariadb-server mariadb#回到数据库,打开主从的日志vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log#重启mysql主从库访问日志
[root@localhost data]# tail -f mysql_general.log#代理服务器登录数据库
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.230.20 -P8066#创建一个表test01,查看日志此时主从库都有记录
查询test01,主库没有记录,从库有
插入数据1000,主从都有记录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java二十三种设计模式-代理模式模式(8/23)
  • 正点原子imx6ull-mini移植文件系统
  • 视频加密软件哪个好?怎么进行视频文件加密?
  • pyenv-win | python版本管理,无需卸载当前版本
  • 上传文件传参 pc端vue的formData
  • Jenkins集成JDK、git、gitee、maven逐步实现自动拉取,自动部署,自动启动
  • 重塑生态体系 深挖应用场景 萤石诠释AI时代智慧生活新图景
  • 前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)
  • 嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)
  • hamcrest 断言框架使用示例和优势分析
  • 与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙
  • 【ffmpeg命令入门】视频的旋转与翻转
  • 搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)
  • MongoDB多数据源配置与切换
  • Flink 技术与应用(一)
  • 4. 路由到控制器 - Laravel从零开始教程
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js如何打印object对象
  • Mybatis初体验
  • node和express搭建代理服务器(源码)
  • oschina
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • springboot_database项目介绍
  • 编写高质量JavaScript代码之并发
  • 创建一种深思熟虑的文化
  • 番外篇1:在Windows环境下安装JDK
  • 分布式熔断降级平台aegis
  • 简单基于spring的redis配置(单机和集群模式)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 新书推荐|Windows黑客编程技术详解
  • 用jQuery怎么做到前后端分离
  • PostgreSQL之连接数修改
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 积累各种好的链接
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 如何正确理解,内页权重高于首页?
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #每日一题合集#牛客JZ23-JZ33
  • $.proxy和$.extend
  • ( 10 )MySQL中的外键
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (四) 虚拟摄像头vivi体验
  • (四)JPA - JQPL 实现增删改查
  • (四)模仿学习-完成后台管理页面查询
  • (五)IO流之ByteArrayInput/OutputStream
  • (自用)仿写程序
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 5种线程安全集合
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET gRPC 和RESTful简单对比
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 怎么循环得到数组里的值_关于js数组