https://wiki.sanxian.tech/api.php?action=feedcontributions&user=Admin&feedformat=atom
三线的随记 - 用户贡献 [zh-cn]
2024-03-29T10:54:23Z
用户贡献
MediaWiki 1.41.0
https://wiki.sanxian.tech/index.php?title=Linux%E9%80%9A%E8%BF%87curl%E8%AE%BF%E9%97%AEdocker.sock/API%E6%89%A7%E8%A1%8Cdocker%E6%93%8D%E4%BD%9C&diff=1531
Linux通过curl访问docker.sock/API执行docker操作
2024-03-27T10:21:37Z
<p>Admin:</p>
<hr />
<div>官方API doc: https://docs.docker.com/engine/api/v1.41/<br />
<br />
官方API doc(with example): https://docs.docker.com/engine/api/sdk/examples/<br />
<br />
不同版本的docker的api doc: https://docs.docker.com/engine/api/#api-version-matrix<br />
<br />
tips: [[Linux下对socket进行抓包]]<br />
<br />
=== 通过curl socket完成镜像拉取操作 ===<br />
通过docker cli进行操作+抓包获取基本报文格式<br />
POST /v1.41/images/create?fromImage=10.82.123.123%2Fpublic%2Fmaven&tag=3.3.9-public HTTP/1.1<br />
Host: docker<br />
User-Agent: Docker-Client/20.10.17 (linux)<br />
Content-Length: 0<br />
Content-Type: text/plain<br />
命令实现<br />
curl --unix-socket /var/run/docker.sock "<nowiki>http://localhost/v1.41/images/create?fromImage=10.82.123.123%2Fpublic%2Fmaven&tag=3.3.9-public</nowiki>" -X POST<br />
如果拉取镜像需要认证可以加上http header<br />
X-Registry-Auth: eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJwYXNzd29yZCIsInNlcnZlcmFkZHJlc3MiOiIxMC44Mi4xMjMuMTIzIn0=<br />
<br />
=== 通过curl socket获取镜像dangling镜像信息 ===<br />
curl -s --unix-socket /var/run/docker.sock "<nowiki>http://localhost/v1.41/images/json?filters=\{</nowiki>\"dangling\":\[\"true\"\]\}"<br />
<br />
=== 通过curl socket获取指定REPOSITORY+TAG镜像信息 ===<br />
注意是全名字匹配<br />
curl -s --unix-socket /var/run/docker.sock "http:/v1.24/images/json?filters=\{\"reference\":\{\"mysql\":true\}\}"<br />
<br />
[{"Containers":-1,"Created":1602576181,"Id":"sha256:8e85dd5c32558ea5c22cc4786cff512c1940270a50e7dbc21ad2df42f0637de4","Labels":null,"ParentId":"","RepoDigests":["mysql@sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4"],"RepoTags":["mysql:8.0.21"],"SharedSize":-1,"Size":544193587,"VirtualSize":544193587},{"Containers":-1,"Created":1532654095,"Id":"sha256:6bb891430fb6e2d3b4db41fd1f7ece08c5fc769d8f4823ec33c7c7ba99679213","Labels":null,"ParentId":"","RepoDigests":["mysql@sha256:aaba540cdd9313645d892f4f20573e8b42b30e5be71c054b7befed2f7da5f85b"],"RepoTags":["mysql:5.7.22"],"SharedSize":-1,"Size":371941626,"VirtualSize":371941626}]<br />
如果需要半匹配,用 <code>*</code> 号即可(测试下来发现好像只能省略后缀,不能省略前缀,可以匹配tag,区分大小写)<br />
curl -s --unix-socket /var/run/docker.sock "http:/v1.24/images/json?filters=\{\"reference\":\{\"*m*\":true\}\}"|jq .<br />
<br />
[<br />
{<br />
"Containers": -1,<br />
"Created": 1665115518,<br />
"Id": "sha256:9622db9aed586c97c6a18d912b965f3d4c02fdf749650c7ee57a9a6b8cde3dd7",<br />
"Labels": null,<br />
"ParentId": "",<br />
"RepoDigests": null,<br />
"RepoTags": [<br />
"sonarqube:8.9.9-community"<br />
],<br />
"SharedSize": -1,<br />
"Size": 499466355,<br />
"VirtualSize": 499466355<br />
},<br />
{<br />
"Containers": -1,<br />
"Created": 1612947183,<br />
"Id": "sha256:8415759abc07b3d3dcd43cecd924caa3ed68bc5d4a4166e50565a4a1b344a7e5",<br />
"Labels": null,<br />
"ParentId": "",<br />
"RepoDigests": null,<br />
"RepoTags": [<br />
"node:14.15.5-stretch-slim"<br />
],<br />
"SharedSize": -1,<br />
"Size": 166658514,<br />
"VirtualSize": 166658514<br />
},<br />
{<br />
"Containers": -1,<br />
"Created": 1602576181,<br />
"Id": "sha256:8e85dd5c32558ea5c22cc4786cff512c1940270a50e7dbc21ad2df42f0637de4",<br />
"Labels": null,<br />
"ParentId": "",<br />
"RepoDigests": [<br />
"mysql@sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4"<br />
],<br />
"RepoTags": [<br />
"mysql:8.0.21"<br />
],<br />
"SharedSize": -1,<br />
"Size": 544193587,<br />
"VirtualSize": 544193587<br />
},<br />
{<br />
"Containers": -1,<br />
"Created": 1532654095,<br />
"Id": "sha256:6bb891430fb6e2d3b4db41fd1f7ece08c5fc769d8f4823ec33c7c7ba99679213",<br />
"Labels": null,<br />
"ParentId": "",<br />
"RepoDigests": [<br />
"mysql@sha256:aaba540cdd9313645d892f4f20573e8b42b30e5be71c054b7befed2f7da5f85b"<br />
],<br />
"RepoTags": [<br />
"mysql:5.7.22"<br />
],<br />
"SharedSize": -1,<br />
"Size": 371941626,<br />
"VirtualSize": 371941626<br />
}<br />
]<br />
<br />
=== 简单的通过curl + socket进行清理镜像的bash脚本例子 ===<br />
#!/usr/bin/env bash<br />
#exec 1>/proc/1/fd/1 2>/proc/1/fd/2<br />
docker_api_version=v1.41<br />
curl_options=(<br />
"-s"<br />
"--unix-socket" "/var/run/docker.sock"<br />
)<br />
dangling_images=(`curl "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/json?filters=%7B%22dangling%22%3A%5B%22true%22%5D%7D&all=1</nowiki>" | jq -r .[].Id`)<br />
# TODO: clean up stopped non-k8s containers<br />
echo "cleaning dangling images:"<br />
for image in ${dangling_images[*]}<br />
do<br />
echo $image<br />
(set -x; curl -X DELETE "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/$image</nowiki>" )<br />
done<br />
<br />
echo -n "cleaning images without specific string: "<br />
echo ${image_exclude:="(/kube-system/)|(/library/)"}<br />
clean_images=(`curl "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/json</nowiki>"|jq -r ".[] | select(.RepoTags != null )| .RepoTags[]"|grep -v \<none|grep -Ev "${image_exclude}"`)<br />
for image in ${clean_images[*]}<br />
do<br />
echo $image<br />
(set -x; curl -X DELETE "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/$image</nowiki>" )<br />
done<br />
echo "End of docker images clean"<br />
<br />
=== curl socket获取Exited容器名字 ===<br />
curl -s --unix-socket /var/run/docker.sock "<nowiki>http://localhost/v1.41/containers/json?filters=\{</nowiki>\"status\":\[\"exited\"\]\}" | jq -r ".[].Names[]" | cut -c 2-<br />
<br />
=== curl socket删除容器 ===<br />
curl -X DELETE -s --unix-socket /var/run/docker.sock "<nowiki>http://localhost/v1.41/containers/$container</nowiki>"<br />
<br />
=== 利用daemonset部署curl + socket进行清理镜像的定时任务到k8s集群中 ===<br />
${your_image} 自行替换<br />
<br />
依赖工具 curl + jq + crontab<br />
<br />
改不同的发行版crontab需要自行适配cron的启动命令<br />
<br />
==== 例如Debian系容器镜像可以通过下列方式进行构建依赖的容器镜像 ====<br />
#debian_install_package="curl wget iputils-ping iproute2 dnsutils net-tools vim telnet netcat procps lsof tcpdump cron jq" #常见依赖工具<br />
<br />
debian_install_package="curl cron jq"<br />
sed -i -e "s/security.debian.org/mirrors.ustc.edu.cn/" -e "s/deb.debian.org/mirrors.ustc.edu.cn/" /etc/apt/sources.list && \<br />
apt-get update && \<br />
apt-get install --no-install-recommends -y ${debian_install_package} && \<br />
apt-get autoremove && \<br />
apt-get clean && \<br />
rm -rf /var/lib/apt/lists/* && \<br />
touch /var/spool/cron/crontabs/root && \<br />
chmod -v 600 /var/spool/cron/crontabs/root && \<br />
chgrp -v crontab /var/spool/cron/crontabs/root<br />
操作/var/spool/cron/crontabs/root文件只是为了方便通过echo等方式直接操作root用户的crontab<br />
<br />
==== 使用microdnf的yum系容器镜像可以通过下列方式进行构建依赖的容器镜像 ====<br />
#microdnf_install_package="curl wget iputils iproute bind-utils net-tools hostname vim telnet nmap-ncat procps lsof tcpdump cronie findutils zip unzip jq" #常见依赖工具<br />
<br />
microdnf_install_package="cronie jq"<br />
<br />
microdnf install ${microdnf_install_package} && \<br />
rpm -i /tmp/${java_version}-linux-x64.rpm && \<br />
microdnf clean all && \<br />
rm -rvf /tmp/* && \<br />
touch /var/spool/cron/root && \<br />
chmod 600 /var/spool/cron/root<br />
操作/var/spool/cron/root文件同样只是为了方便通过echo等方式直接操作root用户的crontab<br />
<br />
注意有的发行版容器镜像需要tty才可以输出详细的crond 前台运行日志,例如某些Alpine (<code>/usr/sbin/crond -f -S /dev/stdout</code> + <code>tty: true</code>)<br />
<br />
==== 具体k8s编排 ====<br />
apiVersion: apps/v1<br />
kind: DaemonSet<br />
metadata:<br />
labels:<br />
k8s-app: docker-image-cleaner<br />
app: docker-image-cleaner<br />
name: docker-image-cleaner<br />
namespace: kube-system<br />
spec:<br />
revisionHistoryLimit: 5<br />
selector:<br />
matchLabels:<br />
k8s-app: docker-image-cleaner<br />
app: docker-image-cleaner<br />
template:<br />
metadata:<br />
labels:<br />
k8s-app: docker-image-cleaner<br />
app: docker-image-cleaner<br />
spec:<br />
containers:<br />
- image: ${your_image}<br />
imagePullPolicy: IfNotPresent<br />
name: docker-image-cleaner<br />
command:<br />
- cron<br />
- -L<br />
- "8"<br />
- "-f"<br />
lifecycle:<br />
postStart:<br />
exec:<br />
command:<br />
- /bin/sh<br />
- -c<br />
- |<br />
cat <<\EOF > /clean.sh<br />
#!/usr/bin/env bash<br />
exec 1>/proc/1/fd/1 2>/proc/1/fd/2<br />
docker_api_version=v1.41<br />
curl_options=(<br />
"-L"<br />
"-s"<br />
"--unix-socket" "/var/run/docker.sock"<br />
)<br />
# Remove exited non-k8s containers<br />
exited_containers=(`curl "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/containers/json?filters=\{</nowiki>\"status\":\[\"exited\"\]\}" | jq -r ".[].Names[]" | cut -c 2- | grep -v k8s`)<br />
echo "removing exited non-k8s containers"<br />
for container in ${exited_containers[*]}<br />
do<br />
echo $container<br />
(set -x;curl -X DELETE "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/containers/$container</nowiki>")<br />
done<br />
<br />
echo "cleaning dangling images:"<br />
for image in ${dangling_images[*]}<br />
do<br />
echo $image<br />
(set -x; curl -X DELETE "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/$image</nowiki>" )<br />
done<br />
<br />
echo -n "cleaning images without specific string: "<br />
echo ${image_exclude:="(/kube-system/)|(/library/)"}<br />
clean_images=(`curl "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/json</nowiki>"|jq -r ".[] | select(.RepoTags != null )| .RepoTags[]"|grep -v \<none|grep -Ev "${image_exclude}"`)<br />
for image in ${clean_images[*]}<br />
do<br />
echo $image<br />
(set -x; curl -X DELETE "${curl_options[@]}" "<nowiki>http://localhost/${docker_api_version}/images/$image</nowiki>" )<br />
done<br />
echo "End of image clean"<br />
EOF<br />
chmod u+x /clean.sh<br />
echo "0 2 * * * bash /clean.sh" |crontab -<br />
crontab -l > /proc/1/fd/1<br />
resources:<br />
limits:<br />
cpu: 500m<br />
memory: 256Mi<br />
requests:<br />
cpu: 100m<br />
memory: 64Mi<br />
securityContext:<br />
capabilities:<br />
add:<br />
- NET_ADMIN<br />
privileged: true<br />
volumeMounts:<br />
- mountPath: /var/run/docker.sock<br />
name: docker-sock<br />
restartPolicy: Always<br />
tolerations:<br />
- effect: NoSchedule<br />
operator: Exists<br />
volumes:<br />
- hostPath:<br />
path: /var/run/docker.sock<br />
type: ""<br />
name: docker-sock<br />
updateStrategy:<br />
rollingUpdate:<br />
maxUnavailable: 60%<br />
type: RollingUpdate <br />
<br />
[[分类:Docker]]<br />
[[分类:Linux]]<br />
{{DEFAULTSORT:Docker.sock}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E4%B8%AD%E5%AF%B9pod-lifecycle%E4%BD%BF%E7%94%A8bash%E4%B8%94%E9%87%8D%E5%AE%9A%E5%90%91%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%88%B0%E5%AE%B9%E5%99%A8%E7%9A%84%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA&diff=1530
K8s中对pod-lifecycle使用bash且重定向执行结果到容器的标准输出
2024-03-12T03:57:04Z
<p>Admin:Admin移动页面K8s中对pod-lifecycle使用bash同时重定向命令执行输出到容器的标准输出至K8s中对pod-lifecycle使用bash且重定向执行结果到容器的标准输出,不留重定向</p>
<hr />
<div>在某些场景下可能需要对pod <code>postStart</code>或者<code>preStop</code>执行bash脚本操作<br />
<br />
然后为了查看日志会想将命令执行结果重定向到容器标准输出以便直接使用 kubectl logs 进行查看<br />
<br />
这时候可以用以下方法配置( <code>exec 1>/proc/1/fd/1 2>/proc/2/fd/2</code> )<br />
lifecycle:<br />
postStart:<br />
exec:<br />
command:<br />
- bash<br />
- -c<br />
- |-<br />
exec 1>/proc/1/fd/1 2>/proc/2/fd/2<br />
set -ex<br />
env > /etc/environment<br />
echo -e 'BASH_ENV=/etc/environment\n0 3 * * * /usr/local/bin/python /app/dcs_clear.py > /proc/1/fd/1 2>/proc/1/fd/2' | crontab -<br />
rm -rvf /etc/periodic/*/*<br />
<br />
<br />
⚠️ 需要特别注意的是此处<code>bash -c</code>不能直接合并为<code>bash -cxe</code>或者<code>bash -cx</code>等<br />
<br />
否则会遇到 <code>PostStartHookError</code> 等hook错误<br />
[[分类:K8s]]<br />
[[分类:K8s-pod]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E4%B8%AD%E5%AF%B9pod-lifecycle%E4%BD%BF%E7%94%A8bash%E4%B8%94%E9%87%8D%E5%AE%9A%E5%90%91%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%88%B0%E5%AE%B9%E5%99%A8%E7%9A%84%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA&diff=1529
K8s中对pod-lifecycle使用bash且重定向执行结果到容器的标准输出
2024-03-12T03:56:32Z
<p>Admin:Admin移动页面K8s中对pod-lifecycle使用bash同时重定向输出到容器标准输出至K8s中对pod-lifecycle使用bash同时重定向命令执行输出到容器的标准输出,不留重定向</p>
<hr />
<div>在某些场景下可能需要对pod <code>postStart</code>或者<code>preStop</code>执行bash脚本操作<br />
<br />
然后为了查看日志会想将命令执行结果重定向到容器标准输出以便直接使用 kubectl logs 进行查看<br />
<br />
这时候可以用以下方法配置( <code>exec 1>/proc/1/fd/1 2>/proc/2/fd/2</code> )<br />
lifecycle:<br />
postStart:<br />
exec:<br />
command:<br />
- bash<br />
- -c<br />
- |-<br />
exec 1>/proc/1/fd/1 2>/proc/2/fd/2<br />
set -ex<br />
env > /etc/environment<br />
echo -e 'BASH_ENV=/etc/environment\n0 3 * * * /usr/local/bin/python /app/dcs_clear.py > /proc/1/fd/1 2>/proc/1/fd/2' | crontab -<br />
rm -rvf /etc/periodic/*/*<br />
<br />
<br />
⚠️ 需要特别注意的是此处<code>bash -c</code>不能直接合并为<code>bash -cxe</code>或者<code>bash -cx</code>等<br />
<br />
否则会遇到 <code>PostStartHookError</code> 等hook错误<br />
[[分类:K8s]]<br />
[[分类:K8s-pod]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E4%B8%AD%E5%AF%B9pod-lifecycle%E4%BD%BF%E7%94%A8bash%E4%B8%94%E9%87%8D%E5%AE%9A%E5%90%91%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%88%B0%E5%AE%B9%E5%99%A8%E7%9A%84%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA&diff=1528
K8s中对pod-lifecycle使用bash且重定向执行结果到容器的标准输出
2024-03-12T03:55:56Z
<p>Admin:创建页面,内容为“在某些场景下可能需要对pod <code>postStart</code>或者<code>preStop</code>执行bash脚本操作 然后为了查看日志会想将命令执行结果重定向到容器标准输出以便直接使用 kubectl logs 进行查看 这时候可以用以下方法配置( <code>exec 1>/proc/1/fd/1 2>/proc/2/fd/2</code> ) lifecycle: postStart: exec: command: - bash - -c…”</p>
<hr />
<div>在某些场景下可能需要对pod <code>postStart</code>或者<code>preStop</code>执行bash脚本操作<br />
<br />
然后为了查看日志会想将命令执行结果重定向到容器标准输出以便直接使用 kubectl logs 进行查看<br />
<br />
这时候可以用以下方法配置( <code>exec 1>/proc/1/fd/1 2>/proc/2/fd/2</code> )<br />
lifecycle:<br />
postStart:<br />
exec:<br />
command:<br />
- bash<br />
- -c<br />
- |-<br />
exec 1>/proc/1/fd/1 2>/proc/2/fd/2<br />
set -ex<br />
env > /etc/environment<br />
echo -e 'BASH_ENV=/etc/environment\n0 3 * * * /usr/local/bin/python /app/dcs_clear.py > /proc/1/fd/1 2>/proc/1/fd/2' | crontab -<br />
rm -rvf /etc/periodic/*/*<br />
<br />
<br />
⚠️ 需要特别注意的是此处<code>bash -c</code>不能直接合并为<code>bash -cxe</code>或者<code>bash -cx</code>等<br />
<br />
否则会遇到 <code>PostStartHookError</code> 等hook错误<br />
[[分类:K8s]]<br />
[[分类:K8s-pod]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1527
Elasticsearch的一些api随记
2024-03-06T15:36:33Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
/_cat/nodeattrs<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. <br />
<br />
The order of the merging can be controlled using the <code>order</code> parameter, with lower order being applied first, '''and higher orders overriding them.''' <br />
<br />
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号,[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么,该编号始终为 6 个字符,且为零填充]。即使手动创建的索引结尾是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> <br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=MediaWiki:Sidebar&diff=1526
MediaWiki:Sidebar
2024-03-04T16:12:04Z
<p>Admin:</p>
<hr />
<div>* navigation<br />
** mainpage|mainpage-description<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
** https://github.com/San3Xian/randomMark/issues|随记:GitHub分站<br />
** Mediawiki:Sidebar|MediaWiki:Sidebar<br />
* 分类<br />
** :category:Linux|Linux<br />
** :category:K8s|K8s<br />
** :category:Windows|Windows<br />
** :category:Http|Http<br />
** :category:Tcpdump|Tcpdump<br />
** :category:Ctf|Ctf<br />
** :category:Other|Other<br />
** :category:真正的随记|真正的随记<br />
** :category:待补坑|待补坑<br />
** Special:AllPages|所有页面<br />
** Special:Categories|所有分类<br />
* SEARCH<br />
* TOOLBOX<br />
* 友情链接(大佬们的站)<br />
** https://docupa.cc|Docupa<br />
** https://zhakul.top|Zhakul<br />
** https://github.com/techiall/Blog/discussions|Techial<br />
** https://blog.jay6.tech|Jay<br />
** http://blog.sumika.icu|Skrshadow<br />
** https://xchub.cn|Chang<br />
** https://www.cnblogs.com/xxxsans|不知道哪位大佬的blog(等一个认领)<br />
** https://www.gnt007484.cn|Sunny(黄老板)<br />
** https://chirophy.online|始终不够<br />
** https://blog.madebug.net|m4d3bug<br />
** https://qihongcheng.cc|qihongcheng<br />
** https://www.vlinux.cn|运维之境<br />
* LANGUAGES</div>
Admin
https://wiki.sanxian.tech/index.php?title=Vim%E7%9A%84%E9%9A%8F%E8%AE%B0&diff=1525
Vim的随记
2024-02-16T07:49:14Z
<p>Admin:</p>
<hr />
<div>===vim command===<br />
<br />
====line number====<br />
:set number<br />
:set nu<br />
<br />
:set nonu<br />
:set nonumber<br />
<br />
==== search ====<br />
搜索的时候实时跳转<br />
:set incsearch<br />
然后使用下述方式进行实时搜索,'''注意不需要 <code>:</code>''' <br />
/string<br />
<br />
====highlight search====<br />
:set hlsearch<br />
<br />
:set nohlsearch<br />
<br />
=====Clear highlight until next search=====<br />
:noh<br />
<br /><br />
<br />
====indent====<br />
:set autoindent<br />
<br />
:set noautoindent<br />
<br /><br />
<br />
====tab====<br />
:set expantab<br />
<br />
:set tabstop=4<br />
<br />
==== 在xshell+vim中使用mouse (支持光标定位和滚动屏幕) ====<br />
以往在ubuntu中,如果想在编辑文件的时候使用鼠标通常设置<br />
:set mouse=a<br />
就好了<br />
<br />
但是在centos的时候单纯设置mouse仿佛没效果,对比set参数发现<br />
:set ttymouse=xterm2<br />
就ok了<br />
<br />
=== 常用的vimrc ===<br />
set number<br />
set autoindent<br />
set tabstop=4<br />
set expandtab<br />
set hlsearch<br />
set showcmd<br />
filetype on<br />
syntax on<br />
set nowrap<br />
colorscheme delek<br />
" pattern uses more memory than 'maxmempattern<br />
set maxmempattern=9000<br />
" set synmaxcol=900<br />
set incsearch<br />
<br />
if has("autocmd")<br />
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif<br />
endif<br />
<br />
<br />
Linux 默认编辑器变量<br />
<br />
export EDITOR=/usr/bin/vim <br />
[[分类:Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=MediaWiki:Sidebar&diff=1524
MediaWiki:Sidebar
2024-02-15T15:28:41Z
<p>Admin:</p>
<hr />
<div>* navigation<br />
** mainpage|mainpage-description<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
** https://github.com/San3Xian/randomMark/issues|随记:GitHub分站<br />
** Mediawiki:Sidebar|MediaWiki:Sidebar<br />
* 分类<br />
** :category:Linux|Linux<br />
** :category:K8s|K8s<br />
** :category:Windows|Windows<br />
** :category:Http|Http<br />
** :category:Tcpdump|Tcpdump<br />
** :category:Ctf|Ctf<br />
** :category:Other|Other<br />
** :category:真正的随记|真正的随记<br />
** :category:待补坑|待补坑<br />
** Special:AllPages|所有页面<br />
** Special:Categories|所有分类<br />
* SEARCH<br />
* TOOLBOX<br />
* 友情链接(大佬们的站)<br />
** https://docupa.cc|Docupa<br />
** https://zhakul.top|Zhakul<br />
** https://github.com/techiall/Blog/discussions|Techial<br />
** https://blog.jay6.tech|Jay<br />
** http://blog.skrshadow.cn|Skrshadow<br />
** https://xchub.cn|Chang<br />
** https://www.cnblogs.com/xxxsans|不知道哪位大佬的blog(等一个认领)<br />
** https://www.gnt007484.cn|Sunny(黄老板)<br />
** https://chirophy.online|始终不够<br />
** https://blog.madebug.net|m4d3bug<br />
** https://qihongcheng.cc|qihongcheng<br />
** https://www.vlinux.cn|运维之境<br />
* LANGUAGES</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E5%85%B3%E4%BA%8Ekubernetes%E5%8F%8A%E5%85%B6%E8%BF%90%E8%A1%8C%E8%B4%9F%E8%BD%BD%E7%9A%84HA%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83&diff=1523
关于kubernetes及其运行负载的HA一些思考
2024-02-03T17:50:42Z
<p>Admin:创建页面,内容为“简记 # etcd要跟OS盘物理上隔离开。避免有用户在OS盘上进行传输下载文件等操作,导致disk latency增高致使apiserver判定etcd不健…”</p>
<hr />
<div>简记<br />
<br />
# etcd要跟OS盘物理上隔离开。避免有用户在OS盘上进行传输下载文件等操作,导致disk latency增高致使apiserver判定etcd不健康<br />
# etcd要跟容器盘物理上隔离开。同理避免空间占用大的镜像在pull的时候导致disk latency增高致使apiserver判定etcd不健康<br />
# apiserver 要同时连接着一个以上的etcd<br />
# 应用运行编排上toleration对于noschedule 和noexecute的时间可以保持默认,如果修改的话不建议小于两分钟,避免节点上大量容器在某些因素下批量重建销毁导致kubelet判定节点pleg,k8s自动打上污点后立刻触发容器驱逐<br />
<br />
[[分类:K8s]]<br />
{{DEFAULTSORT:ha-k8s}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E8%B0%83%E6%95%B4%E8%8A%82%E7%82%B9kubelet%E7%A1%AC%E9%A9%B1%E9%80%90%E7%AD%96%E7%95%A5&diff=1522
K8s调整节点kubelet硬驱逐策略
2024-01-30T12:26:19Z
<p>Admin:</p>
<hr />
<div> --eviction-hard=nodefs.available<5Gi,imagefs.available<5Gi<br />
添加到kubelet service environment就好(此配置方法在DEPRECATED阶段)<br />
[Service]<br />
Environment="***"<br />
ps: 驱逐相关的doc:<br />
<br />
https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/<br />
<br />
https://blog.tianfeiyu.com/2020/02/06/kubelet_garbage_collect/ (部分内容过时)<br />
<br />
https://kubernetes.io/docs/concepts/architecture/garbage-collection/<br />
<br />
<br />
<br />
PS2: 通过请求k8s-apiserver接口,可以获知节点当前kubelet配置具体值<br />
<br />
apiserver的认证绕过可以通过 <code>kubectl proxy --port=8001</code> 等方法实现<br />
<br />
或者直接使用命令 <code>kubectl get --raw "/api/v1/nodes/${nodeName}/proxy/configz" | jq</code><br />
curl ${k8s-apiserver}/api/v1/nodes/${nodeName}/proxy/configz <br />
{<br />
"kubeletconfig": {<br />
"staticPodPath": "/etc/kubernetes/kubelet/manifests",<br />
"syncFrequency": "1m0s",<br />
"fileCheckFrequency": "20s",<br />
"httpCheckFrequency": "20s",<br />
"address": "0.0.0.0",<br />
"port": 10250,<br />
"readOnlyPort": 10255,<br />
"tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt",<br />
"tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key",<br />
"rotateCertificates": true,<br />
"authentication": {<br />
"x509": {<br />
"clientCAFile": "/etc/kubernetes/certs/ca.crt"<br />
},<br />
"webhook": {<br />
"enabled": true,<br />
"cacheTTL": "2m0s"<br />
},<br />
"anonymous": {<br />
"enabled": false<br />
}<br />
},<br />
"authorization": {<br />
"mode": "Webhook",<br />
"webhook": {<br />
"cacheAuthorizedTTL": "5m0s",<br />
"cacheUnauthorizedTTL": "30s"<br />
}<br />
},<br />
"registryPullQPS": 5,<br />
"registryBurst": 10,<br />
"eventRecordQPS": 5,<br />
"eventBurst": 10,<br />
"enableDebuggingHandlers": true,<br />
"healthzPort": 10248,<br />
"healthzBindAddress": "127.0.0.1",<br />
"oomScoreAdj": -999,<br />
"clusterDomain": "cluster.local",<br />
"clusterDNS": [<br />
"172.31.0.10"<br />
],<br />
"streamingConnectionIdleTimeout": "4h0m0s",<br />
"nodeStatusUpdateFrequency": "10s",<br />
"nodeStatusReportFrequency": "10s",<br />
"nodeLeaseDurationSeconds": 40,<br />
"imageMinimumGCAge": "2m0s",<br />
"imageGCHighThresholdPercent": 85,<br />
"imageGCLowThresholdPercent": 80,<br />
"volumeStatsAggPeriod": "1m0s",<br />
"cgroupsPerQOS": true,<br />
"cgroupDriver": "cgroupfs",<br />
"cpuManagerPolicy": "none",<br />
"cpuManagerReconcilePeriod": "10s",<br />
"topologyManagerPolicy": "none",<br />
"runtimeRequestTimeout": "2m0s",<br />
"hairpinMode": "promiscuous-bridge",<br />
"maxPods": 250,<br />
"podPidsLimit": 8192,<br />
"resolvConf": "/etc/resolv.conf",<br />
"cpuCFSQuota": true,<br />
"cpuCFSQuotaPeriod": "100ms",<br />
"maxOpenFiles": 1000000,<br />
"contentType": "application/vnd.kubernetes.protobuf",<br />
"kubeAPIQPS": 5,<br />
"kubeAPIBurst": 10,<br />
"serializeImagePulls": true,<br />
"evictionHard": {<br />
"imagefs.available": "15%",<br />
"memory.available": "100Mi",<br />
"nodefs.available": "10%",<br />
"nodefs.inodesFree": "5%"<br />
},<br />
"evictionPressureTransitionPeriod": "5m0s",<br />
"enableControllerAttachDetach": true,<br />
"makeIPTablesUtilChains": true,<br />
"iptablesMasqueradeBit": 14,<br />
"iptablesDropBit": 15,<br />
"featureGates": {<br />
"CSIMigration": false,<br />
"EphemeralContainers": true<br />
},<br />
"failSwapOn": true,<br />
"containerLogMaxSize": "10Mi",<br />
"containerLogMaxFiles": 5,<br />
"configMapAndSecretChangeDetectionStrategy": "Watch",<br />
"systemReserved": {<br />
"cpu": "500m",<br />
"memory": "512Mi",<br />
"pid": "100"<br />
},<br />
"enforceNodeAllocatable": [<br />
"pods"<br />
]<br />
}<br />
}<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Linux_ip_ifconfig_net-tools_iproute2&diff=1521
Linux ip ifconfig net-tools iproute2
2024-01-30T12:17:50Z
<p>Admin:</p>
<hr />
<div>just a mark<br />
<br />
一个很有用的图<br />
<br />
[[文件:Net tools iproute2.jpg|735x735像素]]<br />
<br />
=== Related records: ===<br />
<br />
==== 不要过于依赖netstat -i的数据,而使用 ip -s link 或者直接 cat /proc/net/dev 为准: ====<br />
在某些场景下,可能会发现 netstat -i 输出的数据中,多个网卡的RX-OK / RX-DRP / TX-OK 统计都一模一样,特别是在 calico 为 cni 的k8s集群中,多个veth网卡统计信息一模一样<br />
<br />
例如:<br />
<br />
[[文件:Netstat i screenshot.png|无框|426x426像素]]<br />
<br />
<br />
netstat是属于 Linux Net-tools 下的一个工具,他的其中一个代码库可参考 <nowiki>https://github.com/ecki/net-tools/blob/master/netstat.c</nowiki> (根据man netstat来看,应该跟这个有关系)<br />
<br />
然后Net-tools其实是已经比较久了的,这个工具包也是Linux基金会和Redhat官方deprecated的(<nowiki>https://www.redhat.com/sysadmin/deprecated-linux-command-replacements),建议使用iproute2工具包替代</nowiki><br />
<br />
而 <code>netstat -i</code> 命令主要调用 <code>/proc/net/dev</code> 记录的数据实现,目前来看 netstat -i 的输出是有bug的。详情可对比 <code>cat /proc/net/dev | awk '{printf "%-20s %-20s %-20s \n", $1, $2, $10}'</code> 或直接查看 <code>/proc/net/dev</code> 文件记录的数据,另外作为替代可以使用命令 <code>ip -s link</code> 查阅正确的数据<br />
[[分类:Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Linux_ip_ifconfig_net-tools_iproute2&diff=1520
Linux ip ifconfig net-tools iproute2
2024-01-30T12:17:27Z
<p>Admin:</p>
<hr />
<div>just a mark<br />
<br />
一个很有用的图<br />
<br />
[[文件:Net tools iproute2.jpg|735x735像素]]<br />
<br />
=== Related records: ===<br />
<br />
==== 不要过于依赖netstat -i的数据,而使用 ip -s link 或者直接 cat /proc/net/dev 为准: ====<br />
在某些场景下,可能会发现 netstat -i 输出的数据中,多个网卡的RX-OK / RX-DRP / TX-OK 统计都一模一样,特别是在 calico 为 cni 的k8s集群中,多个veth网卡统计信息一模一样<br />
[[文件:Netstat i screenshot.png|无框|426x426像素]]<br />
<br />
<br />
netstat是属于 Linux Net-tools 下的一个工具,他的其中一个代码库可参考 <nowiki>https://github.com/ecki/net-tools/blob/master/netstat.c</nowiki> (根据man netstat来看,应该跟这个有关系)<br />
<br />
然后Net-tools其实是已经比较久了的,这个工具包也是Linux基金会和Redhat官方deprecated的(<nowiki>https://www.redhat.com/sysadmin/deprecated-linux-command-replacements),建议使用iproute2工具包替代</nowiki><br />
<br />
而 <code>netstat -i</code> 命令主要调用 <code>/proc/net/dev</code> 记录的数据实现,目前来看 netstat -i 的输出是有bug的。详情可对比 <code>cat /proc/net/dev | awk '{printf "%-20s %-20s %-20s \n", $1, $2, $10}'</code> 或直接查看 <code>/proc/net/dev</code> 文件记录的数据,另外作为替代可以使用命令 <code>ip -s link</code> 查阅正确的数据<br />
[[分类:Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E6%96%87%E4%BB%B6:Netstat_i_screenshot.png&diff=1519
文件:Netstat i screenshot.png
2024-01-30T12:15:44Z
<p>Admin:</p>
<hr />
<div>netstat -i result error screenshot</div>
Admin
https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&diff=1518
VMware不关机扩容linux磁盘
2024-01-23T09:05:13Z
<p>Admin:</p>
<hr />
<div>注意在部分OS下,可能在扩容前 Disk 的相关 partition 信息在fdisk中是可以正常识别的,但是在 vsphere / esxi 对磁盘进行扩容以后<br />
<br />
就发现 partition 丢了(特别是centos7.9 + fdisk -l + GPT)<br />
<br />
这时候可以直接 <code>parted /dev/sda</code> <br />
<br />
进入以后应该就会提示<br />
Error: The backup GPT table is not at the end of the disk, as it should be. This might mean that<br />
another operating system believes the disk is smaller. Fix, by moving the backup to the end (and<br />
removing the old backup)?<br />
直接进行Fix并扩容即可<br />
<br />
也找到原本的扇区记录,然后进入fdisk ,修改 partition table 为 GPT,根据相关扇区记录,把分区重新建立回来即可<br />
<br />
=== lvm类型的分区 ===<br />
# vm层面完成磁盘扩容<br />
# 有时候会碰到vm无法感知到disk容量变化的情况出现,这时候需要手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan </code><br />
# <code> fdisk -l /dev/sda </code><br />
# 使用fdisk /dev/sda 删除重建需要扩容的分区(增大分区容量,保留原本的LVM2_member signature, 起始扇区与原本一致) <br />
# <code> partprobe /dev/sda </code><br />
# <code> pvresize /dev/sda3 </code><br />
# <code> lvextend /dev/cl/root /dev/sda3 </code><br />
# <code> xfs_growfs /dev/mapper/cl-root </code><br />
# 完成。。<br />
<br />
=== vm disk as mount point ===<br />
# vm层面完成磁盘扩容<br />
# 同样手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan</code><br />
#根据文件系统类型执行fs扩容,如<code>xfs_growfs</code> / <code>resize2fs</code><br />
#例如⬇️<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 150G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# echo 1 > /sys/class/block/sdb/device/rescan<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# cat /etc/fstab |grep cont<br />
/dev/sdb /var/lib/containers xfs defaults,pquota 0 0<br />
[root@192-168-157-39 ~]# xfs_growfs /dev/sdb<br />
meta-data=/dev/sdb isize=512 agcount=4, agsize=9830400 blks<br />
= sectsz=512 attr=2, projid32bit=1<br />
= crc=1 finobt=0 spinodes=0<br />
data = bsize=4096 blocks=39321600, imaxpct=25<br />
= sunit=0 swidth=0 blks<br />
naming =version 2 bsize=4096 ascii-ci=0 ftype=1<br />
log =internal bsize=4096 blocks=19200, version=2<br />
= sectsz=512 sunit=0 blks, lazy-count=1<br />
realtime =none extsz=4096 blocks=0, rtextents=0<br />
data blocks changed from 39321600 to 40632320<br />
[root@192-168-157-39 ~]# df -h /var/lib/containers<br />
Filesystem Size Used Avail Use% Mounted on<br />
/dev/sdb 155G 19G 137G 12% /var/lib/containers<br />
[root@192-168-157-39 ~]# lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 50G 0 disk<br />
├─sda1 8:1 0 1019M 0 part /boot<br />
└─sda2 8:2 0 49G 0 part<br />
└─centos-root 253:0 0 49G 0 lvm /<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
sr0 11:0 1 9.5G 0 rom<br />
[root@192-168-157-39 ~]#<br /><br />
额外延伸:[https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ How to scan\detect new LUN’s & SCSI disks in Linux?]<br />
[[category: Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&diff=1517
VMware不关机扩容linux磁盘
2024-01-23T09:05:03Z
<p>Admin:</p>
<hr />
<div>注意在部分OS下,可能在扩容前 Disk 的相关 partition 信息在fdisk中是可以正常识别的,但是在 vsphere / esxi 对磁盘进行扩容以后<br />
<br />
就发现 partition 丢了(特别是centos7.9 + fdisk -l + GPT)<br />
<br />
这时候可以直接 <code>parted /dev/sda</code> <br />
<br />
进入以后应该就会提示<br />
Error: The backup GPT table is not at the end of the disk, as it should be. This might mean that<br />
another operating system believes the disk is smaller. Fix, by moving the backup to the end (and<br />
removing the old backup)?<br />
直接进行Fix并扩容即可<br />
<br />
<br />
<br />
也找到原本的扇区记录,然后进入fdisk ,修改 partition table 为 GPT,根据相关扇区记录,把分区重新建立回来即可<br />
<br />
=== lvm类型的分区 ===<br />
# vm层面完成磁盘扩容<br />
# 有时候会碰到vm无法感知到disk容量变化的情况出现,这时候需要手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan </code><br />
# <code> fdisk -l /dev/sda </code><br />
# 使用fdisk /dev/sda 删除重建需要扩容的分区(增大分区容量,保留原本的LVM2_member signature, 起始扇区与原本一致) <br />
# <code> partprobe /dev/sda </code><br />
# <code> pvresize /dev/sda3 </code><br />
# <code> lvextend /dev/cl/root /dev/sda3 </code><br />
# <code> xfs_growfs /dev/mapper/cl-root </code><br />
# 完成。。<br />
<br />
=== vm disk as mount point ===<br />
# vm层面完成磁盘扩容<br />
# 同样手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan</code><br />
#根据文件系统类型执行fs扩容,如<code>xfs_growfs</code> / <code>resize2fs</code><br />
#例如⬇️<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 150G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# echo 1 > /sys/class/block/sdb/device/rescan<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# cat /etc/fstab |grep cont<br />
/dev/sdb /var/lib/containers xfs defaults,pquota 0 0<br />
[root@192-168-157-39 ~]# xfs_growfs /dev/sdb<br />
meta-data=/dev/sdb isize=512 agcount=4, agsize=9830400 blks<br />
= sectsz=512 attr=2, projid32bit=1<br />
= crc=1 finobt=0 spinodes=0<br />
data = bsize=4096 blocks=39321600, imaxpct=25<br />
= sunit=0 swidth=0 blks<br />
naming =version 2 bsize=4096 ascii-ci=0 ftype=1<br />
log =internal bsize=4096 blocks=19200, version=2<br />
= sectsz=512 sunit=0 blks, lazy-count=1<br />
realtime =none extsz=4096 blocks=0, rtextents=0<br />
data blocks changed from 39321600 to 40632320<br />
[root@192-168-157-39 ~]# df -h /var/lib/containers<br />
Filesystem Size Used Avail Use% Mounted on<br />
/dev/sdb 155G 19G 137G 12% /var/lib/containers<br />
[root@192-168-157-39 ~]# lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 50G 0 disk<br />
├─sda1 8:1 0 1019M 0 part /boot<br />
└─sda2 8:2 0 49G 0 part<br />
└─centos-root 253:0 0 49G 0 lvm /<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
sr0 11:0 1 9.5G 0 rom<br />
[root@192-168-157-39 ~]#<br /><br />
额外延伸:[https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ How to scan\detect new LUN’s & SCSI disks in Linux?]<br />
[[category: Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&diff=1516
VMware不关机扩容linux磁盘
2024-01-23T07:22:03Z
<p>Admin:</p>
<hr />
<div>注意在部分OS下,可能在扩容前 Disk 的相关 partition 信息在fdisk中是可以正常识别的,但是在 vsphere / esxi 对磁盘进行扩容以后<br />
<br />
就发现 partition 丢了(特别是centos7.9 + fdisk -l + GPT),这时候可以找到原本的扇区记录,然后进入fdisk ,修改 partition table 为 GPT,根据相关扇区记录,把分区重新建立回来即可<br />
<br />
=== lvm类型的分区 ===<br />
# vm层面完成磁盘扩容<br />
# 有时候会碰到vm无法感知到disk容量变化的情况出现,这时候需要手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan </code><br />
# <code> fdisk -l /dev/sda </code><br />
# 使用fdisk /dev/sda 删除重建需要扩容的分区(增大分区容量,保留原本的LVM2_member signature, 起始扇区与原本一致) <br />
# <code> partprobe /dev/sda </code><br />
# <code> pvresize /dev/sda3 </code><br />
# <code> lvextend /dev/cl/root /dev/sda3 </code><br />
# <code> xfs_growfs /dev/mapper/cl-root </code><br />
# 完成。。<br />
<br />
=== vm disk as mount point ===<br />
# vm层面完成磁盘扩容<br />
# 同样手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan</code><br />
#根据文件系统类型执行fs扩容,如<code>xfs_growfs</code> / <code>resize2fs</code><br />
#例如⬇️<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 150G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# echo 1 > /sys/class/block/sdb/device/rescan<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# cat /etc/fstab |grep cont<br />
/dev/sdb /var/lib/containers xfs defaults,pquota 0 0<br />
[root@192-168-157-39 ~]# xfs_growfs /dev/sdb<br />
meta-data=/dev/sdb isize=512 agcount=4, agsize=9830400 blks<br />
= sectsz=512 attr=2, projid32bit=1<br />
= crc=1 finobt=0 spinodes=0<br />
data = bsize=4096 blocks=39321600, imaxpct=25<br />
= sunit=0 swidth=0 blks<br />
naming =version 2 bsize=4096 ascii-ci=0 ftype=1<br />
log =internal bsize=4096 blocks=19200, version=2<br />
= sectsz=512 sunit=0 blks, lazy-count=1<br />
realtime =none extsz=4096 blocks=0, rtextents=0<br />
data blocks changed from 39321600 to 40632320<br />
[root@192-168-157-39 ~]# df -h /var/lib/containers<br />
Filesystem Size Used Avail Use% Mounted on<br />
/dev/sdb 155G 19G 137G 12% /var/lib/containers<br />
[root@192-168-157-39 ~]# lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 50G 0 disk<br />
├─sda1 8:1 0 1019M 0 part /boot<br />
└─sda2 8:2 0 49G 0 part<br />
└─centos-root 253:0 0 49G 0 lvm /<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
sr0 11:0 1 9.5G 0 rom<br />
[root@192-168-157-39 ~]#<br /><br />
额外延伸:[https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ How to scan\detect new LUN’s & SCSI disks in Linux?]<br />
[[category: Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&diff=1515
VMware不关机扩容linux磁盘
2024-01-23T07:21:50Z
<p>Admin:</p>
<hr />
<div>注意在部分OS下,可能在扩容前 Disk 的相关 partition 信息在fdisk中是可以正常识别的,但是在 vsphere / esxi 对磁盘进行扩容以后<br />
<br />
就发现 partition 丢了(特别是centos7.9 + fdisk -l ),这时候可以找到原本的扇区记录,然后进入fdisk ,修改 partition table 为 GPT,根据相关扇区记录,把分区重新建立回来即可<br />
<br />
=== lvm类型的分区 ===<br />
# vm层面完成磁盘扩容<br />
# 有时候会碰到vm无法感知到disk容量变化的情况出现,这时候需要手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan </code><br />
# <code> fdisk -l /dev/sda </code><br />
# 使用fdisk /dev/sda 删除重建需要扩容的分区(增大分区容量,保留原本的LVM2_member signature, 起始扇区与原本一致) <br />
# <code> partprobe /dev/sda </code><br />
# <code> pvresize /dev/sda3 </code><br />
# <code> lvextend /dev/cl/root /dev/sda3 </code><br />
# <code> xfs_growfs /dev/mapper/cl-root </code><br />
# 完成。。<br />
<br />
=== vm disk as mount point ===<br />
# vm层面完成磁盘扩容<br />
# 同样手动rescan一下<code> echo 1 > /sys/class/block/sda/device/rescan</code><br />
#根据文件系统类型执行fs扩容,如<code>xfs_growfs</code> / <code>resize2fs</code><br />
#例如⬇️<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 150G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# echo 1 > /sys/class/block/sdb/device/rescan<br />
[root@192-168-157-39 ~]# lsblk /dev/sdb<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
[root@192-168-157-39 ~]# cat /etc/fstab |grep cont<br />
/dev/sdb /var/lib/containers xfs defaults,pquota 0 0<br />
[root@192-168-157-39 ~]# xfs_growfs /dev/sdb<br />
meta-data=/dev/sdb isize=512 agcount=4, agsize=9830400 blks<br />
= sectsz=512 attr=2, projid32bit=1<br />
= crc=1 finobt=0 spinodes=0<br />
data = bsize=4096 blocks=39321600, imaxpct=25<br />
= sunit=0 swidth=0 blks<br />
naming =version 2 bsize=4096 ascii-ci=0 ftype=1<br />
log =internal bsize=4096 blocks=19200, version=2<br />
= sectsz=512 sunit=0 blks, lazy-count=1<br />
realtime =none extsz=4096 blocks=0, rtextents=0<br />
data blocks changed from 39321600 to 40632320<br />
[root@192-168-157-39 ~]# df -h /var/lib/containers<br />
Filesystem Size Used Avail Use% Mounted on<br />
/dev/sdb 155G 19G 137G 12% /var/lib/containers<br />
[root@192-168-157-39 ~]# lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 50G 0 disk<br />
├─sda1 8:1 0 1019M 0 part /boot<br />
└─sda2 8:2 0 49G 0 part<br />
└─centos-root 253:0 0 49G 0 lvm /<br />
sdb 8:16 0 155G 0 disk /var/lib/containers<br />
sr0 11:0 1 9.5G 0 rom<br />
[root@192-168-157-39 ~]#<br /><br />
额外延伸:[https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ How to scan\detect new LUN’s & SCSI disks in Linux?]<br />
[[category: Linux]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1514
Elasticsearch的一些api随记
2024-01-03T09:50:25Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
/_cat/nodeattrs<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号,[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么,该编号始终为 6 个字符,且为零填充]。即使手动创建的索引结尾是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> <br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E8%B0%83%E6%95%B4%E8%8A%82%E7%82%B9kubelet%E7%A1%AC%E9%A9%B1%E9%80%90%E7%AD%96%E7%95%A5&diff=1513
K8s调整节点kubelet硬驱逐策略
2023-12-22T10:00:01Z
<p>Admin:</p>
<hr />
<div> --eviction-hard=nodefs.available<5Gi,imagefs.available<5Gi<br />
添加到kubelet service environment就好(此配置方法在DEPRECATED阶段)<br />
[Service]<br />
Environment="***"<br />
ps: 驱逐相关的doc:<br />
<br />
https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/<br />
<br />
https://blog.tianfeiyu.com/2020/02/06/kubelet_garbage_collect/ (部分内容过时)<br />
<br />
https://kubernetes.io/docs/concepts/architecture/garbage-collection/<br />
<br />
<br />
<br />
PS2: 通过请求k8s-apiserver接口,可以获知节点当前配置具体值<br />
<br />
apiserver的认证绕过可以通过 <code>kubectl proxy --port=8001</code> 等方法实现<br />
<br />
或者直接使用命令 <code>kubectl get --raw "/api/v1/nodes/${nodeName}/proxy/configz" | jq</code><br />
curl ${k8s-apiserver}/api/v1/nodes/${nodeName}/proxy/configz <br />
{<br />
"kubeletconfig": {<br />
"staticPodPath": "/etc/kubernetes/kubelet/manifests",<br />
"syncFrequency": "1m0s",<br />
"fileCheckFrequency": "20s",<br />
"httpCheckFrequency": "20s",<br />
"address": "0.0.0.0",<br />
"port": 10250,<br />
"readOnlyPort": 10255,<br />
"tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt",<br />
"tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key",<br />
"rotateCertificates": true,<br />
"authentication": {<br />
"x509": {<br />
"clientCAFile": "/etc/kubernetes/certs/ca.crt"<br />
},<br />
"webhook": {<br />
"enabled": true,<br />
"cacheTTL": "2m0s"<br />
},<br />
"anonymous": {<br />
"enabled": false<br />
}<br />
},<br />
"authorization": {<br />
"mode": "Webhook",<br />
"webhook": {<br />
"cacheAuthorizedTTL": "5m0s",<br />
"cacheUnauthorizedTTL": "30s"<br />
}<br />
},<br />
"registryPullQPS": 5,<br />
"registryBurst": 10,<br />
"eventRecordQPS": 5,<br />
"eventBurst": 10,<br />
"enableDebuggingHandlers": true,<br />
"healthzPort": 10248,<br />
"healthzBindAddress": "127.0.0.1",<br />
"oomScoreAdj": -999,<br />
"clusterDomain": "cluster.local",<br />
"clusterDNS": [<br />
"172.31.0.10"<br />
],<br />
"streamingConnectionIdleTimeout": "4h0m0s",<br />
"nodeStatusUpdateFrequency": "10s",<br />
"nodeStatusReportFrequency": "10s",<br />
"nodeLeaseDurationSeconds": 40,<br />
"imageMinimumGCAge": "2m0s",<br />
"imageGCHighThresholdPercent": 85,<br />
"imageGCLowThresholdPercent": 80,<br />
"volumeStatsAggPeriod": "1m0s",<br />
"cgroupsPerQOS": true,<br />
"cgroupDriver": "cgroupfs",<br />
"cpuManagerPolicy": "none",<br />
"cpuManagerReconcilePeriod": "10s",<br />
"topologyManagerPolicy": "none",<br />
"runtimeRequestTimeout": "2m0s",<br />
"hairpinMode": "promiscuous-bridge",<br />
"maxPods": 250,<br />
"podPidsLimit": 8192,<br />
"resolvConf": "/etc/resolv.conf",<br />
"cpuCFSQuota": true,<br />
"cpuCFSQuotaPeriod": "100ms",<br />
"maxOpenFiles": 1000000,<br />
"contentType": "application/vnd.kubernetes.protobuf",<br />
"kubeAPIQPS": 5,<br />
"kubeAPIBurst": 10,<br />
"serializeImagePulls": true,<br />
"evictionHard": {<br />
"imagefs.available": "15%",<br />
"memory.available": "100Mi",<br />
"nodefs.available": "10%",<br />
"nodefs.inodesFree": "5%"<br />
},<br />
"evictionPressureTransitionPeriod": "5m0s",<br />
"enableControllerAttachDetach": true,<br />
"makeIPTablesUtilChains": true,<br />
"iptablesMasqueradeBit": 14,<br />
"iptablesDropBit": 15,<br />
"featureGates": {<br />
"CSIMigration": false,<br />
"EphemeralContainers": true<br />
},<br />
"failSwapOn": true,<br />
"containerLogMaxSize": "10Mi",<br />
"containerLogMaxFiles": 5,<br />
"configMapAndSecretChangeDetectionStrategy": "Watch",<br />
"systemReserved": {<br />
"cpu": "500m",<br />
"memory": "512Mi",<br />
"pid": "100"<br />
},<br />
"enforceNodeAllocatable": [<br />
"pods"<br />
]<br />
}<br />
}<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E8%B0%83%E6%95%B4%E8%8A%82%E7%82%B9kubelet%E7%A1%AC%E9%A9%B1%E9%80%90%E7%AD%96%E7%95%A5&diff=1512
K8s调整节点kubelet硬驱逐策略
2023-12-22T09:57:48Z
<p>Admin:</p>
<hr />
<div> --eviction-hard=nodefs.available<5Gi,imagefs.available<5Gi<br />
添加到kubelet service environment就好(此配置方法在DEPRECATED阶段)<br />
[Service]<br />
Environment="***"<br />
ps: 驱逐相关的doc:<br />
<br />
https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/<br />
<br />
https://blog.tianfeiyu.com/2020/02/06/kubelet_garbage_collect/ (部分内容过时)<br />
<br />
https://kubernetes.io/docs/concepts/architecture/garbage-collection/<br />
<br />
<br />
<br />
PS2: 通过请求k8s-apiserver接口,可以获知节点当前配置具体值<br />
<br />
apiserver的认证绕过可以通过 <code>kubectl proxy --port=8001</code> 等方法实现<br />
curl ${k8s-apiserver}/api/v1/nodes/${nodeName}/proxy/configz <br />
{<br />
"kubeletconfig": {<br />
"staticPodPath": "/etc/kubernetes/kubelet/manifests",<br />
"syncFrequency": "1m0s",<br />
"fileCheckFrequency": "20s",<br />
"httpCheckFrequency": "20s",<br />
"address": "0.0.0.0",<br />
"port": 10250,<br />
"readOnlyPort": 10255,<br />
"tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt",<br />
"tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key",<br />
"rotateCertificates": true,<br />
"authentication": {<br />
"x509": {<br />
"clientCAFile": "/etc/kubernetes/certs/ca.crt"<br />
},<br />
"webhook": {<br />
"enabled": true,<br />
"cacheTTL": "2m0s"<br />
},<br />
"anonymous": {<br />
"enabled": false<br />
}<br />
},<br />
"authorization": {<br />
"mode": "Webhook",<br />
"webhook": {<br />
"cacheAuthorizedTTL": "5m0s",<br />
"cacheUnauthorizedTTL": "30s"<br />
}<br />
},<br />
"registryPullQPS": 5,<br />
"registryBurst": 10,<br />
"eventRecordQPS": 5,<br />
"eventBurst": 10,<br />
"enableDebuggingHandlers": true,<br />
"healthzPort": 10248,<br />
"healthzBindAddress": "127.0.0.1",<br />
"oomScoreAdj": -999,<br />
"clusterDomain": "cluster.local",<br />
"clusterDNS": [<br />
"172.31.0.10"<br />
],<br />
"streamingConnectionIdleTimeout": "4h0m0s",<br />
"nodeStatusUpdateFrequency": "10s",<br />
"nodeStatusReportFrequency": "10s",<br />
"nodeLeaseDurationSeconds": 40,<br />
"imageMinimumGCAge": "2m0s",<br />
"imageGCHighThresholdPercent": 85,<br />
"imageGCLowThresholdPercent": 80,<br />
"volumeStatsAggPeriod": "1m0s",<br />
"cgroupsPerQOS": true,<br />
"cgroupDriver": "cgroupfs",<br />
"cpuManagerPolicy": "none",<br />
"cpuManagerReconcilePeriod": "10s",<br />
"topologyManagerPolicy": "none",<br />
"runtimeRequestTimeout": "2m0s",<br />
"hairpinMode": "promiscuous-bridge",<br />
"maxPods": 250,<br />
"podPidsLimit": 8192,<br />
"resolvConf": "/etc/resolv.conf",<br />
"cpuCFSQuota": true,<br />
"cpuCFSQuotaPeriod": "100ms",<br />
"maxOpenFiles": 1000000,<br />
"contentType": "application/vnd.kubernetes.protobuf",<br />
"kubeAPIQPS": 5,<br />
"kubeAPIBurst": 10,<br />
"serializeImagePulls": true,<br />
"evictionHard": {<br />
"imagefs.available": "15%",<br />
"memory.available": "100Mi",<br />
"nodefs.available": "10%",<br />
"nodefs.inodesFree": "5%"<br />
},<br />
"evictionPressureTransitionPeriod": "5m0s",<br />
"enableControllerAttachDetach": true,<br />
"makeIPTablesUtilChains": true,<br />
"iptablesMasqueradeBit": 14,<br />
"iptablesDropBit": 15,<br />
"featureGates": {<br />
"CSIMigration": false,<br />
"EphemeralContainers": true<br />
},<br />
"failSwapOn": true,<br />
"containerLogMaxSize": "10Mi",<br />
"containerLogMaxFiles": 5,<br />
"configMapAndSecretChangeDetectionStrategy": "Watch",<br />
"systemReserved": {<br />
"cpu": "500m",<br />
"memory": "512Mi",<br />
"pid": "100"<br />
},<br />
"enforceNodeAllocatable": [<br />
"pods"<br />
]<br />
}<br />
}<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E8%B0%83%E6%95%B4%E8%8A%82%E7%82%B9kubelet%E7%A1%AC%E9%A9%B1%E9%80%90%E7%AD%96%E7%95%A5&diff=1511
K8s调整节点kubelet硬驱逐策略
2023-12-22T09:56:13Z
<p>Admin:</p>
<hr />
<div> --eviction-hard=nodefs.available<5Gi,imagefs.available<5Gi<br />
添加到kubelet service environment就好(此配置方法在DEPRECATED阶段)<br />
[Service]<br />
Environment="***"<br />
ps: 驱逐相关的doc:<br />
<br />
https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/<br />
<br />
https://blog.tianfeiyu.com/2020/02/06/kubelet_garbage_collect/ (部分内容过时)<br />
<br />
https://kubernetes.io/docs/concepts/architecture/garbage-collection/<br />
<br />
<br />
PS2: 通过请求kubelet接口,可以获知当前配置具体值<br />
curl {apiserver}/api/v1/nodes/wcn-gzu-ytjdc1/proxy/configz <br />
{<br />
"kubeletconfig": {<br />
"staticPodPath": "/etc/kubernetes/kubelet/manifests",<br />
"syncFrequency": "1m0s",<br />
"fileCheckFrequency": "20s",<br />
"httpCheckFrequency": "20s",<br />
"address": "0.0.0.0",<br />
"port": 10250,<br />
"readOnlyPort": 10255,<br />
"tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt",<br />
"tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key",<br />
"rotateCertificates": true,<br />
"authentication": {<br />
"x509": {<br />
"clientCAFile": "/etc/kubernetes/certs/ca.crt"<br />
},<br />
"webhook": {<br />
"enabled": true,<br />
"cacheTTL": "2m0s"<br />
},<br />
"anonymous": {<br />
"enabled": false<br />
}<br />
},<br />
"authorization": {<br />
"mode": "Webhook",<br />
"webhook": {<br />
"cacheAuthorizedTTL": "5m0s",<br />
"cacheUnauthorizedTTL": "30s"<br />
}<br />
},<br />
"registryPullQPS": 5,<br />
"registryBurst": 10,<br />
"eventRecordQPS": 5,<br />
"eventBurst": 10,<br />
"enableDebuggingHandlers": true,<br />
"healthzPort": 10248,<br />
"healthzBindAddress": "127.0.0.1",<br />
"oomScoreAdj": -999,<br />
"clusterDomain": "cluster.local",<br />
"clusterDNS": [<br />
"172.31.0.10"<br />
],<br />
"streamingConnectionIdleTimeout": "4h0m0s",<br />
"nodeStatusUpdateFrequency": "10s",<br />
"nodeStatusReportFrequency": "10s",<br />
"nodeLeaseDurationSeconds": 40,<br />
"imageMinimumGCAge": "2m0s",<br />
"imageGCHighThresholdPercent": 85,<br />
"imageGCLowThresholdPercent": 80,<br />
"volumeStatsAggPeriod": "1m0s",<br />
"cgroupsPerQOS": true,<br />
"cgroupDriver": "cgroupfs",<br />
"cpuManagerPolicy": "none",<br />
"cpuManagerReconcilePeriod": "10s",<br />
"topologyManagerPolicy": "none",<br />
"runtimeRequestTimeout": "2m0s",<br />
"hairpinMode": "promiscuous-bridge",<br />
"maxPods": 250,<br />
"podPidsLimit": 8192,<br />
"resolvConf": "/etc/resolv.conf",<br />
"cpuCFSQuota": true,<br />
"cpuCFSQuotaPeriod": "100ms",<br />
"maxOpenFiles": 1000000,<br />
"contentType": "application/vnd.kubernetes.protobuf",<br />
"kubeAPIQPS": 5,<br />
"kubeAPIBurst": 10,<br />
"serializeImagePulls": true,<br />
"evictionHard": {<br />
"imagefs.available": "15%",<br />
"memory.available": "100Mi",<br />
"nodefs.available": "10%",<br />
"nodefs.inodesFree": "5%"<br />
},<br />
"evictionPressureTransitionPeriod": "5m0s",<br />
"enableControllerAttachDetach": true,<br />
"makeIPTablesUtilChains": true,<br />
"iptablesMasqueradeBit": 14,<br />
"iptablesDropBit": 15,<br />
"featureGates": {<br />
"CSIMigration": false,<br />
"EphemeralContainers": true<br />
},<br />
"failSwapOn": true,<br />
"containerLogMaxSize": "10Mi",<br />
"containerLogMaxFiles": 5,<br />
"configMapAndSecretChangeDetectionStrategy": "Watch",<br />
"systemReserved": {<br />
"cpu": "500m",<br />
"memory": "512Mi",<br />
"pid": "100"<br />
},<br />
"enforceNodeAllocatable": [<br />
"pods"<br />
]<br />
}<br />
}<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1510
Elasticsearch的一些api随记
2023-12-13T10:51:37Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号,[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么,该编号始终为 6 个字符,且为零填充]。即使手动创建的索引结尾是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> <br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1509
Elasticsearch的一些api随记
2023-12-13T10:49:36Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号,对于索引最后的这个序号,[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么,该编号始终为 6 个字符,且为零填充]。即使手动创建的索引结尾是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> <br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1508
Elasticsearch的一些api随记
2023-12-13T10:46:55Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号,对于索引最后的这个序号,[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么,该编号始终为 6 个字符,且为零填充]。即使手动创建的索引结尾是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> <br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1507
Elasticsearch的一些api随记
2023-12-13T10:42:56Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号需要多长官方似乎没有在doc明确说明,一般是6位数的序号。不过假设手动创建的索引是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code> (至少实测在ES v7.16.3是这样的表现)<br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1506
Elasticsearch的一些api随记
2023-12-13T10:41:22Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
对于索引最后的这个序号需要多长官方似乎没有在doc明确说明,一般是6位数的序号。不过假设手动创建的索引是<code>-00001</code>,在rollover发生以后,索引后缀序号依然会变成<code>-000002</code><br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1505
Elasticsearch的一些api随记
2023-12-12T14:12:02Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
[[使用jq批量修改es index template的lifecycle配置]]<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E9%A6%96%E9%A1%B5&diff=1504
首页
2023-12-12T13:07:01Z
<p>Admin:</p>
<hr />
<div><strong><big>WILO or 三线 --点滴随记</big></strong><br />
<br />
<big>Life // Technology // Memory</big><br />
<br />
<br />
===<big>About this site</big>===<br />
<s><small>部署在了一个随时会down(主机关机)的小本本 正常来说深夜关(shan)站(ku)跑路</small></s><br />
<br />
<big>启用了全站缓存功能-即使主机歇菜了文字也不会歇菜((是的,图片会歇菜))</big><br />
<br />
<big>这里记载了我作为一个可怜的打工人-躺坑路上的一些想法归纳和常用指令,好记性不如烂笔头。</big><br />
<br />
可能早期的记录过于零散,还没心情整理。要看新的可以在导航栏选择【最近更改】进行查看<br />
<br />
<small><br /><s>手机版模板视图有bug,还在拖延修复,建议PC视图(- 不修了,用什么手机📱?电脑💻不香吗?)[我直接关闭手机模板]</s></small><br />
<br />
<br />
部分文章 来源 / 加工 于网上内容,如不同意该内容被转载或有异议<br />
<br />
可在下方 github 提出 issue 或 email 联系 [mailto:mail@sanxian.tech mail@sanxian.tech]<br />
<br />
<br />
===Github 随记===<br />
https://github.com/San3Xian/randomMark/issues<br />
<br />
<br />
===Attention 1===<br />
文化是一种<br />
<br />
1.根植于内心的修养;<br />
<br />
2.无需提醒的自觉;<br />
<br />
3.以约束为前提的自由;<br />
<br />
4.为别人着想的善良!<br />
<br />
做一件事就得做得像一件事<br />
<br />
<br />
===Attention 2===<br />
有时候,“虚惊一场”这四个字是人世间最美好的成语,比起什么兴高采烈,五彩缤纷,一帆风顺都要美好百倍。你可懂什么叫失去。这些时间来,更觉如此。愿悲伤恐惧能够过去,事外之人更懂珍惜。<br />
<br />
<br />
=== Attention 3 ===<br />
你想一件事失败,就拖,拖着拖着,就凉了<br />
<br />
<br />
===<s>TODO LIST?(有心情就更新,咕咕咕)</s> 已经鸽了===<br />
{| class="wikitable"<br />
!【 Status 】<br />
!【 Items 】<br />
|-<br />
|【 Going 】<br />
|deploy a k8s cluster (so you need to learn relevant knowledge)<br />
|-<br />
|【 To Do 】<br />
|https://github.com/hiboyhiboy/opt-script/blob/master/www_sh/goflyway<br />
|}<br />
<br />
<br />
===Share===<br />
↓别看了,下面的媒体资源引用了墙外资源<br />
<br />
<youtube>https://www.youtube.com/watch?v=QqccaHauSKQ&list=PL0PqFWeUovQcgnOwrCyxQYFYf8hDnuAgk</youtube><br />
<br />
<br />
<br />
__无目录__<br />
__无编辑段落__</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E9%A6%96%E9%A1%B5&diff=1503
首页
2023-12-12T13:05:51Z
<p>Admin:</p>
<hr />
<div><strong><big>WILO or 三线 --点滴随记</big></strong><br />
<br />
<big>Life // Technology // Memory</big><br />
<br />
===<big>About this site</big>===<br />
<s><small>部署在了一个随时会down(主机关机)的小本本 正常来说深夜关(shan)站(ku)跑路</small></s><br />
<br />
<big>启用了全站缓存功能-即使主机歇菜了文字也不会歇菜((是的,图片会歇菜))</big><br />
<br />
<big>这里记载了我作为打工人路上的一些想法归纳和常用指令,好记性不如烂笔头</big><br />
<br />
<small><br /><s>手机版模板视图有bug,还在拖延修复,建议PC视图(- 不修了,用什么手机📱?电脑💻不香吗?)[我直接关闭手机模板]</s></small><br />
<br />
<br />
部分文章 来源 / 加工 于网上内容,如不同意该内容被转载或有异议<br />
<br />
可在下方 github 提出 issue 或 email 联系 [mailto:mail@sanxian.tech mail@sanxian.tech]<br />
<br />
<br />
===Github 随记===<br />
https://github.com/San3Xian/randomMark/issues<br />
<br />
<br />
===Attention 1===<br />
文化是一种<br />
<br />
1.根植于内心的修养;<br />
<br />
2.无需提醒的自觉;<br />
<br />
3.以约束为前提的自由;<br />
<br />
4.为别人着想的善良!<br />
<br />
做一件事就得做得像一件事<br />
<br />
<br />
===Attention 2===<br />
有时候,“虚惊一场”这四个字是人世间最美好的成语,比起什么兴高采烈,五彩缤纷,一帆风顺都要美好百倍。你可懂什么叫失去。这些时间来,更觉如此。愿悲伤恐惧能够过去,事外之人更懂珍惜。<br />
<br />
<br />
=== Attention 3 ===<br />
你想一件事失败,就拖,拖着拖着,就凉了<br />
<br />
<br />
===<s>TODO LIST?(有心情就更新,咕咕咕)</s> 已经鸽了===<br />
{| class="wikitable"<br />
!【 Status 】<br />
!【 Items 】<br />
|-<br />
|【 Going 】<br />
|deploy a k8s cluster (so you need to learn relevant knowledge)<br />
|-<br />
|【 To Do 】<br />
|https://github.com/hiboyhiboy/opt-script/blob/master/www_sh/goflyway<br />
|}<br />
<br />
<br />
===Share===<br />
↓别看了,下面的媒体资源引用了墙外资源<br />
<br />
<youtube>https://www.youtube.com/watch?v=QqccaHauSKQ&list=PL0PqFWeUovQcgnOwrCyxQYFYf8hDnuAgk</youtube><br />
<br />
<br />
<br />
__无目录__<br />
__无编辑段落__</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E9%A6%96%E9%A1%B5&diff=1502
首页
2023-12-12T13:05:25Z
<p>Admin:</p>
<hr />
<div><strong><big>WILO or 三线 --点滴随记</big></strong><br />
<br />
<big>Life // Technology // Memory</big><br />
<br />
===<big>About this site</big>===<br />
<s><small>部署在了一个随时会down(主机关机)的小本本 正常来说深夜关(shan)站(ku)跑路</small></s><br />
<br />
<big>启用了全站缓存功能-即使主机歇菜了文字也不会歇菜((是的,图片会歇菜))</big><br />
<br />
<big>这里记载了我作为打工人路上的一些想法归纳和常用指令,好记性不如烂笔头</big><br />
<br />
<small><br /><s>手机版模板视图有bug,还在拖延修复,建议PC视图(- 不修了,用什么手机📱?电脑💻不香吗?)[我直接关闭手机模板]</s></small><br />
<br />
<br />
部分文章 来源 / 加工 于网上内容,如不同意该内容被转载或有异议<br />
<br />
可在下方 github 提出 issue 或 email 联系 [mailto:mail@sanxian.tech mail@sanxian.tech]<br />
<br />
<br />
===Github 随记===<br />
https://github.com/San3Xian/randomMark/issues<br />
<br />
<br />
===Attention 1===<br />
文化是一种<br />
<br />
1.根植于内心的修养;<br />
<br />
2.无需提醒的自觉;<br />
<br />
3.以约束为前提的自由;<br />
<br />
4.为别人着想的善良!<br />
<br />
做一件事就得做得像一件事<br />
<br />
<br />
===Attention 2===<br />
有时候,“虚惊一场”这四个字是人世间最美好的成语,比起什么兴高采烈,五彩缤纷,一帆风顺都要美好百倍。你可懂什么叫失去。这些时间来,更觉如此。愿悲伤恐惧能够过去,事外之人更懂珍惜。<br /><br />
<br />
===Attention 3===<br />
你想一件事失败,就拖,拖着拖着,就凉了<br />
<br />
<br />
===<s>TODO LIST?(有心情就更新,咕咕咕)</s> 已经鸽了===<br />
{| class="wikitable"<br />
!【 Status 】<br />
!【 Items 】<br />
|-<br />
|【 Going 】<br />
|deploy a k8s cluster (so you need to learn relevant knowledge)<br />
|-<br />
|【 To Do 】<br />
|https://github.com/hiboyhiboy/opt-script/blob/master/www_sh/goflyway<br />
|}<br />
<br />
<br />
===Share===<br />
↓别看了,下面的媒体资源引用了墙外资源<br />
<br />
<youtube>https://www.youtube.com/watch?v=QqccaHauSKQ&list=PL0PqFWeUovQcgnOwrCyxQYFYf8hDnuAgk</youtube><br />
<br />
<br />
<br />
__无目录__<br />
__无编辑段落__</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E9%A6%96%E9%A1%B5&diff=1501
首页
2023-12-12T13:04:55Z
<p>Admin:</p>
<hr />
<div><strong><big>WILO or 三线 --点滴随记</big></strong><br />
<br />
<big>Life // Technology // Memory</big><br />
<br />
===<big>About this site</big>===<br />
<s><small>部署在了一个随时会down(主机关机)的小本本 正常来说深夜关(shan)站(ku)跑路</small></s><br />
<br />
<big>启用了全站缓存功能-即使主机歇菜了文字也不会歇菜((是的,图片会歇菜))</big><br />
<br />
<big>这里记载了我作为打工人路上的一些想法归纳和常用指令,好记性不如烂笔头</big><br />
<br />
<small><br /><s>手机版模板视图有bug,还在拖延修复,建议PC视图(- 不修了,用什么手机📱?电脑💻不香吗?)[我直接关闭手机模板]</s></small><br />
<br />
<br />
部分文章 来源 / 加工 于网上内容,如不同意该内容被转载或有异议<br />
<br />
可在下方 github 提出 issue 或 email 联系 [mailto:mail@sanxian.tech mail@sanxian.tech]<br />
<br />
<br />
===Github 随记===<br />
https://github.com/San3Xian/randomMark/issues<br />
<br />
===Attention 1===<br />
文化是一种<br />
<br />
1.根植于内心的修养;<br />
<br />
2.无需提醒的自觉;<br />
<br />
3.以约束为前提的自由;<br />
<br />
4.为别人着想的善良!<br />
<br />
做一件事就得做得像一件事<br />
<br />
===Attention 2===<br />
有时候,“虚惊一场”这四个字是人世间最美好的成语,比起什么兴高采烈,五彩缤纷,一帆风顺都要美好百倍。你可懂什么叫失去。这些时间来,更觉如此。愿悲伤恐惧能够过去,事外之人更懂珍惜。<br /><br />
<br />
===Attention 3===<br />
你想一件事失败,就拖,拖着拖着,就凉了<br />
<br />
===<s>TODO LIST?(有心情就更新,咕咕咕)</s> 已经鸽了===<br />
{| class="wikitable"<br />
!【 Status 】<br />
!【 Items 】<br />
|-<br />
|【 Going 】<br />
|deploy a k8s cluster (so you need to learn relevant knowledge)<br />
|-<br />
|【 To Do 】<br />
|https://github.com/hiboyhiboy/opt-script/blob/master/www_sh/goflyway<br />
|}<br />
<br />
===Share===<br />
↓别看了,下面的媒体资源引用了墙外资源<br />
<br />
<youtube>https://www.youtube.com/watch?v=QqccaHauSKQ&list=PL0PqFWeUovQcgnOwrCyxQYFYf8hDnuAgk</youtube><br />
<br />
<br />
<br />
__无目录__<br />
__无编辑段落__</div>
Admin
https://wiki.sanxian.tech/index.php?title=%E9%A6%96%E9%A1%B5&diff=1500
首页
2023-12-12T13:04:18Z
<p>Admin:</p>
<hr />
<div><strong><big>WILO or 三线 --点滴随记</big></strong><br />
<br />
<big>Life // Technology // Memory</big><br />
<br />
===<big>About this site</big>===<br />
<s><small>部署在了一个随时会down(主机关机)的小本本 正常来说深夜关(shan)站(ku)跑路</small></s><br />
<br />
<big>启用了全站缓存功能-即使主机歇菜了文字也不会歇菜((是的,图片会歇菜))</big><br />
<br />
<big>这里记载了我作为打工人路上的一些想法归纳和常用指令,好记性不如烂笔头</big><br />
<br />
<small><br /><s>手机版模板视图有bug,还在拖延修复,建议PC视图(- 不修了,用什么手机📱?电脑💻不香吗?)[我直接关闭手机模板]</s></small><br />
<br />
<br />
部分文章 来源 / 加工 于网上内容,如不同意该内容被转载或有异议<br />
<br />
可在下方 github 提出 issue 或 email 联系 [mailto:mail@sanxian.tech mail@sanxian.tech]<br />
<br />
<br />
===Github 随记===<br />
https://github.com/San3Xian/randomMark/issues<br />
<br />
===Attention 1===<br />
文化是一种<br />
<br />
1.根植于内心的修养;<br />
<br />
2.无需提醒的自觉;<br />
<br />
3.以约束为前提的自由;<br />
<br />
4.为别人着想的善良!<br />
<br />
做一件事就得做得像一件事<br />
<br />
===Attention 2===<br />
有时候,“虚惊一场”这四个字是人世间最美好的成语,比起什么兴高采烈,五彩缤纷,一帆风顺都要美好百倍。你可懂什么叫失去。这些时间来,更觉如此。愿悲伤恐惧能够过去,事外之人更懂珍惜。<br /><br />
<br />
===Attention 3===<br />
你想一件事失败,就拖,拖着拖着,就凉了<br />
<br />
===<s>TODO LIST?(有心情就更新,咕咕咕)</s> 已经鸽了===<br />
{| class="wikitable"<br />
!【 Status 】<br />
!【 Items 】<br />
|-<br />
|【 Going 】<br />
|deploy a k8s cluster (so you need to learn relevant knowledge)<br />
|-<br />
|【 To Do 】<br />
|https://github.com/hiboyhiboy/opt-script/blob/master/www_sh/goflyway<br />
|}<br />
<br />
===Attention 4===<br />
遍体鳞伤but no way<br />
失去防备该如何防卫<br />
无法预计未来的伤悲<br />
该怎么面对<br />
还是run away<br />
--------《Run Away》<br />
<br />
===Share===<br />
↓别看了,下面的媒体资源引用了墙外资源<br />
<br />
<youtube>https://www.youtube.com/watch?v=QqccaHauSKQ&list=PL0PqFWeUovQcgnOwrCyxQYFYf8hDnuAgk</youtube><br />
<br />
<br />
<br />
__无目录__<br />
__无编辑段落__</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1499
Elasticsearch的一些api随记
2023-12-12T12:59:43Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
===== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) =====<br />
⚠️ 这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster setting related ES集群参数设置===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
<br />
===== 批量/单个 设置索引副本数 =====<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1498
Elasticsearch的一些api随记
2023-12-12T12:58:04Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) ====<br />
这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1497
Elasticsearch的一些api随记
2023-12-12T12:57:45Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== Templates 模板 ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
==== Use template to change the replicas settings of all indexes (Legacy index template) ====<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ILM (index lifecycle policy) 索引生命周期 ===<br />
顾名思义,ilm另外也可用于做ES集群的冷热温架构。<br />
<br />
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看<br />
<br />
比较难受的是,ilm目前没有类似 <code>_cat/templates</code> 的接口一次性只查看这个集群已配置的 ILM 策略名字,只能一次性获取全部策略具体定义<br />
GET /_ilm/policy<br />
<br />
==== Get specific ilm policy detail 获取特定ILM策略定义 ====<br />
GET /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Get index's ilm status 获取索引当前 ILM 状态 ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== Move index's ilm to step 修改索引的ILM阶段状态(人为触发ILM action执行) ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
<br />
==== 手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名) ====<br />
这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1496
Elasticsearch的一些api随记
2023-12-12T10:33:36Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== get index's ilm status ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== move index's ilm to step ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名)<br />
<br />
这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1495
Elasticsearch的一些api随记
2023-12-12T10:33:11Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== get index's ilm status ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== move index's ilm to step ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名)<br />
<br />
这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
ps: 如果怕创建错名字的话,可以使用 <code>GET 3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings</code> 预览一下生成的索引名效果<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1494
Elasticsearch的一些api随记
2023-12-12T10:30:09Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== get index's ilm status ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== move index's ilm to step ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
==== Manually create an index that is managed by template and ILM (including rollover operations by day) ====<br />
手动创建原本应由template和ilm管控的索引,且索引名内包含日期(动态索引名)<br />
<br />
这种索引不能直接粗暴地 <code>PUT /index-name-2022.10.23-000022</code> 以创建索引,否则手动创建出来的索引,在rollover滚动 (例如rollover-max_age:1d)的时候,创建出来的新索引名字仍然是创建索引时定义的日期,而不是当天轮滚发生时的日期(如 <code>index-name-2022.10.23-000023</code>)<br />
<br />
这个现象可以通过判断 <code>GET /index-name/_settings</code> 中 <code>index.provided_name</code> 属性看出来<br />
<br />
解法:<br />
PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E<br />
注意在kibana-Dev Tools中不要做URL Decode,他就是这样的需要编码一下(解码后就是: <code><index-name-{now/d}-000099></code>)<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1493
Elasticsearch的一些api随记
2023-12-12T06:01:02Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions": [<br />
{<br />
"add": {<br />
"index": "es-k8s-logs-000020", <br />
"alias": "es-k8s-logs-alias", <br />
"is_write_index": true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
==== get index's ilm status ====<br />
get /${index_name}/_ilm/explain<br />
<br />
==== move index's ilm to step ====<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html<br />
POST _ilm/move/my-index-000001<br />
{<br />
"current_step": { <br />
"phase": "new",<br />
"action": "complete",<br />
"name": "complete"<br />
},<br />
"next_step": { <br />
"phase": "warm",<br />
"action": "forcemerge", <br />
"name": "forcemerge" <br />
}<br />
}<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&diff=1492
Kubectl随记
2023-11-21T11:50:01Z
<p>Admin:</p>
<hr />
<div>=== kubectl set default editor ===<br />
export KUBE_EDITOR=/usr/bin/vim<br />
<br />
===kubectl completion bash not working 排障随记===<br />
需要已经安装 bash-completion <br />
<br />
如果提示 <code>_get_comp_words_by_ref: command not found</code> 错误的话,需要执行<br />
source /usr/share/bash-completion/bash_completion<br />
执行命令 <code>set</code> 看一下当前环境的相关配置有没有kube相关项<br />
set | grep -i kube<br />
没有的话需要执行<br />
source <(kubectl completion bash)<br />
<br />
正常的话,打开 kubectl debug<br />
__kubectl_debug() {<br />
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then<br />
echo "$*" >> "${BASH_COMP_DEBUG_FILE}"<br />
fi<br />
}<br />
<br />
export BASH_COMP_DEBUG_FILE=****<br />
根据debug file里面的记录去排查出错点<br />
<br />
=== use kubectl to get all api resource types ===<br />
kubectl api-resources -o name --cached --request-timeout=5s --verbs=get<br />
<br />
kubectl api-resources --api-group=networking.k8s.io<br />
<br />
==== get groupVersion when a resource exists in multiple api groups ====<br />
<br />
==== explain api-resource with sprcific api version ====<br />
kubectl api-resources --api-group=networking.k8s.io -v8 2>&1| grep ingress<br />
<br />
kubectl explain ingress --api-version="networking.k8s.io/v1beta1"<br />
<br />
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===<br />
kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d<br />
<br />
=== Check k8s account privilege / k8s 对象权限相关 ===<br />
kubectl options:<br />
--as=: Username to impersonate for the operation<br />
--as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.<br />
假设有名为registry-test的serviceAccount位于kube-system,这时候我们要测试他的RBAC权限,可以使用如下命令<br />
kubectl --as "system:serviceaccount:kube-system:registry-test" get serviceaccount<br />
<br />
Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]<br />
<br />
# Check to see if I can do everything in my current namespace ("*" means all)<br />
kubectl auth can-i '*' '*'<br />
<br />
[root@node-a ~]# kubectl --as "system:serviceaccount:kube-system:registry-test" auth can-i list pods<br />
yes<br />
PS: 在RBAC定义中(例如role / clusterrole)对 <code>resources</code> 的 <code>pods/*</code> 声明不会对诸如 <code>pods/exec pods/log pods/status</code> 等资源授权起效果<br />
<br />
原因: [[K8s-rbac关于子资源授权的一些记录]]<br />
<br />
===kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单)===<br />
<br />
=====通过custom-columns只输出pod所在租户,pod名字和pod uid=====<br />
kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'<br />
<br />
=====通过custom-columns只输出namespace名字和ns annotation中定义的node selector=====<br />
kubectl get namespaces -o custom-columns="NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector"<br />
<br />
===Get node info order by node ip address / 根据ip地址排序获取节点信息===<br />
kubectl get nodes -owide --sort-by status.addresses[0].address<br />
<br />
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===<br />
kubectl get pods -owide --sort-by .spec.nodeName<br />
<br />
kubectl get pods -owide --sort-by spec.nodeName<br />
===Get pod order by pod create time / 根据pod创建时间排序获取pod===<br />
kubectl get pods -n efk-system --sort-by status.startTime<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac<br />
<br />
<br />
===kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本)===<br />
<br />
====Deployments - image / 只获取deployment名字和image====<br />
<nowiki>kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.template.spec.containers}}{{.image}}{{" "}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
稍微格式化输出,输出deployment名字 + container名字 + 对应的image<br />
kubectl get deployments.apps -o go-template --template '<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{range .spec.template.spec.containers}}</nowiki><nowiki>{{.name}}</nowiki><nowiki>{{":"}}</nowiki><nowiki>{{.image}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
====Pods - image / 只获取pod名字和image====<br />
<nowiki>kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.containers}}{{.image}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type "InternalIP" }}{{.address}}{{end}}{{end}}{{end}}{{"\n"}}'</nowiki><br />
====Get node taints / 只获取节点名字和taints====<br />
<nowiki>kubectl get nodes -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
=====获取namespace名字和ns annotation中定义的node selector=====<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{.metadata.name}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector" -}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
稍微处理一下,格式化对齐输出<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{if index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{else}}</nowiki> <nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
===kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件===<br />
kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}<br />
<br />
===kubectl get event sort by lastTime / 根据事件最后触发时间进行排序===<br />
kubectl get event -n kube-system --sort-by=.lastTimestamp<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&diff=1491
Kubectl随记
2023-11-21T11:45:10Z
<p>Admin:</p>
<hr />
<div>=== kubectl set default editor ===<br />
export KUBE_EDITOR=/usr/bin/vim<br />
<br />
===kubectl completion bash not working 排障随记===<br />
需要已经安装 bash-completion <br />
<br />
如果提示 <code>_get_comp_words_by_ref: command not found</code> 错误的话,需要执行<br />
source /usr/share/bash-completion/bash_completion<br />
执行命令 <code>set</code> 看一下当前环境的相关配置有没有kube相关项<br />
set | grep -i kube<br />
没有的话需要执行<br />
source <(kubectl completion bash)<br />
<br />
正常的话,打开 kubectl debug<br />
__kubectl_debug() {<br />
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then<br />
echo "$*" >> "${BASH_COMP_DEBUG_FILE}"<br />
fi<br />
}<br />
<br />
export BASH_COMP_DEBUG_FILE=****<br />
根据debug file里面的记录去排查出错点<br />
<br />
=== use kubectl to get all api resource types ===<br />
kubectl api-resources -o name --cached --request-timeout=5s --verbs=get<br />
<br />
kubectl api-resources --api-group=networking.k8s.io<br />
<br />
==== get groupVersion when a resource exists in multiple api groups ====<br />
<br />
==== explain api-resource with sprcific api version ====<br />
kubectl api-resources --api-group=networking.k8s.io -v8 2>&1| grep ingress<br />
<br />
kubectl explain ingress --api-version="networking.k8s.io/v1beta1"<br />
<br />
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===<br />
kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d<br />
<br />
=== Check k8s account privilege / k8s 对象权限相关 ===<br />
kubectl options:<blockquote>--as=<nowiki>''</nowiki>: Username to impersonate for the operation<br />
<br />
--as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</blockquote>假设有名为registry-test的serviceAccount位于kube-system,这时候我们要测试他的RBAC权限,可以使用如下命令<br />
kubectl --as "system:serviceaccount:kube-system:registry-test" get serviceaccount<br />
<br />
Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]<br />
<br />
# Check to see if I can do everything in my current namespace ("*" means all)<br />
kubectl auth can-i '*' '*'<br />
<br />
[root@node-a ~]# kubectl --as "system:serviceaccount:kube-system:registry-test" auth can-i list pods<br />
yes<br />
PS: 在RBAC定义中(例如role / clusterrole)对 <code>resources</code> 的 <code>pods/*</code> 声明不会对诸如 <code>pods/exec pods/log pods/status</code> 等资源授权起效果<br />
<br />
原因: [[K8s-rbac关于子资源授权的一些记录]]<br />
<br />
=== kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单) ===<br />
<br />
===== 通过custom-columns只输出pod所在租户,pod名字和pod uid =====<br />
kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'<br />
<br />
===== 通过custom-columns只输出namespace名字和ns annotation中定义的node selector =====<br />
kubectl get namespaces -o custom-columns="NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector"<br />
<br />
=== Get node info order by node ip address / 根据ip地址排序获取节点信息 ===<br />
kubectl get nodes -owide --sort-by status.addresses[0].address<br />
<br />
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===<br />
kubectl get pods -owide --sort-by .spec.nodeName<br />
<br />
kubectl get pods -owide --sort-by spec.nodeName<br />
===Get pod order by pod create time / 根据pod创建时间排序获取pod===<br />
kubectl get pods -n efk-system --sort-by status.startTime<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac<br />
<br />
<br />
=== kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本) ===<br />
<br />
==== Deployments - image / 只获取deployment名字和image====<br />
<nowiki>kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.template.spec.containers}}{{.image}}{{" "}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
稍微格式化输出,输出deployment名字 + container名字 + 对应的image<br />
kubectl get deployments.apps -o go-template --template '<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{range .spec.template.spec.containers}}</nowiki><nowiki>{{.name}}</nowiki><nowiki>{{":"}}</nowiki><nowiki>{{.image}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
====Pods - image / 只获取pod名字和image====<br />
<nowiki>kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.containers}}{{.image}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type "InternalIP" }}{{.address}}{{end}}{{end}}{{end}}{{"\n"}}'</nowiki><br />
====Get node taints / 只获取节点名字和taints====<br />
<nowiki>kubectl get nodes -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
===== 获取namespace名字和ns annotation中定义的node selector =====<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{.metadata.name}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector" -}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
稍微处理一下,格式化对齐输出<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{if index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{else}}</nowiki> <nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
=== kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件 ===<br />
kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}<br />
<br />
=== kubectl get event sort by lastTime / 根据事件最后触发时间进行排序 ===<br />
kubectl get event -n kube-system --sort-by=.lastTimestamp<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&diff=1490
Kubectl随记
2023-11-21T11:43:57Z
<p>Admin:</p>
<hr />
<div>=== kubectl set default editor ===<br />
export KUBE_EDITOR=/usr/bin/vim<br />
<br />
===kubectl completion bash not working 排障随记===<br />
需要已经安装 bash-completion <br />
<br />
如果提示 <code>_get_comp_words_by_ref: command not found</code> 错误的话,需要执行<br />
source /usr/share/bash-completion/bash_completion<br />
执行命令 <code>set</code> 看一下当前环境的相关配置有没有kube相关项<br />
set | grep -i kube<br />
没有的话需要执行<br />
source <(kubectl completion bash)<br />
<br />
正常的话,打开 kubectl debug<br />
__kubectl_debug() {<br />
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then<br />
echo "$*" >> "${BASH_COMP_DEBUG_FILE}"<br />
fi<br />
}<br />
<br />
export BASH_COMP_DEBUG_FILE=****<br />
根据debug file里面的记录去排查出错点<br />
<br />
=== use kubectl to get all api resource types ===<br />
kubectl api-resources -o name --cached --request-timeout=5s --verbs=get<br />
<br />
kubectl api-resources --api-group=networking.k8s.io<br />
<br />
==== get groupVersion when a resource exists in multiple api groups ====<br />
<br />
==== explain api-resource with sprcific api version ====<br />
kubectl api-resources --api-group=networking.k8s.io -v8 2>&1| grep ingress<br />
<br />
kubectl explain ingress --api-version="networking.k8s.io/v1beta1"<br />
<br />
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===<br />
kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d<br />
<br />
=== Check k8s account privilege / k8s 对象权限相关 ===<br />
假设有名为registry-test的serviceAccount位于kube-system,这时候我们要测试他的RBAC权限,可以使用如下命令<br />
kubectl --as "system:serviceaccount:kube-system:registry-test" get serviceaccount<br />
<br />
Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]<br />
<br />
# Check to see if I can do everything in my current namespace ("*" means all)<br />
kubectl auth can-i '*' '*'<br />
<br />
[root@node-a ~]# kubectl --as "system:serviceaccount:kube-system:registry-test" auth can-i list pods<br />
yes<br />
PS: 在RBAC定义中(例如role / clusterrole)对 <code>resources</code> 的 <code>pods/*</code> 声明不会对诸如 <code>pods/exec pods/log pods/status</code> 等资源授权起效果<br />
<br />
原因: [[K8s-rbac关于子资源授权的一些记录]]<br />
<br />
=== kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单) ===<br />
<br />
===== 通过custom-columns只输出pod所在租户,pod名字和pod uid =====<br />
kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'<br />
<br />
===== 通过custom-columns只输出namespace名字和ns annotation中定义的node selector =====<br />
kubectl get namespaces -o custom-columns="NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector"<br />
<br />
=== Get node info order by node ip address / 根据ip地址排序获取节点信息 ===<br />
kubectl get nodes -owide --sort-by status.addresses[0].address<br />
<br />
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===<br />
kubectl get pods -owide --sort-by .spec.nodeName<br />
<br />
kubectl get pods -owide --sort-by spec.nodeName<br />
===Get pod order by pod create time / 根据pod创建时间排序获取pod===<br />
kubectl get pods -n efk-system --sort-by status.startTime<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat<br />
<br />
kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac<br />
<br />
<br />
=== kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本) ===<br />
<br />
==== Deployments - image / 只获取deployment名字和image====<br />
<nowiki>kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.template.spec.containers}}{{.image}}{{" "}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
稍微格式化输出,输出deployment名字 + container名字 + 对应的image<br />
kubectl get deployments.apps -o go-template --template '<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{range .spec.template.spec.containers}}</nowiki><nowiki>{{.name}}</nowiki><nowiki>{{":"}}</nowiki><nowiki>{{.image}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
====Pods - image / 只获取pod名字和image====<br />
<nowiki>kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{" -- "}}{{range .spec.containers}}{{.image}}{{end}}{{"\n"}}{{end}}'</nowiki><br />
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type "InternalIP" }}{{.address}}{{end}}{{end}}{{end}}{{"\n"}}'</nowiki><br />
====Get node taints / 只获取节点名字和taints====<br />
<nowiki>kubectl get nodes -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
<nowiki>kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{":\n"}}{{range .spec.taints}}{{.key}}{{"="}}{{.value}}{{":"}}{{.effect}}{{" "}}{{end}}{{"\n\n"}}{{end}}'</nowiki><br />
<br />
===== 获取namespace名字和ns annotation中定义的node selector =====<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{.metadata.name}}</nowiki><nowiki>{{" "}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector" -}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
稍微处理一下,格式化对齐输出<br />
kubectl get namespaces -o go-template='<nowiki>{{range .items}}</nowiki><nowiki>{{printf "%-30s " .metadata.name}}</nowiki><nowiki>{{if index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{index .metadata.annotations "scheduler.alpha.kubernetes.io/node-selector"}}</nowiki><nowiki>{{else}}</nowiki> <nowiki>{{end}}</nowiki><nowiki>{{"\n"}}</nowiki><nowiki>{{end}}</nowiki>'<br />
<br />
=== kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件 ===<br />
kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}<br />
<br />
=== kubectl get event sort by lastTime / 根据事件最后触发时间进行排序 ===<br />
kubectl get event -n kube-system --sort-by=.lastTimestamp<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s-rbac%E5%85%B3%E4%BA%8E%E5%AD%90%E8%B5%84%E6%BA%90%E6%8E%88%E6%9D%83%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%B0%E5%BD%95&diff=1489
K8s-rbac关于子资源授权的一些记录
2023-11-21T11:42:52Z
<p>Admin:</p>
<hr />
<div>在RBAC定义中(例如role / clusterrole)对 <code>resources</code> 的 <code>pods/*</code> 声明不会对诸如 <code>pods/exec pods/log pods/status</code> 等资源授权起效果<br />
<br />
原因: https://github.com/kubernetes/kubernetes/issues/78936#issuecomment-501455971<blockquote><code>services/*</code> does not grant permissions to service status updates.<br />
<br />
If you want to give unrestricted access to all resources, you can grant that with <code>*</code><br />
<br />
Unrestricted access to all current and future subresources is misleading to reason about. Different subresources are used for different purposes. Authorizing all subresources of a resource assumes that no new subresource will ever be added that grants access to far more powerful capabilities. Granting access to <code>pods/*</code> would allow what is currently a restricted user access to future subresources, even if those subresources far exceeded the capabilities of the current subresources.<br />
<br />
The format <code>*/scale</code> can be used to grant access to the subresource named <code>scale</code> on all resources, and is useful for things like autoscaling which needs access to a specific subresource.</blockquote>另外,目前kubectl (1.18) 无法通过kubectl 快捷获取所有子资源(subresources)<br />
<br />
只能通过脚本访问apiserver获取,例如<br />
_list=($(kubectl get --raw / |grep "^ \"/api"|sed 's/[",]//g')); <br />
for _api in ${_list[@]}; do<br />
_aruyo=$(kubectl get --raw ${_api} | jq .resources); <br />
if [ "x${_aruyo}" != "xnull" ]; then <br />
echo; <br />
echo "===${_api}==="; <br />
kubectl get --raw ${_api} | jq -r ".resources[].name"; <br />
fi; <br />
done<br />
脚本摘自 https://stackoverflow.com/questions/57872201/how-to-refer-to-all-subresources-in-a-role-definition<br />
<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&diff=1488
Etcd命令随记
2023-11-20T07:49:13Z
<p>Admin:</p>
<hr />
<div>=== 切换 ETCDCTL version ===<br />
<br />
==== with docker exec ====<br />
docker exec -e "ETCDCTL_API=2" etcd_container_name_or_id etcdctl --help<br />
<br />
==== env ====<br />
export ETCDCTL_API=2<br />
<br />
=== 排障相关 ===<br />
<br />
* 如果etcd是基于k8s manifest启动的,在指定endpoints只能通过环境变量指定,或者在bash环境下unset environment variable "ETCDCTL_ENDPOINTS" 然后再通过参数传入,不然会提示配置冲突<br />
<br />
2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable "ETCDCTL_ENDPOINTS" is shadowed by corresponding command-line flag (either unset environment variable or disable flag)<br />
<br />
==== etcdctl v3 api ====<br />
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md<br />
<br />
其中常见的包括<br />
export ETCDCTL_ENDPOINTS=<nowiki>https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379</nowiki><br />
export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt<br />
export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt<br />
export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key<br />
===== etcd member list (v3 API) =====<br />
* etcdctl member list<br />
<br />
[root@test kubelet]# docker exec -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379</nowiki>" `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | <nowiki>http://192.168.150.12:12380</nowiki> | <nowiki>https://192.168.150.12:12379</nowiki> | false |<br />
| d58cc05313738455 | started | dce-etcd-192.168.150.13 | <nowiki>http://192.168.150.13:12380</nowiki> | <nowiki>https://192.168.150.13:12379</nowiki> | false |<br />
| ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | <nowiki>http://192.168.150.14:12380</nowiki> | <nowiki>https://192.168.150.14:12379</nowiki> | false |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
<br />
===== etcd endpoint health (v3 API) =====<br />
*etcdctl endpoint health<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint health -w table<br />
<br />
+------------------------------+--------+--------------+-------+<br />
| ENDPOINT | HEALTH | TOOK | ERROR |<br />
+------------------------------+--------+--------------+-------+<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | true | 14.2308ms | |<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | true | 14.572283ms | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | true | 351.572429ms | |<br />
+------------------------------+--------+--------------+-------+<br />
<br />
===== etcd endpoint status (v3 API) =====<br />
<br />
* etcdctl endpoint status<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint status -w table<br />
<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | 5710b6824446f271 | 3.4.1 | 35 MB | false | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | 2a8509b66bfae6b6 | 3.4.1 | 35 MB | true | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | 72f4884011f8a2b | 3.4.1 | 35 MB | false | false | 52 | 7925760 | 7925760 | |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
<br />
==== etcd cluster-health (v2 API) ====<br />
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md<br />
<br />
etcdctl v2常用的环境变量<br />
ETCDCTL_ENDPOINT <br />
ETCDCTL_CA_FILE<br />
ETCDCTL_KEY_FILE<br />
ETCDCTL_CERT_FILE<br />
* etcdctl cluster-health<br />
<br />
docker exec -e "ETCDCTL_API=2" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl cluster-health<br />
member 72f4884011f8a2b is healthy: got healthy result from <nowiki>https://192.168.155.24:12379</nowiki><br />
member 2a8509b66bfae6b6 is healthy: got healthy result from <nowiki>https://192.168.155.23:12379</nowiki><br />
member 5710b6824446f271 is healthy: got healthy result from <nowiki>https://192.168.155.22:12379</nowiki><br />
cluster is healthy<br />
<br />
docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health<br />
<br />
=== 磁盘/网络性能要求相关 ===<br />
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]<blockquote>etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.<br />
<br />
</blockquote>[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]<blockquote>就延迟而言,应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说,当有一个 20ms 的延迟时,使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio。<br />
<br />
</blockquote>[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]<br />
<br />
<br />
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]<blockquote>IO延迟与Queue Depth(队列深度)/Queue Length (队列长度)<br />
<br />
IO延迟是指控制器将IO指令发出之后,直到IO完成的过程中总共花费的时间。早前业界不成文的规定为,只要IO延迟在20ms内,IO性能对于应用程序来说都是可以接受的,但是如果大于20ms,应用程序的性能将会受到较大影响。(JMF602的小文件随机写入IOPS是个位数,所以你们觉得卡)<br />
<br />
这样算下来,存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS,所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近(7200转),固态硬盘的话就比较夸张了,对于大型的存储设备,通过并行N个IO通道工作,达到几十万甚至几百万IOPS都不是问题。<br />
<br />
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候,IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘,即使延迟平均在0.1ms的话,每个IO通道的IOPS=1000/0.1=10000,但是这块固态硬盘被厂家标称35000的读取IOPS,这里就引出另一个概念:Queue Depth(队列深度,也可以叫队列长度)<br />
<br />
控制器向存储设备发起的指令,不是一条条发送的,而是一批批的发送,存储目标设备批量执行IO,然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强,在IO比较少的时候,处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数,由控制器上的Queue Depth(队列深度)决定。(一般好的固态硬盘主控,队列深度都支持到32了)<br />
<br />
如果给出队列深度,IOPS,IO延迟三者中的任意两者,则可以推算出第三者,公式:IOPS=(队列深度)/ (IO延迟)。实际上,随着队列深度的增加,IO延迟也在增加,二者是互相促进的关系,所以,随着IO数目的增多,将很快达到存储设备提供的最大IOPS处理能力,此时IO延迟将会陡峭升高,而IOPS则增加缓慢。(消化不良)</blockquote>[https://etcd.io/docs/v3.5/faq/#what-does-the-etcd-warning-failed-to-send-out-heartbeat-on-time-mean wal_fsync_duration_seconds 官方建议] <blockquote>Usually this issue is caused by a slow disk. Before the leader sends heartbeats attached with metadata, it may need to persist the metadata to disk. The disk could be experiencing contention among etcd and other applications, or the disk is too simply slow (e.g., a shared virtualized disk). To rule out a slow disk from causing this warning, monitor wal_fsync_duration_seconds (p99 duration should be less than 10ms) to confirm the disk is reasonably fast. If the disk is too slow, assigning a dedicated disk to etcd or using faster disk will typically solve the problem. To tell whether a disk is fast enough for etcd, a benchmarking tool such as fio can be used. Read here for an example.</blockquote><br />
[[分类:Linux]]<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&diff=1487
Etcd命令随记
2023-11-17T11:09:28Z
<p>Admin:</p>
<hr />
<div>=== 切换 ETCDCTL version ===<br />
<br />
==== with docker exec ====<br />
docker exec -e "ETCDCTL_API=2" etcd_container_name_or_id etcdctl --help<br />
<br />
==== env ====<br />
export ETCDCTL_API=2<br />
<br />
=== 排障相关 ===<br />
<br />
* 如果etcd是基于k8s manifest启动的,在指定endpoints只能通过环境变量指定,或者在bash环境下unset environment variable "ETCDCTL_ENDPOINTS" 然后再通过参数传入,不然会提示配置冲突<br />
<br />
2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable "ETCDCTL_ENDPOINTS" is shadowed by corresponding command-line flag (either unset environment variable or disable flag)<br />
<br />
==== etcdctl v3 api ====<br />
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md<br />
<br />
其中常见的包括<br />
export ETCDCTL_ENDPOINTS=<nowiki>https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379</nowiki><br />
export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt<br />
export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt<br />
export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key<br />
===== etcd member list (v3 API) =====<br />
* etcdctl member list<br />
<br />
[root@test kubelet]# docker exec -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379</nowiki>" `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | <nowiki>http://192.168.150.12:12380</nowiki> | <nowiki>https://192.168.150.12:12379</nowiki> | false |<br />
| d58cc05313738455 | started | dce-etcd-192.168.150.13 | <nowiki>http://192.168.150.13:12380</nowiki> | <nowiki>https://192.168.150.13:12379</nowiki> | false |<br />
| ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | <nowiki>http://192.168.150.14:12380</nowiki> | <nowiki>https://192.168.150.14:12379</nowiki> | false |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
<br />
===== etcd endpoint health (v3 API) =====<br />
*etcdctl endpoint health<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint health -w table<br />
<br />
+------------------------------+--------+--------------+-------+<br />
| ENDPOINT | HEALTH | TOOK | ERROR |<br />
+------------------------------+--------+--------------+-------+<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | true | 14.2308ms | |<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | true | 14.572283ms | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | true | 351.572429ms | |<br />
+------------------------------+--------+--------------+-------+<br />
<br />
===== etcd endpoint status (v3 API) =====<br />
<br />
* etcdctl endpoint status<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint status -w table<br />
<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | 5710b6824446f271 | 3.4.1 | 35 MB | false | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | 2a8509b66bfae6b6 | 3.4.1 | 35 MB | true | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | 72f4884011f8a2b | 3.4.1 | 35 MB | false | false | 52 | 7925760 | 7925760 | |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
<br />
==== etcd cluster-health (v2 API) ====<br />
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md<br />
<br />
etcdctl v2常用的环境变量<br />
ETCDCTL_ENDPOINT <br />
ETCDCTL_CA_FILE<br />
ETCDCTL_KEY_FILE<br />
ETCDCTL_CERT_FILE<br />
* etcdctl cluster-health<br />
<br />
docker exec -e "ETCDCTL_API=2" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl cluster-health<br />
member 72f4884011f8a2b is healthy: got healthy result from <nowiki>https://192.168.155.24:12379</nowiki><br />
member 2a8509b66bfae6b6 is healthy: got healthy result from <nowiki>https://192.168.155.23:12379</nowiki><br />
member 5710b6824446f271 is healthy: got healthy result from <nowiki>https://192.168.155.22:12379</nowiki><br />
cluster is healthy<br />
<br />
docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health<br />
<br />
=== 磁盘/网络性能要求相关 ===<br />
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]<blockquote>etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.<br />
<br />
</blockquote>[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]<blockquote>就延迟而言,应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说,当有一个 20ms 的延迟时,使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio。<br />
<br />
</blockquote>[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]<br />
<br />
<br />
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]<blockquote>IO延迟与Queue Depth(队列深度)/Queue Length (队列长度)<br />
<br />
IO延迟是指控制器将IO指令发出之后,直到IO完成的过程中总共花费的时间。早前业界不成文的规定为,只要IO延迟在20ms内,IO性能对于应用程序来说都是可以接受的,但是如果大于20ms,应用程序的性能将会受到较大影响。(JMF602的小文件随机写入IOPS是个位数,所以你们觉得卡)<br />
<br />
这样算下来,存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS,所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近(7200转),固态硬盘的话就比较夸张了,对于大型的存储设备,通过并行N个IO通道工作,达到几十万甚至几百万IOPS都不是问题。<br />
<br />
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候,IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘,即使延迟平均在0.1ms的话,每个IO通道的IOPS=1000/0.1=10000,但是这块固态硬盘被厂家标称35000的读取IOPS,这里就引出另一个概念:Queue Depth(队列深度,也可以叫队列长度)<br />
<br />
控制器向存储设备发起的指令,不是一条条发送的,而是一批批的发送,存储目标设备批量执行IO,然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强,在IO比较少的时候,处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数,由控制器上的Queue Depth(队列深度)决定。(一般好的固态硬盘主控,队列深度都支持到32了)<br />
<br />
如果给出队列深度,IOPS,IO延迟三者中的任意两者,则可以推算出第三者,公式:IOPS=(队列深度)/ (IO延迟)。实际上,随着队列深度的增加,IO延迟也在增加,二者是互相促进的关系,所以,随着IO数目的增多,将很快达到存储设备提供的最大IOPS处理能力,此时IO延迟将会陡峭升高,而IOPS则增加缓慢。(消化不良)</blockquote><br />
[[分类:Linux]]<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&diff=1486
Etcd命令随记
2023-11-17T11:08:51Z
<p>Admin:</p>
<hr />
<div>=== 切换 ETCDCTL version ===<br />
<br />
==== with docker exec ====<br />
docker exec -e "ETCDCTL_API=2" etcd_container_name_or_id etcdctl --help<br />
<br />
==== env ====<br />
export ETCDCTL_API=2<br />
<br />
=== 排障相关 ===<br />
<br />
* 如果etcd是基于k8s manifest启动的,在指定endpoints只能通过环境变量指定,或者在bash环境下unset environment variable "ETCDCTL_ENDPOINTS" 然后再通过参数传入,不然会提示配置冲突<br />
<br />
2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable "ETCDCTL_ENDPOINTS" is shadowed by corresponding command-line flag (either unset environment variable or disable flag)<br />
<br />
==== etcdctl v3 api ====<br />
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md<br />
<br />
其中常见的包括<br />
export ETCDCTL_ENDPOINTS=<nowiki>https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379</nowiki><br />
export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt<br />
export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt<br />
export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key<br />
===== etcd member list (v3 API) =====<br />
* etcdctl member list<br />
<br />
[root@test kubelet]# docker exec -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379</nowiki>" `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | <nowiki>http://192.168.150.12:12380</nowiki> | <nowiki>https://192.168.150.12:12379</nowiki> | false |<br />
| d58cc05313738455 | started | dce-etcd-192.168.150.13 | <nowiki>http://192.168.150.13:12380</nowiki> | <nowiki>https://192.168.150.13:12379</nowiki> | false |<br />
| ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | <nowiki>http://192.168.150.14:12380</nowiki> | <nowiki>https://192.168.150.14:12379</nowiki> | false |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
<br />
===== etcd endpoint health (v3 API) =====<br />
*etcdctl endpoint health<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint health -w table<br />
<br />
+------------------------------+--------+--------------+-------+<br />
| ENDPOINT | HEALTH | TOOK | ERROR |<br />
+------------------------------+--------+--------------+-------+<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | true | 14.2308ms | |<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | true | 14.572283ms | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | true | 351.572429ms | |<br />
+------------------------------+--------+--------------+-------+<br />
<br />
===== etcd endpoint status (v3 API) =====<br />
<br />
* etcdctl endpoint status<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint status -w table<br />
<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | 5710b6824446f271 | 3.4.1 | 35 MB | false | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | 2a8509b66bfae6b6 | 3.4.1 | 35 MB | true | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | 72f4884011f8a2b | 3.4.1 | 35 MB | false | false | 52 | 7925760 | 7925760 | |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
<br />
==== etcd cluster-health (v2 API) ====<br />
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md<br />
<br />
etcdctl v2常用的环境变量<br />
ETCDCTL_ENDPOINT <br />
ETCDCTL_CA_FILE<br />
ETCDCTL_KEY_FILE<br />
ETCDCTL_CERT_FILE<br />
* etcdctl cluster-health<br />
<br />
docker exec -e "ETCDCTL_API=2" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl cluster-health<br />
member 72f4884011f8a2b is healthy: got healthy result from <nowiki>https://192.168.155.24:12379</nowiki><br />
member 2a8509b66bfae6b6 is healthy: got healthy result from <nowiki>https://192.168.155.23:12379</nowiki><br />
member 5710b6824446f271 is healthy: got healthy result from <nowiki>https://192.168.155.22:12379</nowiki><br />
cluster is healthy<br />
<br />
docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health<br />
<br />
=== 磁盘/网络性能要求相关 ===<br />
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]<blockquote>etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.<br />
<br />
</blockquote>[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]<blockquote>就延迟而言,应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说,当有一个 20ms 的延迟时,使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio。<br />
<br />
</blockquote>[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]<br />
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]<blockquote>IO延迟与Queue Depth(队列深度)/Queue Length (队列长度)<br />
<br />
IO延迟是指控制器将IO指令发出之后,直到IO完成的过程中总共花费的时间。早前业界不成文的规定为,只要IO延迟在20ms内,IO性能对于应用程序来说都是可以接受的,但是如果大于20ms,应用程序的性能将会受到较大影响。(JMF602的小文件随机写入IOPS是个位数,所以你们觉得卡)<br />
<br />
这样算下来,存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS,所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近(7200转),固态硬盘的话就比较夸张了,对于大型的存储设备,通过并行N个IO通道工作,达到几十万甚至几百万IOPS都不是问题。<br />
<br />
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候,IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘,即使延迟平均在0.1ms的话,每个IO通道的IOPS=1000/0.1=10000,但是这块固态硬盘被厂家标称35000的读取IOPS,这里就引出另一个概念:Queue Depth(队列深度,也可以叫队列长度)<br />
<br />
控制器向存储设备发起的指令,不是一条条发送的,而是一批批的发送,存储目标设备批量执行IO,然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强,在IO比较少的时候,处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数,由控制器上的Queue Depth(队列深度)决定。(一般好的固态硬盘主控,队列深度都支持到32了)<br />
<br />
如果给出队列深度,IOPS,IO延迟三者中的任意两者,则可以推算出第三者,公式:IOPS=(队列深度)/ (IO延迟)。实际上,随着队列深度的增加,IO延迟也在增加,二者是互相促进的关系,所以,随着IO数目的增多,将很快达到存储设备提供的最大IOPS处理能力,此时IO延迟将会陡峭升高,而IOPS则增加缓慢。(消化不良)</blockquote><br />
[[分类:Linux]]<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&diff=1485
Etcd命令随记
2023-11-17T11:08:26Z
<p>Admin:</p>
<hr />
<div>=== 切换 ETCDCTL version ===<br />
<br />
==== with docker exec ====<br />
docker exec -e "ETCDCTL_API=2" etcd_container_name_or_id etcdctl --help<br />
<br />
==== env ====<br />
export ETCDCTL_API=2<br />
<br />
=== 排障相关 ===<br />
<br />
* 如果etcd是基于k8s manifest启动的,在指定endpoints只能通过环境变量指定,或者在bash环境下unset environment variable "ETCDCTL_ENDPOINTS" 然后再通过参数传入,不然会提示配置冲突<br />
<br />
2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable "ETCDCTL_ENDPOINTS" is shadowed by corresponding command-line flag (either unset environment variable or disable flag)<br />
<br />
==== etcdctl v3 api ====<br />
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md<br />
<br />
其中常见的包括<br />
export ETCDCTL_ENDPOINTS=<nowiki>https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379</nowiki><br />
export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt<br />
export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt<br />
export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key<br />
===== etcd member list (v3 API) =====<br />
* etcdctl member list<br />
<br />
[root@test kubelet]# docker exec -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379</nowiki>" `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
| 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | <nowiki>http://192.168.150.12:12380</nowiki> | <nowiki>https://192.168.150.12:12379</nowiki> | false |<br />
| d58cc05313738455 | started | dce-etcd-192.168.150.13 | <nowiki>http://192.168.150.13:12380</nowiki> | <nowiki>https://192.168.150.13:12379</nowiki> | false |<br />
| ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | <nowiki>http://192.168.150.14:12380</nowiki> | <nowiki>https://192.168.150.14:12379</nowiki> | false |<br />
+------------------+---------+-------------------------+-----------------------------+------------------------------+------------+<br />
<br />
===== etcd endpoint health (v3 API) =====<br />
*etcdctl endpoint health<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint health -w table<br />
<br />
+------------------------------+--------+--------------+-------+<br />
| ENDPOINT | HEALTH | TOOK | ERROR |<br />
+------------------------------+--------+--------------+-------+<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | true | 14.2308ms | |<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | true | 14.572283ms | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | true | 351.572429ms | |<br />
+------------------------------+--------+--------------+-------+<br />
<br />
===== etcd endpoint status (v3 API) =====<br />
<br />
* etcdctl endpoint status<br />
<br />
docker exec -e "ETCDCTL_API=3" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl endpoint status -w table<br />
<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
| <nowiki>https://192.168.155.22:12379</nowiki> | 5710b6824446f271 | 3.4.1 | 35 MB | false | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.23:12379</nowiki> | 2a8509b66bfae6b6 | 3.4.1 | 35 MB | true | false | 52 | 7925759 | 7925759 | |<br />
| <nowiki>https://192.168.155.24:12379</nowiki> | 72f4884011f8a2b | 3.4.1 | 35 MB | false | false | 52 | 7925760 | 7925760 | |<br />
+------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+<br />
<br />
==== etcd cluster-health (v2 API) ====<br />
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md<br />
<br />
etcdctl v2常用的环境变量<br />
ETCDCTL_ENDPOINT <br />
ETCDCTL_CA_FILE<br />
ETCDCTL_KEY_FILE<br />
ETCDCTL_CERT_FILE<br />
* etcdctl cluster-health<br />
<br />
docker exec -e "ETCDCTL_API=2" -e "ETCDCTL_ENDPOINTS=<nowiki>https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379</nowiki>" etcd_container_name_or_id etcdctl cluster-health<br />
member 72f4884011f8a2b is healthy: got healthy result from <nowiki>https://192.168.155.24:12379</nowiki><br />
member 2a8509b66bfae6b6 is healthy: got healthy result from <nowiki>https://192.168.155.23:12379</nowiki><br />
member 5710b6824446f271 is healthy: got healthy result from <nowiki>https://192.168.155.22:12379</nowiki><br />
cluster is healthy<br />
<br />
docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health<br />
<br />
=== 磁盘/网络性能要求相关 ===<br />
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]<blockquote>etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.<br />
<br />
</blockquote>[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]<blockquote>就延迟而言,应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说,当有一个 20ms 的延迟时,使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio。<br />
<br />
</blockquote>[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]<br />
<br />
<br />
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]<blockquote>IO延迟与Queue Depth(队列深度)/Queue Length (队列长度)<br />
<br />
IO延迟是指控制器将IO指令发出之后,直到IO完成的过程中总共花费的时间。早前业界不成文的规定为,只要IO延迟在20ms内,IO性能对于应用程序来说都是可以接受的,但是如果大于20ms,应用程序的性能将会受到较大影响。(JMF602的小文件随机写入IOPS是个位数,所以你们觉得卡)<br />
<br />
这样算下来,存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS,所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近(7200转),固态硬盘的话就比较夸张了,对于大型的存储设备,通过并行N个IO通道工作,达到几十万甚至几百万IOPS都不是问题。<br />
<br />
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候,IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘,即使延迟平均在0.1ms的话,每个IO通道的IOPS=1000/0.1=10000,但是这块固态硬盘被厂家标称35000的读取IOPS,这里就引出另一个概念:Queue Depth(队列深度,也可以叫队列长度)<br />
<br />
控制器向存储设备发起的指令,不是一条条发送的,而是一批批的发送,存储目标设备批量执行IO,然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强,在IO比较少的时候,处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数,由控制器上的Queue Depth(队列深度)决定。(一般好的固态硬盘主控,队列深度都支持到32了)<br />
<br />
如果给出队列深度,IOPS,IO延迟三者中的任意两者,则可以推算出第三者,公式:IOPS=(队列深度)/ (IO延迟)。实际上,随着队列深度的增加,IO延迟也在增加,二者是互相促进的关系,所以,随着IO数目的增多,将很快达到存储设备提供的最大IOPS处理能力,此时IO延迟将会陡峭升高,而IOPS则增加缓慢。(消化不良)</blockquote><br />
[[分类:Linux]]<br />
[[分类:K8s]]</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1484
Elasticsearch的一些api随记
2023-11-08T17:15:34Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions" : [<br />
{<br />
"add" : {<br />
"index" : "es-k8s-logs-000020", <br />
"alias" : "es-k8s-logs-alias", <br />
"is_write_index" : true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
get index's ilm status<br />
get /${index_name}/_ilm/explain<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&diff=1483
Elasticsearch的一些api随记
2023-11-08T17:14:36Z
<p>Admin:</p>
<hr />
<div>===Health===<br />
/_cat/health<br />
<br />
/_cluster/health<br />
<br />
===Indices health===<br />
按条件查看索引状态<br />
/_cat/indices?help<br />
/_cat/indices?health=red&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=yellow&v&s=store.size:desc,index<br />
<br />
/_cat/indices?health=green&v&s=store.size:desc,index<br />
<br />
===Nodes===<br />
/_cat/nodes?v<br />
查看es各节点磁盘空间占用、分片数目等<br />
/_cat/allocation?v<br />
<br />
===Get master node===<br />
/_cat/master?v<br />
<br />
===Cluster allocation explain related===<br />
用于定位分片状态以及分片为何故障<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
/_cluster/allocation/explain<br />
<br />
===Shards===<br />
粗略查看分片情况,特别是查看分片分布节点或大小/状态<br />
GET /_cat/shards<br />
<br />
GET /_cat/shards?index=index_name<br />
<br />
GET /_cat/shards?index=index_na*<br />
查看分片分配失败原因<br />
/_cat/shards/index_name-*?v&s=state,index&h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason<br />
<br />
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===<br />
为别名设置可写索引或数据流<br />
<br />
If the alias doesn’t exist, the <code>add</code> action creates it.<br />
POST /_aliases <br />
{<br />
"actions" : [<br />
{<br />
"add" : {<br />
"index" : "es-k8s-logs-000020", <br />
"alias" : "es-k8s-logs-alias", <br />
"is_write_index" : true <br />
}<br />
}<br />
]<br />
}<br />
<br />
===Thread pool related===<br />
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html<br />
/_cluster/settings?pretty&include_defaults=true | grep processors<br />
<br />
====Get maximum number of threads info====<br />
curl "127.1:9200/_cat/thread_pool?v&h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&pretty"<br />
<br />
=== templates ===<br />
/_cat/templates?v<br />
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.<br />
<br />
新版本中使用 <code>/_index_template</code> 取代<br />
GET/PUT /_template/${template_name}<br />
<br />
use template to change the replicas settings of all indexes<br />
PUT /_template/${template_name}<br />
{<br />
"order": 2147483647,<br />
"index_patterns": [<br />
"*"<br />
],<br />
"settings": {<br />
"index": {<br />
"number_of_replicas": "0"<br />
}<br />
}<br />
}<br />
<br />
=== ilm (index lifecycle policy) ===<br />
get /_ilm/policy<br />
<br />
get /_ilm/policy/${ilm_name}<br />
<br />
PUT /_ilm/policy/ilm-30d-delete<br />
{<br />
"policy": {<br />
"phases": {<br />
"delete": {<br />
"min_age": "30d",<br />
"actions": {<br />
"delete": {<br />
"delete_searchable_snapshot": true<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
get index ilm status<br />
get /${index_name}/_ilm/explain<br />
<br />
===Cluster settings===<br />
/_cluster/settings?include_defaults=true&pretty<br />
<br />
/_cluster/settings?include_defaults=true<br />
<br />
==== Wildcard expressions or all indices are not allowed ====<br />
<br />
===== 允许泛匹配删除索引 =====<br />
PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"action": {<br />
"destructive_requires_name": "false"<br />
}<br />
}<br />
}<br />
<br />
====primaries recovery settings ====<br />
=====控制索引恢复或者relocating的并发数=====<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 10,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_outgoing_recoveries": null,<br />
"node_concurrent_recoveries": 20<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"transient": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": null,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": null<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_initial_primaries_recoveries": 30,<br />
"node_concurrent_incoming_recoveries": null,<br />
"node_concurrent_recoveries": 10<br />
}<br />
}<br />
}<br />
}<br />
}<br />
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code>.<br />
# PUT /_cluster/settings<br />
{<br />
"persistent": {<br />
"cluster": {<br />
"routing": {<br />
"allocation": {<br />
"node_concurrent_recoveries": 8<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===<br />
加大此数值可以有效缩短es relocating index的耗时<br />
<br />
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to <code>40mb</code> unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.<br /><br />
<br />
===Index settings===<br />
<br />
====modify the number of replicas in bulk====<br />
批量/单个 设置索引副本数<br />
PUT /index_name*/_settings<br />
{<br />
"index": {<br />
"number_of_replicas": 1<br />
}<br />
}<br />
<br />
=== Search Documents ===<br />
<br />
==== match_all 搜索 ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match_all": {}<br />
},<br />
"size": 1<br />
}<br />
<br />
==== 单字段排序匹配搜索(match) ====<br />
GET /sw_segment-20230914/_search<br />
{<br />
"query": {<br />
"match": {<br />
"segment_id": "b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526"<br />
}<br />
},<br />
"sort": [<br />
{<br />
"start_time": {<br />
"order": "desc"<br />
}<br />
}<br />
],<br />
"size": 1<br />
}<br />
<br />
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===<br />
ECK operator下管理的Elasticsearch如果要修改<code>cluster.routing.allocation.exclude</code> 的参数配置,需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false',不然会配置一会就会被刷回原状<br />
<br />
<br />
===Other===<br />
<br />
====对于有大量索引的刚重启的es集群====<br />
(主分片在1w-2w)<br />
<br />
=====加快es集群恢复速度=====<br />
结合es节点资源监控图,观测节点cpu压力,以及cpu IO wait<br />
<br />
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to <code>4</code>) <br />
<br />
和 node_concurrent_recoveries <br />
<br />
(A shortcut to set both <code>cluster.routing.allocation.node_concurrent_incoming_recoveries</code> and <code>cluster.routing.allocation.node_concurrent_outgoing_recoveries</code> <br />
<br />
Defaults to <code>2</code>)数值<br />
<br />
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值<br />
<br />
<br />
减少集群从red状态到yellow状态的耗时:增加索引副本数量,增加node_initial_primaries_recoveries值<br />
<br />
<br />
减少集群从yellow状态到green状态的耗时:增加 node_concurrent_recoveries 值<br />
<br />
<br />
通过访问 <code>/_cluster/allocation/explain</code> 接口查到阻碍集群 to green(yellow)的原因<br />
<br />
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====<br />
调整缩小 jvm 配置值,尽量不超配(requests 和 limit尽量一致或提高requests值)<br />
<br />
=== Error ===<br />
<br />
==== 集群分片数达到maximum错误 ====<br />
集群分片数达到maximum错误会有如下log信息,但是集群的健康状态不会改变<br />
2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;<br />
解决:<br />
<br />
调整index ilm 策略或者调整集群的max_shards_per_node配置<br />
<br />
临时生效配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"transient": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
永久更改性配置:<br />
<nowiki>curl -H "content-type: application/json" -X PUT "127.0.0.1:9200/_cluster/settings" -d '{"persistent": {"cluster.max_shards_per_node": "5000"}}'</nowiki><br />
[[分类:Elasticsearch]]<br />
{{DEFAULTSORT:api随记}}</div>
Admin
https://wiki.sanxian.tech/index.php?title=K8s%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E5%9D%91%E6%88%96%E8%80%85bug%E7%AE%80%E8%A6%81%E8%AE%B0%E5%BD%95&diff=1482
K8s的一些小坑或者bug简要记录
2023-11-08T09:12:42Z
<p>Admin:</p>
<hr />
<div>__TOC__<br />
=== kubectl===<br />
<br />
==== kubectl rollout history====<br />
kubectl rollout history 在 v1.26之前,如果带上-o yaml或者-o json之类的-o 参数,输出的内容会是错误的版本内容<br />
<br />
相关Issue https://github.com/kubernetes/kubectl/issues/598#issuecomment-1230824762<br />
<br />
==== kubectl apply 在特定情况下可能有bug或者非预期行为====<br />
前提提要: kubectl apply 的工作涉及到了计算行为 [https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/#how-apply-calculates-differences-and-merges-changes How apply calculates differences and merges changes]<br />
<br />
例如如果在kubectl 1.18,kubectl apply操作hostAliases的时候可能是追加而不是替换 [[在使用kubectl_apply操作hostalias产生的非预期行为]]<br />
<br />
还有一个修改probe配置,apply会有异常的,这个基本也是跟apply计算实现有关(只出现在1.18,不是很记得怎么复现,有缘再补)<br />
<br />
kubernetes中apply命令执行的全过程源码解析:https://juejin.cn/post/6968106028642598949<br />
<br />
=== kubelet===<br />
<br />
==== kubelet 1.27前串行拉取容器镜像====<br />
https://kubernetes.io/docs/concepts/containers/images/#serial-and-parallel-image-pulls<br />
<br />
By default, kubelet pulls images serially. In other words, kubelet sends only one image pull request to the image service at a time. Other image pull requests have to wait until the one being processed is complete.<br />
<br />
kubernetes 节点上kubelet在1.27版本之前对于容器镜像是串行拉取的,串行值为1,这在拉公网镜像的时候会有可能导致其它容器镜像一直处在拉取状态,在1.27中改成了并行镜像拉取<br />
<br />
==== kubelet 不断刷大量的 'Path "/var/lib/kubelet/pods/${pod_ID}/volumes" does not exist' 日志报错 ====<br />
关联原因Issue里面介绍是runc cgroup GC异常<br />
<br />
issue:<br />
<br />
https://github.com/kubernetes/kubernetes/issues/112124<br />
<br />
底部有cgroup清理脚本,但是KUBE_POD_IDS的取值逻辑要根据实际环境调整,而且就算改完了,rmdir cgroup directory会提示Device or resource busy错误<br />
<br />
继续关联issue:<br />
<br />
https://github.com/kubernetes/kubernetes/issues/112151#issuecomment-1285261341<br />
<br />
issue解释诱因: 磁盘IO<br />
<br />
==== kubelet 刷 vol_data.json: no such file or directory 日志 ====<br />
报错日志样式: <br />
<br />
operationExecutor.UnmountVolume failed<br />
<br />
failed to open volume data file [/var/lib/kubelet/pods/${pod_id}/volumes/kubernetes.io~csi/${pvc_id}/vol_data.json]: open /var/lib/kubelet/pods/${pod_id}/volumes/kubernetes.io~csi/${pvc_id}/vol_data.json: no such file or directory<br />
<br />
Issue:<br />
<br />
https://github.com/kubernetes/kubernetes/issues/85280<br />
<br />
里面issue creator有提及: <blockquote>When there is something wrong to execute os.Remove(volPath), volume path is left on node. However, mount path and vol_data.json is deleted.</blockquote>这时候实践下来,可以手动umount,重启kubelet错误即可解除<br />
<br />
其他issue中有提及<nowiki/>https://github.com/kubernetes/kubernetes/issues/116847#issuecomment-1721540974<blockquote>Alright one last update. If anyone is running into problems like these, make sure your CSI driver implements <code>NodeUnpublish</code> correctly at very minimum and idempotent. This issue imo is almost entirely caused by problematic CSI driver implementations.</blockquote><br />
[[分类:K8s]]</div>
Admin