Docker-compose构建ELK自然环境并同歩MS SQL Server数据信息

Docker上布署ELK,同歩 SQL SERVER 数据信息到ELK

序言

文中做为学习小结,供大伙儿参照:一次应用阿里云服务器(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 ,有许多配备要立即写在cmd上,假如必须再度运作就需要再写一遍主要参数很不方便。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 器皿。文中加上端口号标准如图所示:
    image

下面各自纪录 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。

  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查看及其人物角色管理权限、客户等內容,下一篇文章再再次。与此同时,下一篇文章可能汇总碰到的坑

评论(0条)

刀客源码 游客评论