做物流运输网站电话/视频号关键词搜索排名

做物流运输网站电话,视频号关键词搜索排名,表格布局网站,开源代码网站github文章目录 一、分表分库1. 数据分表的必要性与方式2. 数据分库原则与优势 二、主从复制1. 读写分离架构设计2. 数据复制方式3. MySQL实现主从复制4. MySQL主从复制实践与高可用方案 三、数据扩容 随着业务的不断发展和数据量的增长,传统的单机关系型数据库已经逐渐不…

文章目录

    • 一、分表分库
      • 1. 数据分表的必要性与方式
      • 2. 数据分库原则与优势
    • 二、主从复制
      • 1. 读写分离架构设计
      • 2. 数据复制方式
      • 3. MySQL实现主从复制
      • 4. MySQL主从复制实践与高可用方案
    • 三、数据扩容

随着业务的不断发展和数据量的增长,传统的单机关系型数据库已经逐渐不能满足高效存储和快速访问的需求。在这种背景下,分布式数据库存储成为了解决这些问题的重要策略。通过分表分库、主从复制以及数据扩容等技术,分布式数据库可以提高存储的可扩展性、性能和可靠性。接下来,我们将详细介绍这些关键策略及其应用。

一、分表分库

1. 数据分表的必要性与方式

在传统数据库中,随着单表数据量的增加操作数据库时会产生巨大的开销,导致系统效率降低。例如,在MySQL中,当单表记录数过多时,插入数据时可能会对表加锁,这会导致后续的请求排队等待,从而影响系统的整体性能。为了解决这一问题,通常建议MySQL单表的记录数控制在500万条以内,但实际情况要根据具体的业务需求和硬件配置来决定。

为了应对数据量过大的问题,分表技术应运而生。分表的方式主要有两种:垂直分表和水平分表。

  1. 垂直分表:将表中的字段根据业务需求拆分到不同的表中。例如,将不常用的字段或长字段拆分出来,这样可以避免查询时产生“跨页”问题。此方法通常在数据库设计的初期就进行。

  2. 水平分表:根据某个关键字段(如ID)进行Hash计算,将数据拆分到多个表中。例如,可以通过对ID取模的方式,将数据分配到不同的表中。除了ID外,还可以按时间、地域等标准进行分表。

然而,分表虽然带来了性能提升,但也引入了跨表数据查询、ID生成和事务处理等新问题。针对这些问题,有以下解决思路:

  • 跨表数据的Join:可以在应用层进行多次查询,并合并结果。
  • 跨表数据生成ID:可以使用UUID或Sequence表来生成ID,但这些方式的效率和空间利用有时不尽如人意。大厂常用的snowflake算法(由Twitter开源)就是一种高效生成ID的方式。
  • 跨表数据的排序和分页:可以先对分表数据进行排序、分页、聚合等操作,再合并数据进行进一步处理,或者先合并数据后再进行这些操作。
  • 跨表事务处理:可以通过补偿事务或采用TCC(Try-Confirm-Cancel)模式来保证跨表事务的一致性。

 

2. 数据分库原则与优势

在分表的基础上,随着数据量和请求量的不断增长,单一数据库的存储能力和访问能力已无法满足需求,这时就需要采用分库技术。分库技术可以将数据库按照一定的规则拆分到多个数据库中,减轻单个数据库的负担。

分库的常见原则有:

  1. 按业务分库:根据不同的业务模块将数据分到不同的数据库中。例如,订单数据、核算数据和评价数据可以分别存储在不同的数据库中。
  2. 按冷热数据分库:根据数据访问频率的不同,将高频、中频和低频的数据分库存储。频繁访问的数据存储在高性能数据库中,减少访问延迟。
  3. 按访问地域或时间范围分库:根据地域或者时间来划分数据存储的数据库。例如,可以将不同地区或不同时间段产生的数据分配到不同的数据库中。

通过分库,将多个数据库组成集群,应用程序通过负载均衡代理来访问这些数据库,实现读写分离,极大地提高了数据库的可用性。同时,分库也便于进行健康监控、熔断、选举等机制的实施,从而保障数据库系统的高可用性。

 

二、主从复制

1. 读写分离架构设计

在分布式数据库中,为了提高数据库的并发处理能力,通常会采用读写分离的架构。具体来说,数据库的写操作由主库处理,读操作由从库来承担。这样,主库和从库之间就形成了一个分离的架构,从库可以分担主库的读请求压力。当读请求较多时,可以通过增加从库来进一步扩展系统的读性能。

 

2. 数据复制方式

为了保证主库和从库数据的一致性,需要对主库的数据进行复制。数据复制可以分为同步和异步两种方式:

  1. 同步数据复制:主库在进行写操作时,必须先将数据同步到从库,确认从库同步成功后,才会返回给用户。这样做能够确保主从数据的一致性,但也会牺牲部分系统的可用性,因为写操作需要等待同步完成。

  2. 异步数据复制:主库在进行写操作后,直接返回结果给用户,数据复制则在后台进行。虽然这样可以提高系统的可用性,但也可能导致主从数据不一致的问题,尤其是在从库还未同步完成时,应用读取到的数据可能存在问题。

 

3. MySQL实现主从复制

以MySQL为例,MySQL的主从复制过程如下:

  1. 从库的IO线程连接到主库,获取Binary Log的指定位置和偏移量。
  2. 主库在数据更新时,将更新信息通知从库。
  3. 从库IO线程将这些更新信息存入relay Log,并记录日志文件名和位置。
  4. 从库的SQL线程解析relay Log内容,执行SQL语句,从而完成数据的同步。

在这里插入图片描述

MySQL支持两种数据复制方式:Row Level和Statement Level。Row Level复制记录每条数据的修改操作,能够更精确地同步数据,但会增加日志的存储和网络传输负担;而Statement Level复制记录执行的SQL语句,相对节省空间和IO成本,但对主从数据库版本的要求较高,建议主库的版本低于从库版本。

 

4. MySQL主从复制实践与高可用方案

在实际应用中,为了实现高可用性,除了传统的主从复制,还有主主复制(双主模式)等方案。在主主模式下,两个主服务器之间互为备份,通常会暴露一个虚拟IP(VIP),并根据服务器的健康状态进行切换。也可以通过中间件如MyCat和ZooKeeper实现更高级的高可用性,ZooKeeper提供了选举机制来选择新的主服务器,从而确保系统的高可用性。

 


如下图:MyCat 通过 ZooKeeper 对主节点 writeHost(负责写入)和从节点 readHost(负责读取)进行心跳检测。接收到请求时,MyCat 依据 SQL 解析结果,将 DML SQL 发往 writeHost,Select SQL 发往 readHost。writeHost 完成写入后与 readHost 进行主从复制。若 writeHost 挂掉,n 次心跳检测未恢复,MyCat 发起选举新 writeHost,原 writeHost 恢复后变为 readHost 接收数据同步。
 

在这里插入图片描述

 

三、数据扩容

随着数据量和并发量的不断增长,数据库需要不断扩容以满足需求。以主从数据库扩容为例,假设原本有2个数据库集群,在扩容时可以将数据库数量增加到4个。扩容时,需要将原先基于ID取模的分表方式改为新的模4运算,重新分配数据并进行代理配置的调整。扩容后的系统,主库和从库之间可以继续进行复制,进一步提高系统的可用性和性能。

具体操作如下:

  1. 初始数据分布:在2个数据库集群中,每个集群含主备(M0、S0 和 M1、S1),通过对记录ID进行模2运算,结果为0的数据存于M0和S0所在集群,结果为1的数据存于M1和S1所在集群。主库写入数据后,从库主动同步以保证数据一致。

在这里插入图片描述

  1. 集群扩展操作:当将2个集群扩展为4个时,将模2运算切换为模4运算,原从库S0和S1变为主库,负载均衡器按ID%4算法将部分数据路由到它们上面,同时S0和S1停止与原主库同步。只需修改代理配置,无需重启服务。之后可通过后台服务删除冗余数据。
    在这里插入图片描述

  2. 保障数据库可用性:扩展到4个主库后进行主从复制,为每个主库建立从库,主库负责写操作,从库负责读操作,后续扩容可参照此方法。

在这里插入图片描述

 

《分布式架构原理与实践-崔皓》

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

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

相关文章

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点 比如用户自定义配置好的数据源,通过在列中配置好数据,全 json 方式直接返回给前端渲染,不需要写任何格式化方法。 官网:https://vxetable.cn npm i…

延迟任务的11种实现方式(下)!!

接上文: Redisson的RDelayedQueue Redisson他是Redis的儿子(Redis son),基于Redis实现了非常多的功能,其中最常使用的就是Redis分布式锁的实现,但是除了实现Redis分布式锁之外,它还实现了延迟…

iOS事件传递和响应

背景 对于身处中小公司且业务不怎么复杂的程序员来说,很多技术不常用,你可能看过很多遍也都大致了解,但是实际让你讲,不一定讲的清楚。你可能说,我以独当一面,应对自如了,但是技术的知识甚多&a…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0:总目录-CSDN博客 Windows桌面系统管理1:计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2:VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3:Windows 10操作系统部署与使用-CSDN博客 Wi…

【运维】源码编译安装cmake

背景: 已经在本地源码编译安装gcc/g,现在源码安装cmake 下载源码 下载地址:CMake - Upgrade Your Software Build System 安装步骤: ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…

petalinux高版本设置自动登录和开机自启动配置

petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…

【论文学习】RVS-FDSC:一种基于四方向条带卷积的视网膜血管分割方法以增强特征提取

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文论文内容RSC模块MSPF2 模块RPDA模块 实验效果 总结互动致谢参考往期回顾 前言…

Windows Docker运行Implicit-SVSDF-Planner

Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器,挂载主机的D:/Github文…

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类,这就是QPdfWriter类。 (1)PDF文件生成 支持创建新的PDF文件或覆盖已有文件,通过构造函数直接绑定文件路径或QFile对象; 默认生成矢量图形PDF&#…

Golang GORM系列:GORM无缝集成web框架

高效的数据管理是每个成功的web应用程序的支柱。GORM是通用的Go对象关系映射库,它与流行的Go web框架搭配得非常好,提供了无缝集成,简化了数据交互。本指南将带你探索GORM和web框架(如Gin, Echo和Beego)之间…

SAM C++ TensorRT(实时图像分割)

SPEED SAM C TENSORRT 🌐 1、概述 用于SAM(segment anything model分割一切模型)的TensorRT和CUDA优化的高表现C实现,特别适用于实时图像分割任务。 📢 更新 模型转换:从ONNX模型构建TensorRT引擎以加速…

【LLAMA】羊驼从LLAMA1到LLAMA3梳理

every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 论文: LLaMA: Open and Efficient Foundation Language Models 时间: 2023.02 1.1 前言…

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展,它已经成为我们生活中不可或缺的存在,无论是个人还是企业,都离不开互联网。正因为互联网得到了重视,网络安全问题也随之加剧,给我们的信息安全造成严重威胁,而想要有效规避这些风险&…

【从0做项目】Java搜索引擎(7) web模块

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 文章导读 零:项目结果展示 一:后端web模块 1:思路 2&#xff1a…

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…

用命令模式设计一个JSBridge用于JavaScript与Android交互通信

用命令模式设计一个JSBridge用于JavaScript与Android交互通信 在开发APP的过程中,通常会遇到Android需要与H5页面互相传递数据的情况,而Android与H5交互的容器就是WebView。 因此要想设计一个高可用的 J S B r i d g e JSBridge JSBridge,不…

昇腾DeepSeek模型部署优秀实践及FAQ

2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

vscode复制到下一行

linux中默认快捷键是ctrl shift alt down/up 但是在vscode中无法使用,应该是被其他的东西绑定了,经测试,可以使用windows下的快捷键shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…

网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件

一、前言 最近几个月里,我一直在学习网络爬虫方面的知识,每有收获都会将所得整理成文发布,不知不觉已经发了7篇日志了: 网络爬虫学习:从百度搜索结果抓取标题、链接、内容,并保存到xlsx文件中 网络爬虫学…

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…