前言

本文作为学习记录,供大家参考:一次使用阿里云(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

官网下载安装 DockerDocker 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 的配置

首先进行下述配置:

  1. 修改/etc/sysctl.conf:vm.max_map_count = 262144,修改完运行 sysctl -p使之生效或者退出当前终端重进使之生效。

  2. elasticsearch.yml 配置文件中的 xpack.license.self_generated.type 修改为 basic 来禁用 X-Pack 相关收费功能。

  3. 由于机器内存太小,导致实际运行中容器各种退出,我选择将 Elastic Stack 三者的 xpack.monitoring.enabled 统统关闭。打开 .yml,修改相应配置项为:

     xpack.monitoring.collection.enabled: false
    xpack.monitoring.enabled: false
  4. 特别注意,对于阿里云服务器,还需要配置安全组规则以开放 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 的内容请看文档:volumesbind-mounts and volumes

  1. 打开 docker-compose.yml 到文件末尾找到 volumes,在其下添加 named volume,如下所示:

     volumes:
    elasticsearch:
    logstash_logging:
    elasticsearch_logging:

    在此,一并将上文 Elasticsearch 的日志数据卷添加进去。

  2. 分别给 logstash 和 elasticsearch 配置 volumes 项,如下所示:

     - type: volume
    source: elasticsearch_logging
    target: /usr/share/elasticsearch/logs

    source 为刚才定义的 volumes 名字,target 为在 .yml 里配置 path.logs 的路径。

运行容器,然后运行docker volume lsdocker 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数据的更多相关文章

  1. 使用Docker快速搭建ELK环境

    今天由于Win系统的笔记本没带回家,其次Docker在非Linux系统下都需要安装额外的软件去镜像才行 所以感觉没有差别,先直接用Mac搭建一遍呢, 本篇部分命令和配置内容为摘抄 Mac下使用Dock ...

  2. elasticsearch与ms sql server数据同步

    MS SQL Server Download Elasticsearch Install Elasticsearch Follow instructions on https://www.elasti ...

  3. MS SQL SERVER数据导入MySQL

    1.sql server导出到xls,再导入到mysql中.亲测,单表数据量到百万以后,导出异常,可能由其它原因导致,没细纠.此种方式需要来回倒腾数据,稍繁琐. 2.采用kettle第三方的ETL工具 ...

  4. Docker Compose搭建ELK

    Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...

  5. Linux环境Perl链接MS Sql Server数据库

    1.下载相关软件 unixODBC.freetds和DBD-ODBC ①.Linux系统的ODBC unixODBC-2.3.4.tar.gz ( http://www.unixodbc.org) ② ...

  6. MS SQL Server迁移至Azure SQL(官方工具)

    前面,我有尝试过将MS SQL Server数据数据迁移至Azure SQL,请参考<MS SQL Server迁移至Azure SQL>,使用的是第三方工具,但现在官方更新了工具,我们尝 ...

  7. 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)

    0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...

  8. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  9. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

随机推荐

  1. MAC地址格式

    随机配置一个mac地址,发现有的会报出Cannot assign requested address. 错误码是EADDRNOTAVAIL. 检查不是组播地址也不是全0地址. 组播地址就是第一个字节最 ...

  2. 使用 Azure Container Registry 储存镜像

    Azure Container Registry(容器注册表)是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务. 可以创建和维护 Azure 容器注册表来存储与管 ...

  3. git的一些常用命令总结

    1.拉取代码Git clone  "链接名称" 2.新建分支 git checkout -b "分支名称" 3.提交代码步骤 (1)Git status查看项目 ...

  4. burp-suite(Web安全测试工具)教程

    Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...

  5. 2021ArchSummit全球架构师峰会上,大家在聊些什么

    大会PPT公开下载链接:https://ppt.infoq.cn/list/assh2021 大会主要情况介绍 2021 ArchSummit全球架构师峰会是该大会正式成立的第十年,是极客邦科技旗下I ...

  6. 运行程序显示丢失“MSVCR100D.dll”

    前言 写了一个Dll注入工具,结果发现程序在其他机器上会出现丢失"MSVCR100D.dll".这个dll是vs2010自带的动态链接库,如果在没安装vs2010运行库的电脑中使用 ...

  7. (转)netcore原生websocket客户端写法(ClientWebSocket)

    代码: using System; using System.Net.WebSockets; using System.Text; using System.Threading; using Syst ...

  8. 在Visual Studio 中使用git——文件管理-下(六)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  9. CentOS 7磁盘寻找不到,卡在sulogin,造成的开机失败问题--Error getting authority...

    今天早上使用内网gitlab仓库的时候,发现页面无法打开,ssh也无法连接. 到机房接上显示器,发现如下错误: Error getting authority: Error initializing ...

  10. 单臂路由实现不同vlan间通信

    单臂路由实现不同vlan间通信 拓扑图 PC配置 PC1 :192.168.1.1 vlan10 192.168.1.254 PC2 :192.168.2.1 vlan20 192.168.2.254 ...