探讨如何实现数据同步的架构和网络协议

一、背景

(一)当前为了后端网络程序的高并发和高可用,总是需要多台服务器一起协调工作,它们可能负责不同的模块(属于分布式),也可能多台提供相同的功能(属于集群)。

(二)为了解决读写分离的主从架构的数据库同步问题,需要数据库支持集群和同步。

(三)为了让请求均匀合理的分摊到每台服务器处理,需要解决负载如何均衡的问题(一般用nginx代理和分摊请求)。


二、本文目的

探讨多台数据库服务器如何来数据同步,以及设计简单的网络同步协议。


三、多台数据库的连接方式

(一)主从分离方式

1、根据实际的平均请求量,可能大多数是读取数据库记录,少数是更新数据库记录;也有可能相反。

需要综合查询耗时,更新耗时,操作平均类型数量占比来分析和决策(没差别可以不分离)。

2、因为平时大部分用户可能只是调用数据库的查询功能,只有少部分才调用更新功能(新增、删除、更新)。

3、设计应用程序时根据功能选择对应的数据库执行。

4、更新数据库会和每个查询数据库建立连接,发送最新的更新记录进行更新。


(二)设计数据库的链式结构

1、指的是每台数据库除了和应用服务器建立网络连接外,还设计数据库的串联链式网络结构。

2、链式结构指的是一个接一个连在一起,构成一条线。

3、可能用来更新的数据库在第一个,查询的数据库都接在后面。

4、我觉得优点是每相邻的两个数据库有建立双工的通信网络;

5、当信息同步时,只需要第一个更新数据库把更新的记录传给下一台数据库,然后继续传给下一台,最后每一台都获得最新的数据更新。

6、每一台查询数据库获取更新记录后,进行更新,还要反馈结果给上一台库,进行重发,然后重新更新。

7、要注意时间戳,防止重复更新。

8、缺点是容易断链,导致后面联系不通,无法更新。


(三)设计星型的连接方式

1、除了和应用系统有网络连接,每个数据库还和一台中心交换服务器建立双向网络连接。

2、更新时由更新数据库发送最新记录给中心交换服务器。

3、中心交换服务器会把最新记录发给每台查询数据库进行更新。

其他:如果用交换机或者路由器把数据库连接在一起,还可以采用UDP协议的网关广播方式来同步最新数据。缺点是不可靠,需要实现可靠机制。


四、发现数据库的记录更新的机制

(一)日志记录
数据库有日志,当执行更新操作时会写入对应的SQL语句,用一个后台进程不断的扫描和监听就能知道记录发生更新,就能进行同步操作。

该机制方便用户的使用,能自动发现更新,自动同步。


(二)应用层面的主动更新
如果用户提交更新操作后,在执行时,同时把该操作在查询数据库中操作,这样可能会增加时间。

改进方式为:把同步操作提交给消息队列后返回结果给用户,查询数据库获取消息后执行。


五、猜测监听数据库更新日志的思路

(一)第一种、主动循环扫描方式

进入循环(退出为假):
1、获取日志的最新修改时间。

2、和当前日期比较,判断是否改变。

3、如果改变,跳跃到上次的文件指针位置,开始读取日志中的更新记录,直到末尾;
处理后开始同步给其他数据库。

记录最新的文件指针读取位置。

4、如果没有改变,休眠几毫秒,继续循环。


(二)第二种、事件触发方式

1、当数据库执行到更新语句,并且产生了更新日志,就开启一个线程或者进程来同步。

2、开启的进程或者线程执行逻辑和第一种方法的循环体逻辑一样,不需要循环,执行同步后就退出该异步线程或者异步进程。


六、设计一个同步数据库记录的网络协议格式

(一)文本格式(适合SQL语句)

1字节开头符

2字节发送者标志

8字节发送时毫秒数

2字节保留符

任意长度的SQL语句字符

1字节ASCII码为0的结尾符


(二)二进制格式(特殊形式,传输表的字段值)

1字节操作类别(插入、修改、新增)

2字节发送者标志

8字节发送时的毫秒数

任意长度的数据库名字组成的字节

1字节值为0的字节(间隔符)

任意长度的表名组成的字节

ASCII码为0的字节(间隔符)

2字节数据长度

指定长度的记录负载(UTF8或者GBK格式)


(三)同步结果(通用的)

1字节类型(执行结果,成功为1,失败为0)
2字节保留
2字节影响记录数
1字节文本长度值
指定长度的执行结果文本信息
1字节结尾符(一般为字节0)


七、查询数据库收到更新信息的反应

1、监听同步网络连接的线程阻塞等待。

2、收到同步网络数据,读取到内存。

3、调用执行方法执行SQL语句。
可能需要控制事务。

4、按照结果协议格式回复执行结果。

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

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

相关文章

智能电网与微电网:引领电力未来的创新力量

随着能源需求持续增长和环保压力日益加大,电力行业正面临前所未有的挑战与机遇。在这一背景下,智能电网和微电网作为新兴的技术应用方向,以其独特的优势和潜力,正逐步成为推动电力领域可持续发展的关键力量。 智能电网&#xff0…

leetcode387:字符串中的第一个唯一字符

题目链接&#xff1a;387. 字符串中的第一个唯一字符 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int firstUniqChar(string s) {unordered_map<char, int> mapch;for(auto c : s){mapch[c];}for(int i 0; i < s.size(); i){if(mapch[s[i]] …

【java问答小知识6】一些Java基础的知识,用于想学习Java的小伙伴们建立一些简单的认知以及已经有经验的小伙伴的复习知识点

请解释Java中的双亲委派模型是什么&#xff1f; 回答&#xff1a;双亲委派模型是Java类加载机制的核心原则&#xff0c;它确保所有类加载器在尝试加载一个类之前&#xff0c;都会委托给它的父类加载器。 Java中的类路径&#xff08;Classpath&#xff09;是什么&#xff1f; 回…

2024.6.10 刷题总结

2024.6.10 **每日一题** 881.救生艇&#xff0c;依据题意可以看出这道题是一道贪心的题目&#xff0c;即越多地安排两个人坐一艘船更好&#xff0c;所以我们想到每次都用最小和最大的组合&#xff0c;判断是否能够合并&#xff0c;故需要先进行排序&#xff0c;然后利用双指针…

svnadmin备份和还原

背景 客户操作系统重启文件损坏&#xff0c;操作系统无法重启&#xff0c;只能恢复到之前的快照。恢复快照导致最近操作的数据丢失&#xff0c;需要进行恢复。 客户的IT任务已经把SVN数据所在盘挂到新操作系统F盘&#xff0c;试用svnadmin dump/load命令进行备份和恢复。 当…

使用 AWK 为特定行添加编号并打印

在数据处理和文件操作中&#xff0c;经常需要根据特定规则处理文本文件。在这篇博文中&#xff0c;我们将展示如何使用 AWK 这一强大的文本处理工具&#xff0c;为不以字母 A、B、C、D 开头的行添加编号并打印&#xff0c;而直接打印以这些字母开头的行。 为什么选择 AWK&…

【车载开发系列】MCU选型

【车载开发系列】MCU选型 【车载开发系列】MCU选型 【车载开发系列】MCU选型一. 重要概念二. MCU选型的风险风险1风险2 三. MCU选型要点四. MCU选型维度五. MCU 选型需要考虑的因素1&#xff09;ROM/RAM2&#xff09;速度/主频3&#xff09;分析外设需求4&#xff09;工作电压(…

设计模式- 责任链模式(行为型)

责任链模式 责任链模式是一种行为模式&#xff0c;它为请求创建一个接收者对象的链&#xff0c;解耦了请求的发送者和接收者。责任链模式将多个处理器串联起来形成一条处理请求的链。 图解 角色 抽象处理者&#xff1a; 一个处理请求的接口&#xff0c;可以通过设置返回值的方…

codesys【CAN总线】

1下载设备描述文件&#xff1a; 必须下载设备描述文件&#xff0c;要不然编程软件无法正确组态。 根据实际设备【品牌】去官网搜索下载。 以 DMA882-CAN 为例 CAN的设备描述文件是【.eds】的扩展名 安装设备描述文件。 2添加CAN总线&#xff1a; 1添加【CAN总线】&#xff1a…

同盾中文点选验证码识别方法

中文验证码一直是识别的难题&#xff0c;首先他分类的种类很多&#xff0c;常见中文都有3500个&#xff0c;而且一般中文验证码都会有变形&#xff0c;导致每一个文字都需要大量训练样本。假设每一个汉字样本需要100个&#xff0c;100350035万个样本&#xff0c;所以标记的样本…

excel拖拽怎么使单元格序号不递增

拖拽下来不仅不递增&#xff0c;而且右下角没有倒三角可以设置改变&#xff0c;&#xff08;即没有下图这个&#xff09; 则&#xff0c;可以采用以下方法 excel数值拖拽不递增还有一个更快更快捷的方法&#xff0c;这就运用到了excel快捷键&#xff0c;我们把鼠标放到单元格的…

C/C++|Pimpl Idiom(Pointer to IMPLementation) 指针实现模式浅析

Pimpl Idiom&#xff08;Pointer to IMPLementation&#xff09;&#xff0c;也称为 “Opaque Pointer”&#xff08;不透明指针&#xff09;或 “Cheshire Cat”&#xff08;柴郡猫&#xff09;模式或者"指针实现模式"和"实现隐藏模式"。这种模式通过将类…

模板字符串

模板字符串&#xff08;Template Literals&#xff09;是在ES6&#xff08;ECMAScript 2015&#xff09;中引入的一种新的字符串表示法&#xff0c;它提供了构建字符串的更加强大和灵活的方式。模板字符串可以通过反引号&#xff08;&#xff09;&#xff08;而不是普通的单引号…

04-4.2.4 KMP 算法的进一步优化

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

IP分片的隐患,以及TCP分片

好的&#xff0c;我们来用一个生活中的例子更详细地解释 MTU、MSS&#xff0c;以及 IP 和 TCP 分片。 MTU 和 MSS 的概念 MTU&#xff08;Maximum Transmission Unit&#xff0c;最大传输单元&#xff09;&#xff1a; 假设你搬家&#xff0c;需要用卡车搬运家具。 卡车的最…

什么是动态联编、静态联编?

动态联编&#xff08;Dynamic Binding&#xff09;和静态联编&#xff08;Static Binding&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们描述了程序在运行时如何确定调用哪个方法或属性。 静态联编&#xff08;Static Binding&#xff09; 静态联编&#xff0c…

Hadoop 2.0:主流开源云架构(一)

目录 一、引例&#xff08;一&#xff09;问题概述&#xff08;二&#xff09;常规解决方案&#xff08;三&#xff09;分布式下的解决方案&#xff08;四&#xff09;小结 自从云计算的概念被提出&#xff0c;不断地有IT厂商推出自己的云计算平台&#xff0c;但它们都是商业性…

Suno小技巧大揭秘,不会这些技巧别说你懂AI音乐

Suno是一个强大的AI音乐生成工具&#xff0c;它不仅可以帮你快速生成音乐&#xff0c;还能精确地根据你的需求进行调整。无论你是音乐小白还是专业音乐人&#xff0c;这篇文章将揭示一些鲜为人知的Suno技巧&#xff0c;帮助你最大化利用这个工具的潜力。 技巧一&#xff1a;精准…

解读下/etc/network/interfaces配置文件

/etc/network/interfaces 是一个常见的网络配置文件&#xff0c;通常在 Debian 及其衍生版本的 Linux 发行版中使用。该文件用于配置网络接口和网络连接参数&#xff0c;允许用户手动设置网络连接的属性&#xff0c;包括 IP 地址、子网掩码、网关、DNS 服务器等。 以下是一个可…

时间相关格式的转化

时间转秒越界 时间不加 L 就会越界 long l 90L * 24 * 60 * 60 * 1000;System.out.println(l);固定时间格式化 Date curTime new Date();SimpleDateFormat simpleDateFormat new SimpleDateFormat("HH:mm");// 19:30System.out.println(simpleDateFormat.format(…