【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略

文章目录

    • 一、分表分库
      • 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.rhkb.cn/news/20890.html

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

相关文章

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…

sentinel集成nacos做持久化配置

sentinel提供了非常强大的控制台来提供流控等功能,但是控制台只是临时的配置,想要将流控配置永久的保存,或者在项目启动的时候就加载,不需要手动设置,就需要使用到nacos与sentinel做集成配置。这里都是不变代码&#x…

SpringBoot速成概括

视频:黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 图示:

【含文档+PPT+源码】基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部…

Python在网络安全中的应用 python与网络安全

前言 网络安全是保护网络、系统和程序免受数字攻击的做法。据估计, 2019 年该行业价值 1120 亿美元,到2021 年估计有 350 万个职位空缺。 许多编程语言用于执行与网络安全相关的日常任务,但其中一种已成为行业标准:Python&#…

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】,点击【个人】 3.【command shift J】显示所有文件,打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹:用于存储每个应用程序的沙盒数据,确保应用程序…

基于SpringBoot实现的宠物领养系统平台功能一

一、前言介绍: 1.1 项目摘要 宠物领养需求增加:随着人们生活水平的提高和对宠物养护意识的增强,越来越多的人选择领养宠物作为家庭的一员。这导致了宠物领养需求的显著增加。 传统领养方式存在问题:传统的宠物领养方式&#xf…

智慧能源管理新标杆:安科瑞EMS3.0解锁工业园区经济效益与环保双赢

智慧能源平台是一种集成分布式能源、储能系统、负荷管理和智能控制技术的综合能源管理系统。它能够实现能源的高效利用、优化调度和智能化管理,为用户提供稳定、经济、绿色的能源解决方案。工业园区作为能源消耗和管理的核心场景之一,对微电网能源管理平…

Spotify AI 技术(1)使用 TensorFlow 和 TF-Agents

介绍 我们的许多音乐推荐问题都涉及为用户提供有序的项目集,以满足用户在那个时间点的收听偏好和意图。我们根据以前与应用程序的交互来提供当前的推荐,抽象地说,由于我们不断向用户推荐内容,因此我们面临着一个连续的决策过程。 …

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…

动态规划,复习

一.动态规划 1. 思路&#xff1a;每次递增序列结束都取最优解 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int ans -1,temp 1;for(int i 0;i<nums.size()-1;i){if(nums[i]<nums[i1]) temp;else{ans max(ans,temp);temp 1;}}ans…

【鸿蒙开发】第三十八章 ArkTS代码调试

debug启动调试attach启动调试等待调试使用断点检查变量使用调试器反向调试extension调试worker/taskpool调试Evaluate and logSmart Step Into 1 debug启动调试 如果需要设置断点调试&#xff0c;找到需要暂停的代码片断&#xff0c;点击该代码行的左侧边线&#xff0c;或将光…

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)

全流程导览 一、前言二、基本介绍2.1全过程软件基本介绍2.1.1 Pytorch2.1.2 Anaconda2.1.3 Pycharm2.1.4 显卡GPU及其相关概念2.1.5 CUDA和cuDNN 2.2 各部分相互间的联系和安装逻辑关系 三、Anaconda安装3.1安装Anaconda3.2配置环境变量3.3检验是否安装成功 四、Pycharm安装五、…

案例-18.文件上传-阿里云OSS-集成

一.分析 要想将阿里云oss集成到新增员工的功能中&#xff0c;必须要设计文件上传的接口UploadController。首先前端给接口上传接口需要接收请求的图片&#xff0c;然后接口再将图片上传到阿里云oss中存储起来&#xff0c;接着接口从阿里云oss中获取图片的url并返回给前端&#…

在Unity中用简单工厂模式模拟原神中的元素反应

1. 第一步创建3个脚本Factory&#xff08;反应工厂&#xff09;&#xff0c;Reactions&#xff08;具体反应&#xff09;&#xff0c;FactoryText&#xff08;测试反应的脚本&#xff09; 2.编写工厂脚本 using UnityEngine;// 定义一个元素反应的接口&#xff0c;所有具体的元…

Markdown 常用语法及示例

介绍 Markdown 是一种轻量级标记语言&#xff0c;广泛用于编写文档、README 文件、博客文章等。本文将介绍 Markdown 的一些常用语法&#xff0c;帮助你快速上手。官网地址1 1. 标题 Markdown 使用井号 # 来表示标题&#xff0c;井号的数量决定了标题的级别&#xff0c;最多…

Ubuntu USB耳机找不到设备解决

​ 一. 确定硬件连接 lsusb -t 插拔USB耳机&#xff0c;确定是否有USB识别到 二. 查看输出设备 sudo apt-get install pavucontrol pavucontrol 点击想要使用的输出设备后面的绿色选项 三. 输出设备没有USB耳机时调试 3.1 确认ALSA是否识别设备 列出ALSA播放设备&#…

企业软件合规性管理:构建高效、安全的软件资产生态

引言 在数字化转型的浪潮下&#xff0c;企业的软件使用方式日益多元化&#xff0c;涉及云端、订阅制、永久授权及浮动许可等多种模式。然而&#xff0c;随着软件资产的增多&#xff0c;企业面临着合规性管理的严峻挑战&#xff1a;非法软件使用、许可证管理不当、软件资产闲置…