• Elasicseaech描述及理解


    前言

    为何要搭建 Elasticsearch 集群

    凡事都要讲究个为什么。在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢?

    (1)高可用性

    Elasticsearch 作为一个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在非常短的时间内查询到我们想要的信息。所以第一步我们需要保证的就是 Elasticsearch 的高可用性,什么是高可用性呢?它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是 100%。如果系统在某个时刻宕掉了,比如某个网站在某个时间挂掉了,那么就可以它临时是不可用的。所以,为了保证 Elasticsearch 的高可用性,我们就应该尽量减少 Elasticsearch 的不可用时间。

    那么怎样提高 Elasticsearch 的高可用性呢?这时集群的作用就体现出来了。假如 Elasticsearch 只放在一台服务器上,即单机运行,假如这台主机突然断网了或者被攻击了,那么整个 Elasticsearch 的服务就不可用了。但如果改成 Elasticsearch 集群的话,有一台主机宕机了,还有其他的主机可以支撑,这样就仍然可以保证服务是可用的。

    那可能有的小伙伴就会说了,那假如一台主机宕机了,那么不就无法访问这台主机的数据了吗?那假如我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其他的主机里面也存了一份一模一样的数据?那这岂不是很浪费吗?

    为了解答这个问题,这里就引出了 Elasticsearch 的信息存储机制了。首先解答上面的问题,一台主机宕机了,这台主机里面存的数据依然是可以被访问到的,因为在其他的主机上也有备份,但备份的时候也不是整台主机备份,是分片备份的,那这里就又引出了一个概念——分片。

    分片,英文叫做 Shard,顾名思义,分片就是对数据切分成了多个部分。我们知道 Elasticsearch 中一个索引(Index)相当于是一个数据库,如存某网站的用户信息,我们就建一个名为 user 的索引。但索引存储的时候并不是整个存一起的,它是被分片存储的,Elasticsearch 默认会把一个索引分成五个分片,当然这个数字是可以自定义的。分片是数据的容器,数据保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里,所以相当于一份数据被分成了多份并保存在不同的主机上。

    那这还是没解决问题啊,如果一台主机挂掉了,那么这个分片里面的数据不就无法访问了?别的主机都是存储的其他的分片。其实是可以访问的,因为其他主机存储了这个分片的备份,叫做副本,这里就引出了另外一个概念——副本。

    副本,英文叫做 Replica,同样顾名思义,副本就是对原分片的复制,和原分片的内容是一样的,Elasticsearch 默认会生成一份副本,所以相当于是五个原分片和五个分片副本,相当于一份数据存了两份,并分了十个分片,当然副本的数量也是可以自定义的。这时我们只需要将某个分片的副本存在另外一台主机上,这样当某台主机宕机了,我们依然还可以从另外一台主机的副本中找到对应的数据。所以从外部来看,数据结果是没有任何区别的。

    一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率,从而提高高可用性。

    但这时假如你只有一台主机,那不就没办法了吗?分片和副本其实是没意义的,一台主机挂掉了,就全挂掉了。

    (2)健康状态

    针对一个索引,Elasticsearch 中其实有专门的衡量索引健康状况的标志,分为三个等级:

    • green,绿色。这代表所有的主分片和副本分片都已分配。你的集群是 100% 可用的。

    • yellow,黄色。所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果更多的分片消失,你就会丢数据了。所以可把 yellow 想象成一个需要及时调查的警告。

    • red,红色。至少一个主分片以及它的全部副本都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

    如果你只有一台主机的话,其实索引的健康状况也是 yellow,因为一台主机,集群没有其他的主机可以防止副本,所以说,这就是一个不健康的状态,因此集群也是十分有必要的。

    (3)存储空间

    另外,既然是群集,那么存储空间肯定也是联合起来的,假如一台主机的存储空间是固定的,那么集群它相对于单个主机也有更多的存储空间,可存储的数据量也更大。

    所以综上所述,我们需要一个集群!

    1.安装 

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html (es官网,这个是重要配置的文档)

    (1) 最新的javajdk 这个应该都会安装吧

    [root@cyy data]# yum -y list java*     //列出来java的jdk版本
    [root@cyy data]# yum -y install java-11.0.8-openjdk* 
    [root@cyy data]# java --version
    openjdk 11.0.8 2020-07-14 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.8+10-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode, sharing)
    [root@cyy data]# 
        
    

      

    (2)下载

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-7.1.1-linux-x86_64.tar.gz
    
    tar -zxvf elasticsearch-oss-7.1.1-linux-x86_64.tar.gz

    具体的配置,下边些集群的时候填上

    2.重要配置的修改

    Elasticsearch 已经有了 很好 的默认值,特别是涉及到性能相关的配置或者选项。 如果你有疑问,最好就不要动它。我们已经目睹了数十个因为错误的设置而导致毁灭的集群, 因为它的管理者总认为改动一个配置或者选项就可以带来 100 倍的提升。

    其它数据库可能需要调优,但总得来说,Elasticsearch 不需要。 如果你遇到了性能问题,解决方法通常是更好的数据布局或者更多的节点。 在 Elasticsearch 中很少有“神奇的配置项”, 如果存在,我们也已经帮你优化了!

    另外,有些 逻辑上的 配置在生产环境中是应该调整的。 这些调整可能会让你的工作更加轻松,又或者因为没办法设定一个默认值(它取决于你的集群布局)。

    名字:
    1.Elasticsearch 默认启动的集群名字叫 elasticsearch 。你最好给你的生产环境的集群改个名字,改名字的目的很简单, 就是防止某人的笔记本电脑加入了集群这种意外。简单修改成 elasticsearch_production 会很省心。
    你可以在你的 elasticsearch.yml 文件中修改:
    cluster.name: elasticsearch_production

    2.最好也修改你的节点名字
    node.name: elasticsearch_005_data

    路径:
    默认情况下,Elasticsearch 会把插件、日志以及你最重要的数据放在安装目录下。这会带来不幸的事故, 如果你重新安装 Elasticsearch 的时候不小心把安装目录覆盖了。如果你不小心,你就可能把你的全部数据删掉了。这种事情很多
    可以更改如下:
    path.data: /path/to/data1,/path/to/data2

    # Path to log files:
    path.logs: /path/to/logs

    # Path to where plugins are installed:
    path.plugins: /path/to/plugins
    注意:你可以通过逗号分隔指定多个目录。

    数据可以保存到多个不同的目录, 如果将每个目录分别挂载不同的硬盘,这可是一个简单且高效实现一个软磁盘阵列( RAID 0 )的办法。Elasticsearch 会自动把条带化(注:RAID 0 又称为 Stripe(条带化),在磁盘阵列中,数据是以条带的方式贯穿在磁盘阵列所有硬盘中的) 数据分隔到不同的目录,以便提高性能。

    最小主节点
    配置为 master 候选节点的法定个数(大多数个)。法定个数就是 ( master 候选节点个数 / 2) + 1 。 这里有几个例子:
    你可以在你的 elasticsearch.yml 文件中这样配置:
    discovery.zen.minimum_master_nodes: 2

    集群恢复方面的配置
    当你集群重启时,几个配置项影响你的分片恢复的表现。首先,我们需要明白如果什么也没配置将会发生什么。

    想象一下假设你有 10 个节点,每个节点只保存一个分片,这个分片是一个主分片或者是一个副本分片,或者说有一个有 5 个主分片/1 个副本分片的索引。有时你需要为整个集群做离线维护(比如,为了安装一个新的驱动程序), 当你重启你的集群,恰巧出现了 5 个节点已经启动,还有 5 个还没启动的场景。

    假设其它 5 个节点出问题,或者他们根本没有收到立即重启的命令。不管什么原因,你有 5 个节点在线上,这五个节点会相互通信,选出一个 master,从而形成一个集群。 他们注意到数据不再均匀分布,因为有 5 个节点在集群中丢失了,所以他们之间会立即启动分片复制。

    最后,你的其它 5 个节点打开加入了集群。这些节点会发现 它们 的数据正在被复制到其他节点,所以他们删除本地数据(因为这份数据要么是多余的,要么是过时的)。 然后整个集群重新进行平衡,因为集群的大小已经从 5 变成了 10。

    在整个过程中,你的节点会消耗磁盘和网络带宽,来回移动数据,因为没有更好的办法。对于有 TB 数据的大集群, 这种无用的数据传输需要 很长时间 。如果等待所有的节点重启好了,整个集群再上线,所有的本地的数据都不需要移动。

    现在我们知道问题的所在了,我们可以修改一些设置来缓解它。 首先我们要给 ELasticsearch 一个严格的限制:
    gateway.recover_after_nodes: 8
    这将阻止 Elasticsearch 在存在至少 8 个节点(数据节点或者 master 节点)之前进行数据恢复。 这个值的设定取决于个人喜好:整个集群提供服务之前你希望有多少个节点在线?这种情况下,我们设置为 8,这意味着至少要有 8 个节点,该集群才可用。

    现在我们要告诉 Elasticsearch 集群中 应该 有多少个节点,以及我们愿意为这些节点等待多长时间:

    gateway.expected_nodes: 10
    gateway.recover_after_time: 5m
     
    这意味着 Elasticsearch 会采取如下操作:
    • 等待集群至少存在 8 个节点
    • 等待 5 分钟,或者10 个节点上线后,才进行数据恢复,这取决于哪个条件先达到。
    这三个设置可以在集群重启的时候避免过多的分片交换。这可能会让数据恢复从数个小时缩短为几秒钟。注意:这些配置只能设置在 config/elasticsearch.yml 文件中或者是在命令行里(它们不能动态更新)它们只在整个集群重启的时候有实质性作用。

    最好使用单播代替组播:

    Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。

    虽然组播仍然 作为插件提供, 但它应该永远不被使用在生产环境了,否则你得到的结果就是一个节点意外的加入到了你的生产环境,仅仅是因为他们收到了一个错误的组播信号。 对于组播 本身 并没有错,组播会导致一些愚蠢的问题,并且导致集群变的脆弱(比如,一个网络工程师正在捣鼓网络,而没有告诉你,你会发现所有的节点突然发现不了对方了)。

    使用单播,你可以为 Elasticsearch 提供一些它应该去尝试连接的节点列表。 当一个节点联系到单播列表中的成员时,它就会得到整个集群所有节点的状态,然后它会联系 master 节点,并加入集群。

    这意味着你的单播列表不需要包含你的集群中的所有节点, 它只是需要足够的节点,当一个新节点联系上其中一个并且说上话就可以了。如果你使用 master 候选节点作为单播列表,你只要列出三个就可以了。 这个配置在 elasticsearch.yml 文件中:

    discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

    3.集群

    上边说到。集群的master 为 ( master 候选节点个数 / 2) + 1  不过7之后的版本可以不用配置

    准备3台服务器

    192.168.199.236

    :192.168.199.138

    192.168.199.121

    1.添加elasticsearch 用户 用户启动

    [root@cyy data]#  tar -zxvf elasticsearch-oss-7.1.1-linux-x86_64.tar.gz   //解压

    [root@cyy data]# useradd elasticsearch

    [root@cyy data]# cat passswd  //查看下用户

    [root@cyy config]# pwd

    /data/elasticsearch-7.1.1/config

    [root@cyy config]# cp elasticsearch.yml elasticsearch.yml.bak185.147

    [root@cyy config]# vim elasticsearch.yml

    cluster.name: cluster-Es

    node.name: node_41

    network.host: 192.168.199.236

    node.master: true

    node.data: true

    # head 插件需要这打开这两个配置

    http.cors.allow-origin: "*"

    http.cors.enabled: true

    http.max_content_length: 200mb

    # 可以选举的主节点

    cluster.initial_master_nodes: ["192.168.199.236:9300","192.168.199.138:9300","192.168.199.121:9300"]

    discovery.seed_hosts: ["192.168.199.236:9300","192.168.199.138:9300","192.168.199.121:9300"]

    gateway.recover_after_nodes: 2

    network.tcp.keep_alive: true

    network.tcp.no_delay: true

    transport.tcp.compress: true

    #集群内同时启动的数据任务个数,默认是2个

    cluster.routing.allocation.cluster_concurrent_rebalance: 16

    #添加或删除节点及负载均衡时并发恢复的线程个数,默认4个

    cluster.routing.allocation.node_concurrent_recoveries: 16

    #初始化数据恢复时,并发恢复线程的个数,默认4个

    cluster.routing.allocation.node_initial_primaries_recoveries: 16

    #开启 xpack 功能,如果要禁止使用密码,请将以下内容注释,直接启动不需要设置密码

    xpack.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 EOF

    [root@cyy config]# scp elasticsearch.yml root@172.16.185.148:/tmp/

    根据配置修改下不同的地方

    node.name: es1-236    //可以修改更具体些,这样多的话可以好找
    node.name: es2-138    
    node.name: es2-121
    

    * node.master该节点是否有资格选举为master,如果上面设了两个mater_node 2,也就是最少两个master节点,则集群中必须有两台es服务器的配置为node.master: true的配置,配置了2个节点的话,如果主服务器宕机,整个集群会不可用,所以三台服务器,需要配置3个node.masdter为true,这样三个master,宕了一个主节点的话,他又会选举新的master,还有两个节点可以用,只要配了node master为true的ES服务器数正在运行的数量不少于master_node的配置数,则整个集群继续可用,我这里则配置三台es node.master都为true,也就是三个master,master服务器主要管理集群状态,负责元数据处理,比如索引增加删除分片分配等,数据存储和查询都不会走主节点,压力较小,jvm内存可分配较低一点

    于Elasticsearch是Java开发的,所以可以通过/etc/elasticsearch/jvm.options配置文件来设定JVM的相关设定。如果没有特殊需求按默认即可。
    不过其中还是有两项最重要的-Xmx1g-Xms1gJVM的最大最小内存。如果太小会导致Elasticsearch刚刚启动就立刻停止。太大会拖慢系统本身。

    [root@cyy config]# ls
    elasticsearch.yml  elasticsearch.yml.bak  jvm.options  log4j2.properties
    [root@cyy config]# vim jvm.options 
    -Xms1g                                                  # JVM最大、最小使用内存
    -Xmx1g

    *、操作系统调优
    【1】内存优化
    在/etc/sysctl.conf添加如下内容

     在root用户下:
     echo "* soft nofile 65535" >> /etc/security/limits.conf
     echo "* hard nofile 65535" >> /etc/security/limits.conf
     echo "vm.max_map_count=262144" >> /etc/sysctl.conf
     sysctl -p
    解释下配置先关


    cluster.name: ES-Cluster
    #ES集群名称,同一个集群内的所有节点集群名称必须保持一致
    
    node.name: ES-master-10.150.55.94
    #ES集群内的节点名称,同一个集群内的节点名称要具备唯一性
    
    node.master: true
    #允许节点是否可以成为一个master节点,ES是默认集群中的第一台机器成为master,如果这台机器停止就会重新选举
    
    node.data: false
    #允许该节点存储索引数据(默认开启)
    #关于Elasticsearch节点的角色功能详解,请看:https://www.dockerc.com/elasticsearch-master-or-data/
    
    path.data: /data/ES-Cluster/master/ES-master-10.150.55.94/data1,/data/ES-Cluster/master/ES-master-10.150.55.94/data2
    #ES是搜索引擎,会创建文档,建立索引,此路径是索引的存放目录,如果我们的日志数据较为庞大,那么索引所占用的磁盘空间也是不可小觑的
    #这个路径建议是专门的存储系统,如果不是存储系统,最好也要有冗余能力的磁盘,此目录还要对elasticsearch的运行用户有写入权限
    #path可以指定多个存储位置,分散存储,有助于性能提升,以至于怎么分散存储请看详解https://www.dockerc.com/elk-theory-elasticsearch/
    
    path.logs: /data/ES-Cluster/master/ES-master-10.150.55.94/logs
    #elasticsearch专门的日志存储位置,生产环境中建议elasticsearch配置文件与elasticsearch日志分开存储
    
    bootstrap.memory_lock: true
    #在ES运行起来后锁定ES所能使用的堆内存大小,锁定内存大小一般为可用内存的一半左右;锁定内存后就不会使用交换分区
    #如果不打开此项,当系统物理内存空间不足,ES将使用交换分区,ES如果使用交换分区,那么ES的性能将会变得很差
    
    network.host: 10.150.55.94
    #es绑定地址,支持IPv4及IPv6,默认绑定127.0.0.1;es的HTTP端口和集群通信端口就会监听在此地址上
    
    network.tcp.no_delay: true
    #是否启用tcp无延迟,true为启用tcp不延迟,默认为false启用tcp延迟
    
    network.tcp.keep_alive: true
    #是否启用TCP保持活动状态,默认为true
    
    network.tcp.reuse_address: true
    #是否应该重复使用地址。默认true,在Windows机器上默认为false
    
    network.tcp.send_buffer_size: 128mb
    #tcp发送缓冲区大小,默认不设置
    
    network.tcp.receive_buffer_size: 128mb
    #tcp接收缓冲区大小,默认不设置
    
    transport.tcp.port: 9301
    #设置集群节点通信的TCP端口,默认就是9300
    
    transport.tcp.compress: true
    #设置是否压缩TCP传输时的数据,默认为false
    
    http.max_content_length: 200mb
    #设置http请求内容的最大容量,默认是100mb
    
    http.cors.enabled: true
    #是否开启跨域访问
    
    http.cors.allow-origin: “*”
    #开启跨域访问后的地址限制,*表示无限制
    
    http.port: 9201
    #定义ES对外调用的http端口,默认是9200
    
    discovery.zen.ping.unicast.hosts: [“10.150.55.94:9301”, “10.150.55.95:9301”,“10.150.30.246:9301”] #在Elasticsearch7.0版本已被移除,配置错误
    #写入候选主节点的设备地址,来开启服务时就可以被选为主节点
    #默认主机列表只有127.0.0.1和IPV6的本机回环地址
    #上面是书写格式,discover意思为发现,zen是判定集群成员的协议,unicast是单播的意思,ES5.0版本之后只支持单播的方式来进行集群间的通信,hosts为主机
    #总结下来就是:使用zen协议通过单播方式去发现集群成员主机,在此建议将所有成员的节点名称都写进来,这样就不用仅靠集群名称cluster.name来判别集群关系了
    
    discovery.zen.minimum_master_nodes: 2 #在Elasticsearch7.0版本已被移除,配置无效
    #为了避免脑裂,集群的最少节点数量为,集群的总节点数量除以2加一
    
    discovery.zen.fd.ping_timeout: 120s #在Elasticsearch7.0版本已被移除,配置无效
    #探测超时时间,默认是3秒,我们这里填120秒是为了防止网络不好的时候ES集群发生脑裂现象
    
    discovery.zen.fd.ping_retries: 6 #在Elasticsearch7.0版本已被移除,配置无效
    #探测次数,如果每次探测90秒,连续探测超过六次,则认为节点该节点已脱离集群,默认为3次
    
    discovery.zen.fd.ping_interval: 15s #在Elasticsearch7.0版本已被移除,配置无效
    #节点每隔15秒向master发送一次心跳,证明自己和master还存活,默认为1秒太频繁,
    
    discovery.seed_hosts: [“10.150.55.94:9301”, “10.150.55.95:9301”,“10.150.30.246:9301”]
    #Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点,由discovery.zen.ping.unicast.hosts:参数改变而来
    
    cluster.initial_master_nodes: [“10.150.55.94:9301”, “10.150.55.95:9301”,“10.150.30.246:9301”]
    #Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点
    
    cluster.fault_detection.leader_check.interval: 15s
    #Elasticsearch7新增参数,设置每个节点在选中的主节点的检查之间等待的时间。默认为1秒
    
    discovery.cluster_formation_warning_timeout: 30s
    #Elasticsearch7新增参数,启动后30秒内,如果集群未形成,那么将会记录一条警告信息,警告信息未master not fount开始,默认为10秒
    
    cluster.join.timeout: 30s
    #Elasticsearch7新增参数,节点发送请求加入集群后,在认为请求失败后,再次发送请求的等待时间,默认为60秒
    
    cluster.publish.timeout: 90s
    #Elasticsearch7新增参数,设置主节点等待每个集群状态完全更新后发布到所有节点的时间,默认为30秒
    
    cluster.routing.allocation.cluster_concurrent_rebalance: 32
    #集群内同时启动的数据任务个数,默认是2个
    
    cluster.routing.allocation.node_concurrent_recoveries: 32
    #添加或删除节点及负载均衡时并发恢复的线程个数,默认4个
    
    cluster.routing.allocation.node_initial_primaries_recoveries: 32
    #初始化数据恢复时,并发恢复线程的个数,默认4个
    
    

     http://192.168.199.236:9200/_cat/nodes

    
    
    192.168.199.236 24 88 19 0.37 0.11 0.07 mdi - node_236
    192.168.199.121 21 96  0 0.01 0.03 0.05 mdi - node_121
    192.168.199.138 30 96  1 0.01 0.04 0.07 mdi * node_138       主节点

    我们去掉一个节点138    集群主节点转移

    192.168.199.121 25 96  1 0.04 0.04 0.05 mdi * node_121
    192.168.199.236 22 89 12 0.26 0.13 0.08 mdi - node_236


  • 相关阅读:
    转几篇关于反射的文章
    几篇并发的文章
    线程池的使用(转)
    深入理解java不可变对象(转)
    收集的书
    BeanPostProcessor(转)
    JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
    Java中InputStream和String之间的转换方法
    linux的一些常用命令
    Linux下查看文件内容的命令
  • 原文地址:https://www.cnblogs.com/aoxueshou/p/13576357.html
Copyright © 2020-2023  润新知