elasticsearch常用命令

检查es版本信息

curl IP:9200


查看集群是否健康

http://IP:9200/_cat/health?v

curl 'IP:9200/_cat/health?v'

查看集群状态

curl -XGET ip:9200/_cluster/state

curl -XGET ip:9200/_cluster/health?pretty

查看节点列表

http://IP:9200/_cat/nodes?v

curl 'IP:9200/_cat/nodes?v'

curl 'ip:9200/_nodes/stats'

列出所有索引及存储大小

http://IP:9200/_cat/indices?v

curl 'IP:9200/_cat/indices?v'--查询所有索引及数据大小


查看线程状态

GET /_cat/thread_pool

查看线程状态

http://172.21.0.5:9200/_nodes/thread_pool

线程池优化

更改配置文件elasticsearch.yml增加如下内容:

thread_pool.search.queue_size: 500

#queue_size允许控制没有线程执行它们的挂起请求队列的初始大小。

thread_pool.search.size: 200

#size参数控制线程数,默认为核心数乘以5。

thread_pool.search.min_queue_size:10

#min_queue_size设置控制queue_size可以调整到的最小量。

thread_pool.search.max_queue_size: 1000

#max_queue_size设置控制queue_size可以调整到的最大量。

thread_pool.search.auto_queue_frame_size: 2000

#auto_queue_frame_size设置控制在调整队列之前进行测量的操作数。它应该足够大,以便单个操作不会过度偏向计算。

thread_pool.search.target_response_time: 6s

#target_response_time是时间值设置,指示线程池队列中任务的目标平均响应时间。如果任务通常超过此时间,则将调低线程池队列以拒绝任务。


获取集群主ip

 curl -s localhost:9200/_cat/nodes?v|awk -F":" '{print $1;print $9}'|grep "*"|awk '{print $1}'


创建索引

创建索引名为XX,默认会有5个分片,1个索引

curl -XPUT 'IP:9200/XX?pretty'


添加一个类型

curl -XPUT 'IP:9200/XX/external/2?pretty' -d '

{

   "gwyy": "John"

}'


更新一个类型

curl -XPOST 'IP:9200/XX/external/1/_update?pretty' -d '

{

   "doc": {"name": "Jaf"}

}'


删除指定索引

curl -XDELETE 'IP:9200/_index?pretty'


分片处理

过滤查看所有未分配索引的方式,c知道哪个索引的哪个分片就开始手动修复,通过reroute的allocate分配

curl -s “http://10.19.22.142:9200/_cat/shards” | grep UNASSIGNED结果如下,第一列表示索引名,第二列表示分片编号,第三列p是主分片,r是副本

知道哪个索引的哪个分片就开始手动修复,通过reroute的allocate分配

curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{

    "commands" : [ {

          "allocate_replica" : {

              "index" : "eslog1",

              "shard" : 4,

              "node" : "es1",

              "allow_primary" : true

          }

        }

    ]

}'

分配时可能遇到的坑,需要注意的地方

分配副本时必须要带参数”allow_primary” : true, 不然会报错

当集群中es版本不同时,如果这个未分配的分片是高版本生成的,不能分配到低版本节点上,反过来低版本的分片可以分配给高版本,如果遇到了,只要升级低版本节点的ES版本即可

案例

通过/_cat/shards 查看,发现有从分配处于一个未分配的状态,该命令该出的数据奇怪的地方是,我的集群明明有三台机器,但是shareds里面只给出了两台。


data 2 r STARTED 449516 1.6gb 100.73.22.5 22-5

data 2 p STARTED 449516 1.6gb 100.73.22.6 22-6

data 2 r UNASSIGNED


然后通过查阅官方手册,查询UNASSIGNED 的原因,然后发现很多种可能性的,但是官方的api 的case里面,shards 是直接给出了原因的,但是我的es却没有给出原因。怎么办呢?在api文档里面找答案,发现了/_cluster/reroute 的命令,一看就知道是救星,既然状态是UNASSIGNED, 我手动指定 该切片到特定的节点,不就可以了么。


执行命令


curl -XPOST ‘100.73.22.5:9200/_cluster/reroute’ -d ‘{

“commands” : [{

"move" : {

"index" : "data",

"shard" : 0,

"from_node" : "22-6" ,

"to_node": "22-5"

}

}]

}’


4.手动移动分片和副本:

移动分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"move":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"from_node":"ali-hk-ops-elk1",

"to_node":"ali-hk-ops-elk2"

}

}]

}'


取消分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"cancel":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

}]

}'


分配分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"allocate":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk2"

}

}]

}'


将某个未分配的索引手动分配到某个节点上.


$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[

{

"move":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"from_node":"ali-hk-ops-elk1",

"to_node":"ali-hk-ops-elk2"

}

},

{

"cancel":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

},

{

"allocate":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

}]

}'




curl -XPOST '10.9.86.252:9200/_cluster/reroute' -d '{ "commands": [{"allocate_replica": {"index": "esuser117db1","shard": 5,"nodes": "in-searchN-A2"}}]}'


未分配副本解决方法(经过实战有效可行):

如果手动分配无效的话,可采用如下针对未分配索引的副本数目设置操作处理

设置索引副本数目为0

curl -XPUT '192.168.12.131:9200/vip_active223/_settings' -d '{"index": {"number_of_replicas":0}}'

设置索引副本数目为1

curl -XPUT '192.168.12.131:9200/vip_active223/_settings' -d '{"index": {"number_of_replicas":1}}'


#elasticsearch集群安全重启方法

我们需要的是,告诉 Elasticsearch 推迟再平衡,因为对外部因子影响下的集群状态,我们自己更了解。操作流程如下:


可能的话,停止索引新的数据。虽然不是每次都能真的做到,但是这一步可以帮助提高恢复速度。

禁止分片分配。这一步阻止 Elasticsearch 再平衡缺失的分片,直到你告诉它可以进行了。如果你知道维护窗口会很短,这个主意棒极了。你可以像下面这样禁止分配:

查看:curl -XGET ip:9200/_cluster/settings

修改:curl -XPUT ip:9200/_cluster/settings {}


PUT /_cluster/settings

{

    "transient" : {

        "cluster.routing.allocation.enable" : "none"

    }

}

关闭单个节点。

执行维护/升级。

重启节点,然后确认它加入到集群了。

用如下命令重启分片分配:


PUT /_cluster/settings

{

    "transient" : {

        "cluster.routing.allocation.enable" : "all"

    }

}

分片再平衡会花一些时间。一直等到集群变成 绿色 状态后再继续。


重复第 2 到 6 步操作剩余节点。

到这步你可以安全的恢复索引了(如果你之前停止了的话),不过等待集群完全均衡后再恢复索引,也会有助于提高处理速度。




防止内存溢出(生产环境建议设置锁住内存)

你需要打开配置文件中的mlockall开关,它的作用就是运行JVM锁住内存,禁止OS交换出去。在elasticsearch.yml配置如下:

bootstrap.memory_lock: true

置为true来锁住内存不进行swapping。因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。 同时也要允许elasticsearch的进程可以锁住内存,linux下启动es之前可以通过`ulimit -l unlimited`命令设置


防止出现内存溢出但是进程没有退出

jvm.options

-XX:+ExitOnOutOfMemoryErrorsss


elasticsearch集群内部节点超时解决

默认配置为:节点每隔1s同master发送1次心跳,超时时间为30s,测试次数为3次,超过3次,则认为该节点同master已经脱离了。以上为elasticsearch的默认配置。在实际生产环境中,每隔1s,太频繁了,会产生太多网络流量。我们可以在elasticsearch.yml如下修改。 

discovery.zen.fd.ping_timeout: 120s  

discovery.zen.fd.ping_retries: 6  

discovery.zen.fd.ping_interval: 30s



如何加快我的index速度

Elasticsearch预先配置了许多设置,尝试确保您保留足够的资源来搜索和索引数据。但是,如果您使用Elasticsearch严重偏向写入,则可能会发现调整某些设置以提高索引性能是有意义的,即使这意味着丢失一些搜索性能或副本数据。 下面,我们将探讨一些方法来优化用例来进行索引,而不是搜索数据。(预设值是兼顾搜索和索引)


分片分配: 如果你要创建一个更新频繁的索引,请确保指定足够的主分片,以便您可以在所有节点间均匀分布索引负载。一般建议是每个集群中的节点分配一个主分片。如果你的CPU和磁盘够用,2个或者更多的主分片是可行的(注意:这个是对单个索引来描述的)。但是,请记住,分片过度分配会增加开销,并可能会对搜索产生负面影响,因为搜索请求需要打到索引中的每个分片。另一方面,如果分配的分片数少于节点数,you may create hotspots?因为包含这些分片的节点需要处理比不包含任何索引分片的节点更多的索引请求。

禁止 merge throttling: merge throttling是elasticsearch的一个自动机制:当es检测到合并速度落后于索引速度时,es会throttle 索引请求。 如果要优化索引性能,而不是搜索性能,可以通过更新集群设置来禁止掉merge throttling(通过将indices.store.throttle.type设置为“none”)。You can make this change persistent (meaning it will persist after a cluster restart) or transient (resets back to default upon restart), based on your use case.

增加indexing buffer的大小: 这个index-level 设置(indices.memory.index_buffer_size)决定了在将文档写入到磁盘上的segment之前buffer的总大小。默认为总heap的10%,以便为索引请求预留更多的heap,which doesn’t help you if you’re using Elasticsearch primarily for indexing.??

先index,后replicate: 初始化索引时,在索引设置中指定零个复本分片,并在索引完成后添加副本。 这将提高索引性能。但是有一定的风险。

刷新间隔拉长: 增加Index Settings API中的刷新间隔。 默认情况下,索引刷新过程每秒都会发生一次,但是在较大的索引期间,降低刷新频率可以帮助减轻部分工作量。

调整translog设置: 从版本2.0开始,Elasticsearch将在每次请求后将Translog数据刷新到磁盘,从而降低硬件故障时数据丢失的风险。如果你中索引性能,并且不太担心潜在的数据丢失的可能,您可以将index.translog.durability更改为异步。 有了这一点,索引只会在每个sync_interval上提交写入磁盘,而不是在每个请求之后提交写入磁盘,从而使其更多的富余资源可以提供索引请求。


es集群节点数据迁移场景:集群中需要替换一台新机器,需要把集群中的老的机器的数据迁移到集群其他的机器中,下面的命令是排除掉10.0.0.1,把这台机器的数据迁移到器群其他机器中。

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'

{

  "transient" : {

    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"

  }

}

'