elasticsearch经常使用命令node
检查es版本信息linux
curl IP:9200json
查看集群是否健康bootstrap
http://IP:9200/_cat/health?vapi
curl 'IP:9200/_cat/health?v'安全
查看集群状态网络
curl -XGET ip:9200/_cluster/stateapp
curl -XGET ip:9200/_cluster/health?prettycurl
查看节点列表异步
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"
}
}
'