elasticsearch 部署手册

下载

  1. wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz
  2. tar -zxvf elasticsearch-6.6.2.tar.gz

安装

  • Java1.8.0_131 或更高版本, 仅支持Oracle的Java和OpenJDK

配置

1. ES 重要配置

  • conf/elasticsearch.yml ES 集群配置
  1. # ---------------------------------- Cluster -----------------------------------
  2. # 集群名称
  3. cluster.name: data-center
  4. # ------------------------------------ Node ------------------------------------
  5. # 节点名称
  6. ## 默认情况下,Elasticsearch 将使用随机生成的 UUID 的前七个字符作为节点id。请注意,节点 id 是持久化的,在节点重启时不会更改,因此默认的节点名称也不会更改。
  7. # node.name: node-1
  8. # 使用主机名
  9. node.name: ${HOSTNAME}
  10. # ----------------------------------- Paths ------------------------------------
  11. # 路径配置
  12. ## 指定路径
  13. path:
  14. logs: /opt/logs/elasticsearch
  15. data: /opt/data/elasticsearch
  16. ## 多路径
  17. path:
  18. data:
  19. - /mnt/elasticsearch_1
  20. - /mnt/elasticsearch_2
  21. - /mnt/elasticsearch_3
  22. # ----------------------------------- Memory -----------------------------------
  23. # 锁住内存,不使用 swap
  24. bootstrap.memory_lock: true
  25. # ---------------------------------- Network -----------------------------------
  26. # 网络设置, 绑定到哪个网络接口以便侦听传入请求,
  27. ## 默认情况下,Elasticsearch 仅绑定到环回地址 - 例如 127.0.0.1 和[::1]。这是在服务器上运行单个开发节点。
  28. #network.host ${HOSTNAME}
  29. ## 将绑定地址设置为特定的IP (IPv4或IPv6), 如果自定义设置了 network.host 的 Ip, Elasticsearch 就会假定从开发模式转移到生产模式
  30. network.host 192.168.1.10
  31. ["127.0.0.1", "[::1]"].
  32. _[networkInterface]_ 例如,网络接口的地址 _en0_
  33. _local_ 例如,系统上的任何环回地址127.0.0.1
  34. _site_ 例如,系统上的任何站点本地地址192.168.0.1
  35. _global_ 例如,系统上的任何全局范围的地址8.8.8.8
  36. # network.host 同时设置 bind_host 和 publish_host 两个参数
  37. ## network.bind_host
  38. ## network.publish_host
  39. http.host: 0.0.0.0
  40. # 外服务的 http端口,默认为9200
  41. http.port: 9200
  42. # 进行节点之间的通信 tcp 端口
  43. transport.tcp.port:
  44. # --------------------------------- Discovery ----------------------------------
  45. # 发现设置, Elasticsearch使用名为“Zen Discovery”的自定义发现实现进行节点到节点的群集和主选举。在投入生产之前,应该配置两个重要的发现设置。
  46. ## 第一种配置格式
  47. discovery.zen.ping.unicast.hosts:
  48. - 192.168.1.10:9300
  49. - 192.168.1.11
  50. - seeds.mydomain.com
  51. ## 第二种配置格式
  52. discovery.zen.ping.unicast.hosts: ["host1", "host2"]
  • conf/jvm.options 配置 Elasticsearch JVM 设置
  1. # JVM 内存设置, Xmx 为不超过物理 RAM 的 50%, 以确保有足够的物理RAM用于内核文件系统缓存。
  2. ## 表示总堆空间的初始大小
  3. -Xms8g
  4. ## 表示总堆空间的最大大小
  5. -Xmx8g
  6. # JVM 堆转储路径
  7. ## 默认情况下,Elasticsearch 将 JVM 配置为将内存异常转储到默认数据目录.(RPM 和 Debian 软件包发行版,/var/lib/elasticsearch, tar 和 zip 安装, 放在安装目录的 data 文件夹下)
  8. ## mkdir -p /opt/logs/elasticsearch/heap_dump
  9. ## mkdir -p /opt/logs/elasticsearch/gc
  10. -XX:HeapDumpPath=/opt/logs/elasticsearch/heap_dump
  11. # specify an alternative path for JVM fatal error logs
  12. -XX:ErrorFile=/opt/logs/elasticsearch/gc/hs_err_pid%p.log
  13. # JDK 8 GC logging
  14. 8:-Xloggc:/opt/logs/elasticsearch/gc/gc.log
  15. # JDK 9+ GC logging
  16. 9-:-Xlog:gc*,gc+age=trace,safepoint:file=/opt/logs/elasticsearch/gc/gc.log:utctime,pid,tags:filecount=32,filesize=64m
  • conf/log4j2.properties 用于配置 Elasticsearch 日志记录
  1. 待定

2. 系统重要配置

  1. 大多数操作系统尝试使用尽可能多的内存来存储文件系统缓存,并急切地交换掉未使用的应用程序内存。这可能导致部分JVM堆甚至其可执行页面被换出到磁盘。
  2. 交换对性能,节点稳定性非常不利,应该不惜一切代价避免。它可能导致垃圾收集持续数分钟而不是毫秒,并且可能导致节点响应缓慢甚至断开与群集的连接。在弹性分布式系统中,让操作系统终止节点更有效。
  3. 有三种禁用交换的方法。首选选项是完全禁用交换。如果这不是一个选项,是否更喜欢最小化swappiness与内存锁定取决于您的环境。
  4. 1. Disable all swap files
  5. sudo swapoff -a
  6. 2. 永久禁用
  7. 需要编辑 /etc/fstab 文件并注释掉包含该单词的任何行 swap
  8. 3. 启用 bootstrap.memory_lock
  9. 另一种选择是在 Linux / Unix系统上使用mlockall,或 Windows 使用 VirtualLock,以尝试将进程地址空间锁定到RAM中,从而防止任何 Elasticsearch 内存被换出。这可以通过将此行添加到config/elasticsearch.yml 文件来完成:
  1. ulimit 方式 ulimit -n 65536 (这个只要比 /etc/security/limits.conf 设置的小, 否则无效)

  2. /etc/security/limits.conf 永久生效 elasticsearch - nofile 65536 ```

  1. Elasticsearch mmapfs 默认使用目录来存储其索引。map 计数的默认操作系统限制可能太低,这可能导致内存不足异常。
  2. 1. Linux 上,可以通过运行以下命令来增加限制 root
  3. sysctl -w vm.max_map_count=262144
  4. 2. /etc/sysctl.conf 永久生效
  5. vm.max_map_count = 262144
  1. Elasticsearch 为不同类型的操作使用许多线程池。重要的是它能够在需要时创建新线程。确保 Elasticsearch 用户可以创建的线程数至少为 4096
  2. 1. ulimit
  3. ulimit -u 65536
  4. 2. /etc/security/limits.conf 生效
  5. elasticsearch - nofile 65536
  1. # 缓存ttl(以秒为单位),以便进行积极的DNS查找, JDK安全属性networkaddress.cache.ttl;设置为-1以永久缓存
  2. -Des.networkaddress.cache.ttl=60
  3. # 为负DNS查找缓存ttl(以秒为单位),注意这将覆盖JDK安全属性networkaddress.cache。- ttl;设置为-1以缓存永远
  4. -Des.networkaddress.cache.negative.ttl=10

集群部署

  1. # --------------------------------- 启动 ----------------------------------
  2. 1. 启动
  3. # 直接读取配置启动
  4. ./bin/elasticsearch
  5. # 命令行启动
  6. ./bin/elasticsearch \
  7. -E cluster.name=es-datacenter \
  8. -E node.name=es-datacenter-node1 \
  9. -E network.host=es-datacenter-node1 \
  10. -E discovery.zen.ping.unicast.hosts=es-datacenter-node1,es-datacenter-node2,es-datacenter-node3 \
  11. -d
  12. # 守护启动
  13. ./bin/elasticsearch -d -p pid
  14. # 指定 pid 启动
  15. ./bin/elasticsearch -p /tmp/elasticsearch-pid -d
  16. # 通过 pid 删除
  17. cat /tmp/elasticsearch-pid && echo
  18. kill -SIGTERM PID
  19. netstat -tunlp | grep 9200
  20. # --------------------------------- 停止 ----------------------------------
  21. jps | grep Elasticsearch
  22. 14542 Elasticsearch
  23. # 删除进程
  24. pkill -F pid
  25. # --------------------------------- 问题 ----------------------------------
  26. max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
  27. 1. ulimit 方式
  28. ulimit -n 65536 (这个只要比 /etc/security/limits.conf 设置的小, 否则无效)
  29. 2. /etc/security/limits.conf 永久生效
  30. 你的启动账号 - nofile 65536
  31. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  32. 1. 临时修改
  33. sudo sysctl -w vm.max_map_count=262144
  34. 2. 永久生效
  35. sudo vim /etc/sysctl.conf 永久生效
  36. vm.max_map_count=262144