浅析dgraph高可用架构 #45
Valdanitooooo
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
架构介绍
Dgraph只有一个可执行文件,通过指定不同的参数在不同的机器上启动,就能自动组成集群,无需搭建维护其他任何第三方系统。
集群建设
我们使用docker+k8s技术对Dgraph进行统一的容器化部署和管理。如图使用三台服务器,每台服务器上启动四个节点,其中三个是Alpha节点,就是存储数据、索引、执行查询的节点,一个zero节点,是Dgraph的控制节点;需要注意到的一点是,每个Group的3个Alpha用于存储同一份数据的三个副本,一个Group的不同的Alpha肯定是不能在同一台机器的,而哪几个Alpha组成一个Group是zero根据副本数来确定的,比如dgraph zero – replicas 3这样启动时候就指定三个副本数,并且根据Alpha的启动顺序来确定。所以有个启动技巧就是,先在第一台服务器上启动Alpha1,然后切到第二胎服务器上启动Alpha2,再到第三台服务器上启动Alpha3,这三个先启动的Alpha组成第一个Group;然后轮流顺序地启动其他的Alpha 4、5、6组成第二个Group,7、8、9组成第三个Group,不能直接在第一台服务器上直接启动123,这样组成一个Group是无法保证高可用的,因为当这一台机器挂掉之后三个副本就全部丢失了。
左侧是Dgraph的启动命令,启动zero时候指定一下副本数量;启动alpha的时候,指定一下zero的地址就可以了;这样就启动了一个Dgraph集群,由此可见,它的搭建和维护成本确定很低。
架构原理
① 存储引擎:
Dgraph的存储引擎是自研的Badger,完全由Go语言开发。最初Dgraph存储也是使用RocksDB,但后来上层通过go调用,出现一些内存溢出的问题,于是Dgraph团队干脆自己用Go实现了一个高效的、持久化的,基于LSM的键值数据库,并且号称随机读比RocksDB快3.5倍
② 存储结构 ( 因为存储引擎是KV的,所存储结构也是KV的 ):
(Predicate, Subject) --> [sorted list of ValueId],Key是由谓词和主语组成的,Value是一个有序的数组。
举个例子:
(friend, me)–>[person1, person2, person3, person4, person5],Key是friend和me,friend是关系,me是主语,这样组成的一个Key;Value是有序的,me的所有friend,从person1、person2到person5这些ID组成的一个有序的数组。
基于这样的底层存储结构设计,Dgraph同一个谓词下的所有数据都存储在同一个数据节点甚至同一个数据块中,所以这样查询一个谓词数据时候,只需要一次RPC调用就可以拿到这个谓词下面全部需要的数据,对于后面的一度、二度、多度的关联查询有非常大的性能提升,这是它核心的优势。
③ 数据分片 ( 作为一个分布式系统,要想平滑的扩展,必须要支持数据分片 ):
根据谓词分片,相同谓词的数据按序存储在同一个节点,减少RPC,提升查询性能,不同谓词可能是在不同的节点
定期数据均衡 ( rebalance_interval ),zero节点会定期的检测各个节点的数据是否均衡,如果某个节点数据过大或者过小,会导致查询的性能下降,因此zero节点会尽量的保证每个节点的数据均衡。
group根据replicas和alpha启动顺序确定,因为Dgraph的副本一致性是依赖Raft协议的,所以要保证至少有三个节点,才能保证数据的强一致性。
④ 高可用:
每个group至少3个alpha,互为副本,raft协议保证强一致性;每个group中的alpha的数据保持一致,这样某个alpha节点挂了,可以通过其他的alpha进行数据恢复。
write-ahead logs,预写日志;分布式很常见的WAL机制,为了提升写入性能,一定是先写缓存后刷磁盘的,不会直接写磁盘的,那样性能会非常低,但先写内存后写磁盘会带来一个问题,一旦机器挂掉了,内存数据没有刷到磁盘中,那这部分数据就会丢失。因此大部分分布式系统,比如:HBase、Elasticsearch、Dgraph等都是数据写内存之前,先预写日志,日志会实时刷到磁盘上,然后再将数据写内存,一旦内存中数据丢失了,可以通过磁盘上的日志回放这些数据,从而保证高可用性。
参考(copy)连接:
Beta Was this translation helpful? Give feedback.
All reactions