数据的复制
基本概念
数据的复制指的是通过网络链接的多台机器保留相同的副本
- 为什么要进行数据的复制
- 使得用户和数据在地理上比较接近,因为大数据要求我们将计算安排在数据存放的位置和我们基本的内存模型不是很一样 ,比如磁盘调入内存之类的。
- 即使系统的一部分机器出现了故障,系统也能正常工作,这个指的是如果一个节点出现宕机,应该怎么处理才能使系统正常工作。
- 扩展可以接收读请求机器的数量,如果有很多个机器进行读,如果只有一个副本的话,那么系统就会发生崩溃,有点类似于DNS泛洪攻击的原理。
领导者和追随者的复制
我们这里假设的情景是基于领导者的复制或者是说主从库的复制。
- 副本的概念:
当有多个副本的时候我们会思考几个问题,当存储多个副本的时候如何确保所有的数据落到所有的副本上,就类似于通知从教学秘书下放到计算学部大群, 我们到底是采用让所有的同学向教学秘书确认他收到消息了才算下放完成,还是说让辅导员老师通知班长下放消息 然后反馈给教学秘书我已经全通知完了。 - 同步和异步的优劣
同步的好处是可靠性很高 但是缺点是消耗资源,异步的优点
我们发现follower1的复制是同步的 但是2的复制是异步的 - 半同步
实际上 数据库大多是采用半同步复制的策略,也就是上面的图展示的样子,指定一个主库,并且从中指定一个从库使得主库和从库的复制是同步的,主库和其他从库的复制是异步的。这样的好处是如果一个主库发生的宕机,那么我们指定好了一个新的主库之后就把这个同步的从库的内容直接复制过去就行了。 - 半同步背景下,节点的加入节点的宕机复制日志的实现细节
我们采用比较多的是半同步复制,那么我们不妨看下底层的具体是如何实现的
由于大数据具有实时性的特点,任何时候都可能发生数据的更新,所以我们从库拉取的数据也未必是最新的数据,我们的数据库需要进行如下处理:首先拉取主库的一致性快照,快照复制到新的从库节点,然后将这些快照复制到新的从库节点,之后从库连接主库,并拉取复制快照之后的所有变更,这样新的节点就赶上主库了。
系统中任何的节点都可能宕机:包括主库 从库1 从库n也就是大老板 小老板 打工人都有可能出现故障,如果是从库发生故障 那么解决的方法非常简单,就是和新加入的节点的方法类似,首先修好之后,从库连接主库,并拉取宕机之后的日志,完成追赶。。主库发生故障这个问题是非常棘手的,首先我们需要考虑选谁充当主库,这个可以通过选举产生,也就是统计相同副本数量的个数来选举其次有可能出现两个或者多个从库同时充当主库的情况(类似于汉高祖失去权力之后 各路诸侯纷争)这个时候就会出现一个脑裂的情况,解决方法很粗暴如果两个的话随机关闭一个。还有一个问题就是可能会存在冲突的写入,老领导回来之后可能会产生冲突的写入,避免冲突写入的方法就是忽略老节点的写入,但是这样会破坏数据的持久性写入的原则。
- 日志的复制:
- 基于语句的复制:主库想要写入什么内容,比如情景是关系数据库update或者是delete之类的语句,但是这样可能会产生一想不到的后果,比如我让你们寝室的人都去老师那签到,本来老师以为是239的人是小明和小方,但是这两个人串寝室了,所有结果是小红和小绿去老师那报道了,所以除非有特别确定的结果,基于语句的复制是不好的。
- 传输预写日志:缺点是需要和存储引擎打交道,时间开销比较大。
- 逻辑日志的复制:基于行的复制,有利于向后兼容不同的数据库存储软件。
- 基于触发器的复制:
复制的延迟
- 复制的另外一个原因是适用于读多写少的情景,我们回顾一下 数据库更新的过程,如果一个客户想要往数据库写数据,首先发送请求给领导者,领导者收到数据之后写入其本地的存储,从库也被称作是只读副本,他不会直接读取数据,领导者将新的数据变更发送给所有的追随者,也就是复制日志记录,每个追随者拉取日志更新更新本地的数据库副本,那么就回到了我们数据复制的第三点原因,扩展可读机器的数量。
- 最终一致性,在不发生错误的情况下 主库和从库数据保持一致性的状态叫做最终一致性。
- 读己之写,我们写入数据库之后想要快速的看到自己的更新,一种方法是直接看自己从主库,看别人从其他的库读,第二种方法是检测状态。
多主复制
- 数据中心内部:采用主从复制的原则
- 数据中心之间:采用多主复制的原则
对比内容 | 单主复制 | 多主复制 |
---|---|---|
出现故障时 | 故障切换让数据中心的一个追随者成为领导者 | 每个数据中心可以独立于其他数据中心运行,并且发生故障时的数据中心归队时复制会自动赶上 |
容忍网络 | 敏感,因为写操作是同步的 | 临时的网络中断不影响写入 |
应用场景 | 离线的客户端 |
并发控制,当多个人写入的时候可能存在冲突解决的方法是加锁 或者是根据时间戳设置ID 或者是在读取的时候设置限制。
相关文章:

数据的复制
基本概念 数据的复制指的是通过网络链接的多台机器保留相同的副本 为什么要进行数据的复制 使得用户和数据在地理上比较接近,因为大数据要求我们将计算安排在数据存放的位置和我们基本的内存模型不是很一样 ,比如磁盘调入内存之类的。即使系统的一部分…...

【辐射场】3D Gaussian Splatting
三维高斯…喷喷 \, 3D Gaussian Splatting,下文简称3DGS,是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。 它属于基于图像的三维重建方法,意思就是你对现实物体或者场景拍照片,就能给你训练成一个场景模型&a…...

冒泡排序--------(C每日一题)
冒泡排序: 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论: n个数要进行n-1轮比较,第j轮要进行n-j次两两比较 循环体代码: int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…...
每日一练:LeeCode-347. 前 K 个高频元素(中) - 【优先级队列】
本文是力扣LeeCode-347. 前 K 个高频元素 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输…...

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上答疑&#x…...

PowerShell Instal 一键部署TeamCity
前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…...

将“渴望“乐谱写入AT24C02并读出播放
#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…...

Vue独立组件开发-动态组件
文章目录 一、前言二、实现三、优化四、总结五、最后 一、前言 在开发中,你经常会遇到这么一种情况:根据条件动态地切换某个组件,或动态地选择渲染某个组件。 Vue 提供了另外一个内置的组件 <component> 和 is 特性,可以更…...
前端八股文(HTML篇)
目录 1.什么是DOCTYPE,有何用呢? 2.说说对html语义化的理解 3.src和href的区别? 4.title与h1的区别,b与strong的区别,i与em的区别? 5.什么是严格模式与混杂模式? 6.前端页面有哪三层构成,分…...
RivaGAN 水印项目
git地址 https://github.com/DAI-Lab/RivaGAN Dockerfile (/tools下文件为git下的文件) ############################################### # 使用 NVIDIA CUDA 10.0 开发环境作为基础镜像 FROM kaldiasr/kaldi:gpu-ubuntu18.04-cuda10.0 # 设置非交互式安装模式以避免某些命…...

Games101作业5
1.实现Renderer.cpp 中的 Render():为每个像素生成光线 这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 我们要做的就是将屏幕空间下的坐标最后转换到世界空间的坐标…...
Golang解决跨域问题【OPTIONS预处理请求】
Golang解决跨域问题 前置知识:跨域问题产生条件及原因 跨域是是因为浏览器的同源策略限制,是浏览器的一种安全机制,服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口,三者有任一不相同即会产生跨域…...
复试 || 就业day05(2023.12.31)算法篇
文章目录 前言找不同最长回文串找到所有数组中消失的数字下一个更大元素 I键盘行 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台 💫…...

Spring-4-代理
前面提到过,在Spring中有两种类型的代理:使用JDK Proxy类创建的JDK代理以及使用CGLIB Enhancer类创建的基于CGLIB的代理。 你可能想知道这两种代理之间有什么区别,以及为什么 Spring需要两种代理类型。 在本节中,将详细研究代理…...

设计模式:抽象工厂模式(讲故事易懂)
抽象工厂模式 定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。 设计模式有三大分类:创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…...
C语言中的Strict Aliasing Rule
文章目录 前言没有警告不代表没有问题目前的应对方法 前言 很久没写了,水一篇。 最近有个代码在gcc 4.8.5上编译失败。编译失败的提示是: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werrorstrict-aliasing]查了下…...

单字符检测模型charnet使用方法,极简
Git链接 安装按照上面的说明,说下使用。 把tools下面的test做了一点修改,可以读取一张图片,把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…...

Erlang、RabbitMQ下载与安装教程(windows超详细)
目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址:Installing on Windows — RabbitMQ,找到 2.配置RabbitMQ环境变量࿰…...

2023年终总结丨很苦,很酷!
文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址:https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…...

鸿蒙 DevEco Studio 3.1 入门指南
本文主要记录开发者入门,从软件安装到项目运行,以及后续的学习 1,配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成,按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...