介绍
elasticsearch集群的搭建教程很多。网上一搜都是,但是,搭建不难。更重要的是明白集群原理,性能以及运维知识点。所以,本文将从这些点着重介绍。
配置参数详解
在elasticsearch配置文件中有以下这些参数,将逐一介绍(其实配置文件中英文描述已经非常清楚):
cluster.name 集群名,自定义集群名,默认为elasticsearch,建议修改,因为低版本多播模式下同一网段下相同集群名会自动加入同一集群,如生产环境这样易造成数据运维紊乱。
node.name 节点名,同一集群下要求每个节点的节点名不一致,起到区分节点和辨认节点作用
node.master 是否为主节点,选项为true或false,当为true时在集群启动时该节点为主节点,在宕机或任务挂掉之后会选举新的主节点,恢复后该节点依然为主节点
node.data 是否处理数据,选项为true或false。负责数据的相关操作
path.data 默认数据路径,可用逗号分隔多个路径
path.logs 默认日志路径
bootstrap.mlockall 内存锁,选项为true或false,用来确保用户在es-jvm中设置的ES_HEAP_SIZE参数内存可以使用一半以上而又不溢出
network.host 对外暴露的host,0.0.0.0时暴露给外网
http.port 对外访问的端口号,默认为9200,所以外界访问该节点一般为http://ip:9200/
transport.tcp.port 集群间通信的端口号,默认为9300
discovery.zen.ping.unicast.hosts 集群的ip集合,可指定端口,默认为9300,如 ["192.168.1.101","192.168.1.102"]
discovery.zen.minimum_master_nodes 少的主节点个数,为了防止脑裂,好设置为(总结点数/2 + 1)个
discovery.zen.ping_timeout 主节点选举超时时间设置
gateway.recover_after_nodes 值为n,网关控制在n个节点启动之后才恢复整个集群
node.max_local_storage_nodes 值为n,一个系统中多启用节点个数为n
action.destructive_requires_name 选项为true或false,删除indices是否需要现实名字
理解主节点、副节点、分片与复制分片
关系
起初创建节点与分片的关系,设置shards=2,replicas=1
解析
node-master主节点 集群中用于元数据(metadata)的请求处理,比如确定分片位置,索引的新增、删除请求分配等
node 包括client node和 data node
1. `client node` node.master=true,node.data=false 用于转发请求,起到平衡负载的作用
2. `data node` node.master=flase,node.data=true
> 节点上保存了数据分片。它负责数据相关操作,比如分片的 CRUD,以及搜索和整合操作。这些操作都比较消耗 CPU、内存和 I/O 资源
shards 分片 在设置索引时默认(5)或自己设置的分片数量,即indices(1)--shards(n),而每插入一条数据都会在主分片中,即Document(n)--shards(1)
replicas 复制分片 同样在设置索引时会默认(1)或自定义复制分片数量,该数量对应关系为每个主分片对应的复制分片,即shards(1)--replicas(n)
要点
- 当集群健康状态为yello表示存在复制分片未被分配(unassigned)到节点中(或者分配的复制节点个数少于设置的个数),这时如果硬件有故障将无法找回数据。
- 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
- 主分片数量一般是在建立索引时就固定的,一般是不作修改的,如果减少分片数量意味着数据将要丢失
- 复制分片一定意义上可以起到负载的功能,提高数据的冗余量。但如果只是在相同节点数目的集群上增加更多的副本分片并不能提高性能,因为每个分片从节点上获得的资源会变少。 你需要增加更多的硬件资源来提升吞吐量
节点与分片模型
同样设置shards=2,replicas=1
分布式文档存储的关系原理
这个由于在官网指南中写的很清楚了,直接贴出章节。 分布式文档存储
集群搭建
配置集群
修改配置文件
# vi /etc/elasticsearch/elasticsearch.yml
# 统一的集群名
cluster.name: syncwt-es
# 当前节点名
node.name: syncwt-es-node-1
# 对外暴露端口使外网访问
network.host: 0.0.0.0
# 对外暴露端口
http.port: 9200
# ...还有很多可以设置,这些是基础的。具体看上面的配置参数说明
重启并查看集群健康状态:
# sudo systemctl start elasticsearch.service
# curl -XGET 'http://localhost:9200/_cat/health?v'
集群可视化插件安装elasticsearch-head
# cd ${elasticsearch_HOME}
# ./plugin install mobz/elasticsearch-head
页面访问效果(单节点): http://119.29.248.199:9200/_plugin/head/
注意
- 集群中es的版本应保持一致,好内网部署,外网不是很稳定。
- 可用容器(如docker)封装统一部署集群各节点以保持配置一致性
- 可在一台机器上运行多个节点来构建集群,只是性能会和机器配置相关
总结
- 集群中节点选型策略。node-data节点(随着数据增加而增加),note-client(随着查询压力而增加)节点
- 集群节点数量上升时,多关注配置参数,如gateway.recover_after_nodes等,会带来很多效率的提高
- 当集群数量较大时,建议横向扩展集群。单纯增加es节点的内存和CPU不会有很大提升,建议多增加节点