当数据量较大,同时又需要快速计算时,可以在多台分机上,将集群组表常驻内存,后续查询可以直接访问内存数据。在分机启动时,将共享数据加载入内存区,根据内存区的编号提供全进程数据访问。
为了加载内存区的数据,需要分机在运行时执行初始化。分机运行时的初始化是靠执行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中,需要定义两个参数z和zoneN,将在初始化时根据分机序号传入:
在这段初始化代码中,需要先用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() |
这里使用本机启动的两个分机,端口分别为8281和8291。A2中用hosts@i(h, n) 在分机主进程序列h中,查找分区值为1到n的可用分机序列,@i表示将对这些分机分别执行init.dfx中的代码,加载对应的集群组表到内存区。结果即为找到的分机序列:
在分机窗口中能够看到对应的初始化执行情况,如:
A3中,memory(h, v) 使用各个分机内存区中的全局变量v共同构成集群组表。A4中使用内存区中的集群组表查询,它的使用和普通的集群组表是相同的。A4中查询结果如下:
由于集群组表需要由各个分机内存区中的数据共同构成,因此对稳定性要求比较高,为了防止个别分机故障造成集群组表无法使用,在使用时可以采用内存容错。为此,需要准备一台或多台备用分机,将数据存储多份,在某台分机故障时由备用分机提供相应部分的数据。如增加一台分机8301,在数据分区node3中同时存储node1和node2各个分区的数据:
在分机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顶替,保证了内存区中集群组表的稳定使用。