Elasticsearch学习之路(3)

分片

es支持PB级全文搜索,当索引上的数量太大的时候,es通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,拆分出来的数据库块称之为一个分片。

类似于Mysql的分库分表,只不过Mysql分库分表需要借助第三方,而es内部自身实现了此功能,在一个多分片的索引中写入数据时,通过路由来确定具体写入哪个分片,所以在创建索引的时候需要指定分片的数量,并且分片的数量一旦确定就无法修改。分片的数量和下面介绍的副本数量都是可以通过创建索引时的settings来配置,默认一个索引创建5个主分片,为每个分片创建一个副本

副本

副本就是分片的copy,每个主分片都有一个或者多个副本分片,当主分片异常时,副本可以提供数据的查询等操作,主分片和对应的副本分片时不会再同一个节点上的,所以副本分片数的最大值时n-1(其中n时节点数)

对文档的新建,索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片,es为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突问题,es是哦通过乐观锁的方式控制,每个文档都有一个版本号,当文档呗修改时版本号递增,一旦所有的副本分片都报告写成功才会向协调节点报告成功,协调节点向客户端报告成功。

                                     s:主分片 R:副本分片

为了达到高可用,Master节点会避免将主分片和副本分片放在同一个节点上。

如果这时Node1副本宕机了或者网络不可用了,那么主节点上主分片S0也就不可用了,幸运的是还存在另外两个节点能正常共,这时ES会重新选举新的主节点,而且这个两个节点上存在我们的所需要的s0的所有数据,我们会将s0的副本分片提升为主分片,这个提升主分片的过程是瞬时发生的,此时集群的状态将会为yellow。

为社么呢我们集群状态是yellow而不是green呢?虽然我们拥有所有的两个主分片,但是同时设置了每个主分片需要对应两份副本分片,而此时只存在一份副本分片,所以集群不能为green的状态,如果我们同样关闭了 Node2 ,我们的程序依然可以保持在不丢任何数据的情况下运行,因为Node3 为每一个分片都保留着一份副本。

如果我们重新启动Node1 ,集群可以将缺失的副本分片再次进行分配,那么集群的状态又将恢复到原来的正常状态。如果Node1依然拥有着之前的分片,它将尝试去重用它们,只不过这时Node1节点上的分片不再是主分片而是副本分片了,如果期间有更改的数据只需要从主分片上复制修改的数据文件即可。

小结:

1、将数据分片是为了提高可处理数据的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高并发量。2、副本是乘法,越多消耗越大,但也越保险。分片是除法,分片越多,单分片数据就越少也越分散。3、副本越多,集群的可用性就越高,但是由于每个分片都相当于一个Lucene的索引文件,会占用一定的文件句柄、内存及CPU,并且分片间的数据同步也会占用一定的网络带宽,所以索引的分片数和副本数也不是越多越好。

映射

映射是用于定义ES对索引中字段的存储类型,分词方式和是否存储能信息,就像数据库中的schema,描述了文档可能具有的字段或属性,每个字段的数据类型。只不过关系型数据库建表时必须指定字段类型,而es对于字段类型可以不指定然后动态对字段类型猜测,也可以在创建索引时具体指定字段的类型

对字段类型根据数据格式自动识别的映射称为动态映射,我们创建索引时具体定义字段类型的映射称为静态映射

es字段类型

类别数据类型
核心类型text, keywords, long, integer, short, double, data, boolean等等
复杂类型Object, Nested
地理类型geopoint, geoshape
特殊类型

ip, completion, token_count, join等等

text用于索引全文值的字段,例如电子邮件正文或者产品说明,这些字段是被分词得,他们用过分词器传递,以在被索引之前将字符串转换为单个术语得列表,分析过程允许es搜索单个单词中每个完整的文本字段,文本字段不用排序,很少用于聚合

keyword 用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,通常用于过滤,排序和聚合,keyword字段只能按其确切的值进行搜索

通过对字段类型的了解我们知道有些字段需要明确定义的,例如某个字段是text类型还是keword类型差别是很大的,时间字段也许我们需要指定它的时间格式,还有一些字段我们需要指定特定的分词器等等。如果采用动态映射是不能精确做到这些的,自动识别常常会与我们期望的有些差异。

所以创建索引给的时候一个完整的格式应该是指定分片和副本数以及Mapping的定义,如下:

 
 PUT my_index
{
	"settings": {
		"number_of_shards": 5,
		"number_of_replicas": 1
	}
	"mappings": {
		"_doc": {
			"properties": {
				"title": {
					"type": "text"
				},
				"name": {
					"type": "text"
				},
				"age": {
					"type": "integer"
				},
				"created": {
					"type": "date",
					"format": "strict_date_optional_time||epoch_millis"
				}

			}

		}

	}

}

下一章讲es的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值