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

主从复制和读写分离

MySQL 主从复制和读写分离:

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

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

1,异步复制:(MySQL的默认复制就是异步复制,最常用。只要执行完之后,客户端提交事务,主MySQL会立即把结果返回给从服务器,主服务器并不关心从服务器是否已经接受,并且处理。)

问题:主一旦崩溃,主MySQL的事务可能没有传到从MySQL,这个时候强行的把从提升为主,可能到新的主服务器数据不完整。(很少见。)

2,全同步复制,主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端。

因为需要等待所有从库全部执行完成,性能必然下降。(对数据一致性,和数据完整性要求很好的场景。)

3,半同步复制:介于异步和全同步复制之间。主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后才会返回给客户端。半同步在一定程度上提高了数据的安全性。也会有一定延迟。

这个延迟一般是一个tcp/ip的时间:从发送到接受的时间,单位是毫秒ms

时间<1ms: round-trip time RTT

架构:主从复制和读写分离:

mysql1 主

mysql2 从

mysql3 从

test1 读写分离的服务器

test2 客户端

实验:

主从复制

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

安装 ntp工具

yum -y install ntp

改ntp配置文件:

数字越小,时间的精确度越高,设置fudge 8 时间层级是8 最高到15。

从本地获取时间源,不从网络获取

从服务器执行同步命令

生成中会加一个定时任务

每30分钟同步一次

查看时间:

改主配置文件:

log-bin=master-bin #添加,主服务器开启二进制日志

binlog_format = MIXED

log-slave-updates=true

#添加,允许slave从master复制数据时可以写入到自己的二进制日志

进入服务器,新建一个用户,并授权:

GRANT REPLICATION SLAVE ON . TO 'myslave'@'192.168.176.%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

show master status;

靠位置点进行同步:

修改从数据库配置文件

每个id不能一样:

server-id = 2

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

relay_log_recovery = 1

relay_log_recovery=1

默认是0,1开启中继日志的复制。从服务器出现异常或者崩溃时,从服务器会从主服务器的二进制

server-id = 3

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

relay_log_recovery = 1

重启数据库

从服务器分别进入数据库:

mysql -u root -p123456;

和主进行同步:

CHANGE master to master_host='192.168.176.30',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;

启动同步:

start slave;

查看:

show slave status\G;

Slave_IO_Running: Yes #负责与主机的io通信

Slave_SQL_Running: Yes #负责自己的slave mysql进程

在主数据库创建库,表

从库也会跟着改变

面试题:如果slave io running no

1,网络问题

2,my.cnf 配置文件写错了

3,

4,防火墙和安全机制。

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

面试题:主从复制的延迟问题:

1,网络延迟

2,主从硬件设备(CPU主频,内存IO,硬件IO)。

3,同步复制而不是异步复制。

解决方案:

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

2,网络层面,主从服务器配置在一个局域网内,尽量避免跨网段和跨机房。

3,架构方面:读写分离,把写入控制在主库,从库负责读,降低从库的压力

4,配置方面 mysql配置。从配置文件的角度实现性能最大化

追求安全性的配置:

innodb_flush_log_at_trx_commit=1

每次事务提交时都会刷新事务日志。已确保持久性,最高级别的数据安全性,但是会响应性能,默认就是1

0就是事务提交时不会立刻刷新,而是每秒刷新一次。可以提高性能,但是发生故障会导致数据丢失。

2 事务提交时,事务日志不会写入硬盘而是保持在系统缓存,不会进行刷新。一定的安全性和性能。内存要求比较高。

sync_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存储引擎的缓冲池大小,设置的s值越高,可以提高innodb的性能。

更多的数据和索引都可以缓存在内存中。减少磁盘的访问次数。对系统内存要求比较高。

主从复制的一个工作过程:

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

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

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

主从复制的问题:

1,只能在主库上发生变化,任何同步到从。

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

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

mysql主从复制

若主从版本不一致,从的版本一定要高于主,保证可以向下兼容

因为若主的版本更新,低版本的从无法兼容的

读写分离:

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

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

为什么要有读写分离:

1,数据库在写入数据时,比较耗时(mysql写一万条数据 3分钟)

2,数据库在读的时候,速度很快(读一万,5秒)

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

在什么场景下需要读写分离:

只有在某些程序在使用数据库过程中,更新少,但是查询比较多,这种情况可用考虑读写分离。

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

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

测试库一般不管。

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

mysql读写分离的原理:

1,根据脚本实现。在代码中实现路由分类。select insert 进行路由分类。这种方式是最多的。

性能好,在代码中可用实现,不需要额外的硬件设备

缺点:开发实现的,跟我们无关。如果大型的复制的应用,设计改动的代码非常多。

2,基于中间代理层实现:

mysql-proxy自带的开源项目,基于自带的lua脚本。这些lua脚本不是现成的,,要自己写,不熟悉他的内置变量写不出来的 atlas 360内部做自己代理工具。每天的读写请求承载量可用到几十亿条。支持事务,支持存储过程。

3,Amoeba 陈思儒,之前在阿里就职。是由java开发的一个开源团建。不支持事务,也不支持存储过程。但是Amoeba还是用的最多的功能比较强大的软件。

实验:

mysql1 主

mysql2 从

mysql3 从

test1 读写分离的服务器 Amooeba

test2 客户端

修改java环境

查看java环境:java -version

基于 jdk1.5开发的,官方推荐的

更换java环境

cd /opt/

cp jdk-6u14-linux-x64.bin /usr/local/

cd /usr/local/

chmod +x jdk-6u14-linux-x64.bin

./jdk-6u14-linux-x64.bin

//按yes,按enter

mv jdk1.6.0_14/ /usr/local/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

使文件立即生效:source /etc/profile

java -version

安装amoeba

在opt目录下创建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赋权

grant all on *.* to amoeba@'192.168.176.%' identified by '123456';

flush privileges;

在amoeba服务器修改配置文件:

cd /usr/local/amoeba/conf/

配置用户信息:

配置数据库信息:

备份

cp amoeba.xml amoeba.xml.bak

改配用户信息:

vim amoeba.xml

--30行--

amoeba

--32行--

123456

--115行--

master

--117-去掉注释-

master

slaves

修改数据库信息:

cp dbServers.xml dbServers.xml.bak

vim dbServers.xml

--23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错

--26--修改

amoeba

--28-30--去掉注释

123456

--45--修改,设置主服务器的名Master

--48--修改,设置主服务器的地址

192.168.233.21

--52--修改,设置从服务器的名slave1

--55--修改,设置从服务器1的地址

192.168.233.22

--58--复制上面6行粘贴,设置从服务器2的名slave2和地址

192.168.233.23

--65行--修改

--71行--修改

slave1,slave2

启动Amoeba软件:

/usr/local/amoeba/bin/amoeba start &

查看8066端口是否开启

netstat -anpt | grep java

测试读写分离:

客户端安装 mariadb

yum install -y mariadb-server mariadb

systemctl start mariadb.service

修改三台mysql生成日志文件

最后一行添加:

general_log=ON

general_log_file=/usr/local/mysql/data/mysql_general.log

三台库打开日志

tail -f /usr/local/mysql/data/mysql_general.log

在客户端对表进行写入时三个日志都会有显示

查看表只有一台从库有记录,而且会轮询记录:

相关文章:

主从复制和读写分离

MySQL 主从复制和读写分离&#xff1a; 主从复制&#xff1a;主MySQL上的数据&#xff0c;新增&#xff0c;修改库&#xff0c;表&#xff0c;表里的数据&#xff0c;都会同步到从MySQL上。 MySQL的主从复制的模式&#xff1a;&#xff08;面试题&#xff09; 1&#xff0c;异…...

Redis模块的高级使用方式

Redis 模块是Redis的高级功能&#xff0c;允许我们实现特定的自定义数据类型。本质上&#xff0c;模块是一个动态库&#xff0c;可以在启动时或根据命令按需加载到 Redis 中 MODULE LOAD 。模块可以用多种语言编写&#xff0c;包括 C 和 Rust。 我们自己使用 Redis 模块实现新…...

Failed to restart network.service: Unit network.service not found.

执行systemctl restart network命令&#xff0c;报错Failed to restart network.service: Unit network.service not found. 执行 yum install network-scripts命令 再次执行&#xff0c;正常...

wiki.js一个开源知识库系统

1 什么是wiki wiki.js是一个开源Wiki应用程序&#xff0c;官网介绍为&#xff1a; A modern, lightweight and powerful wiki app built on NodeJS 访问Github&#xff1a;github 访问Wike&#xff1a;js.wiki 省流总结 开源知识库平台&#xff0c;和语雀有一样的功能&…...

关于Java抽象类和接口的总结和一点个人的看法

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ ა 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶个人主页&am…...

vue中ref的用法

vue中ref的用法 在项目中使用ref时有时候直接取值,有时候返回的却是一个数组,不知其中缘由,后查了一下ref用法,所以总结一下. 1.绑定在dom元素上时&#xff0c;用起来与id差不多&#xff0c;通过this.$refs来调用: <div id"passCarEchart" ref"passCarEch…...

【华为OD题库-012】模拟消息队列-Java

题目 让我们来模拟一个消息队列的运作&#xff0c;有一个发布者和若干消费者 &#xff0c;发布者会在给定的时刻向消息队列发送消息。>若此时消息队列有消费者订阅&#xff0c;这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个。>若此时…...

Android修行手册 - 阴影效果的几种实现以及一些特别注意点

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…...

【星海出品】SDN neutron (五) openvswitch

1、ovs-vswitchd组件是交换机的主要模块&#xff0c;运行在用户态&#xff0c;其主要负责基本的转发逻辑、地址学习、外部物理端口绑定等。还可以运用OVS自带的ovs-ofctl工具采用openflow协议对交换机进行远程配置和管理。 2、ovsdb-server组件是存储OVS的网桥等配置、日志以及…...

springboot整合vue2实现简单的新增删除,整合ECharts实现图表渲染

先看效果图&#xff1a; 1.后端接口 // 查询所有商品信息 // CrossOrigin(origins "*")RequestMapping("/list1")ResponseBodypublic List<Goodsinfo> list1(){List<Goodsinfo> list goodsService.list();return list;}// 删除 // …...

<蓝桥杯软件赛>零基础备赛20周--第5周--杂题-2

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

数据结构哈希表(散列)Hash,手写实现(图文推导)

目录 一、介绍 二、哈希数据结构 三、✍️实现哈希散列 1. 哈希碰撞&#x1f4a5; 2. 拉链寻址⛓️ 3. 开放寻址⏩ 4. 合并散列 一、介绍 哈希表&#xff0c;也被称为散列表&#xff0c;是一种重要的数据结构。它通过将关键字映射到一个表中的位置来直接访问记录&#…...

【嵌入式设计】Main Memory:SPM 便签存储器 | 缓存锁定 | 读取 DRAM 内存 | DREM 猝发(Brust)

目录 0x00 便签存储器&#xff08;Scratchpad memory&#xff09; 0x01 缓存锁定&#xff08;Cache lockdown&#xff09; 0x02 读取 DRAM 内存 0x03 DREM Banking 0x04 DRAM 猝发&#xff08;DRAM Burst&#xff09; 0x00 便签存储器&#xff08;Scratchpad memory&#…...

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…...

python图神经网络,注意力机制、Transformer模型、目标检测算法、强化学习等

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛 本文重点为&#xff1a;注意力机制、Transformer模型&#xff08;BERT、GPT-1/2/3/…...

安装包 amd,amd64, arm,arm64 都有什么区别

现在的安装包也不省心&#xff0c;有各种版本都不知道怎么选。 根据你安装的环境配置。 amd&#xff1a; 32位X86 amd64&#xff1a; 64位X86 arm&#xff1a; 32位ARM arm64&#xff1a; 64位ARM amd64是X86架构的CPU&#xff0c;64位版。amd64又叫X86_64。主流的桌面PC&am…...

Ansible 企业实战详解

一、ansible简介1. ansible是什么2.ansible的特点ansible的架构图 二、ansible 任务执行1、ansible 任务执行模式2、ansible 执行流程3、ansible 命令执行过程 二 .Ansible安装部署1.yum安装2.ansible 程序结构3、ansible配置文件查找顺序4、ansible配置文件5.ansible自动化配置…...

云贝教育 |【技术文章】pg缓存插件介绍

一、pg_buffercache 主要作用是查看pg的共享池中缓存的对象信息 1.1 创建扩展 postgres# create extension pg_buffercache; CREATE EXTENSION 1.2 查看视图pg_buffercache postgres# \d pg_buffercacheView "public.pg_buffercache"Column | Type | Co…...

Kohana框架的安装及部署

Kohana框架的安装及部署 tipsKohana安装以及部署1、重要文件作用说明1.1 /index.php1.2 /application/bootstrap.php 2、项目结构3、路由配置3.1、隐藏项目入口的路由3.2、配置默认路由3.3、配置自定义的路由(Controller目录下的控制器)3.4、配置自定义的路由(Controller/direc…...

无重复字符的最长子串 Golang leecode_3

刚开始的思路&#xff0c;先不管效率&#xff0c;跑出来再说&#xff0c;然后再进行优化。然后就有了下面的暴力代码&#xff1a; func lengthOfLongestSubstring(s string) int {// count 用来记录当前最长子串长度var count int// flag 用来对下面两个 if 语句分流var flag …...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...