内存容错

阅读(222) 标签: 内存区, init.dfx,

当数据量较大,同时又需要快速计算时,可以在多台分机上,将集群组表常驻内存,后续查询可以直接访问内存数据。在分机启动时,将共享数据加载入内存区,根据内存区的编号提供全进程数据访问。

为了加载内存区的数据,需要分机在运行时执行初始化。分机运行时的初始化是靠执行init.dfx来实现的,这个SPL文件放置在分机的主路径或者寻址路径中,可以自行设计在内存区加载的共享数据,如:

 

A

B

1

/共用的一些初始化代码

2

if z > 0

>zone(z)

3

 

=file("salespart.ctx":z)

4

 

=B3.create().cursor().fetch()

5

 

>env(SALES, B4)

init.dfx中,需要定义两个参数zzoneN,将在初始化时根据分机序号传入:

在这段初始化代码中,需要先用zone(z) 函数设置当前内存区的编号以备调用,在读取文件数据时,file(fn:z) 表示在当前分机的数据区z中寻找文件fn,并用env(v, data) 函数将读出的数据存入内存区中的全局变量v中。

下面,来看如何使用内存区中的集群组表:

 

A

1

[127.0.0.1:8281, 127.0.0.1:8291]

2

=hosts@i(A1,2)

3

=memory(A2,SALES)

4

=A3.cursor().fetch()

这里使用本机启动的两个分机,端口分别为82818291A2中用hosts@i(h, n) 在分机主进程序列h中,查找分区值为1n的可用分机序列,@i表示将对这些分机分别执行init.dfx中的代码,加载对应的集群组表到内存区。结果即为找到的分机序列:

在分机窗口中能够看到对应的初始化执行情况,如:

A3中,memory(h, v) 使用各个分机内存区中的全局变量v共同构成集群组表。A4中使用内存区中的集群组表查询,它的使用和普通的集群组表是相同的。A4中查询结果如下:

由于集群组表需要由各个分机内存区中的数据共同构成,因此对稳定性要求比较高,为了防止个别分机故障造成集群组表无法使用,在使用时可以采用内存容错。为此,需要准备一台或多台备用分机,将数据存储多份,在某台分机故障时由备用分机提供相应部分的数据。如增加一台分机8301,在数据分区node3中同时存储node1node2各个分区的数据:

在分机3运行后,关闭第一台分机,执行下面的代码:

 

A

1

[127.0.0.1:8281, 127.0.0.1:8291, 127.0.0.1:8301]

2

=hosts@i(A1,2)

3

=memory(A2,SALES)

4

=A3.cursor().fetch()

代码仍然可以正常执行,A4中取到的最终结果和前面是相同的。查看A2结果如下:

 

可以看到,由于分机8281被关闭,因此它所提供的数据由8301顶替,保证了内存区中集群组表的稳定使用。