【工作记录】docker-compose搭建最新版elk集群

背景

之前写了一篇爬取新闻的文章,最终数据是存到了mysql中,考虑后续别的场景下有全文检索的类似需求,就想着搭建一套elk环境并把mysql数据抽取到logstash然后输出到es中,为后续全文检索场景做准备,或者叫踩坑。作为记录,也希望能对大家工作有所帮助吧。

服务器信息

服务器信息操作系统配置安装软件
kf202(172.16.10.202)Centos 74C8Gkibana/logstash
bd226(172.16.10.221)Centos 78C64Ges集群(es01 es02 es03)

PS: 由于bd226内存较大,就直接在一台上装了3个es实例来模拟集群,多台集群安装过程类似

基础环境搭建

1. docker-ce 安装及配置

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce
yum -y install docker-ce-18.06.1.ce-3.el7

镜像源配置

mkdir -p /etc/docker
cd /etc/docker
vim daemon.json
{ 
  # 以下是我自己的配置,可以使用自己的账号登录到相关的云平台查看并替换
  "registry-mirrors": [
        "https://tcf1itm4.mirror.aliyuncs.com",
        "https://ue4pbmxq.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"]
}

解决docker pull 提示server gave HTTP response to HTTPS client的问题

vim /usr/lib/systemd/system/docker.service
# 修改下面这行的内容 
ExecStart=/usr/bin/dockerd --insecure-registry 172.16.10.205:5000

# 刷新
systemctl daemon-reload
systemctl restart docker
2. 安装docker-compose 3
# 下载到指定目录
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改权限
chmod +x /usr/local/bin/docker-compose

安装完成后可以执行docker-compose version 查看。

3. 镜像仓库

主要是为了上传镜像,方便,可以使用私有镜像库,也可以使用公有云上的镜像仓库

示例中使用的仓库地址是172.16.10.205:5000/xxx, 根据实际情况替换成自己的真实的仓库地址即可

4. es基础镜像准备

创建需要的目录,并修改权限

mkdir -p /opt/elk
cd /opt/elk
mkdir -p es01/data es02/data es03/data
chmod 777 -R es01/data es02/data es03/data

在/opt/elk目录下编写Dockerfile, 基于8.6.2版本的镜像,同时使用内置的xpack插件生成https证书文件

FROM docker.elastic.co/elasticsearch/elasticsearch:8.6.2
RUN bin/elasticsearch-certutil ca --out config/elastic-stack-ca.p12 --pass ""
RUN bin/elasticsearch-certutil cert --pass "" --days 1825 --ca config/elastic-stack-ca.p12 --ca-pass "" --out config/elastic-certificates.p12

编辑完成后保存并退出。
继续执行下列命令生成镜像并上传到仓库。

docker build -t .
docker tag elasticearch-with-certs:latest <your registry addr>:<your  registry port>/elasticsearch-with-certs:1.0
docker push <your registry addr>:<your registry port>/elasticsearch-with-certs:1.0

如有报错先自行百度解决,解决不了的可以评论区留言或者私信。

执行完成后可以通过docker images 查看

单机三节点es搭建

1. 添加主节点

编写docker-compose.yml文件,对格式要求比较严格,一定要注意对齐和缩进。

version: '3'
services:
  es01:
    image: 172.16.10.205:5000/elasticsearch-with-certs:1.0
    container_name: es01
    environment:
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
      - "NETWORK_HOST=172.16.10.221"
    ulimits:
      memlock: -1
    volumes:
      - /opt/elk/es01/data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - elastic
networks:
  elastic:
    driver: bridge
    enable_ipv6: false

先创建一个容器,由于使用了内置的https安全配置,一会需要生成相关配置参数,这里就采用先部署一个实例,再加入另外两个实例到集群的方式。

启动容器

docker-compose up -d

可以通过如下命令查看对应日志

docker logs -f es01 --tail 200

不出意外这里应该是可以正常启动的,创建容器之前会创建网络elk_elastic

2. 添加子节点

通过如下命令进入到es01容器内部并生成加入集群需要的token

docker exec -it es01 bash
cd bin
elasticsearch-create-enrollment-token -s node

执行完成后会看到控制台有一堆文本输出,将其复制出来,一会需要用到。

修改docker-compose.yml,再添加两个es节点,同时加入到es01所在的集群里。

version: '3'
services:
  es01:
    image: 172.16.10.205:5000/elasticsearch-with-certs:1.0
    container_name: es01
    environment:
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
      - "NETWORK_HOST=172.16.10.221"
    ulimits:
      memlock: -1
    volumes:
      - /opt/elk/es01/data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - elastic
  # 从这里开始是本次新增内容
  es02:  
    image: 172.16.10.205:5000/elasticsearch-with-certs:1.0
    container_name: es02
    environment:
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
      - "ENROLLMENT_TOKEN=<替换成前面复制出来的token>"
    ulimits:
      memlock: -1
    volumes:
      # 注意这里的目录不能一样
      - /opt/elk/es02/data:/usr/share/elasticsearch/data
    ports:
      # 注意这里的端口映射,因为在一台机器部署,要考虑端口冲突的问题
      - 9202:9200
      - 9302:9300
    networks:
      - elastic
  es03:
    image: 172.16.10.205:5000/elasticsearch-with-certs:1.0
    container_name: es03
    environment:
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
      - "ENROLLMENT_TOKEN=<替换成前面复制出来的token>"
    ulimits:
      memlock: -1
    volumes:
      - /opt/elk/es03/data:/usr/share/elasticsearch/data
    ports:
      - 9203:9200
      - 9303:9300
    networks:
      - elastic
networks: 
  elastic: 
    driver: bridge
    enable_ipv6: false 

再次执行docker-compose up -d 命令,即可启动es02 es03

3. 测试

进入容器重新生成elastic这个用户的密码,用于测试和后续使用。

docker exec -it es01 bash
cd bin
elasticsearch-reset-password -u elastic

执行完成后会在控制台输出一段密码文本,复制出来后续使用。

通过curl测试各个节点:

curl -u elastic:<之前复制的密码文本> https://localhost:9200 --insecure
curl -u elastic:<之前复制的密码文本> https://localhost:9202 --insecure
curl -u elastic:<之前复制的密码文本> https://localhost:9203 --insecure

正常情况下会输出节点的基本信息,如下所示:

[root@bd226 ~]# curl -u elastic:9PmdZUjnEL-Kf=V__fCZ https://localhost:9200 --insecure
{
  "name" : "c5935fa91283",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "67odY4CLSIOUhxGUj8p1ZA",
  "version" : {
    "number" : "8.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2d58d0f136141f03239816a4e360a8d17b6d8f29",
    "build_date" : "2023-02-13T09:35:20.314882762Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
[root@bd226 ~]# curl -u elastic:9PmdZUjnEL-Kf=V__fCZ https://localhost:9202 --insecure
{
  "name" : "3877592028ee",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "67odY4CLSIOUhxGUj8p1ZA",
  "version" : {
    "number" : "8.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2d58d0f136141f03239816a4e360a8d17b6d8f29",
    "build_date" : "2023-02-13T09:35:20.314882762Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

可以看到cluster_uuid是一样的,也就是在一个集群里了。

我们再通过访问node接口查询下节点信息,可以看到确实是三个节点的集群。

[root@bd226 ~]# curl -u elastic:9PmdZUjnEL-Kf=V__fCZ https://localhost:9200/_cat/nodes --insecure
172.17.0.3 46 70 5 0.19 0.43 0.64 cdfhilmrstw - 3877592028ee
172.17.0.4 48 70 5 0.19 0.43 0.64 cdfhilmrstw - 94250eb86c08
172.17.0.2 48 70 5 0.19 0.43 0.64 cdfhilmrstw * c5935fa91283

如果以上步骤都没问题的话,es单机3节点的集群就搭建完成了。(有问题可以留言或者私信,一起交流…)

运行kibana及汉化

1. 创建对应目录
mkdir -p /opt/elk/kibana
2. 运行容器

执行如下脚本启动kibana

# 启动kibana容器 kibana:latest并不是最新版本,需要显式指定版本号
docker run -it -d \
-p 5601:5601 \
--name kibana --restart=always \
kibana:8.6.2 

查看kibana运行日志

docker logs -f kibana --tail 200
3. 访问及token生成

浏览器访问http://ip:5601 会提示输出es认证token

进入容器并生成kibana链接es需要的token

# 进入到es容器中
docker exec -it elasticsearch bash

# 容器内部执行下列命令
cd bin
elasticsearch-create-enrollment-token --scope kibana

执行完应该会看到打印在控制台的一段字符串,复制出来粘贴到浏览器的token输入框即可。

稍等一会会弹出输入用户名密码的对话框,输入es的用户名密码即可。

4. kibana的汉化

docker运行kibana后,默认生成的配置文件目录在容器中的/usr/share/kibana/config/kibana.yml

通过命令将容器中的默认配置文件复制出来,加入i18n.locale: “zh-CN”

docker cp kibana:/usr/share/kibana/config/kibana.yml:kibana.yml

最终的kibana.yml(除了最后一行是新加的,前面的都是自动生成的,也可以根据需要调整)

### >>>>>>> BACKUP START: Kibana interactive setup (2023-03-08T03:16:04.095Z)

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
#server.host: "0.0.0.0"
#server.shutdownTimeout: "5s"
#elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#monitoring.ui.container.elasticsearch.enabled: true
### >>>>>>> BACKUP END: Kibana interactive setup (2023-03-08T03:16:04.095Z)

# This section was automatically generated during setup.
server.host: 0.0.0.0
server.shutdownTimeout: 5s
elasticsearch.hosts: ['https://172.17.0.2:9200']
monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE2NzgyNDUzNjMwNTI6Tnc3SlJjZFpUQWlfNG9QYUVGQmVjdw
elasticsearch.ssl.certificateAuthorities: [/usr/share/kibana/data/ca_1678245364090.crt]
xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: ['https://172.17.0.2:9200'], ca_trusted_fingerprint: 4bdfc4276d404f288fdf8a3054b7b27d00b6288a0b061842c9391ce918232582}]
# 添加汉化代码
i18n.locale: "zh-CN"

复制kibana.yml 文件到容器指定位置再重启容器即可生效。

# 复制配置好的kibana.yml 到容器对应位置
docker cp kibana.yml kibana:/usr/share/kibana/config/kibana.yml
# 重启容器
docker restart kibana

运行logstash

1. 创建相关目录
mkdir -p /opt/elk/logstash
cd /opt/elk/logstash
mkdir -p config data pipeline

目录说明:

  • config: 配置文件目录
  • data: 数据文件目录
  • pipeline: 管道配置目录
2. 添加配置

在config目录下新建logstash.yml文件,内容输入http.host: “0.0.0.0”

在pipeline目录下新建logstash.conf文件,内容如下:

input {
  jdbc {
    jdbc_driver_library => "/usr/share/logstash/mysql-connector-j-8.0.32.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    # 这里需要替换jdbc_url,username和password
    jdbc_connection_string => "jdbc:mysql://172.16.10.202/spiderflow?useSSL=false&useUnicode=true&characterEncoding=UTF8&autoReconnect=true"
    jdbc_user => "root"
    jdbc_password => "123456"
    jdbc_paging_enabled => true
    tracking_column => "unix_ts_in_secs"
    use_column_value => true
    tracking_column_type => "numeric"
    # 定时执行 这里设置的是30分钟,可自行调整
    schedule => "* /30 * * * *"
    statement => "SELECT *, UNIX_TIMESTAMP(update_time) AS unix_ts_in_secs FROM ydstu_news WHERE (UNIX_TIMESTAMP(update_time) > :sql_last_value AND update_time < NOW()) ORDER BY update_time ASC"
  }
}

filter {
  mutate {
    copy => { "id" => "[@metadata][_id]"}
    remove_field => ["id", "@version", "unix_ts_in_secs"]
  }
}

output {
    stdout {
      codec => rubydebug
    }
 
    elasticsearch {
      # 这里替换成es的ip和端口
      hosts => ["https://172.16.10.221:9200"]
      index => "spiderflow_news"
      document_id => "%{[@metadata][_id]}"
      ssl => true
      ilm_enabled => true
      ssl_certificate_verification => false
      api_key => "BKbMv4YBRKtCJUZ3cNQJ:U0Rc2BIGSKSF1KDKjmzInw"
    }
}

上面配置实现的是定时从mysql读取增量数据,输出到es里,同时创建了spiderflow_news这个索引,需要的前置配置是:

  • mysql数据库+表,表里需要有id字段及更新时间字段(字段名称无所谓,主要需要标识出数据变更时间,上次同步时间之后更新进数据库的数据会被认为是增量数据)
  • 需要上传mysql-connector-j-8.0.32.jar(版本可以自己选,但是需要对应目录里的这个jar包)到对应目录,可以选择直接拷贝容器外的文件到容器里,也可以通过挂载映射进去
  • 需要在kibana页面上创建一个APIkey,用于访问https加密后的es集群的认证,当然也有其他方式可以实现,具体可以参考官方文档。
3. 运行容器

完成上述准备工作后,执行下面的命令启动logstash

docker run -it -d --name logstash \
-v /opt/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /opt/elk/logstash/pipeline/:/usr/share/logstash/pipeline \ logstash:8.6.2

启动后正常的话应该是可以在日志文件里看到对应数据的json信息。

最终效果展示

mysql表里的数据展示;

mysql数据展示
通过kibana查看es中的数据:
kibana查看es数据
kibana查看es各节点状态
查看es节点信息1
查看es节点信息2

问题

  1. kibana访问es的时候可能是通过容器内部网络访问,存在网路不通的问题,可以通过添加路由解决。

总结

本文介绍了通过docker-compose方式部署新版elk((8.6.2)集群的整体过程,相对来说还是比较简单清晰的。

后续会写通过javasdk获取es数据并实现检索的相关文章吧。

以上过程中有任何问题都可以留言或者私信,一起交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泽济天下

你的鼓励是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值