Docker-compose搭建ELK环境并同步MS SQL Server数据
前言
本文作为学习记录,供大家参考:一次使用阿里云(Aliyun)1核2G centos7.5 云主机搭建Docker下的ELK环境,并导入MS SQL Server的商品数据以供Kibana展示的配置过程。
关于Docker配置,本文直接使用开源项目 docker-elk(该项目维护了一个 Docker Compose 版的 Elastic Stack), 在其上做简单修改。
参考文章:
SQL Server数据同步到ELK
使用 Docker 搭建 ELK 环境
1. 环境准备
1.1 Docker & Docker Compose
官网下载安装 Docker 和 Docker Compose
注:对于 Win/MacOS系统安装 Docker 后自带 Docker Compsoe,不需要再次安装。
Docker安装好后,建议先配置相关权限,官方文档:linux-postinstall
1.2 docker-elk 项目
git clone https://github.com/deviantony/docker-elk.git /app/docker-elk
克隆到指定目录,这里指定到 /app/docker-elk
该项目初始结构(elk version 7.13)如下:
├── docker-compose.yml
├── docker-stack.yml
├── elasticsearch
│ ├── config
│ │ └── elasticsearch.yml
│ └── Dockerfile
├── extensions
│ ├── apm-server
│ ├── app-search
│ ├── curator
│ ├── logspout
├── kibana
│ ├── config
│ │ └── kibana.yml
│ └── Dockerfile
├── LICENSE
├── logstash
│ ├── config
│ │ └── logstash.yml
│ ├── Dockerfile
│ └── pipeline
│ └── logstash.conf
└── README.md
└── .env
1.3 docker compose
据官网介绍,docker compose 是一个方便配置多 container 的工具。之前一个容器一个容器的 run ,有好多配置要直接写在命令行上,如果需要再次运行就要再写一遍参数很不方便。compose 文档:docker-compsoe
注:项目根目录下的 .env 文件中定义了一个变量,指定了 elk 的版本,默认是 latest。可自行修改,修改后需要 build 才会生效:docker-compose build
。欲知详情请参考项目文档。
要运行 docker compose 项目,请切换到项目根目录,然后运行 docker-compose up [service name]
命令,如果不指定 service name,则启动所有服务。至于停止运行等其他的命令,请去参考文档内容。这里建议初次使用之前至少认真阅读一遍文档。
2 Elastics Stack 的配置
首先进行下述配置:
修改
/etc/sysctl.conf
:vm.max_map_count = 262144
,修改完运行sysctl -p
使之生效或者退出当前终端重进使之生效。elasticsearch.yml 配置文件中的
xpack.license.self_generated.type
修改为basic
来禁用 X-Pack 相关收费功能。由于机器内存太小,导致实际运行中容器各种退出,我选择将 Elastic Stack 三者的
xpack.monitoring.enabled
统统关闭。打开 .yml,修改相应配置项为:xpack.monitoring.collection.enabled: false
xpack.monitoring.enabled: false
特别注意,对于阿里云服务器,还需要配置安全组规则以开放 docker 的端口,否则外网无法访问 docker 容器。本文添加端口规则如图:
接下来分别记录 Elastic Stack 的配置。需要说明的是,关于这三者的配置,前面提到过,编排文件可以极大的方便 docker 的容器配置,尤其是多容器场景,使 docker 更方便的 run。同时,每个容器在编排文件里的环境变量(?) enviroment 里也可以进行此容器本身的配置。也就是说,本文要配置的 Elastic Stack,既可以找到他们各自目录里的 .yml 在里面写配置项,也可以在编排文件里找到各容器的 environment 属性,在其下写配置项。
2.1 Elasticsearch
Docker compose 编排文件(docker-compose.yml)里的 Elasticsearch service 定义了 Elasticsearch 的 docker 配置,以及一些 Elasticsearch 本身的运行参数。本文主要进行了 Elasticsearch logging 写入文件并持久化保存到磁盘以及跨域开启这两点设置。
2.1.1 跨域
首先进行跨域开启设置。为了能用 elasticsearch-head 插件访问 elasticsearch,elasticsearch 需要开启跨域。
如前所述,直接在 docker-compose.yml 里配置和在 elasticsearch.yml 里配置这两种方式都可以。本文直接在编排文件里配。找到 elasticsearch service 的 environment 属性,在其下添加(参考 elasticsearch-head 文档):
http.cors.enabled: "true"
http.cors.allow-origin: "*"
因为 docker-elk 项目初始的 Elastic Stack 都有认证机制,故还需要添加:
http.cors.allow-headers: "Content-Type,Content-Length,Authorization"
http.cors.allow-credentials: "true"
此时,启动 elasticsearch 容器:docker-compose up elasticsearch
,浏览器用 elasticsearh-head 访问 http://yourhost:9200/ 可以看到仍无法连接,打开F12,会发现 ERROR CODE 401。这时参考 elasticsearch-head 文档中的说明,在地址后添加认证信息:http://yourhost:9100/?auth_user=elastic&auth_password=changeme
。注意,本文这里的用户名和密码用的是默认的。
2.1.2 logging
Elasticsearch 的运行日志记录(logging)一般而言不需要,但本文在此次部署过程中发生了多起 elasticsearch 的报错事件,为方便填坑学习,本文配置日志记录并做持久化。
Elastic Stack 运行日志默认输出到 console,在屏幕上可以看到,但是写到文件里则需要配置日志保存的路径(容器内的路径):
path.logs: /usr/share/elasticsearch/logs
下一步是配置 log4j2.properties 这个文件。在 elasticsearch config 下新建一个文件,叫做log4j2.properties
。其内容本文选择从容器内拷贝过来。注意,容器内有两个长得比较像的文件,一个是 log4j2.properties
,另一个是log4j2.file.properties
。其区别是后者多了日志写入到文件的配置。所以,后者的内容是我们需要拷贝的。
文件新建好后,需要绑定到容器内。打开 docker-compose.yml,在 elasticsearch 的 volumes 里添加:
- type: bind
source: ./elasticsearch/config/log4j2.properties
target: /usr/share/elasticsearch/config/log4j2.properties
read_only: true
当然,实现配置映射还有其他方式,本文采用上述这种方式,即通过绑定挂载文件的方式。关于绑定挂载下文会再次提及。
此时,启动容器,并进入容器内部,查看对应文件夹是否有 log 文件。如果没有 log 文件请逐一检查上述配置,有时可能只是笔误打错了字导致。
注:每次修改配置文件后需要重新启动。如果配置仍不生效,手动停止容器docker stop [container id]
然后手动启动docker-compose up logstash
。这里记录一下,docker-compose down
命令是停止并移除实例(docker-compose down -v
命令则会连同 volume 一起移除)。
关于 logging 的其他内容,参考官方文档
以上并没有对日志数据做持久化,这里先不进行此步,留待下文再说。
2.2 Logstash
本文主要的工作量其实都在Logstash,故 Logstash 的配置内容还是比较多的。
关于从 sql server 导入数据到 es,本文采用方案:https://www.cnblogs.com/baiyunchen/p/11216165.html
2.2.1 导入数据
首先,下载 jdbc jar 包,地址:https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017
下载后解压到相应路径。
然后,准备好一份 .conf 文件,下面给出模板。
input {
jdbc {
jdbc_driver_library => "/usr/local/logstash-7.2.0/lib/mssql-jdbc-7.2.2/mssql-jdbc-7.2.2.jre8.jar" # 这里请灵活应变,能找到我们上一步下载的jdbc jar包即可
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" # 这个名字是固定的
jdbc_connection_string => "jdbc:sqlserver: //数据库ServerIP:1433;databaseName=数据库名;"
jdbc_user => "数据库账号"
jdbc_password => "数据库密码"
schedule => "* * * * *" # Corn 表达式,请自行百度写法
jdbc_default_timezone => "Asia/Shanghai"
jdbc_page_size => "500" # 每一批传输的数量
record_last_run => "true" #是否保存状态
use_column_value => "true" #设置为时true,使用定义的 tracking_column值作为:sql_last_value。设置为时false,:sql_last_value反映上次执行查询的时间。
tracking_column => "LastModificationTime" #配合use_column_value使用
last_run_metadata_path => "/usr/opt/logstash/config/last_value" #记录:sql_last_value的文件
lowercase_column_names => "false" #将DB中的列名自动转换为小写
tracking_column_type => "timestamp" #tracking_column的数据类型,只能是numberic和timestamp
clean_run => "false" #是否应保留先前的运行状态,具体参考文档~~
#statement => "SELECT * FROM 表 WITH(NOLOCK) WHERE LastModificationTime > :sql_last_value" #从DB中抓数据的SQL脚本
statement_filepath => "/file/path/some.sql" #文件形式的SQL脚本,路径注意双引号括起来
}
}
output {
elasticsearch {
index => "your_index"
document_id => "%{Id}"
hosts => ["elasticsearch:9200"]
user => "elastic"
password => "changeme"
ecs_compatibility => disabled
}
}
上面的 input jdbc plugin 中 SQL 语句配置了 statement_filepath。因此对应的 some.sql 文件也需要通过 bind-mount 绑定到容器中。
关于 input 的 jdbc plugin,可以参考文档:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
这里再给出一份正式版本的 .conf 文件:
input {
jdbc {
jdbc_driver_library => "/usr/share/logstash/lib/sqljdbc_9.2/chs/mssql-jdbc-9.2.1.jre11.jar"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://yourip:1433;databaseName=yourDB;"
jdbc_user => "user_name"
jdbc_password => "your_passwd"
schedule => "*/15 * * * *"
jdbc_default_timezone => "Asia/Shanghai"
jdbc_page_size => "500"
record_last_run => "true"
#use_column_value => "true"
#tracking_column => "LastModificationTime"
last_run_metadata_path => "/usr/share/logstash/config/last_value"
lowercase_column_names => "false"
tracking_column_type => "timestamp"
clean_run => "false"
statement_filepath => "/usr/share/logstash/item_warehouse.sql"
#statement => "SELECT * FROM Table1 WITH(NOLOCK) WHERE (LastModificationTime >= :sql_last_value OR CreationTime >= :sql_last_value) AND IsDeleted=0"
}
}
filter {
mutate {
rename => {"Field1" => "字段1" "Field2" => "字段2" }
}
}
output {
elasticsearch {
index => "your_index"
document_id => "%{Id}"
hosts => ["elasticsearch:9200"]
user => "elastic"
password => "changeme"
ecs_compatibility => disabled
}
}
这里定时查询以跟踪表 Table1 的变化,依据是上一次查询时间。第一次查询的初始时间是'1970-01-01 08:00',具体请查看上述 jdbc 文档。这里的 filter 用来完成重命名字段名称的工作。
此时,运行 Elasticsearch 和 Logstash,在 head 插件上打开可以看到相应的 index 及其 document。
2.2.2 logging
与 Elasticsearch 一样,本文出于排除 Bug 的需要,配置 logstash 的 logging。参考:官方文档,pipeline logs
log 写入的配置与前文 Elasticsearch 一样,需要指定 logs 文件夹的路径。
另外,可以顺便指定 log 的 level 和格式。log level 默认是 info
级别的。在 yml 中添加如下三行。
log.level: info
path.logs: /usr/share/logstash/logs
log.format: plain
logstash 同样需要配置log4j2.properties
文件。如果不指定,则使用默认的文件。这里要注意,默认的文件是 docker 版的,比正常版本的简化了很多。这里贴出正常版本的 logstash (version 7.12)的log4j2.properties
地址:https://github.com/elastic/logstash/blob/7.12/config/log4j2.properties
新建的log4j2.properties
文件同样需要 bind mount,步骤与前文 Elasticsearch 雷同,此处不再赘述。
以上两点配置好后,运行 logstash,发现 logs 下会有相应文件。
下面将 log 保存到硬盘以持久化数据。思路是利用数据卷 volume。这里还可以用 bind mount 绑定挂载实现数据持久化到硬盘,不过本文没有深入探究。关于 volume 和 bind mount 的内容请看文档:volumes,bind-mounts and volumes。
打开 docker-compose.yml 到文件末尾找到 volumes,在其下添加 named volume,如下所示:
volumes:
elasticsearch:
logstash_logging:
elasticsearch_logging:
在此,一并将上文 Elasticsearch 的日志数据卷添加进去。
分别给 logstash 和 elasticsearch 配置 volumes 项,如下所示:
- type: volume
source: elasticsearch_logging
target: /usr/share/elasticsearch/logs
source 为刚才定义的 volumes 名字,target 为在 .yml 里配置 path.logs 的路径。
运行容器,然后运行docker volume ls
和docker volume inspect volume_name
命令查看 elasticsearch 和 logstash 的 volume 路径。
可以看到,在 elasticsearch logging 的目录下有相应的文件。而 logstash 下却没有。进入 logstash 容器,找到之前的 logs 文件夹,发现其为空文件夹。
这是因为,logstash 容器是以 logstash 用户运行的,而自动生成的 volume 数据卷的存储目录需要 root 权限。反观 elasticsearch,它默认是以 root 用户运行的。这一点在进入容器后也可以观察到。所以,本文的解决方案是,设置 logstash 以 root 用户启动,在编排文件 logstash 里添加属性user: root
,如下所示:
...
user: root
ports:
- "5044:5044"
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
...
到此,logstash 的基本配置已经完成,下面进行附加配置:logstash multiple pipelines 的配置。
之所以配置多管道,是想把 logging 的东西展示到 kibana 里,查看它执行的 SQL Statement 等信息。
在开始附加配置之前,先说一个问题。本文选择的阿里云实例配置比较低,容器运行过程中总是报 exited)
2.2.3 multiple pipelines
logstash 支持多 pipeline,参考:官方文档,pipeline logs
1.首先,创建新的 .conf 文件,本文选择在 logstash 的 pipeline 文件夹下创建。本文使用的文件如下:
######
input {
file {
path => "/usr/share/logstash/logs/logstash-plain.log"
#sincedb_path => "/usr/share/logstash/logs/sincedb"
sincedb_path => "/dev/null"
#tags => ["some-logs"]
}
}
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:tstamp}\]\[%{LOGLEVEL:loglevel} \]\[%{JAVACLASS:class}.*\] %{GREEDYDATA:logmessage}" }
}
date {
match => ["tstamp", "ISO8601"]
}
mutate {
remove_field => [ "tstamp" ]
}
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "logstash_logs-%{+YYYY.MM.dd}"
user => "elastic"
password => "changeme"
ecs_compatibility => disabled
}
stdout { }
}
}
本文在这里遇到一点问题,即新建文件的首行首字母会被“吞”掉,于是将首行作为注释行。
2.在 logstash 的 config 文件夹下新建一个文件叫做 pipelines.yml
,具体配置如下:
# This file is where you define your pipelines. You can define multiple.
# # For more information on multiple pipelines, see the documentation:
# # https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
#
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline/logstash.conf"
- pipeline.id: logs
path.config: "/usr/share/logstash/pipeline/logs.conf"
此处记录一下:本文在配置的时候,将 .conf 与 .yml 文件后缀搞混了,以致于耽误了很多时间。
同样地,配置文件写好需要挂载到容器内,给编排文件里的 logstash 添加此项:
- type: bind
source: ./logstash/config/pipelines.yml
target: /usr/share/logstash/config/pipelines.yml
read_only: true
启动 logstash,在 head 上可以看到 logging 的数据同步到了 es。
2.3 Kibana
Kibana的 yml 文件配置大致如下:
---
## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
xpack.monitoring.enabled: false
##
i18n.locale: "zh-CN"
## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme
#elasticsearch.username: kibana-system
#elasticsearch.password: mjHPFOvECWnAmeaKhMqf
i18n.locale这一行是设置Kibana的界面语言为中文。
...
设置完毕,启动 Kibana,访问 host 的 5601 端口开始使用。
关于 Kibana 设置索引模式、Discover、Dashboard、KQL查询以及角色权限、用户等内容,下篇文章再继续。同时,下篇文章将会总结遇到的坑
Docker-compose搭建ELK环境并同步MS SQL Server数据的更多相关文章
- 使用Docker快速搭建ELK环境
今天由于Win系统的笔记本没带回家,其次Docker在非Linux系统下都需要安装额外的软件去镜像才行 所以感觉没有差别,先直接用Mac搭建一遍呢, 本篇部分命令和配置内容为摘抄 Mac下使用Dock ...
- elasticsearch与ms sql server数据同步
MS SQL Server Download Elasticsearch Install Elasticsearch Follow instructions on https://www.elasti ...
- MS SQL SERVER数据导入MySQL
1.sql server导出到xls,再导入到mysql中.亲测,单表数据量到百万以后,导出异常,可能由其它原因导致,没细纠.此种方式需要来回倒腾数据,稍繁琐. 2.采用kettle第三方的ETL工具 ...
- Docker Compose搭建ELK
Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...
- Linux环境Perl链接MS Sql Server数据库
1.下载相关软件 unixODBC.freetds和DBD-ODBC ①.Linux系统的ODBC unixODBC-2.3.4.tar.gz ( http://www.unixodbc.org) ② ...
- MS SQL Server迁移至Azure SQL(官方工具)
前面,我有尝试过将MS SQL Server数据数据迁移至Azure SQL,请参考<MS SQL Server迁移至Azure SQL>,使用的是第三方工具,但现在官方更新了工具,我们尝 ...
- 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)
0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...
- Docker Compose 搭建 Redis Cluster 集群环境
在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...
- Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...
随机推荐
- 关于PHP动态的接收传递的GET,POST和COOKIE变量
0x01 我们知道 PHP 接收的变量最常用的是 GET,POST,COOKIE 这三个变量.GET变量是附在 url 后传输的,而 POST 变量是放在 http 包中传输的,COOKIE 则是浏览 ...
- Matlab学生账号创建激活使用
软件介绍 MATLAB主要用于数值分析.数值和符号计算.工程与科学绘图.控制系统的设计与仿真.数字图像处理.数字信号处理.通讯系统设计与仿真.财务与金融工程,是一款商业数学软件.MATLAB拥有丰富的 ...
- 续订Jetbrain学生包
今天打开IDEA和Pycharm都不约而同的告诉我我的账号无法使用学生包了 此刻我的内心是: 冷静下来我算了算,嗷,原来是一年的订阅期到了,那就简单了,直接续订吧,唉.其实续订和重新认证是一样的. 首 ...
- maven下载Oracle jar包
Oracle的jar包由于是收费的,所以当我们使用maven去下载时下载不下来,对于这种情况,可以用以下方式去处理: oracle官网下载应用地址:https://www.oracle.com/dow ...
- C# 变体(variance)
上节讲到了泛型,这节延申一下,讲一下变体. 变体(variance)是协变(convariance)和抗变(也说逆变contravariance)的统称.这个概念在.net 4中引入,在.net 2. ...
- MongoDB评论管理
MongoDB简介 文章评论数据分析 相较于一般数据,文章评论一般有如下特点: 数据量巨大.通常评论量要比帖子.文章大很多 写入操作频繁. 价值较低.一般来说,我们的主要目标还是在帖子(文章)本身. ...
- 云空调来自 GitHub 的冷气——GitHub 热点速览 v.21.20
作者:HelloGitHub-小鱼干 万物皆可上云,air-conditioner 是上周火爆小鱼干朋友圈和公众号信息流的云空调项目.第一眼的时候,你会觉得和这个云空调还挺别致的,第二眼,si~~感到 ...
- 解决Latex输出PDF纸张自适应大小及中文无法显示问题
遗留的问题 之前我们进行了基于texlive定制chemfig化学式转换Python服务镜像,虽然完成pdf的输出服务改造,但是输出效果并不是太好,如下图: 这个图有两个比较严重问题 不支持中文 空白 ...
- 屌炸天的3D引擎OpenCASCADE的用法及案例(转载之处:)
What CASCADE? Open CASCADE(简称OCC)平台是由法国Matra Datavision公司开发的CAD/CAE/CAM软件平台,可以说是世界上最重要的几何造型基础软件平台之一. ...
- 虚拟机快速下载安装配置aarch64-linux-gnu-gcc工具链
方式一:软件仓库安装 此方法不用自己去配置交叉编译工具链 1.查看本地仓库有支持哪些版本哪些 输入命令: apt-cache search aarch64 2.下载安装 gcc-8-aarch64-l ...