zoukankan      html  css  js  c++  java
  • 生产环境elasticsearch的配置建议


    参考:
    https://www.elastic.co/guide/cn/elasticsearch/guide/current/important-configuration-changes.html
    https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
    https://blog.csdn.net/thomas0yang/article/details/55518105
    https://www.cnblogs.com/ginb/p/7027910.html

    硬件方面

    内存

    首先最重要的资源是内存,排序和聚合都可能导致内存匮乏,因此足够的堆空间来容纳这些是重要的。即使堆比较小,也要给操作系统高速缓存提供额外的内存,因为Lucene使用的许多数据结构是基于磁盘的格式,Elasticsearch利用操作系统缓存有很大的影响。
    64GB RAM的机器是最理想的,但32GB和16GB机器也很常见。少于8GB往往适得其反(你最终需要许多,许多小机器),大于64GB可能会有问题,我们将在讨论在堆:大小和交换。

    CPU

    大多数Elasticsearch部署往往对CPU要求很不大。因此,确切的处理器设置比其他资源更重要,应该选择具有多个内核的现代处理器。通用集群使用2到8核机器。
    如果需要在较快的CPU或更多核之间进行选择,请选择更多核。 多核提供的额外并发将远远超过稍快的时钟速度。

    硬盘

    磁盘对于所有集群都很重要,尤其是对于索引很重的集群(例如摄取日志数据的磁盘)。 磁盘是服务器中最慢的子系统,这意味着大量写入的群集可以轻松地饱和其磁盘,这反过来成为群集的瓶颈。

    如果你能买得起SSD,他们远远优于任何旋转磁盘。 支持SSD的节点看到查询和索引性能方面的提升。
    如果使用旋转磁盘,请尝试获取尽可能最快的磁盘(高性能服务器磁盘,15k转速驱动器)。
    使用RAID 0是提高磁盘速度的有效方法,适用于旋转磁盘和SSD。 没有必要使用RAID的镜像或奇偶校验变体,因为高可用性是通过副本建立到Elasticsearch中。
    最后,避免网络连接存储(NAS)。 NAS通常较慢,显示较大的延迟,平均延迟的偏差较大,并且是单点故障。

    网络

    快速和可靠的网络对于分布式系统中的性能显然是重要的。低延迟有助于确保节点可以轻松地进行通信,而高带宽有助于分段移动和恢复。现代数据中心网络(1GbE,10GbE)对于绝大多数集群都是足够的。
    避免跨越多个数据中心的群集,即使数据中心位置非常接近。绝对避免跨越大地理距离的集群。
    Elasticsearch集群假定所有节点相等,而不是一半的节点距离另一个数据中心中有150ms。较大的延迟往往会加剧分布式系统中的问题,并使调试和解决更加困难。
    与NAS参数类似,每个人都声称数据中心之间的管道是稳健的和低延迟。(吹牛)。从我们的经验,管理跨数据中心集群的麻烦就是浪费成本。

    其他

    现在可以获得真正巨大的机器如数百GB的RAM和几十个CPU内核。 另外也可以在云平台(如EC2)中启动数千个小型虚拟机。 哪种方法最好?
    一般来说,最好选择中到大盒子。 避免使用小型机器,因为您不想管理具有一千个节点的集群,而简单运行Elasticsearch的开销在这种小型机器上更为明显。
    同时,避免真正巨大的机器。 它们通常导致资源使用不平衡(例如,所有内存正在使用,但没有CPU),并且如果您必须为每台机器运行多个节点,可能会增加后期的运维复杂性。

    操作系统

    较大的文件描述符

    Lucene使用了非常大量的文件。 并且Elasticsearch使用大量的套接字在节点和HTTP客户端之间进行通信。 所有这些都需要可用的文件描述符。
    可悲的是,许多现代的Linux发行版每个进程允许一个不允许的1024个文件描述符。 这对于一个小的Elasticsearch节点来说太低了,更不用说处理数百个索引的节点了。
    您应该将文件描述符计数增加到非常大的值,例如64,000。 这个过程是令人恼火的困难,高度依赖于你的特定操作系统和分布。 请查阅操作系统的文档以确定如何更改允许的文件描述符计数。
    可以使用http://ip:port/_nodes/stats接口process中的open_file_descriptors和max_file_descriptors进行查看。

    设置MMap
    Elasticsearch还针对各种文件使用NioFS和MMapFS的混合。 确保配置最大映射计数,以便有足够的虚拟内存可用于mmapped文件。 这可以临时设置

    sysctl -w vm.max_map_count=655300

    或者在/etc/sysctl.conf下永久设置vm.max_map_count。查看设置

    cat /proc/sys/vm/max_map_count

    JVM虚拟机

    除非Elasticsearch网站上另有说明,否则应始终运行最新版本的Java虚拟机(JVM)。 Elasticsearch和Lucene都是比较苛刻的软件。 Lucene的单元和集成测试通常暴露JVM本身的错误。这些错误的范围可以从轻微的烦恼到严重的segfaults,所以最好是使用最新版本的JVM尽可能。
    Java8要好于Java7.Java6不再受支持。可以接受Oracle或OpenJDK。它们的性能和稳定性相当。
    如果您的应用程序是用Java编写的,并且正在使用传输客户端或节点客户端,请确保运行应用程序的JVM与服务器JVM相同。在Elasticsearch中的几个位置,使用Java的本机序列化(IP地址,异常等)。不幸的是,Oracle已知改变小版本之间的序列化格式,导致奇怪的错误。这种情况很少发生,但最佳做法是保持客户端和服务器之间的JVM版本相同。

    给lucene留下一半的内存空间

    一个常见的问题是配置一个太大的堆。你有一个64GB的机器,并且你想给Elasticsearch所有64GB的内存。更多更好?!堆对Elasticsearch绝对重要,它被许多内存数据结构使用以提供快速操作。但是还有另一个主要的内存用户是堆:Lucene。
    Lucene旨在利用底层操作系统来缓存内存中的数据结构。 Lucene段存储在单独的文件中,因为段是不可变的,所以这些文件从不改变。这使得它们非常易于缓存,并且底层操作系统将适合的保持segment驻留在内存中以便更快地访问。这些段包括反向索引(用于全文搜索)和docvalues(用于聚合)。Lucene的性能依赖于与操作系统的这种交互。但是如果你给Elasticsearch的堆提供所有可用的内存,Lucene就不会有任何剩余的内存。这会严重影响性能。
    标准建议是给Elasticsearch堆提供50%的可用内存,同时保留其他50%的空闲内存。它不会不使用; Lucene会愉快地吞噬剩下的任何东西。
    如果你不是聚合在分析的字符串字段(例如你不需要fielddata),你可以考虑降低堆更多。你可以做的堆越小,你可以期望从Elasticsearch(更快的GC)和Lucene(更多的内存缓存)更好的性能。

    不要超过32G

    事实证明,当堆大小小于32GB时,HotSpot JVM使用一个技巧来压缩对象指针。可以通过-XX:+PrintFlagsFinal来查看,在es2.2.0后不用设置,启动后会打印compressed ordinary object pointers [true]
    在Java中,所有对象都在堆上分配并由指针引用。Ordinary object pointers(OOP)指向这些对象,并且通常是CPU本地字的大小:32位或64位,取决于处理器。指针引用值的确切字节位置。 对于32位系统,这最大堆大小为4GB。对于64位系统,堆大小可以变得更大,但64位指针的开销意味着更多的浪费空间,因为指针更大。并且比浪费的空间更糟,当在主存储器和各种高速缓存(LLC,L1等)之间移动值时,较大的指针占用更多的带宽。
    Java使用一个名为compress oops的技巧来解决这个问题。指针不是指向存储器中的精确字节位置,而是引用对象偏移。这意味着32位指针可以引用四十亿个对象,而不是40亿字节。最终,这意味着堆可以增长到大约32 GB的物理大小,同时仍然使用32位指针。
    一旦你超越32GB边界,指针切换回Ordinary object pointers。每个指针的大小增加,使用更多的CPU内存带宽,并且您有效地丢失了内存。事实上,它需要直到大约40到50GB的分配的堆,你有一个堆的相同有效内存刚刚低于32GB使用压缩oops。所以即使你有内存,尽量避免跨越32 GB堆边界。它浪费内存,降低CPU性能,并使GC与大堆争夺。

    swapping是性能的死穴

    它应该是显而易见的,但它明确拼写出来:将主内存交换到磁盘会破坏服务器性能。 内存中操作是需要快速执行的操作。如果内存交换到磁盘,100微秒操作将花费10毫秒。 现在重复所有其他10us操作的延迟增加。 不难看出为什么交换对于性能来说是可怕的。
    1、最好的办法是在系统上完全禁用交换。 这可以临时完成:

    sudo swapoff -a

    要永久禁用则需要编辑/etc/fstab。请查阅操作系统的文档。
    2、如果完全禁用交换不是一个选项,您可以尝试

    sysctl vm.swappiness = 1(查看cat /proc/sys/vm/swappiness)

    这个设置控制操作系统如何积极地尝试交换内存。 以防止在正常情况下交换,但仍然允许操作系统在紧急情况下交换。swappiness值1比0好,因为在一些内核版本上,swappiness为0可以调用OOM-killer。
    3、最后,如果两种方法都不可能,就应该启用mlockall。 这允许JVM锁定其内存,并防止它被操作系统交换。 可以在elasticsearch.yml中设置:

    bootstrap.mlockall: true

    具体配置

    服务器的初始化

    设置vm.max_map_count=262144

    echo "vm.max_map_count=262144" >> /etc/sysctl.conf

    创建elasticsearch的启动用户

    创建普通用户 es

    useradd es

    数据目录和日志目录需要设置普通用户es的权限

    sudo chmod 777 es* -R

    关于证书elastic-certificates.p12

    es提供了生成证书的工具elasticsearch-certutil

    第一步,生成ca: elastic-stack-ca.p12, 在任意一台服务器上生成

    `./bin/elasticsearch-certutil ca`
    

    第二步,生成cert: elastic-certificates.p12

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    这个生成elastic-certificates.p12 就是我们需要使用的。

    把证书复制到其他的服务器上

    生成elastic用户的密码

    ./bin/elasticsearch-setup-passwords interactive
    默认的用户名是elastic

    创建一个临时的超级用户admin

    ./bin/elasticsearch-users useradd admin -r superuser

    重要配置

    path.data
    path.logs
    cluster.name
    node.name
    network.host
    discovery.seed_hosts (旧版本是discovery.zen.ping.unicast.hosts)
    discovery.zen.minimum_master_nodes [3个节点,就写2,多于3个,就(总数/2 + 1)]
    bootstrap.memory_lock (这个是管理swap内存交换的,默认是不使用swap,建议使用默认)

    cluster.name: es-cluster
     node.name: es-node1
     path.data: /elasticsearch/elasticsearch/data/
     path.logs: /elasticsearch/elasticsearch/logs
     path.repo: /elasticsearch/snapshot
     network.host: 0.0.0.0
     http.port: 49200
     transport.tcp.port: 49300
     #gateway.recover_after_time默认是5分钟,增大后,减少数据来回拷贝几率
     gateway.recover_after_time: 10m
     
     #旧版本是discovery.zen.ping.unicast.hosts
     discovery.seed_hosts: ["es-node1", "es-node2", "es-node3"]
     #[3个节点,就写2,多于3个,就(总数/2 + 1)]
     discovery.zen.minimum_master_nodes: 2
     
     xpack.security.enabled: true
     xpack.security.transport.ssl.enabled: true
     xpack.security.transport.ssl.verification_mode: certificate
     xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
     xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
    
    本人水平有限,还在不断学习中 难免有很多错误或者遗漏,望见谅
  • 相关阅读:
    Oracle 11 安装 提示环境不满足最低要求解决方案
    sys.argv[]的用法简明解释
    (转载)Pycharm 新版本打开md文件卡死-解决办法
    csv模块
    算法笔记——【动态规划】矩阵连乘问题——备忘录法
    Clion配置MingGW报错test cmake run with errors解决方法
    主定理(Master Theorem)与时间复杂度的计算
    UML笔记
    分治法+时间复杂度分析
    数字图像处理DIP 学习笔记
  • 原文地址:https://www.cnblogs.com/faberbeta/p/14776116.html
Copyright © 2011-2022 走看看