我目前正在探索解决方案,以便存档并提供大量文档数据的网络搜索引擎。我首先开始寻找搜索引擎解决方案的搜索,最后得出的结论是,当您必须处理大量数据时,Elasticsearch是最好的之一。我已经读过,它很容易扩展,开箱即用,我确信。
然后我查看了没有SQL数据库,由于演员的数量,我花了更多的时间在我的搜索上,我已经阅读了几个资源(没有SQL提取,Amazon Dynamo纸张,Google BigTable纸张等)导致我为了更好地理解分布式系统。我还看到,大多数No SQL可伸缩数据库都能够在碎片变得太大时自动将碎片拆分为两个碎片。
然后我意识到Elasticsearch不提供此功能。此外,相信文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html
创建索引后,我们无法增加索引的分片数。所以这带来了我的问题:
假设您创建了一个索引,指定了预期流量/数据量的分片数量,并且超出了您的预期,您没有足够的分片来处理写入请求和索引的大小,您怎么能管理这种情况?
答案 0 :(得分:1)
我想我找到了一种方法,如果知道ElasticSearch的人可以确认它会很好用,那就太好了。
我刚读过这篇文章,最后一节激发了我的想法:
http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/
这个想法是创建两个别名(index_search和index_write),它们指向同一个索引(让我们称之为index_1)。想象一下,有一天index_1中的分片数量不够,在这种情况下,我们可以使用相同的映射和分片数创建一个新索引(让我们称之为index_2),如果我们可以添加到index_1本来可以做到的。
然后,我们更新别名index_search,使其指向“index_1,index_2”(index_1和index_2),就像在两个索引上进行搜索一样。然后,我们将index_write更新为index_2,因此只会对新的分片进行写入,因为index_1的分片被认为已满。
将来我们可以添加一个新索引(index_3)并将index_search映射到“index_1,index_2,index_3”。
当然在我们的应用程序中,我们总是使用别名而不是像这样的索引的真实名称,转换将对应用程序不可见,我们不必更改应用程序的代码。
使用Sense语法的示例:
PUT index_1
{
"settings": {
"number_of_shards": 1
}
}
POST _aliases
{
"actions": [
{
"add": {
"index": "index_1",
"alias": "index_search"
}
},
{
"add": {
"index": "index_1",
"alias": "index_write"
}
}
]
}
PUT index_write/article/1
{
"title":"One first index",
"article":"This is an article that is indexed on index_1"
}
PUT index_2
{
"settings": {
"number_of_shards": 2
}
}
POST _aliases
{
"actions": [
{
"add": {
"index": "index_2",
"alias": "index_search"
}
},
{
"add": {
"index": "index_2",
"alias": "index_write"
}
},
{
"remove": {
"index": "index_1",
"alias": "index_write"
}
}
]
}
PUT index_write/article/2
{
"title":"One second index",
"article":"This is an article that is indexed on index_2"
}
此解决方案的问题是,如果您在index_1上更新index_1上的文档而index_write指向index_2,则会复制它。这意味着你必须在更新它之前搜索它才能找到真正的索引。 此外,您不能使用ID为一个index_write的GET命令。
答案 1 :(得分:0)