elasticsearch
1、部署
1.官网下载
// 下载地址
https://www.elastic.co/cn/downloads/past-releases/#elasticsearch
// 部署文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
ps: es 需要 JDK17 环境,自行安装 |
java -version
java version "17.0.10" 2024-01-16 LTS
Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)
2.解压软件
将下载的软件分发到所有节点
su - app
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.1-linux-x86_64.tar.gz
tar zxf elasticsearch-8.17.1-linux-x86_64.tar.gz -C /home/app/
3.创建用户
因为安全问题, Elasticsearch 不允许 root 用户直接运行,所以要在每个节点创建新用户,在 root 用户中心创建新用户
// useradd app && echo 'FtDSnWP5DEjnB68f' | passwd --stdin app
// mkdir -p /home/app/esData/{data,logs,certs,dumpData,temp}
mkdir -p /home/app/esData/{data,logs,gcLogs}
chown -R app.app /home/app/elasticsearch-8.17.1
chown -R app.app /home/app/esData
4.修改 elasticsearch.yml 配置文件
cluster.name: es-test
node.name: node-1
#机架(rack)的标识
#node.attr.rack: r1
path.data: /home/app/esData/data
path.logs: /home/app/esData/logs
#设置为 true 来锁住内存.因为当 jvm 开始 swapping 时 es 的效率会降低,所以要保证它不 swap ,可以把 ES_MIN_MEM 和 ES_MAX_MEM 两个环境变量设置成同一个值,并且保证机器有足够的内存分配给 es
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
#节点发现
discovery.seed_hosts: ["22.50.10.19:9300", "22.50.10.20:9300", "22.50.10.21:9300"]
#初始化一个新的集群时需要此配置来选举master
#第一次成功形成集群后,从每个节点配置文件中删除。重新启动集群或添加新节点时,请勿使用此设置。
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
#允许通配符删除索引
action.destructive_requires_name: false
#旧版本及其他参数
#Enable an unauthenticated TCP readiness endpoint on localhost
#readiness.port: 9399
#是不是有资格为主节点
node.master: true
#node.roles: [master,data]
#是否存储数据,如果节点配置 node.master:false 并且 node.data: false ,则该节点将起到负载均衡的作用
node.data: true
#head插件需要打开这两个配置(允许跨域)
http.cors.enabled: true
http.cors.allow-origin: "*"
#设置内容的最大容量,默认100mb
http.max_content_length: 200mb
#设置集群中N个节点启动时进行数据恢复
gateway.recover_after_nodes: 3
#设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
#设置在选举master节点时需要参与最少的候选主节点数,默认为1.如果使用默认值,则当网络不稳定时有可能出现脑裂.合理的数值为(master_eligble_nodes/2)+1,其中master_eligble_nodes表示集群中的侯选主节点数
discovery.zen.minimum_master_nodes: 2
#关闭xpack
xpack.security.enabled: false
#每个节点上的最大分片数
cluster.max_shards_per_node: 20000
#设置在集群中自动发现其他节点时Ping连接的超时时间.默认为3秒.在较差的网络环境下需要设置得大一点,防止因为误判改节点的存活状态而导致分片的转移
discovery.zen.ping.timeout: 3s
#是否使用http协议对外提供服务,默认为true
http.enabled: false
#最大集群节点数,为了避免脑裂,集群节点数最少为:半数+1
node.max_local_storage_nodes: 3
network.tcp.keep_alive: true
netowrk.tcp.no_delay: true
network.publish_host: 10.1.0.215
script.allowed_types: inline
script.allowed_contexts: search, update
#集群内同时启动的数据任务个数,默认是2个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并恢复的线程个数,默认是4个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认4个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
#xpack插件配置
xpack.ml.enabled: false
xpack.security.enabled: true
#集群内部通信加密
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
#https
#【full:它验证所提供的证书是否由受信任的权威机构(CA)签名,并验证服务器的主机名(或IP地址)是否与证书中识别的名称匹配。】
#【certificate:它验证所提供的证书是否由受信任的机构(CA)签名,但不执行任何主机名验证。】
#【none:它不执行服务器证书的验证。】
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.verification_mode: certificate
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
// 生成证书
// ./elasticsearch-certutil cert --keep-ca-key --days 3650 --pass ""
// openssl pkcs12 -in elastic-certificates.p12 -clcerts -nokeys -out certificate.pem
// 您可以使用以下命令检查生成的证书的有效期:
// openssl x509 -in elastic-certificates.p12 -noout -dates
// xpack.security.enabled: true
// xpack.security.transport.ssl.enabled: true
// xpack.security.transport.ssl.verification_mode: certificate
// xpack.security.transport.ssl.keystore.path: /home/app/elasticsearch-7.17.24/config/instance.p12
// xpack.security.transport.ssl.truststore.path: /home/app/elasticsearch-7.17.24/config/instance.p12
// cd elasticsearch-7.17.6/
// 创建一个证书颁发机构
// ./bin/elasticsearch-certutil ca
// 为节点生成证书和私钥
// ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
// mv elastic-* config/certs/
// #给keystore和truststore设置密码
// #./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
// #./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
// #./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
// #./bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
// 密钥复制到其他所有节点下
// 重启es
自用配置 7.17.6
vim /home/app/elasticsearch-7.17.6/config/elasticsearch.yml
cluster.name: es-ny
node.name: node-1
path.data: /home/app/elasticsearch-7.17.6/data
path.logs: /home/app/elasticsearch-7.17.6/logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["18.10.13.197:9300", "18.10.13.198:9300", "18.10.13.199:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
action.destructive_requires_name: false
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
http.max_content_length: 200mb
transport.tcp.compress: true
gateway.recover_after_nodes: 3
discovery.zen.minimum_master_nodes: 2
transport.tcp.port: 9300
ingest.geoip.downloader.enabled: false
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
自用配置 8.17.1
vim /home/app/elasticsearch-8.17.1/config/elasticsearch.yml
cluster.name: es-test
node.name: node-1
path.data: /home/app/esData/data
path.logs: /home/app/esData/logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["22.50.2.137:9300", "22.50.2.140:9300", "22.50.2.141:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
action.destructive_requires_name: false
#x
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
5.修改 jvm.options 配置
vim /home/app/elasticsearch-8.17.1/config/jvm.options
# 可自定义配置大小,不要超过本机内存的 50% 而且不要超过 30GB
-Xms4g
-Xmx4g
-XX:ErrorFile=/home/app/esData/logs/hs_err_pid%p.log
-Xlog:gc*,gc+age=trace,safepoint:file=/home/app/esData/gcLogs/gc.log:utctime,level,pid,tags:filecount=32,filesize=64m
6.启动 es
cd /home/app/elasticsearch-8.17.1
# 启动
# bin/elasticsearch
# 后台启动
./bin/elasticsearch -d -p pid
# 关闭 es
pkill -F pid
kill -SIGTERM 15516
# 可以在日志中打印出更加详细的信息
bin/elasticsearch -d -Des.logger.level=DEBUG
# 查看日志
tail -20f /home/app/esData/logs/es-test.log
DEBUG:
debug1:
java.nio.file.NoSuchFileException: /home/app/jdk-17.0.10/lib/dt.jar
jdk17 等高版本的 jdk 在配置环境变量时无需配置 CLASSPATH
解决:
1.将环境变量中的 CLASSPATH 变量删除
source ~/.bashrc
debug2:
memory locking requested for elasticsearch process but memory is not locked
echo "* soft memlock unlimited" >>/etc/security/limits.conf
echo "* hard memlock unlimited" >>/etc/security/limits.conf
debug3:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least
echo "vm.max_map_count = 262144" >>/etc/sysctl.conf
sysctl -p
7.创建用户密码
查看集群节点信息
curl http://127.0.0.1:9200/_cat/nodes?v
查看集群健康信息
curl http://127.0.0.1:9200/_cat/health?v
//自动创建密码
./bin/elasticsearch-setup-passwords auto
bin/elasticsearch-setup-passwords auto -u "http://localhost:9201"
//手动创建密码
./elasticsearch-setup-passwords interactive
重置用户密码(随机密码)
./bin/elasticsearch-reset-password -u elastic
重置用户密码(指定密码)
./bin/elasticsearch-reset-password -u elastic -i
8.测试集群
curl http://127.0.0.1:9200/_cat/nodes?v
curl -u elastic:xing@123 http://127.0.0.1:9200/_cat/nodes?v
2、ElasticSearch 基本概念介绍
ElasticSearch | Relational Database |
---|---|
Index | Database |
Type | Table |
Document | Row |
Field | Column |
Mapping | Schema |
Everything is indexed | Index |
Query DSL | SQL |
GET http://... | SELECT * FROM table... |
PUT http://... | UPDATE table SET... |
3、常用的 Rest API
基本的命令结构为:
curl <-Xaction> url -d 'body'
这里的 action 表示 HTTP 协议中的各种动作,包括 GET、POST、PUT、DELETE 等
1.查看节点信息
curl -XGET "127.0.0.1:9200/_cat/nodes?v"
2.查看健康信息
curl -u elastic:ElaStic123#@! -XGET "127.0.0.1:9200/_cat/health?v"
3.查看集群健康信息
curl -XGET http://127.0.0.1:9200/_cluster/health?pretty
4.查看集群中的索引信息
curl -XGET "127.0.0.1:9200/_cat/indices?v"
5.查看各节点硬盘空间分配状况
curl -XGET "http://22.50.10.19:9200/_cat/allocation"
6.新建索引
curl -XPUT "127.0.0.1:9200/index_rancher_test"
// 大多数情况下,我们想在索引创建的时候就将我们所需的 mapping 和其他配置确定好.下面的操作就可以在创建索引的同时,创建 settings 和 mapping
curl -XPUT "127.0.0.1:9200/index_rancher_test" -d '
{
"settings": {
"index": {
"number_of_replicas": "1", # 设置复制数
"number_of_shards": "3" # 设置主分片数
}
},
"mappings": { # 创建mapping
"test_type": { # 在index中创建一个新的type(相当于table)
"properties": {
"name": { # 创建一个字段(string类型数据,使用普通索引)
"type": "string",
"index": "not_analyzed"
},
"age": {
"type": "integer"
}
}
}
}
}'
// 创建索引的 mapping
curl -XPUT '127.0.0.1:9200/index_rancher_test/_mapping/test_type' -d '
{
"test_type": { # 注意,这里的test_type与url上的test_type名保存一致
"properties": {
"name": {
"type": "string",
"index": "not_analyzed"
},
"age": {
"type": "integer"
}
}
}
}'
// 另外一种创建 mapping 的方式
- 创建一个扩展名为 test_type.json 的文件名,其中 type_test 就是 mapping 所对应的 type 名
- 在 test_type.json 中输入 mapping 信息
{
"test_type": { # 注意,这里的test_type与json文件名必须一致
"properties": {
"name": {
"type": "string",
"index": "not_analyzed"
},
"age": {
"type": "integer"
}
}
}
} - 在 $ES_HOME/config/ 路径下创建 mappings/index_rancher_test 子目录,这里的 index_rancher_test 目录名必须与我们要建立的索引名一致.将 test_type.json 文件拷贝到 index_rancher_test 目录下
- 创建 index_rancher_test 索引
curl -XPUT "localhost:9200/index_rancher_test" # 注意,这里的索引名必须与mappings下新建的index_rancher_test目录名一致
这样我们就创建了一个新的索引,并且使用了 test_type.json 所定义的 mapping 作为索引的 mapping
7.查看索引的 mapping
curl -XGET '127.0.0.1:9200/index_rancher_test/_mapping/test_type'
8.删除 mapping
curl -XDELETE '127.0.0.1:9200/index_rancher_test/_mapping/test_type'
9.删除索引
curl -XDELETE "127.0.0.1:9200/index_rancher_test"
10.新增一个文档
curl -XPUT 'localhost:9200/index_rancher_test/test_type/1?pretty' -d ' # 这里的pretty参数的作用是使得返回的json显示地更加好看。1是文档的id值(唯一键)。
{
"name": "zhangsan",
"age" : "12"
}'
// 创建文档,生成默认的文档 id
POST orders/_doc
{
"name": "袜子1双",
"price": "200",
"count": 1,
"address": "北京市"
}
// 创建文档,生成自定义文档 id
POST orders/_doc/1
{
"name": "袜子1双",
"price": "2",
"count": 1,
"address": "北京市"
}
11.更新一个文档
curl -XPOST 'localhost:9200/index_rancher_test/test_type/1?pretty' -d ' # 这里的1必须是索引中已经存在id,否则就会变成新增文档操作
{
"name": "lisi",
"age" : "12"
}'
// 更新文档
POST orders/_doc/1
{
"price": "200"
}
// 更新文档
POST orders/_update/1
{
"doc": {
"price": "200"
}
}
12.删除一个文档
curl -XDELETE 'localhost:9200/index_test/test_type/1?pretty' # 这里的1必须是索引中已经存在id
//删除文档
DELETE orders/_doc/1
13.查询单个文档
curl -XGET 'localhost:9200/index_test/test_type/1?pretty'
根据指定的id查询
GET orders/_doc/1
根据指定条件查询文档
GET orders/_search
{
"query": {
"match": {
"address": "北京市"
}
}
}
14.查询全部文档
GET orders/_search
15.设置 mapping 信息
对于映射,只能进行字段添加,不能对字段进行修改或删除,如有需要,则重新创建映射
PUT orders/_mappings
{
"properties":{
"price": {
"type": "long"
}
}
}
16.设置分片和映射
PUT orders
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "long"
},
"count": {
"type": "long"
},
"address": {
"type": "text"
}
}
}
}
17.节点的分配情况
curl -u elastic:ElaStic123#@! -XGET "http://127.0.0.1:9200/_cat/shards"
curl -u elastic:ElaStic123#@! -XGET "http://127.0.0.1:9200/_cat/shards"|grep UNASSIGNED
18.查询得到master得唯一标识
curl -u elastic:ElaStic123#@! 'http://127.0.0.1:9200/_nodes/process?pretty'
4、es 优化
1. 减少Refresh的次数
Luncene在新增数据时,采用了延迟写入的策略,默认情况下索引的refresh_interval为1秒
Lucene将待写入的数据先导入到内存中,超过1秒(默认)时就会触发一次Refresh,然后Refresh就会把内存中的数据刷新到操作系统的文件缓存系统中
如果我们对搜索的实效性要求不高,可以将Refresh周期延迟,例如30秒.这样还可以有效减少刷新次数,但这同时意味着需要消耗更多的Heap内存
2. 加大Flush设置
Flush的主要目的时把文件缓存到系统中的段持久化硬盘,当Translog的数据量达到512MB或者30分钟时,会触发一次Flush.
index.translog.flush_threshold_size参数的默认值是512MB,我们进行修改.
增加参数值意味着文件缓存系统中可能需要存储更多的数据,所以我们需要为操作系统的文件缓存系统留下足够的空间
3. 带routing查询
查询的时候,可以直接根据routing信息定位到某个分配查询,不需要查询所有分配,经过协调节点排序
向上面自定义的用户查询,如果routing设置为userid的话,就可以直接查询数据出来,效率提升很多
4. 减少副本的数量
如果我们需要大批量进行写入操作,可以先禁止Replica复制,设置index.number_of_replicas:0关闭副本.在写入完成后,Replica修改回正常的状态.
5. 内存设置
ES默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果是通过解压安装的ES,则在ES安装文件中包含一个jvm.option文件,添加如下命令设置ES的堆大小,Xms表示堆的初始大小,Xmx表示可分配的最大内存,都是1GB.
确保Xmx和Xms的大小是相同的,其目的是为了能够在java垃圾回收机制中清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力.
因为ES堆内存的分配需要满足一下两个原则:
不要超过物理内存%; Lucene的设计目的是把底层OS里的数据缓存到内存中.Lucene的分段是分别存储到单个文件中的,这些文件都是不会变化,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问.如果我们设置的堆内存过大,Lucene可用的内存将会减少,就会严重影响降低Lucene的全文本查询性能.
堆内存的大小最好不要超过32GB,在java中,所有对象分配在堆上,然后有一个Klass Pointer 指针指向它的类元数据.这个指针在64位的操作系统上为64位,64位的操作系统可以使用更多的内存(264).在32位的系统上为32位,32位的操作系统的最大寻址空间为4GB(232).但是64位的指针意味着更大的浪费,因为你的指针本身大了.浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如LLC,L1等)之间移动数据的时候,会占用更多的宽带.
最终我们采用31G设置
-Xms 31g
-Xmx 31g
6.设置默认索引分片个数,默认为5片.经本人测试,索引分片对ES的查询性能有很大的影响,在应用环境,应该选择适合的分片大小
主分片,副本和节点最大数之间数量,我们分配的时候可以参考以下关系:节点数<=主分片数*(副本数+1)
index.number_of_shards: 3
设置默认索引副本个数,默认为1个副本.此处的1个副本是指index.number_of_shards的一个完全拷贝;默认5个分片1个拷贝;即总分片数为10.
index.number_of_replicas: 1
curl -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{
"index.number_of_replicas" : "1",
"index.number_of_shards" : "3"
}'
5、索引生命周期
请确保在执行这些操作之前备份你的数据,并仔细检查请求中的参数和名称以确保正确性。
要设置索引生命周期管理以保留最近一周的数据并在一周后自动删除,可以按照以下步骤进行操作:
1.创建索引模板:首先,创建一个索引模板,用于定义索引的初始设置和索引生命周期策略。你可以使用以下请求示例创建一个名为 7daydel-noroll 的索引模板:
PUT /_index_template/7daydel-noroll
{
"index_patterns": ["qrcode-after-new-all-20230518","ops-manager-test-all"],
"priority": 100,
"composed_of": [],
"template": {
"settings": {
"index": {
"lifecycle.name": "7-days-default-noroll"
}
},
"aliases": {
"7daydel-noroll-alias": {}
}
}
}
GET /_index_template/7daydel-noroll
2.定义索引生命周期策略:创建一个索引生命周期策略,并指定在一周后删除索引。以下是一个示例请求:
PUT _ilm/policy/7-days-default-noroll
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "7d",
"max_size": "100gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
}
}
PUT _ilm/policy/7-days-default-noroll
{
"policy": {
"phases": {
"hot": {
"actions": { }
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
}
}
GET /_ilm/policy/7-days-default-noroll?pretty
在上述策略中,max_age 设置为 "7d" 表示索引在一周后进行滚动(rollover)到下一个阶段,"7d" 后进行删除。你还可以根据需要设置其他条件,如 max_size 来限制索引的大小。
3.创建初始索引:创建一个新的初始索引,并使用之前定义的模板和别名。以下是一个示例请求:
PUT your_index_name-000001
{
"aliases": {
"your_rollover_alias": {
"is_write_index": true
}
}
}
将 your_index_name 替换为你的索引名称。
以上步骤完成后,Elasticsearch 将自动管理索引的生命周期。每当索引达到最大年龄(一周)时,它们将滚动到下一个阶段并开始删除过期的索引。
如果你已经有现有的索引,而不是需要创建一个新的初始索引,那么在设置索引生命周期管理时,你可以将现有的索引关联到之前定义的模板和别名上。
以下是你可以执行的步骤:
注意:当前正在处理的索引不会自动应用新创建的索引模板。只有新创建的索引才会根据模板进行设置。
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.rollover_alias": "7daydel-noroll-alias"
}
}
GET /qrcode-after-new-all-20230518/_settings
GET /qrcode-after-new-all-20230518/_ilm/explain
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.name": "7-days-default-noroll"
}
}
// 修改索引只读
PUT /qrcode-after-new-all-20230518/_settings
{
"index.blocks.read_only_allow_delete": null
}
4.更新索引别名:
如果你的索引已经存在一个别名,你可以使用以下请求将其更新为之前定义的别名:
POST /_aliases
{
"actions": [
{
"add": {
"index": "qrcode-after-new-all-20230518",
"alias": "7daydel-noroll-alias"
}
}
]
}
POST /_aliases
{
"actions": [
{
"remove": {
"index": "qrcode-after-new-all-20230519",
"alias": "qrcode-after-new"
}
}
]
}
GET /_alias/7daydel-noroll-alias
将 <your_existing_index_name> 替换为现有的索引名称,将 <your_existing_alias_name> 替换为现有的别名名称。将 <your_index_name> 替换为你要关联的索引名称,将 <your_new_alias_name> 替换为之前定义的别名名称。
通过以上步骤,你可以将现有的索引与之前定义的模板和别名进行关联,从而使索引开始遵循索引生命周期管理策略。
5.查看所有索引模板
GET _index_template
6.查看特定索引模板
GET _index_template/<template_name>
7.查看所有索引生命周期策略
GET _ilm/policy
8.查看特定索引生命周期策略:
GET _ilm/policy/<policy_name>
PUT _index_template/my_template_qrcode-after-new-all
{
"index_patterns": ["qrcode-after-new-all-20230518"],
"template": {
"settings": {
"index.lifecycle.name": "7-days-default",
"index.lifecycle.rollover_alias": "qrcode-after-new"
}
}
}
PUT /qrcode-after-new-all-20230518/_index_template/my_template_qrcode-after-new-all
{
"index_patterns": ["qrcode-after-new-all-20230518"],
"template": {
"settings": {
"index.lifecycle.name": "7-days-default",
"index.lifecycle.rollover_alias": "qrcode-after-new"
}
}
}
PUT /qrcode-after-new-all-20230518/_settings
{
"index.blocks.read_only_allow_delete": null
}
1.定义生命周期策略 7-days-default-noroll
2.将策略与别名相关联
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.name": "7-days-default"
}
}
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.rollover_alias": "qrcode-after-new"
}
}
curl -X GET "localhost:9200/_ilm/policy/{policy_name}?pretty"
GET /_ilm/policy/7-days-default?pretty"
根据提供的信息,可以看出索引qrcode-after-new-all-20230518正在执行索引生命周期策略中的rollover操作。这并不一定表示正在执行删除操作,而是可能在执行转储(rollover)操作。
下面是一些相关字段的解释:
这是一个关于索引生命周期的信息,下面解释各个字段的含义:
"index":索引名称,这里是qrcode-after-new-all-20230518。
"managed":指示索引是否由索引生命周期管理(ILM)功能进行管理,这里为true。
"policy":当前应用于索引的索引生命周期策略名称,这里是7-days-default。
"lifecycle_date_millis":索引的生命周期日期,以毫秒表示。在这个例子中是 1684396809976。
"age":索引的年龄,以天为单位。在这个例子中是 126.05d,即索引创建后经过了126.05天。
"phase":索引目前所处的生命周期阶段,这里是hot,表示索引仍然处于活跃状态。
"phase_time_millis":进入当前生命周期阶段的时间戳,以毫秒表示。在这个例子中是 1695287149996。
"action":当前正在执行的动作,这里是rollover,表示正在执行rollover操作。
"action_time_millis":执行当前动作的时间戳,以毫秒表示。在这个例子中是 1695286085878。
"step":当前动作的步骤,这里是check-rollover-ready,表示正在检查是否可以执行rollover操作。
"step_time_millis":执行当前步骤的时间戳,以毫秒表示。在这个例子中是 1695287149996。
"is_auto_retryable_error":指示当前步骤是否遇到了自动可重试的错误,这里为true。
"failed_step_retry_count":当前步骤失败后的重试次数,这里为1。
"phase_execution":有关索引生命周期阶段执行细节的更多信息。
"policy":当前执行的索引生命周期策略名称,这里是7-days-default。
"phase_definition":定义了当前阶段的条件和动作。
"min_age":达到下一阶段所需的最小年龄。
"actions":定义了在此阶段执行的动作。
"rollover":满足条件时执行的rollover操作的相关设置。
"max_primary_shard_size":主分片的最大大小限制。
"max_age":索引的最大年龄限制。
"version":索引生命周期策略的版本号。
"modified_date_in_millis":索引生命周期策略的修改日期,以毫秒表示。在这个例子中是 1679648454543。
自用
GET /_cat/nodes?v
GET /_cat/indices?v
GET _index_template/my_template_qrcode-after*
GET _ilm/policy
PUT /_template/my_template_qrcode-after-new-all
{
"index_patterns": ["qrcode-after-new-all-20230518"],
"template": {
"settings": {
"index.lifecycle.name": "7-days-default",
"index.lifecycle.rollover_alias": "qrcode-after-new"
}
}
}
GET /_alias/qrcode-after-new
GET /qrcode-after-new-all-20230518/_settings
GET /qrcode-after-new-all-20230518/_ilm/explain
PUT /qrcode-after-new-all-20230518/_settings
{
"index.blocks.read_only_allow_delete": null
}
GET /qrcode-after-new-all-20230518
POST /_aliases
{
"actions": [
{
"add": {
"index": "<qrcode-after-new-all-20230518>",
"alias": "<qrcode-after-new>"
}
}
]
}
POST /_aliases
{
"actions": [
{
"add": {
"index": "qrcode-after-new-all-20230518",
"alias": "qrcode-after-new"
}
},
{
"remove": {
"index": "qrcode-after-new-all-20230518",
"alias": "qrcode-after-new-all"
}
}
]
}
GET /_ilm/policy/7-days-default?pretty
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.name": "7-days-default"
}
}
PUT /qrcode-after-new-all-20230518/_settings
{
"index": {
"lifecycle.rollover_alias": "qrcode-after-new"
}
}
6、备份、恢复快照
1.创建一个 repository
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/tmp/backups"
}
}
curl -X PUT "http://localhost:9200/_snapshot/my_backup" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/tmp/backups" ,
"compress": true
}
}'
2.查询 repository 的配置
curl -X GET "localhost:9200/_snapshot/_all"
curl -X GET "localhost:9200/_snapshot/<repository_name>"
3.创建一个 snapshot
PUT /_snapshot/my_backup/snapshot_1
curl -X PUT "http://localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true"
curl -X DELETE "http://localhost:9200/_snapshot/my_backup"
4.查看
curl -X GET "localhost:9200/_snapshot/my_backup/_all"
5.删除snapshot
curl -X DELETE "localhost:9200/_snapshot/my_backup/snapshot_1"
6.数据恢复
重新加载repository
curl -X POST "http://localhost:9200/_snapshot/my_new_backup/_verify"
POST /_snapshot/my_backup/snapshot_1/_restore
在目标集群中注册快照元数据:使用以下命令在目标集群中注册快照元数据。
curl -X POST "http://localhost:9200/_snapshot/my_backup/snapshot_1/_restore"
7、如何进行滚动重启
滚动重启是一种重启 Elasticsearch 集群的方式,主要用来在不影响集群可用性的情况下进行更新或配置更改
1.禁用一个节点的分片分配。这样可以防止这个节点在重启过程中进行不必要的分片重新分配
curl -XGET "127.0.0.1:9200/_cluster/settings?include_defaults=true&flat_settings=true" |grep cluster.routing.allocation.enable
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}'
curl -XGET "127.0.0.1:9200/_cluster/settings?include_defaults=true&flat_settings=true" |grep cluster.routing.allocation.enable
2.停止节点
curl -XGET "127.0.0.1:9200/_cat/nodes?v"
kill -SIGTERM $(pgrep elasticsearch)
curl -XGET "127.0.0.1:9200/_cat/nodes?v"
确保重启的节点已经不再列表中
3.更新配置
4.重启节点
./bin/elasticsearch -d -p pid
节点重启后,等待它加入集群
确认它已经运行且状态为 green
5.重新启用分片分配
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}'
curl -XGET http://127.0.0.1:9200/_cluster/health?pretty
6.如果初始化过程较慢,您可以使用 _cluster/pending_tasks API 来查看集群中待处理的任务
[app@ER-ELASTICSEARCH-ELASTICSEARCH-brdLig bin]$ curl -X GET "localhost:9200/_cluster/pending_tasks?pretty"
{
"tasks" : [ ]
}
这意味着当前集群中没有待处理的任务。这是一个好的迹象,表明集群没有积压的任务,所有任务都在正常处理中
为了进一步确认分片的初始化状态,您可以继续使用 _cat/shards API 来监控分片的状态:
[app@ER-ELASTICSEARCH-ELASTICSEARCH-brdLig bin]$ curl -X GET "localhost:9200/_cat/shards?v"
index shard prirep state docs store ip node
.kibana-event-log-7.17.6-000003 0 p STARTED 18.10.13.198 node-2
.kibana-event-log-7.17.6-000003 0 r STARTED 18.10.13.199 node-3
iot_ele_base_bean_new 0 r INITIALIZING 18.10.13.198 node-2
iot_ele_base_bean_new 0 p STARTED 211461201 87.3gb 18.10.13.199 node-3
iot_ele_log_bean 0 r STARTED 1 6.8kb 18.10.13.198 node-2
iot_ele_log_bean 0 p STARTED 1 6.8kb 18.10.13.199 node-3
.kibana-event-log-7.17.6-000005 0 r STARTED 18.10.13.198 node-2
.kibana-event-log-7.17.6-000005 0 p STARTED 18.10.13.199 node-3
.ds-.logs-deprecation.elasticsearch-default-2024.07.09-000012 0 r STARTED 18.10.13.198 node-2
.ds-.logs-deprecation.elasticsearch-default-2024.07.09-000012 0 p STARTED 18.10.13.199 node-3
.kibana-event-log-7.17.6-000006 0 r STARTED 18.10.13.198 node-2
.kibana-event-log-7.17.6-000006 0 p STARTED 18.10.13.199 node-3
iot_ele_demo_bean 0 p STARTED 0 226b 18.10.13.198 node-2
iot_ele_demo_bean 0 r STARTED 0 226b 18.10.13.199 node-3
.async-search 0 r STARTED 0 3.6kb 18.10.13.198 node-2
.async-search 0 p STARTED 0 253b 18.10.13.199 node-3
.ds-ilm-history-5-2024.04.10-000004 0 r STARTED 18.10.13.198 node-2
.ds-ilm-history-5-2024.04.10-000004 0 p STARTED 18.10.13.199 node-3
iot_ele_data_bean 0 r STARTED 462480549 177.2gb 18.10.13.198 node-2
iot_ele_data_bean 0 p STARTED 462480552 177.3gb 18.10.13.199 node-3
.kibana_task_manager_7.17.6_001 0 p STARTED 17 55.5mb 18.10.13.198 node-2
.kibana_task_manager_7.17.6_001 0 r STARTED 17 55.4mb 18.10.13.199 node-3
.kibana_7.17.6_001 0 r STARTED 403 4.9mb 18.10.13.198 node-2
.kibana_7.17.6_001 0 p STARTED 403 4.9mb 18.10.13.199 node-3
.ds-.logs-deprecation.elasticsearch-default-2024.06.09-000009 0 r STARTED 18.10.13.198 node-2
.ds-.logs-deprecation.elasticsearch-default-2024.06.09-000009 0 p STARTED 18.10.13.199 node-3
er_sxf_data_bean 0 p STARTED 517848 506.7mb 18.10.13.198 node-2
er_sxf_data_bean 0 r STARTED 517848 504.8mb 18.10.13.199 node-3
.apm-agent-configuration 0 r STARTED 0 226b 18.10.13.198 node-2
.apm-agent-configuration 0 p STARTED 0 226b 18.10.13.199 node-3
.kibana-event-log-7.17.6-000004 0 p STARTED 18.10.13.198 node-2
.kibana-event-log-7.17.6-000004 0 r STARTED 18.10.13.199 node-3
.ds-ilm-history-5-2024.06.09-000008 0 r STARTED 18.10.13.198 node-2
.ds-ilm-history-5-2024.06.09-000008 0 p STARTED 18.10.13.199 node-3
.tasks 0 p STARTED 2 13.9kb 18.10.13.198 node-2
.tasks 0 r STARTED 4 27.4kb 18.10.13.199 node-3
.ds-ilm-history-5-2024.07.09-000010 0 r STARTED 18.10.13.198 node-2
.ds-ilm-history-5-2024.07.09-000010 0 p STARTED 18.10.13.199 node-3
.apm-custom-link 0 p STARTED 0 226b 18.10.13.198 node-2
.apm-custom-link 0 r STARTED 0 226b 18.10.13.199 node-3
.ds-ilm-history-5-2024.05.10-000006 0 p STARTED 18.10.13.198 node-2
.ds-ilm-history-5-2024.05.10-000006 0 r STARTED 18.10.13.199 node-3
检查 curl -X GET "localhost:9200/_cluster/allocation/explain?pretty" 以了解分片分配的具体原因。这可以帮助您了解为什么 node-1 没有被分配分片
# 查看日志
tail -30f /home/app/elasticsearch-7.17.6/logs/es-rztest.log
// 查看健康信息
curl -XGET "127.0.0.1:9200/_cat/health?v"
// 查看集群健康信息
curl -XGET http://127.0.0.1:9200/_cluster/health?pretty
重复以上步骤,对集群中的其他节点进行滚动重启
请注意,这些步骤需要在每个节点上执行,并且在每次重启一个节点之前,都需要等待集群回到 green 状态
参考文献:
https://www.cnblogs.com/sunsky303/p/9438737.html
https://blog.csdn.net/bxg_kyjgs/article/details/125993647
https://blog.csdn.net/dream_ling/article/details/123900628
https://blog.csdn.net/weixin_41487487/article/details/123392378
https://blog.csdn.net/weixin_44418421/article/details/125496086
特此感谢以上博主的分享!
------------------------------- THE END -------------------------------