DGraph功能架构

 

1、DGraph功能

1.1、说明

Dgraph 是一个可扩展的,分布式的,低延迟的图数据库,目标是提供 Google 生产水平的规模和吞吐量,在超过 TB 的结构数据里,为用户提供足够低延迟的实时查询。Dgraph有独立开发的网页端查询和操作界面,同时支持 GraphQL 作为查询语言。DGraph只支持最短路径的查询,不支持其它图形计算

1.2、添加索引

更改架构以在某些数据上添加索引,以便查询可以使用术语匹配,过滤和排序。添加索引的语法的规则还得好好研读

curl localhost:8080/alter -XPOST -d $'

  name: string @index(term) .

  release_date: datetime @index(year) .

  revenue: float .

  running_time: int .

' | python -m json.tool | less

1.3、字词匹配

1.3.1、所有条款

语法示例: allofterms(predicate, "space-separated term list")

模式类型: string

所需索引: term

以任意顺序匹配具有所有指定术语的字符串;不区分大小写。

1.3.2、根使用

查询示例:所有name包含术语indiana和的节点,jones以英语返回英语名称和类型。

{

  me(func: allofterms(name@en, "jones indiana")) {

    name@en

    genre {

      name@en

    }

  }

}

1.3.3、用作过滤器

查询示例:所有包含单词indiana和的史蒂文·斯皮尔伯格电影jones。该@filter(has(director.film))名称为史蒂芬斯皮尔伯格是不是导演移除了节点-该数据也包含在一个叫史蒂芬斯皮尔伯格电影中的角色。

{

  me(func: eq(name@en, "Steven Spielberg")) @filter(has(director.film)) {

    name@en

    director.film @filter(allofterms(name@en, "jones indiana"))  {

      name@en

    }

  }

}

1.4、常用表达

语法示例:regexp(predicate, /regular-expression/)或不区分大小写regexp(predicate, /regular-expression/i)

模式类型: string

所需索引: trigram

通过正则表达式匹配字符串。正则表达式语言是go正则表达式

查询示例:在根目录下,将节点匹配Steven Sp于以开头的name,后跟任意字符。对于每个这样的匹配uid,匹配包含的影片ryan。请注意,与的区别allofterms仅匹配,ryan但正则表达式搜索也将在术语内匹配,例如bryan。

{

  directors(func: regexp(name@en, /^Steven Sp.*$/)) {

    name@en

    director.film @filter(regexp(name@en, /ryan/i)) {

      name@en

    }

  }

}

技术细节

Trigram是三个连续符文的子串。例如,Dgraph有八卦Dgr,gra,rap,aph。

为了确保正则表达式匹配的效率,Dgraph使用trigram 索引。也就是说,Dgraph将正则表达式转换为Trigram查询,使用Trigram索引和Trigram查询查找可能的匹配项,并将完整的正则表达式搜索仅应用于可能的匹配项。

编写有效的正则表达式和限制

设计正则表达式查询时,请记住以下几点。

正则表达式必须至少匹配一个三字母组(不支持短于3个符文的模式)。也就是说,Dgraph需要可以转换为三元组查询的正则表达式。

正则表达式匹配的替代三字母组的数量应尽可能小([a-zA-Z][a-zA-Z][0-9]这不是一个好主意)。许多可能的匹配意味着对许多字符串检查了完整的正则表达式;在这种情况下,如果表达式强制执行更多的三元组来匹配,则Dgraph可以更好地利用索引,并针对较小的可能匹配集检查完整的正则表达式。

因此,正则表达式应尽可能精确。匹配更长的字符串意味着需要更多的三字母组,这有助于有效地使用索引。

如果重复规范(*,+,?,{n,m})时,整个正则表达式不能匹配空串或任何字符串:例如,*可以像使用[Aa]bcd*但不喜欢(abcd)*或(abcd)|((defg)*)

括号表达式(如后重复规格[fgh]{7},[0-9]+或[a-z]{3,5})通常被认为是因为它们匹配太多八卦任意字符串匹配。

如果在索引扫描期间部分结果(用于三字母组的子集)超过1000000个uid,则停止查询以禁止进行昂贵的查询。

1.5、模糊匹配

句法: match(predicate, string, distance)

模式类型: string

所需索引: trigram

通过计算到字符串的Levenshtein距离来匹配谓词值,也称为模糊匹配。距离参数必须大于零(0)。使用较大的距离值可能会产生更多但不太准确的结果。

查询示例:在根上,类似于的模糊匹配节点Stephen,距离值为8。

{

  directors(func: match(name@en, Stephen, 8)) {

    name@en

  }

}

1.6、全文搜索

语法示例:alloftext(predicate, "space-separated text")和anyoftext(predicate, "space-separated text")

模式类型: string

所需索引: fulltext

应用带有词干和停用词的全文本搜索来查找与所有或任何给定文本匹配的字符串。

在索引生成过程中将应用以下步骤并处理全文搜索参数:

①、标记化(根据Unicode字边界)。

②、转换为小写。

③、Unicode规范化(规范化形式为KC)。

④、使用特定于语言的词干提取器(如果语言支持)。

⑤、停止删除单词(如果语言支持)。

询示例:有所有的名字dog,dogs,bark,barks,barking,等停止词删除消除the和which

{

  movie(func:alloftext(name@en, "the dog which barks")) {

    name@en

  }

}

1.7、不等式

1.7.1、等于

语法示例:

eq(predicate, value)

eq(val(varName), value)

eq(predicate, val(varName))

eq(count(predicate), value)

eq(predicate, [val1, val2, ..., valN])

eq(predicate, [$var1, "value", ..., $varN])

模式类型:int,float,bool,string,dateTime

需要索引:eq(predicate, ...)表单需要索引(请参见下表)。对于count(predicate)查询根,@count索引是必需的。对于变量,值已作为查询的一部分进行计算,因此不需要索引。

类型

指数期权

int

int

float

float

bool

bool

string

exact, hash

dateTime

dateTime

测试谓词或变量与值的相等性,或在值列表中查找。

布尔常量为true和false,因此eq,例如eq(boolPred, true)。

查询示例:电影类型恰好为十三种。

{

  me(func: eq(count(genre), 13)) {

    name@en

    genre {

      name@en

    }

  }

}

查询示例:导演史蒂文(Steven)导演了1,2或3部电影。

{

  steve as var(func: allofterms(name@en, "Steven")) {

    films as count(director.film)

  }

  stevens(func: uid(steve)) @filter(eq(val(films), [1,2,3])) {

    name@en

    numFilms : val(films)

  }

}

1.7.2、小于,小于或等于,大于和大于或等于

语法示例:不等式 IE

IE(predicate, value)

IE(val(varName), value)

IE(predicate, val(varName))

IE(count(predicate), value)

IE代替

le 小于或等于

lt 少于

ge 大于或等于

gt 大于

模式类型:int,float,string,dateTime

需要索引:IE(predicate, ...)表单需要索引(请参见下表)。对于count(predicate)查询根,@count索引是必需的。对于变量,值已作为查询的一部分进行计算,因此不需要索引。

类型

指数期权

int

int

float

float

string

exact

dateTime

dateTime

查询示例:1980年之前发行的Ridley Scott电影。

{

  me(func: eq(name@en, "Ridley Scott")) {

    name@en

    director.film @filter(lt(initial_release_date, "1980-01-01"))  {

      initial_release_date

      name@en

    }

  }

}

1.8、uid

语法示例:

q(func: uid(<uid>))

predicate @filter(uid(<uid1>, ..., <uidn>))

predicate @filter(uid(a)) 对于变量 a

q(func: uid(a,b))对于变量a和b

将当前查询级别的节点筛选为仅给定UID集中的节点。

对于查询变量a,uid(a)表示存储在中的UID集a。对于value变量b,uid(b)表示从UID到值映射的UID。具有两个或多个变量,uid(a,b,...)表示所有变量的并集。

uid(<uid>)与身份函数一样,即使节点没有任何边缘,也将返回请求的UID。

查询示例:如果已知节点的UID,则可以直接读取该节点的值。知名UID拍摄的Priyanka Chopra的电影

{

  films(func: uid(0x1daf5)) {

    name@hi

    actor.film {

      performance.film {

        name@hi

      }

    }

  }

}

1.9、uid_in

语法示例:

q(func: ...) @filter(uid_in(predicate, <uid>))

predicate1 @filter(uid_in(predicate2, <uid>))

架构类型:UID

所需索引:无

当该uid功能基于UID过滤当前级别的节点时,该功能uid_in允许沿边缘向前看以检查其是否导致特定的UID。这通常可以节省额外的查询块,并避免返回边缘。

uid_in 不能在根目录下使用,它接受一个UID常量作为其参数(而不是变量)。

查询示例:Marc Caro和Jean-Pierre Jeunet(UID 0x99706)的协作。如果Jean-Pierre Jeunet的UID是已知的,则以这种方式进行查询就无需使用块将其UID提取到变量中,并且无需进行额外的边遍历和过滤~director.film。

{

  caro(func: eq(name@en, "Marc Caro")) {

    name@en

    director.film @filter(uid_in(~director.film, 0x99706)) {

      name@en

    }

  }

}

1.10、拥有

语法示例: has(predicate)

模式类型:全部

确定节点是否具有特定谓词。

查询示例:前五名导演及其所有录制有发行日期的电影。导演们执导了至少一部电影-与等同的语义gt(count(director.film), 0)。

{

  me(func: has(director.film), first: 5) {

    name@en

    director.film @filter(has(initial_release_date))  {

      initial_release_date

      name@en

    }

  }

}

1.11、地理位置

注意到目前为止,我们仅支持索引Point,Polygon和MultiPolygon 几何类型。但是,Dgraph可以存储其他类型的地理位置数据。

请注意,对于地理查询,所有带有孔的多边形都将替换为外部循环,而忽略孔。此外,至于版本0.7.7,多边形包含检查是近似的。

变异

要使用geo函数,您需要在谓词上建立索引。

loc: geo @index(geo)

这是您添加的方法Point。

{

  set {

    <_:0xeb1dde9c> <loc> "{'type':'Point','coordinates':[-122.4220186,37.772318]}"^^<geo:geojson> .

    <_:0xeb1dde9c> <name> "Hamon Tower" .

  }

}

这是将a Polygon与节点关联的方式。添加a MultiPolygon也类似。

{

  set {

    <_:0xf76c276b> <loc> "{'type':'Polygon','coordinates':[[[-122.409869,37.7785442],[-122.4097444,37.7786443],[-122.4097544,37.7786521],[-122.4096334,37.7787494],[-122.4096233,37.7787416],[-122.4094004,37.7789207],[-122.4095818,37.7790617],[-122.4097883,37.7792189],[-122.4102599,37.7788413],[-122.409869,37.7785442]],[[-122.4097357,37.7787848],[-122.4098499,37.778693],[-122.4099025,37.7787339],[-122.4097882,37.7788257],[-122.4097357,37.7787848]]]}"^^<geo:geojson> .

    <_:0xf76c276b> <name> "Best Western Americana Hotel" .

  }

}

1.12、询问

1.12.1、近

语法示例: near(predicate, [long, lat], distance)

模式类型: geo

所需索引: geo

匹配所有给定位置predicatedistancegeojson坐标米以内的实体[long, lat]。

查询示例:距旧金山金门公园一点的1000米(1公里)内的旅游目的地。

{

  tourist(func: near(loc, [-122.469829, 37.771935], 1000) ) {

    name

  }

}

1.12.2、内

语法示例: within(predicate, [[[long1, lat1], ..., [longN, latN]]])

模式类型: geo

所需索引: geo

匹配所有给定位置predicate位于geojson坐标数组指定的多边形内的实体。

查询示例:旧金山金门公园指定区域内的旅游目的地。

{

  tourist(func: within(loc, [[[-122.47266769409178, 37.769018558337926 ], [ -122.47266769409178, 37.773699921075135 ], [ -122.4651575088501, 37.773699921075135 ], [ -122.4651575088501, 37.769018558337926 ], [ -122.47266769409178, 37.769018558337926]]] )) {

    name

  }

}

1.12.3、包含

语法示例:contains(predicate, [long, lat])contains(predicate, [[long1, lat1], ..., [longN, latN]])

模式类型: geo

所需索引: geo

匹配所有描述由给出的位置的多边形predicate包含geojson坐标[long, lat]或给定geojson多边形的实体。

查询示例:在旧金山动物园的火烈鸟围栏中包含一个点的所有实体。

{

  tourist(func: contains(loc, [ -122.50326097011566, 37.73353615592843 ] )) {

    name

  }

}

1.12.4、相交

语法示例: intersects(predicate, [[[long1, lat1], ..., [longN, latN]]])

模式类型: geo

所需索引: geo

匹配描述由给出的位置的多边形predicate与给定的geojson多边形相交的所有实体。

{

  tourist(func: intersects(loc, [[[-122.503325343132, 37.73345766902749 ], [ -122.503325343132, 37.733903134117966 ], [ -122.50271648168564, 37.733903134117966 ], [ -122.50271648168564, 37.73345766902749 ], [ -122.503325343132, 37.73345766902749]]] )) {

    name

  }

}

 

2、DGraph架构

Dgraph是真正的分布式图形数据库-不是通用数据集的主从复制。它按谓词进行分片,并在整个集群中复制谓词,查询可以在任何节点上运行,并且联接可以处理分布式数据。对于本地存储的谓词,查询在本地解析;对于在其他节点上存储的谓词,则通过分布式联接解析。

为了有效地运行Dgraph群集,了解分片,复制和重新平衡的工作原理很重要。

2.1、分片

Dgraph将每个谓词的数据并置(在RDF术语中为* P *),因此数据的最小单位是一个谓词。为了对图进行分片,将一个或多个谓词分配给一个组。群集中的每个Alpha节点都服务于一个组。Dgraph Zero将一个组分配给每个Alpha节点。

2.2、分片再平衡

Dgraph Zero尝试根据每个组中的磁盘使用量重新平衡群集。如果Zero检测到不平衡,它将尝试将谓词及其索引移到磁盘使用量最少的组。这可以使谓词临时为只读。对谓词的查询仍将继续进行,但对谓词的任何更改都将被拒绝,并应在移动完成后重试。

零将连续尝试使每个服务器上的数据量保持一致,通常以10分钟的频率运行此检查。因此,每个附加的Dgraph Alpha实例将允许Zero进一步将谓词从组中分离出来并将它们移到新节点。

2.3、一致的复制

如果将--replicas标志设置为大于1的值,则零会将同一组分配给多个节点。然后,这些节点将形成一个Raft组(即定额)。每次写入都将始终复制到仲裁中。要达成共识,重要的是仲裁人数应为奇数。因此,我们建议设置--replicas为1、3或5(而不是2或4)。这允许服务同一组的0个,1个或2个节点分别关闭,而不会影响该组的整体运行状况。

2.4、端口使用

Dgraph群集节点使用不同的端口通过gRPC和HTTP进行通信。用户在根据端口的拓扑和部署模式选择这些端口时必须注意,因为每个端口需要不同的访问安全规则或防火墙。

2.4.1、端口类型

  • gRPC-internal:在群集节点之间用于内部通信和消息交换的端口。
  • gRPC-external: Dgraph客户端,Dgraph Live Loader和Dgraph Bulk loader使用的端口,用于通过gRPC访问API。
  • http-external:客户端用于通过HTTP以及其他监视和管理任务访问API的端口。

2.4.2、不同节点使用的端口

Dgraph节点类型

gRPC内部

gRPC外部

HTTP外部

-未使用-

5080

6080

α

7080

9080

8080

拉特尔

-未使用-

-未使用-

8000

用户必须根据其底层网络修改安全规则或打开防火墙,以允许群集节点之间以及服务器和客户端之间进行通信。在开发过程中,一般规则可能是在群集节点内开放* -external(gRPC / HTTP)端口到公共,而gRPC-internal端口要在集群节点中打开。

Ratel UI在HTTP外部端口(默认localhost:8080)上访问Dgraph Alpha,并且可以配置为与远程Dgraph群集通信。这样,您可以在本地计算机上运行Ratel并指向远程群集。但是,如果要与Dgraph群集一起部署Ratel,则可能必须向公众公开8000。

端口偏移量为了使用户更容易设置群集,Dgraph默认使用Dgraph节点使用的端口,并允许用户提供偏移量(通过命令选项--port_offset)来定义该节点使用的实际端口。在HA设置中启动多个零节点时,也可以使用偏移。

例如,当用户通过设置运行Dgraph Alpha时--port_offset 2,Alpha节点分别绑定到7082(内部gRPC),8082(外部HTTP)和9092(外部gRPC)。

默认情况下,Ratel UI侦听端口8000。您可以使用该-port标志配置侦听其他任何端口。

对于Dgraph v1.0.2(或更旧版本)

零的默认端口是7080和8080。当按照以下不同设置指南的说明进行操作时,请使用零端口覆盖--port_offset以匹配当前的默认端口。

# Run Zero with ports 5080 and 6080

dgraph zero --idx=1 --port_offset -2000# Run Zero with ports 5081 and 6081

dgraph zero --idx=2 --port_offset -1999

同样,Ratel的默认端口为8081,因此请使用--port当前的默认端口覆盖它。

dgraph-ratel --port 8080

2.5、HA群集设置

在高可用性设置中,我们需要为零运行3或5个副本,类似地,为Alpha运行3或5个副本。

注意 

如果副本数为2K + 1,则最多可以关闭K台服务器,而不会影响读取或写入。

避免将副本保留为2K(偶数)。如果K台服务器出现故障,由于缺乏共识,这将阻止读取和写入。

Dgraph零 运行三个零实例,为每个via --idx标记分配一个唯一的ID(Integer),并通过标记传递任何正常的零实例的地址--peer。

要为alpha运行三个副本,请设置--replicas=3。每次添加新的Dgraph Alpha时,Zero都会检查现有的组并将它们分配给一个没有三个副本的组。

Dgraph Alpha 运行任意数量的Dgraph Alpha。您可以手动设置--idx标志,也可以将该标志保留为空,零将为ID自动分配一个ID。该ID将保留在预写日志中,因此请注意不要删除它。

新的Alpha将通过与Dgraph 0进行通信来自动检测彼此,并建立彼此的连接。

通常,零会首先尝试通过复制新的Dgraph alpha来尝试复制一个组,以运行与分配给另一个组相同的组。按照--replicas标志复制组后,零将创建一个新组。

随着时间的流逝,数据将平均分配到所有组中。因此,重要的是要确保Dgraph alpha的数量是复制设置的倍数。例如,如果您设置--replicas=3为零,则运行三个Dgraph alpha,不进行分片,而是进行3x复制。运行六个Dgraph alpha,以3x复制的方式将数据分成两组。

2.6、使用Kubernetes(v1.8.4)

注意这些说明适用于在没有TLS配置的情况下运行Dgraph Alpha。有关使用TLS运行的说明,请参阅TLS说明

  • 安装kubectl这是用于部署和管理应用程序kubernetes。
  • 启动kubernetes集群并在您选择的云提供商上运行。您可以使用kopsAWS上进行设置。默认情况下,Kops会在AWS上自动缩放,并为您创建卷和实例。

使用验证您的集群已启动并正在运行kubectl get nodes。如果使用kops默认选项,则应准备好一个主节点和两个工作节点。

➜  kubernetes git:(master) ✗ kubectl get nodes

NAME                                          STATUS    ROLES     AGE       VERSION

ip-172-20-42-118.us-west-2.compute.internal   Ready     node      1h        v1.8.4

ip-172-20-61-179.us-west-2.compute.internal   Ready     master    2h        v1.8.4

ip-172-20-61-73.us-west-2.compute.internal    Ready     node      2h        v1.8.4

2.6.1、单服务器

Kubernetes集群启动后,您可以使用dgraph-single.yaml启动零和Alpha。

在您的机器上,运行以下命令以启动创建一个Pod的StatefulSet,该Pod中运行着零和Alpha。

kubectl create -f https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-single/dgraph-single.yaml

输出:

service "dgraph-public" created

statefulset "dgraph" created

确认吊舱已成功创建。

kubectl get pods

输出:

NAME       READY     STATUS    RESTARTS   AGE

dgraph-0   3/3       Running   0          1m

提示您可以使用来检查容器中容器的日志kubectl logs -f dgraph-0 <container_name>。例如,尝试kubectl logs -f dgraph-0 alpha获取服务器日志。

测试设置

从本地计算机转发到Pod

kubectl port-forward dgraph-0 8080

kubectl port-forward dgraph-0 8000

转到http://localhost:8000并验证Dgraph是否按预期工作。

注意您还可以通过其外部IP地址访问该服务。

停止集群

删除所有资源

kubectl delete pods,statefulsets,services,persistentvolumeclaims,persistentvolumes -l app=dgraph

停止集群。如果您使用过kops,则可以运行以下命令。

kops delete cluster ${NAME} --yes

2.6.2、使用Kubernetes的HA集群设置

该设置允许您运行3个Dgraph Alpha和3个Dgraph Zeros。我们从--replicas 3标志开始以零开始,因此所有数据将在3个Alpha上复制并形成1个Alpha组。

注意理想情况下,您至少应将三个工作节点作为Kubernetes集群的一部分,以便每个Dgraph Alpha都在单独的节点上运行。

检查属于Kubernetes集群的节点。

kubectl get nodes

输出:

NAME                                          STATUS    ROLES     AGE       VERSION

ip-172-20-34-90.us-west-2.compute.internal    Ready     master    6m        v1.8.4

ip-172-20-51-1.us-west-2.compute.internal     Ready     node      4m        v1.8.4

ip-172-20-59-116.us-west-2.compute.internal   Ready     node      4m        v1.8.4

ip-172-20-61-88.us-west-2.compute.internal    Ready     node      5m        v1.8.4

Kubernetes集群启动后,您可以使用dgraph-ha.yaml启动集群。

在您的计算机上,运行以下命令以启动集群。

kubectl create -f https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-ha/dgraph-ha.yaml

输出:

service "dgraph-zero-public" created

service "dgraph-alpha-public" created

service "dgraph-alpha-0-http-public" created

service "dgraph-ratel-public" created

service "dgraph-zero" created

service "dgraph-alpha" created

statefulset "dgraph-zero" created

statefulset "dgraph-alpha" created

deployment "dgraph-ratel" created

确认吊舱已成功创建。

kubectl get pods

输出:

NAME                   READY     STATUS    RESTARTS   AGE

dgraph-ratel-<pod-id>  1/1       Running   0          9s

dgraph-alpha-0         1/1       Running   0          2m

dgraph-alpha-1         1/1       Running   0          2m

dgraph-alpha-2         1/1       Running   0          2m

dgraph-zero-0          1/1       Running   0          2m

dgraph-zero-1          1/1       Running   0          2m

dgraph-zero-2          1/1       Running   0          2m

提示可以使用kubectl logs -f dgraph-alpha-0和检查窗格中容器的日志kubectl logs -f dgraph-zero-0。

测试设置

从本地计算机转发到Pod

kubectl port-forward dgraph-alpha-0 8080

kubectl port-forward dgraph-ratel-<pod-id> 8000

转到http://localhost:8000并验证Dgraph是否按预期工作。

注意您还可以通过其外部IP地址访问该服务。

停止集群

删除所有资源

kubectl delete pods,statefulsets,services,persistentvolumeclaims,persistentvolumes -l app=dgraph-zero

kubectl delete pods,statefulsets,services,persistentvolumeclaims,persistentvolumes -l app=dgraph-alpha

kubectl delete pods,replicasets,services,persistentvolumeclaims,persistentvolumes -l app=dgraph-ratel

停止集群。如果您使用过kops,则可以运行以下命令。

kops delete cluster ${NAME} --yes

2.6.3、Kubernetes存储

上一节中的Kubernetes配置已配置为以任何存储类型(storage-class: anything)运行Dgraph 。在AWS,GCP和Azure等常见云环境中,默认存储类型是慢速磁盘,例如硬盘或低IOPS SSD。我们强烈建议在运行Dgraph时使用更快的磁盘以获得理想的性能。

本地存储

AWS存储优化的i类实例提供了本地连接的基于NVMe的SSD存储,可提供一致的非常高的IOPS。Dgraph团队在AWS上使用i3.large实例来测试Dgraph。

您可以创建一个Kubernetes StorageClass对象来配置特定类型的存储卷,然后将其附加到Dgraph容器。您可以使用“ 本地永久卷使用本地 SSD设置群集。在撰写本文时,此Kubernetes功能处于beta版本(Kubernetes v1.13.1)。您可以首先使用本地连接的存储设置EC2实例。格式化并正确安装后,您可以创建一个StorageClass来访问它。

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: <your-local-storage-class-name>

provisioner: kubernetes.io/no-provisioner

volumeBindingMode: WaitForFirstConsumer

当前,Kubernetes不允许自动配置本地存储。因此,应创建具有特定安装路径的PersistentVolume:

apiVersion: v1

kind: PersistentVolume

metadata:

  name: <your-local-pv-name>

spec:

  capacity:

    storage: 475Gi

  volumeMode: Filesystem

  accessModes:

  - ReadWriteOnce

  persistentVolumeReclaimPolicy: Delete

  storageClassName: <your-local-storage-class-name>

  local:

    path: /data

  nodeAffinity:

    required:

      nodeSelectorTerms:

      - matchExpressions:

        - key: kubernetes.io/hostname

          operator: In

          values:

          - <node-name>

然后,在StatefulSet配置中,您可以在.spec.volumeClaimTemplate中声明此本地存储:

kind: StatefulSet

...

 volumeClaimTemplates:

  - metadata:

      name: datadir

    spec:

      accessModes:

      - ReadWriteOnce

      storageClassName: <your-local-storage-class-name>

      resources:

        requests:

          storage: 500Gi

您可以对配置了本地节点存储的每个实例重复这些步骤。

2.6.4、非本地永久磁盘

AWS上的EBS卷和GCP上的PD是可以使用Dgraph配置的永久磁盘。磁盘性能远低于本地连接的存储,但足以应付您的工作负载(如测试环境)。

AWS上使用EBS卷时,建议使用提供一致IOPS的Provisioned IOPS SSD EBS卷(io1磁盘类型)。AWS EBS卷的可用IOPS基于总磁盘大小。使用Kubernetes,您可以使用以下iopsPerGB参数请求以50 IOPS / GB的配置将此io1磁盘置备 :

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

  name: <your-storage-class-name>

provisioner: kubernetes.io/aws-ebs

parameters:

  type: io1

  iopsPerGB: "50"

  fsType: ext4

示例:使用此存储类请求250Gi磁盘大小将提供12.5K IOPS。

2.6.5、删除Dgraph Pod

如果您需要完全删除Pod(例如,其磁盘已损坏并且无法恢复数据),则可以使用/removeNodeAPI从群集中删除节点。使用Kubernetes StatefulSet时,您需要按以下顺序删除节点:

调用/removeNode以从集群中删除Dgraph实例(请参阅有关Dgraph Zero的更多信息)。删除的实例将立即停止运行。由于该实例已被删除,因此任何其他尝试加入该集群的尝试都将失败。

删除与容器关联的PersistentVolumeClaim以删除其数据。这将准备将吊舱连接到干净状态。

重新启动广告连播。这将创建一个新的PersistentVolumeClaim以创建新的数据目录。

Alpha Pod在复制的群集中重新启动时,它将作为群集的新成员加入,被分配一个组和一个从零开始的未使用索引,并从该组的Alpha领导者那里接收最新快照。

零吊舱重新启动时,它必须使用未使用的索引ID加入现有组。索引ID设置有--idx标志。这可能需要更新StatefulSet配置。

2.6.6、Kubernetes和散装装载机

您可能希望使用现有数据集(例如来自Dgraph Bulk Loader的数据)初始化新群集。您可以使用Init Containers 将数据复制到Pod卷上,然后再运行Alpha进程。

有关更多initContainers信息,请参见dgraph-ha.yaml中的配置 。

 

posted @ 2020-03-05 17:54  IT入门学生  阅读(949)  评论(0)    收藏  举报