ElasticSearch的集群以及配置方法

ElasticSearch集群

8.1.集群相关概念

8.1.1.为什么要集群
  • 单节点故障
  • 支持高并发
  • 海量数据存储
8.1.2.ES节点类型

默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。这些功能是由两个属性控制的。node.master 和 node.data 默认情况下这两个属性的值都是true。

配置 解释
node.master true 是否是主节点
node.data true 是否存储数据
  • 主节点master

    node.master=true,代表该节点有成为主资格,主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。一般会把主节点和数据节点分开,node.master=true , node.data=false

  • 数据节点data

    node.data=true,数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等,数据节点对CPU,IO,内存要求较高,优化节点的时候需要做状态监控,资源不够时要做节点扩充。配置:mode.master=false,mode.data=true

  • 负载均衡节点client

    当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。配置:mode.master=false,mode.data=false

最佳实践

​ 在一个生产集群中我们可以对这些节点的职责进行划分,建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大,所以在集群中建议再设置一批client节点(node.master: false node.data: false),这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。

8.2.ES的集群理解

8.2.1.shard&replica机制
  • index包含多个shard,一个shard是最小工作单元,存储部分数据,完整的建立索引和处理索引的能力

  • primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和副本都丢失,起不到容错的作用),但是可以和其他primary shard的replica shard放在同一个节点上

  • 增减节点时,shard会自动在nodes中负载均衡

    2个主Shard , 2个从Shard , 3个Node -> 2个主Shard , 2个从Shard , 4个Node

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KEG3nJm-1581164302084)(images/image-20191115145540717.png)]

  • primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard

  • replica shard是primary shard的副本,负责容错(备胎,备升级为主),以及承担读请求负载 - 读写分离

  • primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改

  • primary shard的默认数量是5,replica默认是1,默认有10个shard,5个primary shard,5个replica shard

8.2.2.图解Shard分配
a.单node环境下创建index

​ 单node环境下,创建一个index,有3个primary shard,3个replica shard

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LnWnrevQ-1581164302086)(images/image-20191115150151306.png)]

  • 这个时候,只会将3个primary shard分配到仅有的一个node上去,另外3个replica shard是无法分配的
  • 集群status是yellow
  • 集群可以正常工作,但是一旦出现节点宕机,数据全部丢失,而且集群不可用,无法承接任何请求
b.两个node环境下创建index

​ 2个node环境下,创建一个index, 3个primary shard,3个replica shard

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30Drxzsq-1581164302087)(images/image-20191115150344097.png)]

c.扩容极限,提升容错

​ 如何让性能达到更优?

  • 每个Node更少的Shard,每个Shard资源跟充沛,性能更高
  • 扩容极限:6个shard(3 primary,3 replica),最多扩容到6台机器,每个shard可以占用单台服务器的所有资源,性能最好
  • 超出扩容极限,动态修改replica数量,9个shard(3primary,6 replica),扩容到9台机器,比3台机器时,拥有3倍的读吞吐量
8.2.3.容错机制-Master选举
  • master node宕机,自动进行master选举, - Red

    当某个PrimaryShard (主分片)宕机,这个PrimaryShard的某个ReplicShard(备分片)会通过选举成为PrimaryShard。

  • Replica容错:将replica提升为新的primary shard,- yellow

    新的主分片选举成功后,那么保证了主分片的完整性,但是少了一个备分片,所以状态变成了黄色

  • 重启宕机节点:会生成新的ReplicShard,如果宕机前有数据,会先恢复之前的数据,然后从PrimaryShard中拷贝新的数据,这样做的好处是:1.恢复性能好 , 2.可以避免数据同步延迟造成的数据丢失问题(在宕机的一瞬间,有些数据还没同步到ReplicShard,可能会导致数据丢失)

8.3.集群搭建

8.3.1.环境准备

真实环境

NodeName Web端口,客户端端口
node-1 172.168.1.1:9200 172.168.1.1:9300
node-2 172.168.1.2:9200 172.168.1.2:9300
node-3 172.168.1.3:9200 172.168.1.3:9300

模拟环境

NodeName Web端口,客户端端口
node-1 127.0.0.1:9201 127.0.0.1:9301
node-2 127.0.0.1:9202 127.0.0.1:9302
node-3 127.0.0.1:9203 127.0.0.1:9303

注意:需要准备三个ES(拷贝),然后删除data目录 , 如果电脑内存不够,可以把jvm.properties中的内存设置改小

8.3.2.配置说明
- 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

  最少的主节点个数

- discovery.zen.ping_timeout

  主节点选举超时时间设置

- gateway.recover_after_nodes

  值为n,网关控制在n个节点启动之后才恢复整个集群

- node.max_local_storage_nodes

  值为n,一个系统中最多启用节点个数为n

- action.destructive_requires_name

  选项为true或false,删除indices是否需要现实名字
8.3.3.修改ES配置
  • Node1-配置
# 统一的集群名
cluster.name: my-ealsticsearch

# 当前节点名
node.name: node-1

# 对外暴露端口使外网访问
network.host: 127.0.0.1

# 对外暴露端口
http.port: 9201

#集群间通讯端口号
transport.tcp.port: 9301

#集群的ip集合,可指定端口,默认为9300
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
  • Node2-配置
# 统一的集群名
cluster.name: my-ealsticsearch
# 当前节点名
node.name: node-2
# 对外暴露端口使外网访问
network.host: 127.0.0.1
# 对外暴露端口
http.port: 9202
#集群间通讯端口号
transport.tcp.port: 9302
#集群的ip集合,可指定端口,默认为9300
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
  • Node3-配置
# 统一的集群名
cluster.name: my-ealsticsearch
# 当前节点名
node.name: node-3
# 对外暴露端口使外网访问
network.host: 127.0.0.1
# 对外暴露端口
http.port: 9203
#集群间通讯端口号
transport.tcp.port: 9303
#集群的ip集合,可指定端口,默认为9300
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]

分别启动三个ES节点 , 访问:http://127.0.0.1:9201/

8.4连接集群

8.4.1.修改kibana配置
elasticsearch.url: "http://localhost:9201"

连接其中一个节点自然能连接上整个集群 , 然后启动Kibana

8.4.2.集群查看命令

创建索引

PUT shopping
{
	"settings":{
		"number_of_shards":5,
		"number_of_replicas":1
	}
}
  • GET _cat/nodes?v :查看Node
  • GET _cat/indices?v : 查看索引库
  • GET /_cat/shards?v :查看分片
  • GET /_cat/shards/{index} :查看某个索引库的分片情况
发布了47 篇原创文章 · 获赞 6 · 访问量 1576

猜你喜欢

转载自blog.csdn.net/yy971733014/article/details/104227754