我尝试过以不同格式阅读文档,我有一系列用于阅读的键。每批包含1000个密钥。我有6个riak节点。我用r = 1进行读取。我每次都连接到同一个riak节点。文档只是个人资料字段,所以它不是什么大事。我已经检查了节点上的CPU和磁盘使用情况,我可以观察到一点点移动,但是甚至没有接近整体20%的CPU。
方法1:multiGet
(code section linked here):
$data = $riak->multiGet($ids); /*EXECUTION TIME 80seconds*/
方法2:key_filter
(code section linked here)
$data = $riak->multiGetBetween($id1, $id2); /* GIVES RIAK INTERNAL TIMEOUT*/
方法3:逐个get
foreach ($ids as $key) {
$riak->get($key);
$data[$key] = $riak->document->data;
} /* EXECUTION TIME 20seconds */
正如您所看到的方法3更好,但我遇到的问题是,我的运行速度不能超过2 threads
。如果我尝试运行更多,我会得到套接字超时连接。我检查了linux开放限制,它是240k。我没有选择在这里尝试做什么。有什么想法吗?
答案 0 :(得分:1)
检索多个对象的推荐方法是使用多个连接来并行工作并连接到所有可用节点以分散负载。这样做的好处是它返回所有对象数据以及元数据,并导致执行仲裁读取和读取修复。负载也可以分布在整个群集中。但它最适合对并发和/或线程有良好支持的客户端。
对于没有的客户端库,常见的方法是尝试将多GET作为MapReduce作业执行。这是查询数据的一种相当重要的方式,需要Riak设置和执行MapReduce作业。因此,运行大量并发MapReduce作业会给系统带来很大负担。它也不会导致读取仲裁,也不会触发读取修复。
这是你在方法2示例中所做的。如果您知道要检索的键,则直接指定这些键会更有效,而不是使用键过滤器,因为Riak必须扫描更少的对象。如果您使用的是LevelDB后端,则还可以将查询基于辅助索引查找。在您的示例中,我还注意到您使用的是JavaScript Map函数。这比使用Erlang函数慢得多,并且使用app.config文件中指定的JavaScript VM池。有一个Erlang函数可以返回对象值,我相信这个的映射阶段应该指定为map(array("riak_kv_mapreduce", "map_object_value"))
。
前段时间我做了一些实验,创建了MapReduce函数,它返回了Riak对象的所有重要数据,例如:索引,元数据和矢量时钟。结果编码为JSON,这意味着这些函数仅限于有效JSON的数据。可以找到函数和一些简单的示例和文档in my GitHub repository。请注意,这尚未经过广泛测试。到目前为止,我还没有把结果输出转换为可以从中受益的客户端库的Riak对象。
解决必须从Riak检索大量对象的问题的另一种方法是对数据模型进行去规范化,以确保可以通过较少数量的请求来提供常见查询。这是我通常推荐的方法,因为它通常可以很好地扩展。如果您有大量读取数据,那么在插入或更新数据时多做一些工作通常是有意义的,以确保可以有效地读取数据。确切地说,如何做到这一点将取决于您的数据和访问模式。
答案 1 :(得分:0)
如果你没有在PHP应用程序和Riak之间使用负载均衡器,我建议使用HAProxy来确保你的应用程序不能只连接到一个Riak节点。
当请求在群集中的所有节点之间均匀分布时,Riak效果最佳。