1. 概述

对于分布式系统,人们首先对现实中的分布式系统进行高层抽象,然后做出各种假设,发展了诸如CAP, FLP 等理论,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我们对分布式系统的时序,复制模式,一致性等基础理论特别关注。

在共识算法的基础上衍生了选举算法,并且为分布式事务提供了部分的支持。本文从常见的几种分布式存储系统看看实践中的分布式系统设计细节。理论结合实际,能更好地帮助我们加深理解。

2.分片

先来看看分片的定义:

The word “Shard” means “a small part of a whole“. Hence Sharding means dividing a larger part into smaller parts. In DBMS, Sharding is a type of DataBase partitioning in which a large database is divided or partitioned into smaller data and different nodes

分片是分布式存储系统绕不开的话题,分片提供了更大的数据容量,能够提升读写效率,提升数据可用性。

分布式存储系统 分片 备注
elasticsearch 每个index 进行分片,即 shard shard计算,shard = hash(routing) % number_of_primary_shards
kafka 每个topic分析分片,即 partition 根据key来选择partition,也可以根据自定义partition算法实现 同一的user发送到同一 的partition
redis-cluster 对所有数据进行分片,hash slot 16384(2^14) hash tags 确保数据分配到同一个slot:{123}:profile and user:{123}:account
  • 对redis-cluster 来讲,redis client 需要缓存 key - slot 映射,因为redis 节点不会对 查询请求进行代理,如果查询数据不存在,则需要client重新查询。
  • redis-cluster 的设计目标是在提供高性能的基础上,让redis数据能分布在多达1000个节点的集群上。

3.复制

复制提升了数据的可靠性,复制分片还可以用来做read。在分布式系统重,有两种复制模式:

  1. 同步复制,主节点在同步数据到slave,然后返回响应给到client
  2. 异步复制,主节点先返回响应给到client,然后同步数据到slave

分布式存储系统 复制 备注
elasticsearch  primary 复制数据到 in-sync copies,同步复制  
kafka 主分片复制数据到 ISR (in sync replica) producer 可以配置 acks 和 min.insync.replicas 来调整一致性
redis-cluster 采用redis 的复制机制,异步复制 redis对性能非常敏感,所以采用的都是异步复制
  • 以上三种系统均采用 primary-backup model (Google I/O 2009 - Transactions Across Datacenters), 具有低延迟,高吞吐,会有部分的数据丢失窗口
  • 旧的elasticsearch 版本中可以调整write conistency level : one(primary shard), all(all shard), quorum(default).
  • kafka 是典型的日志消息系统,数据量特别大,在常见的quorum-based 系统中,为了能容忍n个节点失败,往往需要2n + 1 个节点,这对kafka来讲多余的存储成本非常的高,于是kafka采用了ISR机制,即只维护那些与主分片及时保持同步的分片,当主分片失败时,从ISR 中选取一个作为最新的主分片即可。

4.一致性

不同的复制策略带来了不同的一致性,常见的一致性有

  • 强一致性
  • 最终一致性
  • 弱一致性

根据Ryan Barrett在Google I/O 2009 - Transactions Across Datacenters中的定义,elasticsearch/kafka/redis-cluster 都采用了 primary-backup model,primary-backup model 的特点是最终一致性,但是具体细节有所不同。

分布式存储系统 写入一致性 NWR 模型 备注
elasticsearch 最终一致性 (较强) w(all write) , r(1) 需要refresh 到文件系统缓存才可见,flush操作到磁盘
kafka 最终一致性 (可调) w(ack writes) , r(1)  ack = 0 最弱,ack = all 最强
redis-cluster 最终一致性 (较弱) w(1) , r(1)  
  • 采用最终一致性,意味着在写入过程中,会出现部分节点返回最新数据,部分节点返回过期数据的情况,由于这个时间窗口很小,往往可以接受。
  • 我们在这里提到了NWR模型,参考 partial quorums,partial quorums 在基于冲突解决的复制模型中使用广泛,比如Dynamo。当 r + w > n 时总有节点能返回最新的数据。

5.选举算法

选举算法的基础是共识算法,paxos是其中最璀璨的明珠,paxos在共识算法中的地位可以用这样表述:

Either Paxos, or Paxos with cruft, or broken

paxos 最早应用于google 的 Chubby (lock manager),zk是 Chubby的开源版本。

分布式存储系统 选举算法 备注
elasticsearch bully/类raft bully算法比较简单,谁大就选谁
kafka zookeeper(zab)/kraft(raft)  
redis-cluster 类raft  
  • 可以看到很多分布式组件都有转向raft的趋势。
  • 由于paxos算法晦涩难懂,并且如果要应用到实际过程中需要做很多调整,所以开发了一个易于理解的版本raft算法,raft算法分为 leader election, log replication, safety, and membership changes 等模块,相比于paxos 所有节点都是平等的,raft 进行leader 选举,并且通过log replication进行数据同步,safety 确立了raft算法的完备性,membership changes 处理节点变更的情形。log replication 表示了raft底层的数据结构,对我们设计类似系统大有裨益。

6.事务支持

存储系统中,事务是非常重要一部分,我们来看看各类组件是否支持分布式事务,以及他们是如何实现的:

分布式存储系统 事务支持 备注
elasticsearch 不支持  
kafka 支持事务,基于2PC  
redis-cluster 不支持跨节点的事物,支持单节点的事物 使用multi/exec/watch 来实现
  • 2PC是一种强一致的模型,具有高延迟,低吞吐的特点。
  • 常见的分布式事务模型有,primary-backup model,multi-master model, 2PC, Paxos.  3PC 是2PC 的变体。个人认为TCC, 基于消息表的事务也是2PC 的变体。

7.总结

本文从分布式系统的几个方面探讨了elasticsearch,kafka,redis-cluster的细节,他们有很多共性,但是在许多方面也有很多不同。鉴于笔者对分布式系统的研究还不是很深入,如果错误,请指正。

8.参考

https://book.mixu.net/distsys/single-page.html

https://www.youtube.com/watch?v=srOgpXECblk

https://snarfed.org/transactions_across_datacenters_io.html

http://harry.me/blog/2014/12/27/neat-algorithms-paxos/

https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf

分布式存储系统举例剖析(elasticsearch,kafka,redis-cluster)的更多相关文章

  1. Redis Cluster架构优化

    Redis Cluster架构优化 在<全面剖析Redis Cluster原理和应用>中,我们已经详细剖析了现阶段Redis Cluster的缺点: 无中心化架构 Gossip消息的开销 ...

  2. Redis中国用户组|唯品会Redis cluster大规模生产实践

    嘉宾:陈群 很高兴有机会在Redis中国用户组给大家分享redis cluster的生产实践.目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作 Outline 一.生 ...

  3. 全面剖析Redis Cluster原理和应用 (转)

    1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生 ...

  4. 全面剖析Redis Cluster原理和应用 (good)

    redis redis cluster注意的问题 : 1.‘cluster-require-full-coverage’参数的设置.该参数是redis配置文件中cluster模式的一个参数,从字面上基 ...

  5. 全面剖析Redis Cluster原理和应用

    全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最 ...

  6. Redis Cluster的搭建与部署,实现redis的分布式方案

    前言 上篇Redis Sentinel安装与部署,实现redis的高可用实现了redis的高可用,针对的主要是master宕机的情况,我们发现所有节点的数据都是一样的,那么一旦数据量过大,redi也会 ...

  7. Redis05——Redis Cluster 如何实现分布式集群

    前面一片文章,我们已经说了Redis的主从集群及其哨兵模式.本文将继续介绍Redis的分布式集群. 在高并发场景下,单个Redis实例往往不能满足业务需求.单个Redis数据量过大会导致RDB文件过大 ...

  8. spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)

    一,为什么要使用分布式session? HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题, 所以我们在创建web集群时,把session保存到r ...

  9. Redis Cluster 分布式集群(下)

    Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...

  10. Redis Cluster 分布式集群(上)

    Redis Cluster 介绍 Redis 集群是一个可以在多个Redis节点之间进行数据共享的设施(installation): Redis 集群不支持那些需要同时处理多个键的 Redis 命令, ...

随机推荐

  1. Vue 全局避免按钮重复点击

    这里用到的 Vue.directive 自定义指令 自定义指令是对普通DOM元素进行的底层操作,它是一种有效的的补充和扩展,不仅可以用于定义任何的dom操作,并且是可以复用的 在 main.js 中写 ...

  2. odoo开发教程五:高级视图

    树视图 tree视图表现出来是列表视图,列表中一行一纪录.可以根据每行纪录的某字段值不同而把每行以不同样式显示. decoration-{样式}="条件" 样式主要有: bf(fo ...

  3. webGPU orillusion(一)

    关于架构的理解与认识   Orillusion 核心借鉴了 ECS 结构,遵循 组合优于继承 的开发设计原则,实现了自己的组件系统.我们将传统复杂的逻辑划分为独立的.可重复利用的部分,每个部分可以单独 ...

  4. 常见 Linux 提权

    Common Linux Privesc 记录 常见 Linux 提权的 提权方式:水平提权,垂直提权. 水平提权:这是您通过接管与您处于相同权限级别的不同用户来扩大您对受感染系统的影响的地方. 例如 ...

  5. 文字生成图像 AI免费工具第一弹 StableDiffusion

    随着ChatGPT的爆火,text-to-image文字生成图像.以及更广义的AIGC(AI Generated Content)相关的话题最近一直热度不减.相信大家这几天经常会在各类的自媒体.甚至是 ...

  6. Apple、AWS 这些科技巨头,已悄然入局隐私计算

    随着数字化时代的到来,数据已经成为企业竞争的重要资源.然而,与此同时,数据隐私泄露的风险也在不断增加,这已经成为了公共安全和个人权利保护的重要问题.为了解决这个问题,科技巨头谷歌.苹果.亚马逊纷纷入局 ...

  7. 2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

    2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 : ...

  8. 从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生

    摘要:随着云计算的兴起和渗透,云数仓成为了数仓技术演进的新阶段,并且逐渐成为了众多企业的共同选择. 本文分享自华为云社区<从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生>,作 ...

  9. 一文搞懂什么是 API

    在我学习软件开发之前,API 听起来像是一种啤酒(IPA,印度淡色艾尔).如今我经常使用这个术语,事实上最近我还尝试在酒吧里点了一个 API,结果酒保给了我一个: 404 资源未找到的回应 无论是在科 ...

  10. 深入JS——理解闭包可以看作是某种意义上的重生

    JS中有一个非常重要但又难以完全掌握的概念,那就是闭包.很多JS程序员自以为已经掌握了闭包,但实质上是一知半解,就像"JS中万物皆为对象"这个常见的错误说法一样,很多前端开发者到现 ...