赞
踩
之前写了一篇爬取新闻的文章,最终数据是存到了mysql中,考虑后续别的场景下有全文检索的类似需求,就想着搭建一套elk环境并把mysql数据抽取到logstash然后输出到es中,为后续全文检索场景做准备,或者叫踩坑。作为记录,也希望能对大家工作有所帮助吧。
服务器信息 | 操作系统 | 配置 | 安装软件 |
---|---|---|---|
kf202(172.16.10.202) | Centos 7 | 4C8G | kibana/logstash |
bd226(172.16.10.221) | Centos 7 | 8C64G | es集群(es01 es02 es03) |
PS: 由于bd226内存较大,就直接在一台上装了3个es实例来模拟集群,多台集群安装过程类似
安装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
# 下载到指定目录
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 查看。
主要是为了上传镜像,方便,可以使用私有镜像库,也可以使用公有云上的镜像仓库
示例中使用的仓库地址是172.16.10.205:5000/xxx, 根据实际情况替换成自己的真实的仓库地址即可
创建需要的目录,并修改权限
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 查看
编写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
通过如下命令进入到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
进入容器重新生成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节点的集群就搭建完成了。(有问题可以留言或者私信,一起交流…)
mkdir -p /opt/elk/kibana
执行如下脚本启动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
浏览器访问http://ip:5601 会提示输出es认证token
进入容器并生成kibana链接es需要的token
# 进入到es容器中
docker exec -it elasticsearch bash
# 容器内部执行下列命令
cd bin
elasticsearch-create-enrollment-token --scope kibana
执行完应该会看到打印在控制台的一段字符串,复制出来粘贴到浏览器的token输入框即可。
稍等一会会弹出输入用户名密码的对话框,输入es的用户名密码即可。
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
mkdir -p /opt/elk/logstash
cd /opt/elk/logstash
mkdir -p config data pipeline
目录说明:
在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这个索引,需要的前置配置是:
完成上述准备工作后,执行下面的命令启动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表里的数据展示;
通过kibana查看es中的数据:
kibana查看es各节点状态
本文介绍了通过docker-compose方式部署新版elk((8.6.2)集群的整体过程,相对来说还是比较简单清晰的。
后续会写通过javasdk获取es数据并实现检索的相关文章吧。
以上过程中有任何问题都可以留言或者私信,一起交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。