N_Hadoop N_HBase N_Kafka N_ZooKeepper

2023-05-18


CAP理论

CAP原则又称CAP定理, 指的是在一个分布式系统中, Consistency(一致性), Availability(可用性), Partition tolerance(分区容错性), 三者不可兼得

Consistency(一致性)|(原子性)

在分布式系统中的所有数据备份, 在同一时刻是否同样的值; (等同于所有节点访问同一份最新的数据副本)

即: 分布子节点中所有数据,是否都是一致的

Availability(可用性)

指系统提供的服务必须一直处于可用的状态, 每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据;

Partition tolerance(分区容错性)

分布式系统在遇到任何网络分区故障的时候, 仍然能够对外提供满足一致性和可用性的服务, 除非整个网络环境都发生了故障;

目前而言架构实现条件存在互斥. 能很好的满足两个,但不能同时都满足三个, 必定舍弃一个

组 合 分析结果 CA 满足原子和可用, 放弃分区容错; 说白了, 就是一个整体的应用; CP 满足原子和分区容错, 也就是说, 要放弃可用; 当系统被分区, 为了保证原子性, 必须放弃可用性, 让服务停用; AP 满足可用性和分区容错, 当出现分区, 同时为了保证可用性, 必须让节点继续对外服务, 这样必然导致失去原子性

分布式理论(一) —— CAP 定理

缓存

适合读多写少

缓存的好处

分流: 避免全部访问数据库, 提升效率

缓存的更新

被动更新

最简单, 缓存方只需设置TTL, 有可能数据被修改了, 没有通知到缓存, 造成缓存数据与数据源数据不一致

主动更新

  1. 先更新数据库, 再更新缓存(有先发后至的问题)
  2. 先更新缓存, 再更新数据库
  3. 先更新数据库, 再删除缓存 (Cache Aside)
  4. 先更新数据库, 再删除缓存, 延迟再删除一次缓存(延迟双删)
  5. 先删除缓存, 再更新数据库
  6. Read/Write Through 读写都在缓存组件, 后数据库与缓存同步 (缓存为主, 数据库为辅)
  7. Write Behine 读写都在缓存组件, 后数据库与缓存进行异步同步 (缓存为主, 数据库为辅) 考虑并发和复杂度的问题, 优先选择第三种

缓存的清理

基于时间

基于过期时间 触发清理 基于定时任务 触发清理 基于TLL时间 触发清理

基于空间

基于时间, 见上. 基于总空间/数目阈值 (LRU, FIFO), 触发清理 基于清理目标, (目标的价值/权重) 触发清理

缓存的安全问题

缓存穿透

查询不存在的数据, 缓存无法命中, 请求进而穿过缓存, 查数据库

  1. 布隆过滤器 布隆过滤
  2. 回种空值 当确定数据不存在时, 设置该key的缓存为空值()

缓存雪崩

大量key 同一时刻过期

  1. 随机过期时间, 避免缓存集体失效

缓存击穿

大量请求进来的时候, 该key缓存刚好失效

  1. 加锁, 对查询数据库代码块进行同步(synchronized); 查完数据库后会设置回缓存 (信号量: 允许一下线程并发)

分布式锁

锁的本质是, 将并行转为串行操作

三高项目中应用保护设计方案

高性能、高并发、高可用

就近原则

HTTP 缓存控制 cache-conroller

DNS

虚拟IP DNS A记录可以多IP

扩展

无状态服务器

四种读写模式

  1. Merge-on-Read (MOR):
  • 写操作: 在写操作时,不直接修改原始数据。相反,新的数据被写入一个新的位置,而不是在原始数据上进行修改。(写入最快)
  • 读操作: 读操作时,系统会将原始数据与所有未合并的更改进行合并,生成一个合并后的数据。(读取最慢)
  1. Write Delta:
  • 写操作: 写操作时,只有更改的部分(差异或Delta)会被记录和存储,而不是整个数据集。
  • 读操作: 读操作时,系统会使用原始数据和相应的Delta,将它们组合在一起,以生成最新的视图。
  1. Delete + Insert:
  • 写操作: 更新数据时,先执行删除操作,然后插入新的数据。原始数据被删除,然后新的数据被插入。
  • 读操作: 读操作时,系统会返回删除和插入后的最新数据。
  1. Copy-on-Write (COW):
  • 写操作: 在写操作时,系统会创建原始数据的副本。新的更改只会应用于副本,而不是原始数据。(写入最慢)
  • 读操作: 读操作时,系统会返回原始数据或者副本,取决于是否存在未处理的更改。如果有更改,返回副本,否则返回原始数据。(读取最快)

这四种方式读写的速度互斥

大表数据解决方案

读写分离

适合单表不超千万级的数据, 多读少写; 一个主库负责写, 多个从库负责读;

大表数据解决方式

分库分表(分片)

不建议使用数据自带的特性(例如MySQL分区), 一般是引入分片中间件(例如 MyCat) MyCat 主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。

多表 join 解决方式

MySQL JOIN 嵌套查询效率低;

  • sql 数据量不大, 拆开语句, 使用sql in (…) 方式查询

  • 反范式表 通过多张小表, 合并为一张大表; 小表数据修改再同步到大表

  • 数据仓库/数据集 计算好结果归档的数据表, 典型的预先 生成统计表: 按月统计表, 按周统计表

  • 倒排表 空间换时间 以关联外键字段 为数据表分片的 key; 可以确定数据存储到分片的位置

本地存储

磁盘阵列

RAID 0

RAID 0 将数据分条,存储到多个磁盘中,不带任何冗余信息。数据被分割成块,继续分布到磁盘中。**这一级别也被认为是纯粹的数据分条。**创建RAID 0 需要一个或多个磁盘。也就是说,单独的一个磁盘可以被认为是一个RAID 0 阵列。

在所有的级别中,RAID 0的速度是最快的。但是RAID 0没有冗余功能的,如果一个磁盘(物理)损坏,则所有的数据都无法使用。

  • 特点:数据条带化,无校验,不提供数据保护; 数据并发写入多个硬盘。
  • 优点:RAID读写性能最高,100%的磁盘空间利用率。
  • 缺点:此方式硬盘数据没有冗余,没有容错,一旦一个物理硬盘损坏,则所有数据均丢失。
  • 适用:RAID0 适合于对数据量大,但安全性要求不高的场景,比如音像、视频文件的存储等。

RAID 1

RAID1是将一个两块硬盘所构成RAID磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”。每两个硬盘的内容一模一样 RAID 1磁盘阵列显然是最可靠的一种阵列,因为它总是保持一份完整的数据备份。 它的性能自然没有RAID 0磁盘阵列那样好,但其数据读取确实较单一硬盘来的快,因为数据会从两块硬盘中较快的一块中读出。RAID 1磁盘阵列的写入速度通常较慢,因为数据得分别写入两块硬盘中并做比较。

  • 特点:数据镜像,无校验(检查)。 一半的空间存储冗余数据,但是在所有的RAID中数据安全性 最高。
  • 优点:所有的RAID中安全性能最高,即使一块磁盘发生故障,仍能正常运转。 镜像磁盘没有完全 故障,数据就不会丢失。
  • 缺点:一半的磁盘空间用于存储冗余数据,磁盘空间利用率50%
  • 适用:数据安全性要求比较高的场景,如邮件系统,数据库等。

RAID 2

RAID 2使用位级别的条纹化和海明码(Hamming code)进行数据存储和纠错。数据被分割成位,并在多个磁盘上进行并行存储,而纠错码则用于检测和修复数据错误。 RAID 2通常用于特殊应用,如高性能计算和数据传输,而在普遍应用中较少使用。

RAID 3

RAID 3 是最常使用的硬盘阵列技术。RAID 3至少需要3个硬盘。RAID 3的总容量为各个硬盘容量之和减去一块硬盘的容量。 数据被分条存储在多个磁盘内, 产生奇偶校验,并一并存储在磁盘内 RAID 3,数据块会比平均I/O大小来的小的多,同时磁盘主轴会被同步,以便提高数据传送的带宽。由于使用奇偶校验 RAID 3的数据条带可以抵抗其中的一个磁盘出错而不丢失任何信息。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据,奇偶盘会成为写操作的瓶颈。利用单独的校验盘来保护数据虽然没有镜像的安全性高,但是硬盘利用率得到了很大的提高,为(n-1)/n。

RAID 4

RAID 4也使用字节级别的条带化,但与RAID 3不同的是,奇偶校验信息被存储在所有数据磁盘上,而不是单独的奇偶校验磁盘上。这提高了写入性能,因为写入操作不需要更新单个奇偶校验磁盘。然而,由于奇偶校验信息的集中存储,RAID 4的并行读取性能有限。

RAID 5

(推荐) RAID5采用硬盘分割的技术,最少需要三块硬盘才可以组建 RAID 5 阵列,它没有数据冗余,而是把数据奇偶校验的方式存储到每块硬盘上,它将数据分散储存在阵列的每个磁盘,并且还伴有一个数据校验位,数据位与校验位通过算法能相互验证,当丢失其中的一位时,RAID控制器能通过算法,利用其它两位数据将丢失的数据进行计算还原。 因而RAID5最多只允许一个硬盘损坏,有容错性。 RAID5的可用磁盘数为:n-1

  • 特点:数据条带化,校验数据均匀分布在每个物理磁盘上。 当某个物理磁盘发生故障时,可根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。
  • 优点:允许1个物理磁盘发生故障,而不丢失数据。 读取性能相对较高,磁盘空间利用率大于 RAID1+0。
  • 缺点:写入性能相对低。 重建数据时,性能会受到较大的影响。
  • 适用:RAID5可理解为RAID0和RAID1折中方案,兼顾储存性能,数据安全和存储成本等因素。

RAID 6

在RAID5的基础上改良而成的,RAID6再将数据校验位增加一位,所以允许损坏的硬盘数量为两个。 由于同一阵列中两个硬盘同时损坏的概率非常少,所以RAID6 用增加一块硬盘的代价,换来了比 RAID5 更高的数据安全性。 RAID6 即带有两种分布存储的奇偶校验码的独立磁盘结构, 主要是用于要求数据绝对不能出错的场合,使用了二种奇偶校验值,所以需要 N+2 个磁盘,同时对控制器的设计变得十分复杂,写入速度也不好,用于计算奇偶校验值 和验证数据正确性所花费的时间比较多,造成了不必须的负载,很少人用。

  • 特点:数据条带化,校验数据(2组)均匀分布在每个物理磁盘上。 即使有两个磁盘同时故障,也 可通过2组校验数据来重建两个磁盘上损坏的数据。
  • 优点:允许两个物理磁盘发生故障,而不丢失数据。 读取性较高。
  • 缺点:成本高于RAID 5,写入性能较低(低于RAID 5)。
  • 适用:RAID 6主要用于对数据安全要求非常高、成本同样重要的场景,它一般是替代RAID 10经 济性选择。 如金融、数据库等。

RAID 10

RAID 10的容错功能和RAID 1相同,分条使用RAID 1 段得到较高的I/O率。RAID 10巧妙的利用了RAID 0的速度以及RAID 1的保护两种特性,不过它的缺点是需要的硬盘数较多,因为至少必须拥有四个以上的偶数硬盘才能使用。

特点:RAID1与RAID0的结合,先创建RAID1,再创建RAID0 优点:读取性能仅次于RAID0。 镜像中的磁盘没有全部故障,数据就不会丢失。 一半的物理磁盘 发生故障时,仍可以运转。 缺点:成本高。 磁盘利用率50%,一半的空间用于冗余数据。 适用:适用于读写性能要求高,数据安全大于磁盘成本的场景。 如银行、数据库等。

FastDFS

FastDFS是一种开源的分布式文件系统,旨在提供高性能、高可靠性和可扩展性的文件存储解决方案。它由两部分组成:跟踪器(Tracker)和存储节点(Storage Node)。

跟踪器(Tracker): 跟踪器是FastDFS的中心管理节点,负责管理整个系统的文件元数据信息。它记录了文件的位置、存储节点的状态以及文件的访问路径等信息。客户端首先连接到跟踪器,进行文件上传和下载的请求,然后跟踪器将客户端重定向到合适的存储节点进行实际的文件操作。

存储节点(Storage Node): 存储节点是实际存储文件的服务器节点。它们以分布式的方式组成了一个存储集群。每个存储节点独立运行,负责存储文件块并提供文件上传、下载、删除等操作。存储节点之间通过心跳机制保持通信,并共享文件的元数据信息。

分布式事务

Seata

阿里巴巴 Seata 分布式事务解决方案

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 Seata

异构数据的同步

canal

通过canal 监听数据库修改,并发布到MQ, 供其他(例如ES)数据服务同步; 解耦

canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流)

in short 伪装成 MySQL从库, 监听数据库数据修改的工具

微服务

  • 单体架构 简单 并发量太小
  • 集群架构 本质上还是单体架构, 按服务器分配, 资源分配不均, 比如OA审批, 跟打卡的并发量资源不一样

kettle

Kettle 是一款国外开源的ETL工具,纯java编写,可以在Window、 Linux、 Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。 https://github.com/pentaho/pentaho-kettle