java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2273|回复: 0

《大规模分布式存储系统》 第5章 分布式键值系统【5.2】

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66353

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-3-3 20:41:09 | 显示全部楼层 |阅读模式
    5.2 淘宝Tair/ |  |* `( j% P7 P2 f% ]* [
    Tair是淘宝开发的一个分布式键/值存储引擎。Tair分为持久化和非持久化两种使, o% T4 \* @9 @1 h" K. @$ ?
    用方式:非持久化的Tair可以看成是一个分布式缓存,持久化的Tair将数据存放于磁8 a+ P' Y! r) K) C3 g: j* k# d
    盘中。为了解决磁盘损坏导致数据丢失,Tair可以配置数据的备份数目,Tair自动将# w9 \8 e2 M! F  s% B5 z( k
    一份数据的不同备份放到不同的节点上,当有节点发生异常,无法正常提供服务的
    9 O# o) L" u8 {1 g时候,其余的节点会继续提供服务。5 Y/ I" u5 B4 x7 u- V) {6 B2 g
    5.2.1 系统架构0 o+ q; m7 i. k9 P/ Y/ U* p
    Tair作为一个分布式系统,是由一个中心控制节点和若干个服务节点组成。其! s& [1 A- X, N: u# c
    中,中心控制节点称为Config Server,服务节点称为Data Server。Config Server负责" |6 v( l. p; O: V6 h) A  s
    管理所有的Data Server,维护其状态信息;Data Server对外提供各种数据服务,并以
    ' [. L' u- |# p8 z4 u7 c2 k: W7 x心跳的形式将自身状况汇报给Config Server。Config Server是控制点,而且是单点,9 f9 a+ a4 a9 f- w- j$ S7 ?* ~
    目前采用一主一备的形式来保证可靠性,所有的Data Server地位都是等价的。
    . D# B# v+ {% p+ v& w! W$ ^+ }图5-5是Tair的系统架构图。客户端首先请求Config Server获取数据所在的Data9 [3 {$ j/ [9 c0 s
    Server,接着往Data Server发送读写请求。Tair允许将数据存放到多台Data Server,以) O: t* D4 g5 ~) Y' [7 `
    实现异常容错。& b& j+ i( d" k9 X  `  N
    图 5-5 Tair系统架构, k; L: M4 j& q7 V
    5.2.2 关键问题9 \! L7 l% y; j
    (1)数据分布
    ; w- U1 t0 k3 z- ~2 l& r6 R- \根据数据的主键计算哈希值后,分布到Q个桶中,桶是负载均衡和数据迁移的基9 X- L( w) g4 p3 |
    本单位。Config Server按照一定的策略把每个桶指派到不同的Data Server上。因为数
    1 ]- `7 M# `3 ^2 m( b" o: I! e0 Z据按照主键计算哈希值,所以可以认为每个桶中的数据基本是平衡的,只要保证桶
    & j- N8 r) n+ e分布的均衡性,就能够保证数据分布的均衡性。根据Dynamo论文中的实验结论,Q2 J, r' X! x' C. b7 u. b3 {
    取值需要远大于集群的物理机器数,例如Q取值10240。
    2 Y$ E4 }1 ^" ~" z+ y* L(2)容错
    ; J2 K1 v+ N4 u9 w3 h" k当某台Data Server故障不可用时,Config Server能够检测到。每个哈希桶在Tair
    * G7 N5 `$ S) C& e& L中存储多个副本,如果是备副本,那么Config Server会重新为其指定一台Data4 A4 r; b6 E6 k
    Server,如果是持久化存储,还将复制数据到新的Data Server上。如果是主副本,那( @' D; ]; E+ |/ `9 l
    么ConfigServer首先将某个正常的备副本提升为主副本,对外提供服务。接着,再选. K( X( ^6 E( ^8 _  W1 A% E$ f. r9 [
    择另外一台Data Server增加一个备副本,确保数据的备份数。
    # h: Z: e' E7 @3 ^) \! h(3)数据迁移; }% d9 O2 I9 G, ~2 Q, Y; I
    机器加入或者负载不均衡可能导致桶迁移,迁移的过程中需要保证对外服务。
    ) J- f' F+ p) |3 x+ e& b: g. B当迁移发生时,假设Data Server A要把桶3、4、5迁移到Data Server B。迁移完成9 t4 F" O5 f, [; b9 P9 P6 A1 p0 J
    前,客户端的路由表没有变化,客户端对3、4、5的访问请求都会路由到A。现在假
    * A4 o; T+ ^) }* k( y/ H设3还没开始迁移,4正在迁移中,5已经迁移完成。那么如果对3访问,A直接服务;. B' ~5 M' X* _! @" W1 z  T5 T
    如果对5访问,A会把请求转发给B,并且将B的返回结果返回给用户;如果对4访
    ) T* E  k# V* Y4 W) K/ j问,由A处理,同时如果是对4的修改操作,会记录修改日志,等到桶4迁移完成时,* c3 H3 n: O* @8 L1 X. u
    还要把修改日志发送到B,在B上应用这些修改操作,直到A和B之间数据完全一致迁
    " s/ z0 I/ ?( e' H( |: C. u& f移才真正完成。  y4 g5 |, ^' x. ]: m- [1 I8 k: C: T
    (4)Config Server
    # T& r3 M. {4 _! O1 j客户端缓存路由表,大多数情况下,客户端不需要访问Config Server,Config$ I9 Y+ k4 B; a7 v) b/ {
    Server宕机也不影响客户端正常访问。每次路由的变更,Config Server都会将新的配, r$ Y4 @1 Z5 ?9 v9 k
    置信息推给Data Server。在客户端访问Data Server的时候,会发送客户端缓存的路由
    : H5 h% c) X  z+ }9 H; [$ `5 [  g表的版本号。如果Data Server发现客户端的版本号过旧,则会通知客户端去Config
    " Q6 ~3 U. R) ?  T+ Z# o' \% DServer获取一份新的路由表。如果客户端访问某台Data Server发生了不可达的情况
    ( P: o  e. p: V) [% w. I! `( U(该Data Server可能宕机了),客户端会主动去Config Server获取新的路由表。; W: d3 h4 [* v; K( H
    (5)Data Server
    8 Y5 F( ]3 q* J" @; `6 `3 O' hData Server负责数据的存储,并根据Config Server的要求完成数据的复制和迁移6 t. h2 ~% W$ C( f2 E3 F* E
    工作。Data Server具备抽象的存储引擎层,可以很方便地添加新存储引擎。Data
    * U" |( K) P( n" g4 D1 {; H* r! cServer还有一个插件容器,可以动态加载/卸载插件,如图5-6所示。6 i3 j# O# |; y. R$ u* j) O
    图 5-6 Data Server内部结构
    / w9 n% i6 C- ]) ]& w1 ETair存储引擎有一个抽象层,只要满足存储引擎需要的接口,就可以很方便地替# m5 o  H% C' D1 m
    换Tair底层的存储引擎。Tair默认包含两个存储引擎:Mdb和Fdb,此外,还支持
    6 N- t& y' e, [Berkerly DB、Tokyo Cabinet、InnoDB、Leveldb等各种存储引擎。0 V% {6 j/ ^% k
    5.2.3 讨论
    * r, y+ u( \- _Amazon Dynamo采用P2P架构,而在Tair中引入了中心节点Config Server。这种方
    ; o& K" `( d7 n: N式很容易处理数据的一致性,不再需要向量时钟、数据回传、Merkle树、冲突处理
      X2 X2 |( O/ p  }; f等复杂的P2P技术。另外,中心节点的负载很低。笔者认为,分布式键值系统的整体
    6 I" j) J& K: P& }' I架构应该参考Tair,而不是Dynamo。
    * E# o" a' h- p3 g7 ~8 T当然,Tair最主要的用途在于分布式缓存,持久化存储起步比较晚,在实现细节
    : i0 L( p7 G4 Z+ R2 N  ]上也有一些不尽如人意的地方。例如,Tair持久化存储通过复制技术来提高可靠性,
    ; B5 M; _/ }, E$ b: k然而,这种复制是异步的。因此,当有Data Server发生故障时,客户有可能在一定时
    & C  S3 R3 _, s1 o; q) k0 G! A5 @间内读不到最新的数据,甚至发生最新修改的数据丢失的情况。$ B& g& L% D# ?  }

    $ j/ w& w' N) Q8 a9 x- |
    8 F/ Y3 _9 g. u6 M. ?, W
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-12-4 01:50 , Processed in 0.067312 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表