Elasticsearch 架构层:
Elasticsearch 五层架构设计图:
说明:
Elasticsearch内嵌自动发现机制:
单播模式和多播模式配置参数:
如:
discovery.zen.ping.multicast.enabled:true
discovery.zen.fd.ping_timeout:100s
discovery.zen.ping.timeou:100s
discovery.zen.minimum_master_nodes:2
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']
action_create_index:false
* Elasticsearch支持同一台主机启动多个节点,所以只有在同一台机器上运行的节点才会自动组成集群。
* 单播模式下,需要配置Elasticsearch,填写集群中的IP地址列表。如下:
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']
单播模式下的配置信息:
discovery.zen.ping.multicast.enabled:false
discovery.zen.fd.ping_timeout:100s
discovery.zen.ping.timeou:100s
discovery.zen.minimum_master_nodes:2
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']
集群构建及主节点选举过程:
discovery.zen.ping.unicast.hosts
中有设置,则ping设置hosts中,否则尝试ping localhost的几个端口。最后返回包含节点的基本信息以及该节点认为的主节点。注:
discovery.zen.minimum_master_nodes:num
),则循环集群构建与主节点选举过程,直到节点数超过最小限制值,才可以开始选举主节点。discovery.zen.ping.multicast.enabled: false
节点角色在配置文件(/config)elasticsearch.yml文件中设置即可,如下:
# 是否为候选主节点
node.master:true
# 是否为数据节点
node.data:true
image
由于Elasticsearch中,在一个多分片的索引中写入数据时,需要通过路由来确定具体陷入哪一个分片中,所以在创建索引时需要指定分片数量, 配置副本,并且分片的数量一旦确定就不能修改。
通过配置创建索引时的Setting来配置分片和副本数量,如下:
index.number_of_shards:5
index.number_of_replicas:1
补充说明:
为了避免查询时部分分片查询失败影响结果的准确性,Elasticsearch引入了路由功能。 当数据写入时,通过路由将数据写入指定分片; 当查询数据时,通过相同的路由指明在哪个分片将数据查出来
索引数据分片算法:
shard_num = hash(_routing) % num_primary_shards #_routing默认为id字段或者parent字段
补充说明:
数据存储路径配置:(/config)elasticsearch.yml文件中
path.data:/path/to/data # 索引数据
path.logs:/path/to/logs # 日志数据
【注】不建议使用默认值,防止升级Elasticsearch而导致数据部分甚至全部丢失
我们可以思考一下,为什么Elasticsearch中数据的存储要引入段?
当段被写入磁盘后会生成一个提交点,并生成一个用来记录所有段信息的文件,则对于该文件段只有读的权限,永远失去写的权限。同时该部分数据可以被 Elasticsearch 用户检索到。而当段还在内存中时,此时分段只拥有写的权限,数据还能不断写入,但不具备读数据的权限,且无法被 Elasticsearch 用户检索到。
如果段一旦提交不能再写,那么我们如何进行 ’改‘ (新增、更新和删除)的操作呢?
在面对段的不可修改特性,Elasticsearch采用不将文档从旧段中移除,而是新增一个.del文件,记录被 '改' 文档的段信息。 当用户检索时,文档依然可以被查询到,但他会在最终结果被返回前通过.del文件将其从结果集中移除。 如当更新数据时,会先创建一个段,然后将更新好的数据写入新段中,生成提交点,再在.del文件中标记旧段,从而达到更新的效果。
段的优缺点:
Elasticsearch中,索引写入磁盘是异步写入的。为了提升写的性能,延迟写策略采用了 '延迟写策略' 来解决新增一条数据就添加一个段到磁盘上的问题。
延迟写策略执行过程:
补充说明:
JVM内存中的数据不以段形式存储,无法提供检索功能
当生成段后便可以提供检索功能,无需等到刷新到磁盘。
刷新除了自动刷新,开发人员可以手动触发刷新
可通过在创建索引时的Setting文件中配置 refresh_interval
的值,来调整索引的刷新频率。如
refresh_interval = number 时间单位 # 设置值时需要注意带上时间单位,否则默认为ms(毫秒)
refresh_interval = -1 # 表示关闭索引的自动刷新
延迟写策略优缺点:
为了解决延迟写策略引入的数据丢失风险,Elasticsearch又引入了 事务日志(Translog)机制,用于记录所有还没有持久化到磁盘的数据。
添加事务日志机制后的数据写入索引流程:
为了解决段增多的问题,Elasticsearch引入了段合并机制,定期将较小的段合并到较大的段中,而较大的段合并到更大的段中;
说明:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有