想ES中存储数据,需要index——存储数据的地方,实际上,index就是一个指向若干物理shard的逻辑命名空间。
shard就是更底层的工作单元,每个shard是一个Lucene的实例,每个shard在其控制范围内都是一个完整的搜索引擎。我们的文档被存储,并且被index到shard,但是应用程序是不和shard直接对话的而是和index进行通信。
由于shard是真正储存数据的地方,因此shard表示了ES在你的cluster中是怎么分布数据的。文档被存储在shard中,shard被分配到cluster中的node中。当你的cluster扩展或这收缩,ES将会自动在node自动迁移shard,一次cluster可以自动实现平衡分布。
一个shard可以作为primary shard也可一作为replica shard。每个在你index中的document都仅仅分配到一个primary
shard,因此primaryshard的数量决定了你的index能存储的最大数据量。
然而理论上primary
shard能存储的数据量没有限制,这个显示是在实际运行中得到的。shard能存储的最大数据量完全取决你的使用场景如:硬件的限制,document的复杂度,插入(index)和查询(query)文档(document)的方式和你期望响应的速度。
replica shard就是primary shard的一份拷贝。replica就是primary
shard的数据冗余用来保护数据免受到硬件故障的影响,并且对文档的搜索和检索请求作出相应。
primary shard的数量在一个index创建的时候已经被固定了,但是replica shard的数量在任何时候都是可以改变的。
现在,在一个仅仅包含一个node的空的cluster中创建一个名为“blogs”的index。默认情况下,一个index会被分配5个primary
shard,但是作为例子,这里将会分配3个primary shard和1个replica(为每个primary shard分配一个replica
shard)
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
生成的blogs index将会如下图
有三个primary
shard。检测cluster-health,将会得到如下响应,
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards":3,
"active_shards": 3,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 3
}
标记1处的status表示cluster为yellow
标记2处表示还有3个shard没有被分配
cluster的health状态是yellow意味着所有的primary
shard都已经启动了并且正常运行了——这个cluster能提供所有的请求服务了——但是只有若干不是全部的replica
shard被激活。事实上,未被分配的三个shard——他们还没有分配到node下。他们也不存储备份的数据。这时候如果丢失了数据,那就是真的丢失了。
目前,这个cluster已经可以完全实现基础功能了,但是有硬件故障导致的数据丢失的风险。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_add_an_index.html