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

news2025/4/17 8:05:17

文章目录

    • 一、分表分库
      • 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.coloradmin.cn/o/2301244.html

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

相关文章

复现log4j2的jndi注入成功反弹shell

在Apache Solr 中复现log4j2的jndi注入漏洞,获得docker容器的root权限,实验五步走: 启动容器访问web页面漏洞探测反弹shell载荷wireshark抓取log4j反弹shell流量 ailx10 1956 次咨询 4.9 网络安全优秀回答者 互联网行业 安全攻防员 去咨…

Cursor实战:Web版背单词应用开发演示

Cursor实战:Web版背单词应用开发演示 需求分析自行编写需求文档借助Cursor生成需求文档 前端UI设计后端开发项目结构环境参数数据库设计安装Python依赖运行应用 前端代码修改测试前端界面 测试数据生成功能测试Bug修复 总结 在上一篇《Cursor AI编程助手不完全指南》…

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统,报错:Operating System not found 二、原因分析 国产系统,需要注意的点: 需要看你的系统类…

矿用机车移动逆变电源设计(论文+源码)

1总体方案设计 本课题为矿用机车移动逆变电源的硬件电路设计,其整个架构如图2.1所示包括了:380V三相交流电,逆变电路,高频变压器,24V直流输出,控制电路,驱动电路,保护电路等等。 在工作原理上&…

前七章综合练习

一,拓扑图 二,实验要求 不限 三,实验步骤 第一步,搭建拓扑图 如上 注意: 第二步,配置IP trust: client1 client2 fw untrusrt-1: fw r3 电信DNS 百度web-1 untrust-2&#xf…

环境变量2

目录 环境变量PATH 如何改变PATH 我们今天继续来学习环境变量2!!! 环境变量PATH PATH的作用是知道命令的搜索路径,我们都知道Linux上的命令行指令,ll,pwd什么的为什么我们写出来系统就知道是什么并且运…

数据录入与处理岗位

随着人工智能技术的迅猛发展,DeepSeek等先进AI系统正在逐步渗透到各个行业,工控行业也不例外。工控行业作为工业自动化的核心领域,涵盖了从生产线控制到设备维护的多个环节。然而,随着AI技术的不断进步,一些传统岗位正…

基于ffmpeg+openGL ES实现的视频编辑工具(一)

在深入钻研音视频编辑开发这片技术海洋时,相信不少开发者都和我有同样的感受:网络上关于音视频编辑工具实现的资料繁多,理论阐释细致入微,代码片段也随处可见。然而,一个显著的缺憾是,缺乏一个完整成型的 A…

LLM 推理中推理-时间计算技巧

25年2月来自香港科技大学广州分校的论文“Bag of Tricks for Inference-time Computation of LLM Reasoning”。 随着大语言模型 (LLM) 的进步,解决复杂的推理任务越来越受到关注。推理-时间计算方法(例如 Best-of-N、波束搜索等)特别有价值…

matplotlib 如何是的横坐标纵向显示

在 ​​matplotlib​​​ 中,若要让横坐标标签纵向显示,可以使用 ​​plt.xticks()​​​ 或 ​​ax.set_xticklabels()​​ 方法结合旋转参数来实现。 方法一:使用 ​​plt.xticks()​​ 当你使用 ​​matplotlib​​​ 的 pyplot 接口&am…

Mobaxterm: Local port forwarding Remote port forwarding

文章目录 Remote port forwardingLocal port forwardingAppendix: Deploy clash in docker Remote port forwarding If you want to share the proxy on your local machine with the remote server, use Remote port forwarding. Consider this scenario: There is no proxy…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言:在人工智能技术飞速发展的今天,深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型,凭借其高效的性能和灵活的部署方式,受到了广泛关注。无论是自然语言处理、图像识别,还是…

用友U8 固定资产-批量变动单

前提:没有结账,没有结账,没有结账 如果已经结账,可反结账 1.需要先计提折旧,操作路径是点击【固定资产】-【计提折旧】-计提本月折旧 2.进行资产减少操作,点击【资产处置】-【资产减少】,如…

基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频

本系统包含用户、管理员两个角色。 用户角色:注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色:登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…

自然语言处理NLP 02统计语言模型

目录 jieba中文分词 TF-IDF TF(词频,Term Frequency) IDF(逆文档频率,Inverse Document Frequency) 总结 案例:从文本数据中提取并分析关键词的重要性 jieba中文分词 jieba 是一个强大的…

Qt开发④Qt常用控件_上_QWdget属性+按钮类控件

目录 1. 控件概述和发展 2. QWidget 核心属性 2.1 核心属性概览 2.2 enabled 是否可用 2.3 geometry 位置尺寸 2.4 windowTitle 标题 2.5 windowIcon 图标 2.6 windowOpacity 不透明度 2.7 cursor 光标 2.8 font 字体 2.9 toolTip 鼠标悬停提示 2.10 focusPolicy 焦…

Apache Struts RCE (CVE-2024-53677)

前言 对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结,由于只能单个ip验证,所以自己更改一下代码,实现:多线程读取url验证并保存,更改为中文解释 免责声明 请勿利用文章内的相关技术从事非法测试&#xf…

23. AI-大语言模型-DeepSeek

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规性声明 加拿大站成人床垫法规SOR/2016-183是强制性的 。为确保买家安全并遵守相关法规,亚马逊要求所有在加拿大销售的成人床垫必须符合《床垫法规》规定的安全标准,包括SOR/2016-183。此…

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件,已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …