当前位置:   article > 正文

elasticsearch教程

elasticsearch教程

1. 单点部署(rpm):

  1. #提前关闭firewalld,否则无法组建集群
  2. #1. 下载ES rpm包
  3. ]# https://www.elastic.co/cn/downloads
  4. #2. 安装es
  5. ]# rpm -ivh elasticsearch-7.17.5-x86_64.rpm
  6. #3. 调整内核参数(太低的话es会启动报错)
  7. echo "vm.max_map_count=655360
  8. fs.file-max = 655350
  9. fs.nr_open = 655350" > /etc/sysctl.d/es.conf
  10. sysctl -f /etc/sysctl.d/es.conf
  11. ulimit -n 655350
  12. ulimit -u 655350
  13. echo "* soft nofile 655350
  14. * hard nofile 655350
  15. * soft nproc 655350
  16. * hard nproc 655350" > /etc/security/limits.d/es7.conf
  17. #4. 修改es的配置文件--------------------------------------------------
  18. ]# vim /etc/elasticsearch/elasticsearch.yml
  19. ...
  20. #ES服务监听对外暴露服务的地址
  21. network.host: 0.0.0.0
  22. # 指定ES集群的节点IP
  23. discovery.seed_hosts: ["10.0.0.101"]
  24. # 指定参与master选举的节点
  25. cluster.initial_master_nodes: ["10.0.0.101"]
  26. #----------------------------------------------------------------
  27. #5. 启动ES服务
  28. ]# systemctl enable --now elasticsearch
  29. #6. 验证节点是否正常工作
  30. ]# ss -taunlp|grep java
  31. tcp LISTEN 0 128 [::]:9200 [::]:* users:(("java",pid=4192,fd=302))
  32. tcp LISTEN 0 128 [::]:9300 [::]:* users:(("java",pid=4192,fd=287)) users:(("java",pid=2813,fd=287))
  33. #9200端口作用: 对ES集群外部提供http/https服务。可以理解为对客户端提供服务。
  34. #9300端口作用: 对ES集群内部进行数据通信传输端口。走的时候tcp协议。
  35. #7.客户端验证
  36. ]# curl 10.0.0.101:9200
  37. {
  38. "name" : "elk1",
  39. "cluster_name" : "elasticsearch",
  40. "cluster_uuid" : "V_9NnNDdSDOy-OcrZBTFFA",
  41. "version" : {
  42. "number" : "7.17.5",
  43. "build_flavor" : "default",
  44. "build_type" : "rpm",
  45. "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
  46. "build_date" : "2022-06-23T21:57:28.736740635Z",
  47. "build_snapshot" : false,
  48. "lucene_version" : "8.11.1",
  49. "minimum_wire_compatibility_version" : "6.8.0",
  50. "minimum_index_compatibility_version" : "6.0.0-beta1"
  51. },
  52. "tagline" : "You Know, for Search"
  53. }

2. 集群部署(rpm)

集群节点:10.0.0.101,10.0.0.102,10.0.0.103

  1. #提前关闭firewalld,否则无法组建集群
  2. #1. 所有节点下载ES软件包
  3. ]# https://www.elastic.co/cn/downloads
  4. #2. 所有节点安装es
  5. ]# rpm -ivh elasticsearch-7.17.5-x86_64.rpm
  6. #3. 调整内核参数(太低的话es会启动报错)
  7. echo "vm.max_map_count=655360
  8. fs.file-max = 655350
  9. fs.nr_open = 655350" > /etc/sysctl.d/es.conf
  10. sysctl -f /etc/sysctl.d/es.conf
  11. ulimit -n 655350
  12. ulimit -u 655350
  13. echo "* soft nofile 655350
  14. * hard nofile 655350
  15. * soft nproc 655350
  16. * hard nproc 655350" > /etc/security/limits.d/es7.conf
  17. #4. 101修改es的配置文件--------------------------------------------------
  18. ]# vim /etc/elasticsearch/elasticsearch.yml
  19. ...
  20. #集群名称
  21. cluster.name: ES-CLUSTER1
  22. #ES服务监听对外暴露服务的地址
  23. network.host: 0.0.0.0
  24. # 指定ES集群的节点IP
  25. discovery.seed_hosts: ["10.0.0.101","10.0.0.102","10.0.0.103"]
  26. # 指定参与master选举的节点
  27. cluster.initial_master_nodes: ["10.0.0.101","10.0.0.102","10.0.0.103"]
  28. #----------------------------------------------------------------
  29. #5. 在101上把配置文件拷贝到102103
  30. ]# scp /etc/elasticsearch/elasticsearch.yml root@10.0.0.102:/etc/elasticsearch/
  31. ]# scp /etc/elasticsearch/elasticsearch.yml root@10.0.0.103:/etc/elasticsearch/
  32. #6. 所有节点启动ES服务
  33. ]# systemctl enable --now elasticsearch
  34. #7. 三个节点,验证节点是否正常工作
  35. ]# ss -taunlp|grep java
  36. tcp LISTEN 0 128 [::]:9200 [::]:* users:(("java",pid=4192,fd=302))
  37. tcp LISTEN 0 128 [::]:9300 [::]:* users:(("java",pid=4192,fd=287)) users:(("java",pid=2813,fd=287))
  38. #9200端口作用: 对ES集群外部提供http/https服务。可以理解为对客户端提供服务。
  39. #9300端口作用: 对ES集群内部进行数据通信传输端口。走的时候tcp协议。
  40. #8.验证ES集群节点是否正常工作
  41. ]# curl 10.0.0.101:9200/_cat/nodes
  42. 10.0.0.103 9 79 0 0.06 0.13 0.14 cdfhilmrstw - elk3
  43. 10.0.0.101 15 79 0 0.01 0.15 0.18 cdfhilmrstw - elk1
  44. 10.0.0.102 11 80 2 0.02 0.16 0.18 cdfhilmrstw * elk2
  45. ]# curl 10.0.0.101:9200/_cat/nodes?v
  46. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  47. 10.0.0.103 9 79 0 0.03 0.12 0.14 cdfhilmrstw - elk3
  48. 10.0.0.101 16 79 0 0.16 0.17 0.18 cdfhilmrstw - elk1
  49. 10.0.0.102 11 80 0 0.01 0.15 0.18 cdfhilmrstw * elk2
  50. ]# curl 10.0.0.101:9200/_cluster/health?pretty
  51. {
  52. "cluster_name" : "tom-es",
  53. "status" : "green",
  54. "timed_out" : false,
  55. "number_of_nodes" : 3,
  56. "number_of_data_nodes" : 3,
  57. "active_primary_shards" : 3,
  58. "active_shards" : 6,
  59. "relocating_shards" : 0,
  60. "initializing_shards" : 0,
  61. "unassigned_shards" : 0,
  62. "delayed_unassigned_shards" : 0,
  63. "number_of_pending_tasks" : 0,
  64. "number_of_in_flight_fetch" : 0,
  65. "task_max_waiting_in_queue_millis" : 0,
  66. "active_shards_percent_as_number" : 100.0
  67. }
  68. #集群必须保证半数以上的节点存活,集群才能正常

3. 基于二进制部署ElasticSearch集群

集群节点:10.0.0.101,10.0.0.102,10.0.0.103

  1. 下载二进制压缩包
  2. #1. 10.0.0.101 下载ES二进制压缩包
  3. ]# https://www.elastic.co/cn/downloads
  4. 2.10.0.0.101解压缩
  5. mkdir -p /data/{tools,logs,data}/es
  6. tar -xvf elasticsearch-7.17.5-linux-x86_64.tar.gz -C /data/tools/es
  7. 3.编辑配置文件
  8. cp /data/tools/es/elasticsearch-7.17.5/config/elasticsearch.yml{,.back}
  9. cat > /data/tools/es/elasticsearch-7.17.5/config/elasticsearch.yml <<EOF
  10. cluster.name: ES-CLUTER2
  11. path.data: /data/data/es/
  12. path.logs: /data/logs/es/
  13. network.host: 0.0.0.0
  14. discovery.seed_hosts: ["10.0.0.101", "10.0.0.102","10.0.0.103"]
  15. cluster.initial_master_nodes: ["10.0.0.101", "10.0.0.102","10.0.0.103"]
  16. EOF
  17. 4.使用systemctl管理ES服务
  18. cat > /usr/lib/systemd/system/elasticsearch.service <<EOF
  19. [Unit]
  20. Description=es
  21. After=network.target
  22. [Service]
  23. Type=simple
  24. ExecStart=/data/tools/es/elasticsearch-7.17.5/bin/elasticsearch
  25. User=elastic
  26. LimitNOFILE=131070
  27. [Install]
  28. WantedBy=multi-user.target
  29. EOF
  30. 5.把相关目录传到102103
  31. scp -r /data/ root@10.0.0.102:/
  32. scp -r /data/ root@10.0.0.103:/
  33. scp /usr/lib/systemd/system/elasticsearch.service root@10.0.0.102:/usr/lib/systemd/system/elasticsearch.service
  34. scp /usr/lib/systemd/system/elasticsearch.service root@10.0.0.103:/usr/lib/systemd/system/elasticsearch.service
  35. 6.101,102,103
  36. #上创建es配置目录软连接
  37. ln -s /data/tools/es/elasticsearch-7.17.5/config/ /etc/elasticsearch
  38. #创建elastic用户
  39. useradd elastic
  40. #修改目录归属
  41. chown -R elastic.elastic /data/tools/es/ /data/logs/es/ /data/data/es/
  42. #加载服务
  43. systemctl daemon-reload
  44. 7.调整内核参数(太低的话es会启动报错)
  45. echo "vm.max_map_count=655360
  46. fs.file-max = 655350
  47. fs.nr_open = 655350" > /etc/sysctl.d/es.conf
  48. sysctl -f /etc/sysctl.d/es.conf
  49. ulimit -n 655350
  50. ulimit -u 655350
  51. echo "* soft nofile 655350
  52. * hard nofile 655350
  53. * soft nproc 655350
  54. * hard nproc 655350" > /etc/security/limits.d/es7.conf
  55. 8.#启动elasticsearch
  56. systemctl enable elasticsearch.service --now
  57. 9.检查集群状态
  58. ]# curl 10.0.0.101:9200/_cluster/health?pretty
  59. {
  60. "cluster_name" : "ES-CLUTER",
  61. "status" : "green",
  62. "timed_out" : false,
  63. "number_of_nodes" : 3,
  64. "number_of_data_nodes" : 3,
  65. "active_primary_shards" : 3,
  66. "active_shards" : 6,
  67. "relocating_shards" : 0,
  68. "initializing_shards" : 0,
  69. "unassigned_shards" : 0,
  70. "delayed_unassigned_shards" : 0,
  71. "number_of_pending_tasks" : 0,
  72. "number_of_in_flight_fetch" : 0,
  73. "task_max_waiting_in_queue_millis" : 0,
  74. "active_shards_percent_as_number" : 100.0
  75. }

4. 堆内存设置

背景说明:es堆内存默认设置为主机内存的一半,如果主机内存大于64G,则需要手动设置堆内存最大为32G

设置方式为:vim /etc/elasticsearch/jvm.options

-Xms32g

-Xmx32g

5. swapping是性能的坟墓

禁用swapping

  1. #临时禁用
  2. swapoff -a
  3. #永久禁用,需要注释掉 /etc/fstab中/dev/mapper/centos-swap开头的行

如果由于其他原因不能禁用的,可以进行如下操作

  1. echo "vm.swappiness = 1" >> /etc/sysctl.d/es.conf
  2. sysctl -f /etc/sysctl.d/es.conf

6. ES的常见术语:

  1. 索引(index): 用户写入ES集群的逻辑单元。
  2. 分片(shard): 一个索引最少一个分片。作用为将索引的数据分布式的存储在ES集群。
  3. 副本(replica): 一个分片可以有0个或多个副本。作用为同一个分片数据提供数据冗余。
  4. 文档(docment): 实际存储数据的媒介。这些文档存储在分片中。
  5. 主分片和副本分片的区别: 主分片可以用于读写操作(rw)。副本分片仅能用于读取操作(ro)。
  6. 集群的颜色:
  7. - green 表示所有的主分片和副本分片均正常工作。
  8. - yellow 表示有部分副本分片不正常工作。
  9. - red 表示有部分主分片不正常工作。

7. ES的API

安装postman,用于api测试

7.1. 索引管理API:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html
  2. -1. 查看索引
  3. (1)查看所有的索引
  4. curl -X GET 10.0.0.101:9200/_cat/indices
  5. --------------------------------------------------------------------------
  6. -2. 创建索引
  7. (1)创建默认索引,默认是一个分片和一个副本
  8. curl -XPUT 10.0.0.101:9200/tom1
  9. (2)创建指定的分片
  10. curl -XPUT 10.0.0.101:9200/tom2
  11. {
  12. "settings":{
  13. "number_of_shards": 3
  14. }
  15. }
  16. (3)创建指定的分片和副本
  17. curl -XPUT 10.0.0.101:9200/tom3
  18. {
  19. "settings":{
  20. "number_of_shards": 3,
  21. "number_of_replicas":2
  22. }
  23. }
  24. --------------------------------------------------------------------------
  25. -3. 修改索引
  26. (1)修改副本
  27. curl -XPUT 10.0.0.101:9200/tom3/_settings
  28. {
  29. "number_of_replicas": 1
  30. }
  31. (2)修改分片,不能修改,会报错
  32. curl -XPUT 10.0.0.101:9200/tom3/_settings
  33. {
  34. "number_of_shards": 10
  35. }
  36. --------------------------------------------------------------------------
  37. -4 删除索引
  38. (1)删除单个索引
  39. curl -XDELETE 10.0.0.101:9200/tom1
  40. (2)基于通配符删除多个索引
  41. curl -XDELETE 10.0.0.101:9200/tom*
  42. --------------------------------------------------------------------------
  43. -5 索引别名
  44. (1)添加索引别名
  45. curl -XPOST http://10.0.0.101:9200/_aliases
  46. {
  47. "actions": [
  48. {
  49. "add": {
  50. "index": "tom1",
  51. "alias": "2024"
  52. }
  53. },
  54. {
  55. "add": {
  56. "index": "tom1",
  57. "alias": "DBA"
  58. }
  59. },
  60. {
  61. "add": {
  62. "index": "tom2",
  63. "alias": "2024"
  64. }
  65. },
  66. {
  67. "add": {
  68. "index": "tom2",
  69. "alias": "DBA"
  70. }
  71. }
  72. ]
  73. }
  74. (2)查看索引别名
  75. curl -XGET http://10.0.0.101:9200/_aliases
  76. (3)修改索引别名
  77. curl -XPOST http://10.0.0.101:9200/_aliases
  78. {
  79. "actions": [
  80. {
  81. "remove": {
  82. "index": "tom2",
  83. "alias": "DBA"
  84. }
  85. },
  86. {
  87. "add": {
  88. "index": "tom2",
  89. "alias": "数据库"
  90. }
  91. }
  92. ]
  93. }
  94. (4)删除索引别名
  95. curl -XPOST http://10.0.0.101:9200/_aliases
  96. {
  97. "actions": [
  98. {
  99. "remove": {
  100. "index": "tom2",
  101. "alias": "数据库"
  102. }
  103. }
  104. ]
  105. }
  106. curl -XDELETE http://10.0.0.101:9200/tom1/_alias/DBA
  107. --------------------------------------------------------------------------
  108. -6 打开关闭索引
  109. (1)关闭索引:
  110. curl -XPOST 10.0.0.101:9200/tom3/_close
  111. (2)打开索引:
  112. curl -XPOST 10.0.0.101:9200/tom3/_open
  113. --------------------------------------------------------------------------
  114. -7 创建索引的规范:
  115. 1.索引名称不要以"."",""_"开头
  116. 2.索引名称不能出现大写,必须小写
  117. 3.生产环境中尽量避免使用通配符,尤其是删除操作

7.2. 文档管理API:

  1. - 文档的基础操作
  2. 1.创建文档
  3. 1.1 不指定文档ID
  4. POST 10.0.0.101:9200/student/_doc
  5. {
  6. "name": "tom",
  7. "hobby": ["唱K","泡妞","rap"]
  8. }
  9. 1.2 指定文档ID(ID相同,名字不同的,会覆盖)
  10. POST 10.0.0.101:9200/student/_doc/100
  11. {
  12. "name": "jack",
  13. "hobby": ["篮球","足球","乒乓球"]
  14. }
  15. ----------------------------------------------------------------
  16. 2.文档修改
  17. 2.1 全量更新
  18. POST 10.0.0.101:9200/student/_doc/100
  19. {
  20. "name": "jack"
  21. }
  22. 2.2 局部更新
  23. POST 10.0.0.101:9200/student/_doc/100/_update
  24. {
  25. "doc":{
  26. "age":20,
  27. "hobby":["抽烟","喝酒","烫头"]
  28. }
  29. }
  30. ----------------------------------------------------------------
  31. 3.文档的查看
  32. GET 10.0.0.101:9200/student/_search
  33. ----------------------------------------------------------------
  34. 4.删除文档
  35. DELTE 10.0.0.101:9200/student/_doc/100
  36. ----------------------------------------------------------------
  37. -5 文档的批量操作
  38. (1)批量创建
  39. POST 10.0.0.101:9200/_bulk
  40. { "create": { "_index": "elk"} }
  41. { "name": "tom","hobby":["bas","foot"] }
  42. { "create": { "_index": "elk" }
  43. { "name": "jack","hobby":["rap","ktv"] }
  44. (2)批量修改
  45. POST 10.0.0.101:9200/_bulk
  46. { "update" : {"_id" : "J9My45ABMF1IlwvY5XsY", "_index" : "elk"} }
  47. { "doc" : {"name" : "tom1"} }
  48. { "update" : {"_id" : "KNMy45ABMF1IlwvY5XsY", "_index" : "elk"} }
  49. { "doc" : {"name" : "jack1"} }
  50. (3)查询文档
  51. POST 10.0.0.101:9200/_mget
  52. {
  53. "docs": [
  54. {
  55. "_index": "elk",
  56. "_id": "J9My45ABMF1IlwvY5XsY"
  57. },
  58. {
  59. "_index": "elk",
  60. "_id": "KNMy45ABMF1IlwvY5XsY"
  61. }
  62. ]
  63. }
  64. (4)批量删除
  65. POST 10.0.0.101:9200/_bulk
  66. { "delete" : { "_index" : "elk", "_id" : "J9My45ABMF1IlwvY5XsY" } }
  67. { "delete" : { "_index" : "elk", "_id" : "KNMy45ABMF1IlwvY5XsY" } }

7.3. 使用mapping自定义数据类型

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
  2. 1. IP案例:
  3. (1)创建索引时指定映射关系
  4. PUT 10.0.0.101:9200/ip
  5. {
  6. "mappings": {
  7. "properties": {
  8. "ip_add": {
  9. "type": "ip"
  10. }
  11. }
  12. }
  13. }
  14. (2)查看索引的映射关系
  15. GET 10.0.0.101:9200/ip
  16. (3)创建测试数据
  17. POST 10.0.0.101:9200/_bulk
  18. { "create": { "_index": "ip"} }
  19. { "name": "tom","ip_add": "192.168.1.4" }
  20. { "create": { "_index": "ip"} }
  21. { "name": "jack","ip_add": "192.168.1.10" }
  22. { "create": { "_index": "ip"} }
  23. { "name": "lucy","ip_add": "10.168.1.10" }
  24. (4)查看数据
  25. GET 10.0.0.101:9200/ip/_search
  26. POST 10.0.0.101:9200/ip/_search
  27. {
  28. "query":{
  29. "match":{
  30. "ip_add": "192.168.0.0/16"
  31. }
  32. }
  33. }
  34. (5)删除数据
  35. DELETE 10.0.0.101:9200/ip/_doc/KtNV45ABMF1IlwvYAXsz
  36. -----------------------------------------------------------------------------
  37. 2. date案例:
  38. (1)创建索引时指定映射关系
  39. PUT http://10.0.0.101:9200/date
  40. {
  41. "mappings": {
  42. "properties": {
  43. "birthday": {
  44. "type": "date",
  45. "format": "yyyy-MM-dd"
  46. }
  47. }
  48. }
  49. }
  50. (2)查看索引的映射关系
  51. GET http://10.0.0.101:9200/date
  52. (3)创建测试数据
  53. POST 10.0.0.101:9200/_bulk
  54. { "create": { "_index": "date"} }
  55. { "name": "tom","birthday": "2002-10-01" }
  56. { "create": { "_index": "date"} }
  57. { "name": "jack","birthday": "1996-05-01" }
  58. (4)查看数据
  59. GET 10.0.0.101:9200/date/_search
  60. (5)删除数据
  61. DELETE 10.0.0.101:9200/date/_doc/KtNV45ABMF1IlwvYAXsz
  62. ---------------------------------------------------------------------------------
  63. -3 综合案例
  64. (1)创建索引
  65. PUT http://10.0.0.101:9200/elk1
  66. (2)查看索引信息
  67. GET http://10.0.0.101:9200/elk1
  68. (3)为已创建的索引修改数据类型
  69. PUT http://10.0.0.101:9200/elk1/_mapping
  70. {
  71. "properties": {
  72. "name": {
  73. "type": "text",
  74. "index": true
  75. },
  76. "gender": {
  77. "type": "keyword",
  78. "index": true
  79. },
  80. "province": {
  81. "type": "keyword",
  82. "index": true
  83. },
  84. "city": {
  85. "type": "keyword",
  86. "index": false
  87. },
  88. "email": {
  89. "type": "keyword"
  90. },
  91. "ip_addr": {
  92. "type": "ip"
  93. },
  94. "birthday": {
  95. "type": "date",
  96. "format": "yyyy-MM-dd"
  97. }
  98. }
  99. }
  100. (4)添加测试数据
  101. POST http://10.0.0.101:9200/_bulk
  102. { "create": { "_index": "elk1"}}
  103. { "name": "tom","gender":"男性的","telephone":"1111111111","province":"广西","city":"北海市","email":"tom@qq.com","ip_addr":"192.168.25.201","birthday":"1999-04-05"}
  104. { "create": { "_index": "elk1"}}
  105. { "name": "jack","gender":"女性的","telephone":"222222222","province":"河南","city":"濮阳市","email":"jack@qq.com","ip_addr":"192.168.15.31","birthday":"2003-09-05","hobby":["抽烟","喝酒","烫头","足疗"]}
  106. (5)查看数据-基于gender-匹配keyword类型
  107. GET http://10.0.0.101:9200/elk1/_search
  108. {
  109. "query":{
  110. "match":{
  111. "gender": "女"
  112. }
  113. }
  114. }
  115. (6)查看数据-基于name字段搜索-匹配text类型
  116. GET http://10.0.0.101:9200/elk1/_search
  117. {
  118. "query":{
  119. "match":{
  120. "name": "吴"
  121. }
  122. }
  123. }
  124. (7)查看数据-基于email字段搜索-匹配keyword类型
  125. GET http://10.0.0.101:9200/elk1/_search
  126. {
  127. "query":{
  128. "match":{
  129. "email": "jack@qq.com"
  130. }
  131. }
  132. }
  133. (8)查看数据-基于ip_addr字段搜索-匹配ip类型
  134. GET http://10.0.0.101:9200/elk1/_search
  135. {
  136. "query": {
  137. "match" : {
  138. "ip_addr": "192.168.15.0/24"
  139. }
  140. }
  141. }
  142. (9)查看数据-基于city字段搜索,无法完成,该字段无法被检索
  143. GET http://10.0.0.101:9200/elk1/_search
  144. {
  145. "query":{
  146. "match":{
  147. "city": "濮阳市"
  148. }
  149. }
  150. }

7.4. 分词器:

注意:所有ES节点都要安装

  1. 1.内置的标准分词器-分析英文
  2. GET http://10.0.0.101:9200/_analyze
  3. {
  4. "analyzer": "standard",
  5. "text": "My name is Jason Yin, and I'm 18 years old !"
  6. }
  7. 温馨提示:标准分词器模式使用空格和符号进行切割分词的。
  8. 2.内置的标准分词器-分析中文并不友好
  9. GET http://10.0.0.101:9200/_analyze
  10. {
  11. "analyzer": "standard",
  12. "text": "我爱北京天安门!"
  13. }
  14. 3.安装IK分词器
  15. 3.1 在线安装方式:
  16. ]# /data/tools/es/elasticsearch-7.17.5/bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.5
  17. 3.2 离线安装方式:
  18. #创建IK分词器目录
  19. mkdir /data/tools/es/elasticsearch-7.17.5/plugins/ik
  20. #下载安装包到ik目录
  21. https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.5.zip
  22. #解压软件包
  23. cd /data/tools/es/elasticsearch-7.17.5/plugins/ik
  24. unzip elasticsearch-analysis-ik-7.17.5.zip
  25. rm -f elasticsearch-analysis-ik-7.17.5.zip
  26. 4. 重启服务
  27. systemctl restart elasticsearch.service
  28. 5. 测试IK中文分词器
  29. 5.1 测试IK中文分词器-细粒度拆分
  30. GET http://10.0.0.101:9200/_analyze
  31. {
  32. "analyzer": "ik_max_word",
  33. "text": "我爱北京天安门!"
  34. }
  35. 5.2 测试IK中文分词器-粗粒度拆分
  36. GET http://10.0.0.101:9200/_analyze
  37. {
  38. "analyzer": "ik_smart",
  39. "text": "我爱北京天安门!"
  40. }
  41. ----------------------------------------------------------------
  42. 6. 自定义IK分词器的字典
  43. (1)进入到IK分词器的插件安装目录
  44. cd /data/tools/es/elasticsearch-7.17.5/plugins/ik/config
  45. (2)自定义字典
  46. cat > tom.dic <<'EOF'
  47. 德玛西亚
  48. 艾欧尼亚
  49. 亚索
  50. 上号
  51. 带你飞
  52. 6
  53. EOF
  54. (3)加载自定义字典
  55. vim IKAnalyzer.cfg.xml
  56. ...
  57. <entry key="ext_dict">tom.dic</entry>
  58. (4)重启ES集群
  59. systemctl restart elasticsearch.service
  60. (5)测试分词器
  61. GET http://10.0.0.101:9200/_analyze
  62. {
  63. "analyzer": "ik_smart",
  64. "text": "嗨,哥们! 上号,我德玛西亚和艾欧尼亚都有号! 我亚索贼6,肯定能带你飞!!!"
  65. }
  66. (6)使用分词器
  67. #创建索引mnapping
  68. POST 10.0.0.101:9200/tom4/
  69. {
  70. "mappings":{
  71. "properties": {
  72. "content": {
  73. "type": "text",
  74. "analyzer": "ik_max_word",
  75. "search_analyzer": "ik_smart"
  76. }
  77. }
  78. }
  79. }
  80. #创建文档
  81. POST 10.0.0.101:9200/_bulk
  82. { "create": { "_index": "tom4"} }
  83. { "content": "美国留给伊拉克的是个烂摊子吗" }
  84. { "create": { "_index": "tom4"} }
  85. { "content": "公安部:各地校车将享最高路权" }
  86. { "create": { "_index": "tom4"} }
  87. {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
  88. #查询文档
  89. GET 10.0.0.101:9200/tom4/_search
  90. {
  91. "query" : {
  92. "match" : {
  93. "content" : "中国"
  94. }
  95. }
  96. }

7.5. 索引模板

  1. 什么是索引模板: 索引可使用预定义的模板进行创建,这个模板称作Index templates。
  2. 模板设置包括设置和映射,通过模式匹配的方式使得多个索引重用一个模板。
  3. 1.查看索引模板
  4. (1)查看所有的索引模板
  5. GET http://10.0.0.103:9200/_template
  6. (2)查看单个索引模板
  7. GET http://10.0.0.103:9200/_template/.monitoring-es
  8. 2.创建/修改索引模板
  9. POST http://10.0.0.103:9200/_template/java
  10. {
  11. "aliases": {
  12. "DBA": {},
  13. "SRE": {},
  14. "K8S": {}
  15. },
  16. "index_patterns": [
  17. "java*"
  18. ],
  19. "settings": {
  20. "index": {
  21. "number_of_shards": 3,
  22. "number_of_replicas": 1
  23. }
  24. },
  25. "mappings": {
  26. "properties":{
  27. "ip_addr": {
  28. "type": "ip"
  29. },
  30. "access_time": {
  31. "type": "date"
  32. },
  33. "address": {
  34. "type" :"text"
  35. },
  36. "name": {
  37. "type": "keyword"
  38. }
  39. }
  40. }
  41. }
  42. 3.删除索引模板:
  43. DELETE http://10.0.0.103:9200/_template/java

7.6. DSL语句查询(运维开发或者DBA重点掌握)

什么是DSL:Elasticsearch 提供了基于JSON的完整 Query DSL(领域特定语言)来定义查询。

  1. 下面的请求url都为 POST 10.0.0.101:9200/shopping/_search
  2. 全文检索-match查询:
  3. (1)查询tom收集的数据
  4. {
  5. "query":{
  6. "match":{
  7. "auther":"tom"
  8. }
  9. }
  10. }
  11. 精确匹配-match_phrase查询
  12. (1)查询tom的数据
  13. {
  14. "query":{
  15. "match_phrase":{
  16. "auther":"tom"
  17. }
  18. }
  19. }
  20. 全量查询-match_all查询(查询所有结果)
  21. {
  22. "query": {
  23. "match_all": {}
  24. }
  25. }
  26. -----------------------------------------------------------------------------
  27. 分页查询
  28. (1)每页显示3条数据,查询第四页
  29. {
  30. "query":{
  31. "match_phrase":{
  32. "auther":"tom"
  33. }
  34. },
  35. "size": 3,
  36. "from":9
  37. }
  38. (2)查询第六组数据,每页显示7条数据,查询第9
  39. {
  40. "query":{
  41. "match":{
  42. "group":6
  43. }
  44. },
  45. "size":7,
  46. "from": 56
  47. }
  48. 相关参数说明:
  49. size:
  50. 指定每页显示多少条数据,默认值为10.
  51. from:
  52. 指定跳过数据偏移量的大小,默认值为0,即默认看第一页。
  53. 查询指定页码的from= "(页码 - 1) * 每页数据大小(size)"
  54. 温馨提示:
  55. 生产环境中,不建议深度分页,百度的页码数量控制在76页左右。
  56. --------------------------------------------------------------------------
  57. 使用"_source"查看的指定字段
  58. {
  59. "query":{
  60. "match_phrase":{
  61. "auther":"tom"
  62. }
  63. },
  64. "_source":["title","auther","price"]
  65. }
  66. ---------------------------------------------------------------------------
  67. 查询存在某个字段的文档-exists
  68. {
  69. "query": {
  70. "exists" : {
  71. "field": "hobby"
  72. }
  73. }
  74. }
  75. ---------------------------------------------------------------------------
  76. 语法高亮
  77. {
  78. "query": {
  79. "match_phrase": {
  80. "title": "孙子兵法"
  81. }
  82. },
  83. "highlight": {
  84. "pre_tags": [
  85. "<span style='color:red;'>"
  86. ],
  87. "post_tags": [
  88. "</span>"
  89. ],
  90. "fields": {
  91. "title": {}
  92. }
  93. }
  94. }
  95. 参数说明:
  96. highlight: 设置高亮
  97. fields: 指定对哪个字段进行语法高亮
  98. pre_tags: 自定义高亮的前缀标签
  99. post_tags: 自定义高亮的后缀标签
  100. ------------------------------------------------------------------------------
  101. 排序查询:
  102. 01-升序查询最便宜商品及价格
  103. {
  104. "query":{
  105. "match_phrase":{
  106. "auther":"tom"
  107. }
  108. },
  109. "sort":{
  110. "price":{
  111. "order": "asc"
  112. }
  113. },
  114. "size":1
  115. }
  116. 02-降序查询最贵的商品及价格
  117. {
  118. "query":{
  119. "match_phrase":{
  120. "auther":"tom"
  121. }
  122. },
  123. "sort":{
  124. "price":{
  125. "order": "desc"
  126. }
  127. },
  128. "size":1
  129. }
  130. 相关字段说明:
  131. sort: 基于指定的字段进行排序。此处为指定的是"price"
  132. order: 指定排序的规则,分为"asc"(升序)和"desc"(降序)。
  133. ----------------------------------------------------------------
  134. 多条件查询-bool
  135. 01-查看作者是tom且商品价格为24.90(bool,must)
  136. {
  137. "query": {
  138. "bool": {
  139. "must": [
  140. {
  141. "match_phrase": {
  142. "auther": "tom"
  143. }
  144. },
  145. {
  146. "match": {
  147. "price": 24.90
  148. }
  149. }
  150. ]
  151. }
  152. }
  153. }
  154. 02-查看作者是tom或者是jack的商品并降序排序(bool,should)
  155. {
  156. "query": {
  157. "bool": {
  158. "should": [
  159. {
  160. "match_phrase": {
  161. "auther": "tom"
  162. }
  163. },
  164. {
  165. "match_phrase": {
  166. "auther": "jack"
  167. }
  168. }
  169. ]
  170. }
  171. },
  172. "sort":{
  173. "price":{
  174. "order": "desc"
  175. }
  176. }
  177. }
  178. 03-查看作者是tom或者是jack且商品价格为168或者198
  179. {
  180. "query": {
  181. "bool": {
  182. "should": [
  183. {
  184. "match_phrase": {
  185. "auther": "于萌"
  186. }
  187. },
  188. {
  189. "match_phrase": {
  190. "auther": "高超"
  191. }
  192. },
  193. {
  194. "match": {
  195. "price": 168.00
  196. }
  197. },
  198. {
  199. "match": {
  200. "price": 198.00
  201. }
  202. }
  203. ],
  204. "minimum_should_match": "60%"
  205. }
  206. }
  207. }
  208. 04-查看作者不是tom或者是jack且商品价格为168或者198的商品
  209. {
  210. "query": {
  211. "bool": {
  212. "must_not": [
  213. {
  214. "match_phrase": {
  215. "auther": "tom"
  216. }
  217. },
  218. {
  219. "match_phrase": {
  220. "auther": "jack"
  221. }
  222. }
  223. ],
  224. "should": [
  225. {
  226. "match": {
  227. "price": 168.00
  228. }
  229. },
  230. {
  231. "match": {
  232. "price": 198.00
  233. }
  234. }
  235. ],
  236. "minimum_should_match": 1
  237. }
  238. }
  239. }
  240. 05-综合案例
  241. 零食商品,作者不是tom和jack的,价格168.00或者9.919.9的,
  242. 且只看title,price,auther,按照价格降序,标题高亮,
  243. {
  244. "query": {
  245. "bool": {
  246. "must": [
  247. {
  248. "match_phrase": {
  249. "title": "零食"
  250. }
  251. }
  252. ],
  253. "must_not": [
  254. {
  255. "match_phrase": {
  256. "auther": "tom"
  257. }
  258. },
  259. {
  260. "match_phrase": {
  261. "auther": "jack"
  262. }
  263. }
  264. ],
  265. "should": [
  266. {
  267. "match": {
  268. "price": 168.00
  269. }
  270. },
  271. {
  272. "match": {
  273. "price": 9.9
  274. }
  275. },
  276. {
  277. "match": {
  278. "price": 19.9
  279. }
  280. }
  281. ],
  282. "minimum_should_match": 1
  283. }
  284. },
  285. "highlight": {
  286. "pre_tags": [
  287. "<span style='color:red;'>"
  288. ],
  289. "post_tags": [
  290. "</span>"
  291. ],
  292. "fields": {
  293. "title": {}
  294. }
  295. },
  296. "_source": [
  297. "title",
  298. "price",
  299. "auther"
  300. ],
  301. "sort": {
  302. "price": {
  303. "order": "desc"
  304. }
  305. }
  306. }
  307. ---------------------------------------------------------------------------
  308. 过滤查询:
  309. 01-查询3组成员产品价格359910500的商品的最便宜的3
  310. {
  311. "query": {
  312. "bool": {
  313. "must": [
  314. {
  315. "match": {
  316. "group": 3
  317. }
  318. }
  319. ],
  320. "filter": {
  321. "range": {
  322. "price": {
  323. "gte": 3599,
  324. "lte": 10500
  325. }
  326. }
  327. }
  328. }
  329. },
  330. "sort": {
  331. "price": {
  332. "order": "asc"
  333. }
  334. },
  335. "size": 3
  336. }
  337. 02-查询2,4,63个组的最贵的3个产品且不包含酒的商品
  338. {
  339. "query":{
  340. "bool":{
  341. "must_not":[
  342. {
  343. "match":{
  344. "title": "酒"
  345. }
  346. }
  347. ],
  348. "should": [
  349. {
  350. "match":{
  351. "group":2
  352. }
  353. },
  354. {
  355. "match":{
  356. "group":4
  357. }
  358. },
  359. {
  360. "match":{
  361. "group":6
  362. }
  363. }
  364. ]
  365. }
  366. },
  367. "sort":{
  368. "price":{
  369. "order": "desc"
  370. }
  371. },
  372. "size":3
  373. }
  374. ----------------------------------------------------------------------------
  375. 精确匹配多个值-terms:
  376. 01-查询商品价格为9.919.8的商品
  377. {
  378. "query": {
  379. "terms": {
  380. "price": [
  381. 9.9,
  382. 19.9
  383. ]
  384. }
  385. }
  386. }
  387. ---------------------------------------------------------------------------
  388. 多词搜索:
  389. 01-多词搜索包含"小面包"关键字的所有商品
  390. {
  391. "query": {
  392. "bool": {
  393. "must": [
  394. {
  395. "match": {
  396. "title": {
  397. "query": "小面包",
  398. "operator": "and"
  399. }
  400. }
  401. }
  402. ]
  403. }
  404. },
  405. "highlight": {
  406. "pre_tags": [
  407. "<h1>"
  408. ],
  409. "post_tags": [
  410. "</h1>"
  411. ],
  412. "fields": {
  413. "title": {}
  414. }
  415. }
  416. }
  417. 参数说明:
  418. operator: 为and表示查询query中的词必须连续,为or表示query中的词可以分开,默认是or
  419. -------------------------------------------------------------------------------
  420. 聚合查询
  421. 01-统计每个组收集的商品数量
  422. {
  423. "aggs": {
  424. "group": {
  425. "terms":{
  426. "field": "group"
  427. }
  428. }
  429. },
  430. "size": 0
  431. }
  432. 02-统计2组最贵的商品
  433. {
  434. "query": {
  435. "match": {
  436. "group": 2
  437. }
  438. },
  439. "aggs": {
  440. "max_shopping": {
  441. "max": {
  442. "field": "price"
  443. }
  444. }
  445. },
  446. "sort":{
  447. "price":{
  448. "order":"desc"
  449. }
  450. },
  451. "size": 1
  452. }
  453. 03-统计3组最便宜的商品
  454. {
  455. "query": {
  456. "match": {
  457. "group": 3
  458. }
  459. },
  460. "aggs": {
  461. "min_shopping": {
  462. "min": {
  463. "field": "price"
  464. }
  465. }
  466. },
  467. "sort":{
  468. "price":{
  469. "order": "asc"
  470. }
  471. },
  472. "size": 1
  473. }
  474. 04-统计4组商品的平均价格
  475. {
  476. "query": {
  477. "match": {
  478. "group": 4
  479. }
  480. },
  481. "aggs": {
  482. "avg_shopping": {
  483. "avg": {
  484. "field": "price"
  485. }
  486. }
  487. },
  488. "size": 0
  489. }
  490. 05-统计买下5组所有商品要多少钱
  491. {
  492. "query": {
  493. "match": {
  494. "group":5
  495. }
  496. },
  497. "aggs": {
  498. "sum_shopping": {
  499. "sum": {
  500. "field": "price"
  501. }
  502. }
  503. },
  504. "size": 0
  505. }

7.7. 集群迁移实战

Reindex API | Elasticsearch Guide [8.14] | Elastic

7.7.1. 搭建2套ES集群

  1. [root@elk1 data]# curl 10.0.0.101:19200/_cat/nodes
  2. 10.0.0.103 66 96 1 0.19 0.42 0.30 cdfhilmrstw - elk3
  3. 10.0.0.101 66 96 3 0.41 0.45 0.41 cdfhilmrstw - elk1
  4. 10.0.0.102 54 96 1 0.14 0.44 0.36 cdfhilmrstw * elk2
  5. [root@elk1 data]# curl 10.0.0.101:9200/_cat/nodes
  6. 10.0.0.102 63 96 5 0.14 0.44 0.36 cdfhilmrstw - elk2
  7. 10.0.0.103 36 96 9 0.17 0.42 0.30 cdfhilmrstw * elk3
  8. 10.0.0.101 69 96 7 0.38 0.44 0.41 cdfhilmrstw - elk1

7.7.2. 同一个集群内部迁移数据

  1. POST http://10.0.0.101:9200/_reindex
  2. {
  3. "source": {
  4. "index": "student"
  5. },
  6. "dest": {
  7. "index": "student-new"
  8. }
  9. }

7.7.3. 不同集群迁移

  1. 9200的数据迁移到19200集群上
  2. 3.1 修改所有19200端口的配置文件
  3. vim /data/tools/es2/elasticsearch-7.17.5/config/elasticsearch.yml
  4. ...
  5. # 添加如下一行代码,表示添加远程主机的白名单,用于数据迁移信任的主机。
  6. reindex.remote.whitelist: "10.0.0.*:9200"
  7. 3.3 重启所有节点19200的ES服务
  8. systemctl restart elastic2.service
  9. 3.4 迁移数据
  10. POST http://10.0.0.101:19200/_reindex
  11. {
  12. "source": {
  13. "index": "student",
  14. "remote": {
  15. "host": "http://10.0.0.101:9200"
  16. }
  17. },
  18. "dest": {
  19. "index": "student"
  20. }
  21. }
  22. 3.5 验证数据
  23. GET 10.0.0.101:19200/student/_search
  24. 说明:reindex时,可以使用DSL语句来对源数据进行过滤

7.8. 集群常用的API

7.8.1. 集群健康状态API

  1. ]# curl 10.0.0.101:9200/_cluster/health?pretty
  2. {
  3. "cluster_name" : "ES-CLUTER",
  4. "status" : "green",
  5. "timed_out" : false,
  6. "number_of_nodes" : 3,
  7. "number_of_data_nodes" : 3,
  8. "active_primary_shards" : 28,
  9. "active_shards" : 56,
  10. "relocating_shards" : 0,
  11. "initializing_shards" : 0,
  12. "unassigned_shards" : 0,
  13. "delayed_unassigned_shards" : 0,
  14. "number_of_pending_tasks" : 0,
  15. "number_of_in_flight_fetch" : 0,
  16. "task_max_waiting_in_queue_millis" : 0,
  17. "active_shards_percent_as_number" : 100.0
  18. }
  19. 相关参数说明:
  20. cluster_name 集群的名称。
  21. status 集群的健康状态,基于其主分片和副本分片的状态。
  22. ES集群有以下三种状态:
  23. green 所有分片都已分配。
  24. yellow 所有主分片都已分配,但一个或多个副本分片未分配。
  25. 如果集群中的某个节点发生故障,则在修复该节点之前,某些数据可能不可用。
  26. red 一个或多个主分片未分配,因此某些数据不可用。
  27. 这可能会在集群启动期间短暂发生,因为分配了主分片。
  28. timed_out 是否在参数false指定的时间段内返回响应(默认情况下30秒)。
  29. number_of_nodes 集群内的节点数。
  30. number_of_data_nodes 作为专用数据节点的节点数。
  31. active_primary_shards 可用主分片的数量。
  32. active_shards 可用主分片和副本分片的总数。
  33. relocating_shards 正在重定位的分片数。
  34. initializing_shards 正在初始化的分片数。
  35. unassigned_shards 未分配的分片数。
  36. delayed_unassigned_shards 分配因超时设置而延迟的分片数。
  37. number_of_pending_tasks 尚未执行的集群级别更改的数量。
  38. number_of_in_flight_fetch 未完成的提取次数。
  39. task_max_waiting_in_queue_millis 自最早启动的任务等待执行以来的时间(以毫秒为单位)。
  40. active_shards_percent_as_number 集群中活动分片的比率,以百分比表示。
  41. #要想获取某项的值,可以通过jq命令(yum -y install jq)
  42. ]# curl 10.0.0.101:9200/_cluster/health?pretty 2>/dev/null|jq .status
  43. "green"

7.8.2. ES集群的设置及优先级(settings)

  1. 如果您使用多种方法配置相同的设置,Elasticsearch 会按以下优先顺序应用这些设置:
  2. (1)Transient setting(临时配置,集群重启后失效)
  3. (2)Persistent setting(持久化配置,集群重启后依旧生效)
  4. (3)elasticsearch.yml setting(配置文件)
  5. (4)Default setting value(默认设置值)
  6. (1)查询集群的所有配置信息
  7. GET http://10.0.0.103:9200/_cluster/settings?include_defaults=true&flat_settings=true
  8. (2)修改集群的配置信息
  9. PUT http://10.0.0.103:9200/_cluster/settings
  10. {
  11. "transient": {
  12. "cluster.routing.allocation.enable": "none"
  13. }
  14. }
  15. 相关参数说明:
  16. "cluster.routing.allocation.enable":
  17. "all": 允许所有分片类型进行分配。
  18. "primaries" 仅允许分配主分片。
  19. "new_primaries" 仅允许新创建索引分配主分片。
  20. "none": 不允许分配任何类型的分配。
  21. 参考链接:
  22. https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-get-settings.html
  23. https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-update-settings.html

7.8.3. 集群状态API

  1. 集群状态是一种内部数据结构,它跟踪每个节点所需的各种信息,包括:
  2. (1)集群中其他节点的身份和属性
  3. (2)集群范围的设置
  4. (3)索引元数据,包括每个索引的映射和设置
  5. (4)集群中每个分片副本的位置和状态
  6. (1)查看集群的状态信息
  7. GET http://10.0.0.103:9200/_cluster/state
  8. (2)只查看节点信息。
  9. GET http://10.0.0.103:9200/_cluster/state/nodes
  10. (3)查看nodes,version,routing_table这些信息,并且查看以"oldboyedu*"开头的所有索引
  11. http://10.0.0.103:9200/_cluster/state/nodes,version,routing_table/oldboyedu*
  12. 推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-state.html

7.8.4. 集群统计API

  1. Cluster Stats API 允许从集群范围的角度检索统计信息。
  2. 返回基本索引指标(分片数量、存储大小、内存使用情况)和
  3. 有关构成集群的当前节点的信息(数量、角色、操作系统、jvm 版本、内存使用情况、cpu 和已安装的插件)。
  4. (1)查看统计信息
  5. GET http://10.0.0.103:9200/_cluster/stats
  6. 推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-stats.html

7.8.5. 查看集群的分片分配情况(allocation)

  1. 集群分配解释API的目的是为集群中的分片分配提供解释。
  2. 对于未分配的分片,解释 API 提供了有关未分配分片的原因的解释。
  3. 对于分配的分片,解释 API 解释了为什么分片保留在其当前节点上并且没有移动或重新平衡到另一个节点。
  4. 当您尝试诊断分片未分配的原因或分片继续保留在其当前节点上的原因时,
  5. 此 API 可能非常有用,而您可能会对此有所期待。
  6. (1)分析teacher索引的0号分片未分配的原因。
  7. GET http://10.0.0.101:9200/_cluster/allocation/explain
  8. {
  9. "index": "teacher",
  10. "shard": 0,
  11. "primary": true
  12. }
  13. 推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-allocation-explain.html

7.8.6. 集群分片重路由API(reroute)

  1. reroute 命令允许手动更改集群中各个分片的分配。
  2. 例如,可以将分片从一个节点显式移动到另一个节点,可以取消分配,
  3. 并且可以将未分配的分片显式分配给特定节点。
  4. (1)将"student"索引的0号分片从elk102节点移动到elk101节点。
  5. POST http://10.0.0.101:9200/_cluster/reroute
  6. {
  7. "commands": [
  8. {
  9. "move": {
  10. "index": "student",
  11. "shard": 0,
  12. "from_node": "elk102",
  13. "to_node": "elk101"
  14. }
  15. }
  16. ]
  17. }
  18. (2)取消当前已在某个节点上的副本分片,其副本会重新初始化分配。
  19. POST http://10.0.0.101:9200/_cluster/reroute
  20. {
  21. "commands": [
  22. {
  23. "cancel": {
  24. "index": "student",
  25. "shard": 0,
  26. "node": "elk103"
  27. }
  28. }
  29. ]
  30. }
  31. 推荐阅读:
  32. https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-reroute.html

8. ES文档写入和读取流程

8.1. ES文档写入流程

  1. ES文档写入流程
  2. 第一步:客户端写请求给协调节点(ES的所有节点都是协调节点)
  3. 第二步:协调节点会把写请求转发给master节点
  4. 第三步:master通过分片路由计算,得出数据节点,然后就把数据写到数据节点上。
  5. 第四步:副本分片同步主分片的数据,写入成功的依据是 (主分片+副本分片)/2+1的分片数写入成功了,就算成功
  6. 第五步:数据写入成功后,通知master数据写入成功
  7. 第六步:master通知协调节点数据写入成功
  8. 第七步:协调节点通知客户端数据写入成功

8.2. ES文档读取流程(单文档)

  1. ES文档读取流程(单个文档):
  2. 第一步:客户端发送请求到协调节点。
  3. 第二步:节点通过分片路由计算,将请求路由到包含数据的主分片或者副本分片上
  4. 第三步:目标节点上的分片执行读取操作,并将数据返回给原节点。
  5. 第四步:原节点将数据返回给客户端。

8.3. ES文档读取流程(全)

  1. ES文档读取流程(全量查询):
  2. 第一步:客户端发送请求到协调节点。
  3. 第二步:搜索阶段(query):协调节点从各个分片上查询到的查询到的文档id,保存到一个队列
  4. 第三步:取回阶段(fetch):协调节点对返回的数据进行全局排序,根据id取出数据
  5. 第四步:协调节点将数据返回给客户端。

9. ES集群TSL认证设置

在Elasticsearch中,TLS(传输层安全性)是一种加密数据传输的方法,可以提高集群的安全性。

  1. 配置ES集群TSL认证:
  2. (1)elk101节点生成证书文件
  3. cd /data/tools/es/elasticsearch-7.17.5
  4. ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 36500
  5. (2)elk101节点同步证书文件到其他节点
  6. scp config/elastic-certificates.p12 root@10.0.0.102:/data/tools/es/elasticsearch-7.17.5/config/
  7. scp config/elastic-certificates.p12 root@10.0.0.103:/data/tools/es/elasticsearch-7.17.5/config/
  8. (3)所有节点为证书文件修改属主和属组
  9. chown -R elastic.elastic /data/tools/es/elasticsearch-7.17.5/config/elastic-certificates.p12
  10. (4)elk101节点修改ES集群的配置文件
  11. vim /oldboyedu/softwares/es7/elasticsearch-7.17.5/config/elasticsearch.yml
  12. ...
  13. cluster.name: oldboyedu-linux85-binary
  14. path.data: /oldboyedu/data/es7
  15. path.logs: /oldboyedu/logs/es7
  16. network.host: 0.0.0.0
  17. discovery.seed_hosts: ["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
  18. cluster.initial_master_nodes: ["elk103.oldboyedu.com"]
  19. reindex.remote.whitelist: "10.0.0.*:19200"
  20. node.data: true
  21. node.master: true
  22. # 在最后一行添加以下内容
  23. xpack.security.enabled: true
  24. xpack.security.transport.ssl.enabled: true
  25. xpack.security.transport.ssl.verification_mode: certificate
  26. xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
  27. xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
  28. (5)elk101节点同步ES配置文件到其他节点
  29. scp config/elasticsearch.yml root@10.0.0.102:/data/tools/es/elasticsearch-7.17.5/config/
  30. scp config/elasticsearch.yml root@10.0.0.103:/data/tools/es/elasticsearch-7.17.5/config/
  31. (6)所有节点重启ES集群
  32. systemctl restart es7
  33. (7)生成随机密码
  34. [root@elk1 elasticsearch-7.17.5]# ./bin/elasticsearch-setup-passwords auto
  35. Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
  36. The passwords will be randomly generated and printed to the console.
  37. Please confirm that you would like to continue [y/N]y
  38. Changed password for user apm_system
  39. PASSWORD apm_system = g1gZM89D5TRR5Ug5b0jf
  40. Changed password for user kibana_system
  41. PASSWORD kibana_system = 27uCGSOYM3iPC3CKLM3F
  42. Changed password for user kibana
  43. PASSWORD kibana = 27uCGSOYM3iPC3CKLM3F
  44. Changed password for user logstash_system
  45. PASSWORD logstash_system = cm7vkBpUETCNvspA5RSK
  46. Changed password for user beats_system
  47. PASSWORD beats_system = BnOxVmGyslw8K9kh4HG8
  48. Changed password for user remote_monitoring_user
  49. PASSWORD remote_monitoring_user = GalMty6IrqPn9xV3a2hD
  50. Changed password for user elastic
  51. PASSWORD elastic = JEVB5iv4SV4m2uerl8yN
  52. 8)测试用户名密码:
  53. [root@elk1]# curl -u elastic:JEVB5iv4SV4m2uerl8yN 10.0.0.101:9200/_cat/nodes
  54. 10.0.0.101 72 77 1 0.08 0.11 0.13 cdfhilmrstw - elk1
  55. 10.0.0.103 76 74 0 0.02 0.12 0.12 cdfhilmrstw - elk3
  56. 10.0.0.102 66 82 2 0.03 0.19 0.17 cdfhilmrstw * elk2

10. 使用kibana实现基于角色的权限控制

10.1. 给filebeat和logstash创建相对应的权限账户

给filebeat和logstash设置专门权限的用户写数据,不要用超级用户,否则有可能发生权限的泄露

10.1.1. 图形界面方式-创建filebeat和logstash的角色账户

10.1.2. 图形界面方式-创建filebeat账户,logstash账户

10.1.3. api接口方式-创建filebeat账户,logstash角色及用户

  1. # 创建Filebeat角色,并授予相应的索引权限
  2. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/role/filebeat-logstash-roles" -H "Content-Type: application/json" -d'
  3. {
  4. "cluster" : ["manage_index_templates", "monitor"],
  5. "indices" : [ { "names" : [ "*" ], "privileges" : [ "write", "create" ] } ]
  6. }'
  7. # 创建Filebeat用户
  8. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/user/filebeat-user" -H "Content-Type: application/json" -d'
  9. {
  10. "password" : "123456",
  11. "roles" : [ "filebeat-logstash-roles" ],
  12. "full_name" : "Filebeat User"
  13. }'
  14. # 创建logstash用户
  15. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/user/logstash-user" -H "Content-Type: application/json" -d'
  16. {
  17. "password" : "123456",
  18. "roles" : [ "filebeat-logstash-roles" ],
  19. "full_name" : "logstash User"
  20. }'
  21. #查看角色
  22. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/role/filebeat-logstash-roles?pretty"
  23. #查看用户
  24. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/user/filebeat-user?pretty"

10.2. 创建区分开发和运维的账户

10.2.1. 图形界面方式-创建dev角色

10.2.2. 图形界面方式-创建dev用户

10.2.3. api接口方式-创建dev角色及用户

  1. # 创建dev角色
  2. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/role/dev-roles" -H "Content-Type: application/json" -d'
  3. {
  4. "indices" : [ { "names" : [ "*" ], "privileges" : [ "read" ] } ],
  5. "applications" : [
  6. {
  7. "application" : "kibana-.kibana",
  8. "privileges" : [
  9. "feature_discover.all",
  10. "feature_dashboard.all",
  11. "feature_dev_tools.all"
  12. ],
  13. "resources" : [
  14. "*"
  15. ]
  16. }
  17. ]
  18. }'
  19. # 创建dev用户
  20. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/user/dev-jack" -H "Content-Type: application/json" -d'
  21. {
  22. "password" : "123456",
  23. "roles" : [ "dev-roles" ],
  24. "full_name" : "dev-jack"
  25. }'
  26. #查看角色
  27. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/role/dev-roles?pretty"
  28. #查看用户
  29. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/user/dev-jack?pretty"

10.2.4. 图形界面方式-创建运维权限角色

10.2.5. api接口方式-创建运维角色及用户

  1. # 创建ops角色
  2. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/role/ops-roles" -H "Content-Type: application/json" -d'
  3. {
  4. "cluster" : [ "all" ],
  5. "indices" : [ { "names" : [ "*" ], "privileges" : [ "all" ] } ],
  6. "applications" : [
  7. {
  8. "application" : "kibana-.kibana",
  9. "privileges" : [ "all" ],
  10. "resources" : [ "*" ]
  11. }
  12. ]
  13. }'
  14. # 创建ops用户
  15. curl -u elastic:123456 -XPOST "10.0.0.101:9200/_security/user/ops-jimy" -H "Content-Type: application/json" -d'
  16. {
  17. "password" : "123456",
  18. "roles" : [ "ops-roles" ],
  19. "full_name" : "ops-jimy"
  20. }'
  21. #查看角色
  22. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/role/ops-roles?pretty"
  23. #查看用户
  24. ]# curl -u elastic:123456 -XGET "10.0.0.101:9200/_security/user/ops-jimy?pretty"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/940418
推荐阅读
相关标签
  

闽ICP备14008679号