zoukankan      html  css  js  c++  java
  • 多台服务器通过docker搭建ELK集群

    注意点

    • 服务器内存:要求不低于8G,如果4G,没有跑其他程序的话,应该也可以,低于4G基本不用考虑。
    • 我的系统:阿里云centOS7.1,执行cat /proc/version 查看linux version,不能低于3.10
    • 服务器列表: 172.168.50.41,172.168.50.40,172.168.50.240(在50.41上搭建ELK,其他两台服务器es节点)

    首先安装docker 和 docker-compose

    # 更新yum
        yum update
    
    # 移除docker旧版本(如果有的话)
        yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
    
    # 安装系统依赖
        yum install -y yum-utils device-mapper-persistent-data lvm2 
    
    # 添加docker源信息(下载速度比较快)
        yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    
    # 更新yum缓存
        yum makecache fast
    
    # 安装docker-ce
        yum -y install docker-ce
    
    # 启动docker后台服务
        sudo systemctl start docker
    
    # 配置阿里云镜像加速器(仅建议进行配置, 这里加速器地址仅用于展示,无加速功能,请使用自己的阿里云加速器,教程见百度,加速器免费)
        mkdir /etc/docker
        sudo tee /etc/docker/daemon.json <<-'EOF'
            {"registry-mirrors": ["https://6y4h812t.mirror.aliyuncs.com"]}
        EOF
        sudo systemctl daemon-reload
        sudo systemctl restart docker
    
    # 安装docker-compose
        cd /usr/local/src
        sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose  
        sudo chmod +x /usr/local/bin/docker-compose
        docker-compose --version  
    
    # 至此,docker 和docker-compose安装完毕, 如有错误,请留言,毕竟是之前写的自动安装脚本copy过来的。
    

    首先搭建三节点ES集群,以下步骤均需在三台服务器执行

    • 1、使用docker-compose,建立存放yml文件的目录
       建立文件夹,/root/elk(随意即可)
       mkdir /root/elk
    
    • 2、创建docker-compose.yml文件
        cd /root/elk
        touch docker-compose.yml
    

    -3、docker-compose.yml 的文件内容如下

    version: '3'
    services:
      elasticsearch:                    # 服务名称
        image: elasticsearch:7.1.1      # 使用的镜像
        container_name: elasticsearch   # 容器名称
        restart: always                 # 失败自动重启策略
        environment:                                    
          - node.name=node-41                   # 节点名称,集群模式下每个节点名称唯一
          - network.publish_host=172.168.50.41  # 用于集群内各机器间通信,其他机器访问本机器的es服务
          - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,
          - discovery.seed_hosts=172.168.50.40,172.168.50.240,172.168.50.41          # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
          - cluster.initial_master_nodes=172.168.50.40,172.168.50.240,172.168.50.41  # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
          - cluster.name=es-cluster     # 集群名称,相同名称为一个集群
          - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    # 设置内存
        ulimits:             
          memlock:
            soft: -1      
            hard: -1
        volumes:
          - /root/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
          - esdata:/usr/share/elasticsearch/data  # 存放数据的文件, 注意:这里的esdata为 顶级volumes下的一项。
        ports:
          - 9200:9200    # http端口
          - 9300:9300    # es节点直接交互的端口,非http
    volumes:
      esdata:
        driver: local    # 会生成一个对应的目录和文件,如何查看,下面有说明。
    
    • 4、另外两台服务器也照着这个配置进行配置,但IP,以及节点名称需要改一下即可。
    • 5、内存设置,三台服务器都需要
    两种方式:
    1、操作简单,但是机器重启后需再次设置
        sysctl -w vm.max_map_count=262144
    
    2、直接修改配置文件, 进入sysctl.conf文件添加一行(解决容器内存权限过小问题)
    
        vi /etc/sysctl.conf
    
        sysctl vm.max_map_count=262144
    
        sysctl -p 立即生效
    

    -6、es的配置文件

    • 在当前目录下"/root/elk" 执行 vim elasticsearch.yml
    • elasticsearch.yml 内容如下:
        network.host: 0.0.0.0
        http.cors.enabled: true      # 设置跨域,主要用于head插件访问es
        http.cors.allow-origin: "*"  # 允许所有域名访问
    
    {
      "cluster_name" : "es-cluster",
      "status" : "green",
      "timed_out" : false,
      "number_of_nodes" : 3,
      "number_of_data_nodes" : 3,
      "active_primary_shards" : 0,
      "active_shards" : 0,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 0,
      "delayed_unassigned_shards" : 0,
      "number_of_pending_tasks" : 0,
      "number_of_in_flight_fetch" : 0,
      "task_max_waiting_in_queue_millis" : 0,
      "active_shards_percent_as_number" : 100.0
    }
    
    • 9、使用head监控es集群
        // 拉取镜像
        docker pull mobz/elasticsearch-head:5
        // 启动
        docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5
    
    • 10、在浏览器输入http://IP:9100
        注意,IP地址要使用你es所在服务器的地址,然后点击连接,出现类似的显示说明,没问题,这里是三个节点,星星代表master。
    
        如果点击连接没有反应,F12查看network是403,或者200,但是console中提示跨域,那么说明跨域设置的有问题,直接进入容器中,使用 docker exec -it 容器ID /bin/bash ,检查/usr/share/elasticsearch/config/elasticsearch.yml文件,是否有以下两行:
        http.cors.enabled: true
        http.cors.allow-origin: "*"
    
    • 上面说到的顶级volumes, 如何查看挂载卷在宿主机的位置呢?
        # docker volume create elk_data // 创建一个自定义容器卷
        # docker volume ls // 查看所有容器卷
        # docker volume inspect elk_data // 查看指定容器卷详情信息, 包括真实目录
        注意: 如果你要删除一个挂载卷,或者重新生成,请执行删除卷操作
        # docker volume rm edc-nginx-vol  // 直接执行这个命令,同时会删除文件,但是先删除文件的话,必须执行此命令,否则可能导致该节点无法加入集群。
    

    以上都完成,则es三节点集群搭建完成,下面修改172.168.50.41服务器的/root/elk/docker-compose.yml文件,之前只是es,现在将支持ELK

    ELK 前置工作, 升级pip,预先拉取要使用的镜像

        // 下载elasticsearch,logstash,kibana, 自es5开始,一般三个软件的版本都保持一致了。
    
        docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.1 && docker pull docker.elastic.co/logstash/logstash:7.1.1 && docker pull docker.elastic.co/kibana/kibana:7.1.1
    

    ELK搭建

    • 1、建立存放elk配置文件的目录,
      cd /root/elk
      vim docker-compose.yml // 作为docker-compose启动elk这一组容器的引导文件
    • 2、docker-compose.yml文件内容如下
    version: '3'
    services:
      elasticsearch:                                                    # 服务名称
        image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1      # 使用的镜像
        container_name: elasticsearch7.1.1                              # 容器名称
        environment:                                                    # 环境变量
          - node.name=node-41                                           # 节点名称,集群模式下每个节点名称唯一
          - network.publish_host=172.168.50.41                          # 用于集群内各机器间通信,其他机器访问本机器的es服务
          - network.host=0.0.0.0                                        # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,
          - discovery.seed_hosts=172.168.50.40,172.168.50.240,172.168.50.41             # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
          - cluster.initial_master_nodes=172.168.50.40,172.168.50.240,172.168.50.41     # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
          - cluster.name=es-cluster                                     # 集群名称,相同名称为一个集群
          #- http.cors.enabled=true                                     # 是否支持跨域,是:true,主要用于head插件访问es,这里设置不起作用,原因未知,我们会将es的配置文件映射到宿主机进行修改
          #- http.cors.allow-origin="*"                                 # 表示支持所有域名,是:true,这里设置不起作用,原因未知,我们会将es的配置文件映射到宿主机进行修改
          - bootstrap.memory_lock=true                                  # 内存交换的选项,官网建议为true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"                            # 设置内存大小
        volumes:
          - esdata:/usr/share/elasticsearch/data                                           # 设置es数据存放的目录
          - /root/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 映射es容器中的配置文件到宿主机
        hostname: elasticsearch                                         # 服务hostname
        ulimits:                                                        # 是否限制内存
          memlock:
            soft: -1
            hard: -1
        restart: always                                                 # 重启策略
        ports:
          - 9200:9200                                                   # http端口
          - 9300:9300                                                   # es节点直接交互的端口,非http
      kibana:
        image: docker.elastic.co/kibana/kibana:7.1.1
        container_name: kibana7.1.1
        environment:
          - elasticsearch.hosts=http://elasticsearch:9200               # 设置连接的es节点
        hostname: kibana
        depends_on:
          - elasticsearch                                               # 依赖es服务,会先启动es容器在启动kibana
        restart: always
        ports:
          - 5601:5601                                                   # 对外访问端口
      logstash:
        image: docker.elastic.co/logstash/logstash:7.1.1
        container_name: logstash7.1.1
        hostname: logstash
        restart: always
        depends_on:
          - elasticsearch
        ports:
          - 9600:9600         # 这两个端口, 我进行测试其他功能用的,在本文中不用配置问题应该也不大。
          - 5044:5044
    volumes:                                                            # 顶级volumes
      esdata:
        driver: local                                                   # 会生成一个对应的目录和文件,如何查看,下面有说明。
    
    
    • 当前目录执行 docker-compose up -d 启动ELK服务
        出现done表示成功,docker-compose logs 查看日志(分别输出elk三个服务的日志)执行docker ps -a 可以看到三个服务的运行状态
        在浏览器输入http://IP:5601/ 访问kibana
    
    • 另外注意通过head连接ELK服务器的es,看看是否正常连接,如果三个es节点都正常,http://IP:5601也可以正常访问,那么ELK集群搭建完成。

    接下来,我会写一篇使用使用ELK + kafka(zookeeper) + filebeat 的实用架构方案。

  • 相关阅读:
    Debian Linux下的Python学习——控制流
    Ckeditor_3.6.4使用心得
    JavaScript学习(二)
    杂记
    JavaScript——Object类型
    Debian Linux下的Python学习——函数
    Debian Linux下的Python学习——入门
    Debian Linux下的Python学习——列表,元组和字典之列表
    JavaScript——数据类型
    Debian Linux下的Python学习——class
  • 原文地址:https://www.cnblogs.com/lz0925/p/12023521.html
Copyright © 2011-2022 走看看