linux系统里elasticsearch集群搭建

1.在容器中搜索elasticsearch镜像,如图结果,一般选择最上面的一个。

    sudo docker search elasticsearch

'es图'

2.到elasticsearch官方网站查询elasticsearch的版本,我用的是最新版7.6.2

3.拉镜像到本地

    sudo docker pull elasticsearch:7.6.2

4.查看本地镜像,找到elasticsearch,如下图

    sudo docker images

'es图'

5.创建挂载本地目录

mkdir -p es/node1 es/node2 es/node3 && mkdir es/node1/config es/node1/data es/node1/log es/node1/plugins es/node2/config es/node2/data es/node2/log es/node2/plugins es/node3/config es/node3/data es/node3/log es/node3/plugins

config存放配置文件

data存放数据

log存放日志

plugins存放插件

给目录开放读写权限

    sudo chmod -R 777 es/node1 es/node2 es/node3

6.创建配置文件

  • node1的配置文件 es/node1/config/config.yml

    #集群名称
    cluster.name: erik-es
    #当前该节点的名称
    node.name: node1
    #是不是有资格竞选主节点
    node.master: true
    #是否存储数据
    node.data: true
    #最大集群节点数
    node.max_local_storage_nodes: 3
    #给当前节点自定义属性(可以省略)
    #node.attr.rack: r1
    #数据存档位置
    path.data: /usr/share/elasticsearch/data
    #日志存放位置
    path.logs: /usr/share/elasticsearch/log
    #是否开启时锁定内存(默认为是)
    #bootstrap.memory_lock: true
    #设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
    #然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
    network.host: 0.0.0.0
    #设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址,设置当前物理机地址,
    #如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
    network.publish_host: 172.18.0.2
    #设置映射端口
    http.port: 9200
    #内部节点之间沟通端口
    transport.tcp.port: 9300
    #集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
    #es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
    discovery.seed_hosts: ["172.18.0.2:9300","172.18.0.3:9301","172.18.0.4:9302"]
    #当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
    #其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
    #如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
    cluster.initial_master_nodes: ["node1","node2","node3"]
    #在群集完全重新启动后阻止初始恢复,直到启动N个节点
    #简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
    gateway.recover_after_nodes: 2
    #删除索引是是否需要显示其名称,默认为显示
    #action.destructive_requires_name: true
    
  • node2的配置文件 es/node2/config/config.yml

      #集群名称
      cluster.name: erik-es
      #当前该节点的名称
      node.name: node2
      #是不是有资格竞选主节点
      node.master: true
      #是否存储数据
      node.data: true
      #最大集群节点数
      node.max_local_storage_nodes: 3
      #给当前节点自定义属性(可以省略)
      #node.attr.rack: r1
      #数据存档位置
      path.data: /usr/share/elasticsearch/data
      #日志存放位置
      path.logs: /usr/share/elasticsearch/log
      #是否开启时锁定内存(默认为是)
      #bootstrap.memory_lock: true
      #设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
      #然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
      network.host: 0.0.0.0
      #设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址,设置当前物理机地址,
      #如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
      network.publish_host: 172.18.0.3
      #设置映射端口
      http.port: 9201
      #内部节点之间沟通端口
      transport.tcp.port: 9301
      #集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
      #es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
      discovery.seed_hosts: ["172.18.0.2:9300","172.18.0.3:9301","172.18.0.4:9302"]
      #当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
      #其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
      #如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
      cluster.initial_master_nodes: ["node1","node2","node3"]
      #在群集完全重新启动后阻止初始恢复,直到启动N个节点
      #简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
      gateway.recover_after_nodes: 2
      #删除索引是是否需要显示其名称,默认为显示
      #action.destructive_requires_name: true
    
  • node3的配置文件 es/node3/config/config.yml

      #集群名称
      cluster.name: erik-es
      #当前该节点的名称
      node.name: node3
      #是不是有资格竞选主节点
      node.master: true
      #是否存储数据
      node.data: true
      #最大集群节点数
      node.max_local_storage_nodes: 3
      #给当前节点自定义属性(可以省略)
      #node.attr.rack: r1
      #数据存档位置
      path.data: /usr/share/elasticsearch/data
      #日志存放位置
      path.logs: /usr/share/elasticsearch/log
      #是否开启时锁定内存(默认为是)
      #bootstrap.memory_lock: true
      #设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
      #然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
      network.host: 0.0.0.0
      #设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址,设置当前物理机地址,
      #如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
      network.publish_host: 172.18.0.4
      #设置映射端口
      http.port: 9202
      #内部节点之间沟通端口
      transport.tcp.port: 9302
      #集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
      #es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
      discovery.seed_hosts: ["172.18.0.2:9300","172.18.0.3:9301","172.18.0.4:9302"]
      #当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
      #其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
      #如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
      cluster.initial_master_nodes: ["node1","node2","node3"]
      #在群集完全重新启动后阻止初始恢复,直到启动N个节点
      #简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
      gateway.recover_after_nodes: 2
      #删除索引是是否需要显示其名称,默认为显示
      #action.destructive_requires_name: true
    

7.创建网络

如果需要安装kibana等其他,需要创建一个网络,名字任意取,让他们在同一个网络,使得elasticsearch和kibana通信,网络名称可以自定义

sudo docker network create es-net

查看已创建的网络,如下图

    sudo docker network ls

8.创建节点

  • node1

        sudo docker run --privileged -ti -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --network es-net -d -p 9200:9200 -p 9300:9300 -v /home/project/es/node1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/project/es/node1/plugins:/usr/share/elasticsearch/plugins -v /home/project/es/node1/data:/usr/share/elasticsearch/data -v /home/project/es/node1/log:/usr/share/elasticsearch/log --name es-node1 elasticsearch:7.6.2
    

    这时候你会发现过会容器节点es-node1自动停止了。查查容器日志,如下

    本地系统最大虚拟值太小,一般就是本地没有设置,而用了默认的,打开

        sudo leafpad  /etc/sysctl.conf
    

    在sysctl.conf中找找vm.max_map_count,如果找不到就添加vm.max_map_count=262144
    退出编辑,执行加载

        sudo sysctl -p
    

    重新启动es-node1

    查询此时容器es-node1的IP地址

        sudo docker inspect es-node1 | grep '"IPAddress"'
    

    然后更改es-node1配置文件中的network.publish_host和discovery.seed_hostsd地址,其他两个节点也是如此。

  • node2

    sudo docker run --privileged -ti -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --network es-net -d -p 9201:9201 -p 9301:9301 -v /home/project/es/node2/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/project/es/node2/plugins:/usr/share/elasticsearch/plugins -v /home/project/es/node2/data:/usr/share/elasticsearch/data -v /home/project/es/node2/log:/usr/share/elasticsearch/log --name es-node2 elasticsearch:7.6.2
    

改配置ip同node1

  • node3

    sudo docker run --privileged -ti -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --network es-net -d -p 9202:9202 -p 9302:9302 -v /home/project/es/node3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/project/es/node3/plugins:/usr/share/elasticsearch/plugins -v /home/project/es/node3/data:/usr/share/elasticsearch/data -v /home/project/es/node3/log:/usr/share/elasticsearch/log --name es-node3 elasticsearch:7.6.2
    

改配置ip同node1

修改完所有节点的配置文件后记得重启所有节点。

9.测试结果

在浏览器端输入(ip是我本地的)http://172.18.0.2:9200/_cat/nodes?pretty
展示如下图

表示成功

10.安装Kibana

在docker中拉取Kibana

sudo docker pull kibana:7.6.2

创建kibana目录,并添加文件

    sudo chmod -R 777 kibana/config

    leafpad kibana/config/kibana.yml

配置文件内容

#Kibana的映射端口
server.port: 5601

#网关地址
server.host: "0.0.0.0"

#Kibana实例对外展示的名称
server.name: "kibana-192.168.31.190"

#Elasticsearch的集群地址,也就是说所有的集群IP
elasticsearch.hosts: ["http://172.18.0.2:9200","http://172.18.0.3:9201","http://172.18.0.4:9202"]

#设置页面语言,中文使用zh-CN,英文使用en
i18n.locale: "zh-CN"

#这个配置还没理解清楚………………
xpack.monitoring.ui.container.elasticsearch.enabled: true

安装容器

sudo docker run --privileged -ti -d -p 5601:5601 -v /home/project/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml --network es-net --name kibana kibana:7.6.2

成功后在浏览器输入地址(第一次启动会比较慢)http://127.0.0.1:5601,展示如下图

参考文章:https://blog.csdn.net/gfk3009/article/details/104560431/