Elasticsearch集群管理篇
Elasticsearch出现问题,最高效的解决方案是第一手资料ES英文官网文档,其次是ES英文论坛、ES github issues,再次是stackoverflow等英文论坛、博客。最后才是:Elasticsearch中文社区、其他相关中文技术博客等。
步骤1.修改文件jvm.options
-Xms8g
-Xmx8g
步骤2.修改文件elasticsearch.yml
# ======================== ES 参数配置 =========================
#
#
# ------------------------ 集群设定 ----------------------------
#
# 集群名称
cluster.name: benchmark612
#
# ------------------------ 节点设定 ----------------------------
#
# 节点名称
node.name: ${HOSTNAME}
#
# 节点角色
node.master: true
node.data: false
node.ingest: false
#
# ------------------------ 路径设定 ----------------------------
#
# 索引、日志存放路径
path:
data: /data/store/es-6.1.2_benchmark612
logs: /data/logs/es-6.1.2_benchmark612
#
# ------------------------ 内存设定 ----------------------------
#
#
# 锁定内存,阻止操作系统管理内存,可以有效的防止内存数据被交换到磁盘空间,
# 交换过程中磁盘会抖动,会对性能产生较大的影响。因为ES是基于JAVA开发的
# 可以能过垃圾回收器来单独管理内存,所以关闭操作系统级别的内存管理可以
# 提升性能
bootstrap.memory_lock: true
#
# ------------------------ 网络设定 ----------------------------
#
# 绑定节点上的所有网络接口,用于接收通过任意网卡传输过来的请求
network.bind_host: 0.0.0.0
#
# 绑定一个网络接口(网卡),用于集群内部节点通信(一般选择吞吐量大的网卡)
network.publish_host: _eth0:ipv4_
#
# HTTP 通信端口
http.port: 50000
#
# TCP 通信端口
transport.tcp.port: 50100
#
# --------------------------------- 集群发现 模块 ----------------------------------
#
# 集群初始化连接列表,节点启动后,首先通过连接初始化列表里的地址去发现集群。
discovery.zen.ping.unicast.hosts: ["20.120.203.74:50100","20.120.203.76:50100","20.120.203.81:50100"]
#
# 为了防止集群脑裂,目前的策略是当且仅当节点有超过半数的master候选者存活时(目前是2台,可以完成选举),集群才会进行master选举
discovery.zen.minimum_master_nodes: 2
#
# ---------------------------------- 其它 -----------------------------------
#
# 关闭操作系统内核验证(我的操作系统没有升级,如果不关闭验证则无法启动)
bootstrap.system_call_filter: false
#
# ------------------------ HTTP ----------------------------
#
# 是否支持跨域访问资源
http.cors.enabled: true
#
#
#允许访问资源的类型
http.cors.allow-origin: "*"
#
#
# 允许HTTP请求的方法类型
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
#
# 允许HTTP请求头返回类型
http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization,Content-Encoding,Accept-Encoding
#
# 支持HTTP访问API 总开关
http.enabled: true
#
#
停止elasticsearch应用,关闭所有的节点
方法1:
POST http://localhost:9200/_shutdown
方法2:
POST http://localhost:9200/_cluster/nodes/_shutdown
方法3:
POST http://localhost:9200/_cluster/nodes/_all/_shutdown
http://localhost:9200/_cluster/settings
查看ES是否启动成功,查看集群健康状态:
http://localhost:9200/_cluster/health?pretty
返回结果
{
“cluster_name” : “kevin-elk”, #集群名称
“status” : “green”, #为 green 则代表健康没问题,如果是 yellow 或者 red 则是集群有问题
“timed_out” : false, #是否有超时
“number_of_nodes” : 3, #集群中的节点数量
“number_of_data_nodes” : 3,
“active_primary_shards” : 2234,
“active_shards” : 4468,
“relocating_shards” : 0,
“initializing_shards” : 0,
“unassigned_shards” : 0,
“delayed_unassigned_shards” : 0,
“number_of_pending_tasks” : 0,
“number_of_in_flight_fetch” : 0,
“task_max_waiting_in_queue_millis” : 0,
“active_shards_percent_as_number” : 100.0 #集群分片的可用性百分比,如果为0则表示不可用
}
查看集群健康状态
http://localhost:9200/_cat/health?v
检查集群状态:
http://localhost:9200/_cluster/stats?pretty
关闭指定节点
POST http://localhost:9200/_cluster/nodes/node-2/_shutdown
POST http://localhost:9200/_cluster/nodes/nodeId1,nodeId2/_shutdown
默认情况下,关闭命令会延迟1秒(1s)之后执行。可以通过设置 delay 参数 来指定延迟的时间。比如:
POST http://localhost:9200/_cluster/nodes/_local/_shutdown?delay=10s
查看节点状态
curl http://localhost:9200/_nodes/process?pretty
curl http://localhost:9200/_nodes/node1/process?pretty
查看节点状态 (*表示ES集群的master主节点)
http://localhost:9200/_cat/nodes?v
显示master节点的id、ip和节点名。
GET http://localhost:9200_cat/master?v
查看每个节点的分片数量以及每个节点的磁盘空间使用情况。
GET http://localhost:9200_cat/allocation?v
查看每个数据节点上被fielddata所使用的堆内存大小。
GET http://localhost:9200_cat/fielddata?v
节点所运行插件信息。
GET http://localhost:9200/_cat/plugins?v
查看磁盘利用率:
http://localhost:9200/_cat/allocation?v
指定延迟多长时间后才开始分配unassigned的分片(默认1分钟)
PUT /_all/_settings
{
“settings”: {
“index.unassigned.node_left.delayed_timeout”: “5m”
}
}
查看所有分片状态
http://localhost:9200/_cat/shards?v
http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason
查看分片没有被分配的原因,比如通过GET /_cat/shards?v看到某个索引没有被分配,就可以使用下面的命令来查看没有被分配的原因。
GET http://localhost:9200/_cluster/allocation/explain
{
“index”:“twitter”,
“shard”:0,
“primary”:true
}
分片未分配的原因主要有:
1)INDEX_CREATED:由于创建索引的API导致未分配。
2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配。
3)INDEX_REOPENED :由于打开open或关闭close一个索引导致未分配。
4)DANGLING_INDEX_IMPORTED :由于导入dangling索引的结果导致未分配。
5)NEW_INDEX_RESTORED :由于恢复到新索引导致未分配。
6)EXISTING_INDEX_RESTORED :由于恢复到已关闭的索引导致未分配。
7)REPLICA_ADDED:由于显式添加副本分片导致未分配。
8)ALLOCATION_FAILED :由于分片分配失败导致未分配。
9)NODE_LEFT :由于承载该分片的节点离开集群导致未分配。
10)REINITIALIZED :由于当分片从开始移动到初始化时导致未分配(例如,使用影子shadow副本分片)。
11)REROUTE_CANCELLED :作为显式取消重新路由命令的结果取消分配。
12)REALLOCATED_REPLICA :确定更好的副本位置被标定使用,导致现有的副本分配被取消,出现未分配。
手动指定主分片(旧数据)
POST http://localhost:9200/_cluster/reroute
{
“commands” : [ {
“allocate_stale_primary” : {
“index” : “idx_com_jobs_v1”,
“shard” : 1,
“node” : “node191”,
“accept_data_loss” : true
}
}]
}
手动指定主分片(空数据)
POST http://localhost:9200/_cluster/reroute
{
“commands” : [ {
“allocate_empty_primary” : {
“index” : “idx_com_jobs_v1”,
“shard” : 1,
“node” : “node-221”,
“accept_data_loss” : true
}
}]
}
修复副本分片
POST http://localhost:9200/_cluster/reroute
{
“commands”: [{
“allocate_replica”: {
“index”: “.monitoring-kibana-2-2019.06.27”,
“shard”: 0,
“node”: “node2”,
“allow_primary”: true
}
}]
}
关闭指定索引
POST http://localhost:9200/index_name/_close
显示索引的别名信息、过滤器和路由信息。?v是输出表头。
GET http://localhost:9200/_cat/aliases?v
查看索引或集群的文档数量。
GET http://localhost:9200/_cat/count?v
GET http://localhost:9200/_cat/count/books?v
查看索引信息,包括:健康状态、索引开关状态、分片数、副本数、文档数量、标记为删除的文档数量、占用的存储空间、索引的唯一标识等。
GET http://localhost:9200/_cat/indices?v
GET http://localhost:9200/_cat/indices/forum?v
当你不知道有那些属性可以查看时:
localhost:9200/_cat/,会返回可以查看的属性
查看正在执行的任务列表。
GET http://localhost:9200/_cat/pending_tasks?v
查看索引分片恢复进度。
GET http://localhost:9200/_cat/recovery?v
查看集群中的快照库。
GET http://localhost:9200/_cat/repositories?v
查看集群每个节点的线程池统计信息。
GET http://localhost:9200/_cat/thread_pool?v
查看索引的segment信息,注意,索引数据实际上是以一个个segment的方式进行存储的。
GET http://localhost:9200/_cat/segments?v
除了_name 之外, 还可以用_ip、_host进行匹配
步骤1:
PUT http://localhost:9200/_cluster/settings
{
“transient” : {
“cluster.routing.allocation.exclude._name” : “node-2”
}
}
步骤2:
step1 配置完成以后,我们就会看到shard在集群中开始迁移,待迁移完成以后,对node-2进行处理
步骤3:
PUT http://localhost:9200/_cluster/settings
{
“transient” : {
“cluster.routing.allocation.exclude._name” : “”
}
}
只要让_name匹配不到在用的node即可
假如要升级或重启节点192.168.1.8
第一步:先暂停集群的shard自动均衡。
PUT http://localhost:9200/_cluster/settings
{
“transient” : {
“cluster.routing.allocation.enable” : “none”
}
}
第二步:shutdown你要升级的节点
POST http://192.168.1.8:9200/_cluster/nodes/node-2/_shutdown
第三步:升级重启该节点,并确认该节点重新加入到了集群中
GET http://localhost:9200/_cat/health
GET http://localhost:9200/_cat/nodes
第四步:重复2-3步,升级重启其它要升级的节点。
第五步:重新启动集群的shard均衡
PUT http://localhost:9200/_cluster/settings
{
“transient” : {
“cluster.routing.allocation.enable” : “all”
}
}
通过集群的状态和恢复进程监控集群是否可用
GET http://localhost:9200/_cat/health
GET http://localhost:9200/_cat/recovery
参考:
https://blog.51cto.com/xpleaf/2329042
https://www.cnblogs.com/leeSmall/p/9220535.html