• 重要:安装es,ram至少要2G,如果加logstash连接数据库,还要再加内存,4G起

安装es和kibana

重要:建立docker网络,因为es和kibana要连接

1
docker network create elastic

安装es

1
2
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.9
docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9

安装kibana

1
2
docker pull docker.elastic.co/kibana/kibana:7.17.9
docker run -d --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.17.9

kibana改中文

把docker的文件复制出来到data路径下

1
docker cp kib01-test:/usr/share/kibana/config/kibana.yml /data

在文件中添加添加一行配置i18n.locale: "zh-CN"

kibana中文化

然后把修改的文件粘贴回去

1
docker cp /data/kibana.yml kib01-test:/usr/share/kibana/config/

拉取logstash镜像,版本要和es,kibana一致

1
docker pull logstash:7.17.9

下载 mysql connect文件,解压后将jar文件复制到data目录下

写logstash.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://172.17.0.5:3306/test"
jdbc_user => "root"
jdbc_password => "123456"
jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.27.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver" # 8.x版本的驱动类名
# jdbc_driver_class => "com.mysql.jdbc.Driver" # 5.x 版本的驱动类名

jdbc_paging_enabled => "true"
jdbc_fetch_size => "2000" # 每次查2000后即插入ES,避免OOM
jdbc_page_size => "2000"

# 这里类似crontab(但不完全是,还是有区别的),可以定制定时操作,比如每10分钟执行一次同步
schedule => "0 */10 * * * *" # 每10分钟运行一次。注意频率不要太高

# mysql文件, 也可以直接写SQL语句在此处,如下:
# statement_filepath => "/usr/share/logstash/mysql/mysql-to-es.sql"
statement => "SELECT
*
FROM
user202405"

# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
lowercase_column_names => false
# 处理中文乱码问题
codec => plain { charset => "UTF-8" }
}
}

output {
elasticsearch {
hosts => ["http://172.17.0.2:9200"]
index => "%{user_index}"
document_id => "%{user_id}"
user => "elastic"
password => "123456"
}
}

input 部分具体参数说明:

  • jdbc_connection_string:JDBC 连接字符串,用于连接 MySQL 数据库。这里指定了 IP 地址 172.17.0.5(注意这里是 Docker 内部 IP,可通过 docker inspect container_id 命令查看 Docker 内部 IP)。
  • jdbc_user:连接数据库的用户名。
  • jdbc_password:连接数据库的密码。
  • jdbc_driver_library:指定 JDBC 驱动的 jar 文件路径。
  • jdbc_driver_class:JDBC 驱动类,这里使用的是 com.mysql.cj.jdbc.Driver
  • jdbc_paging_enabled:启用分页查询,这里设置为 true
  • jdbc_fetch_size:每次查询返回的数据量,这里设置为 2000,以避免内存溢出(OOM)。
  • jdbc_page_size:每页查询的数据量,这里设置为 2000。
  • schedule:定时任务的调度设置,类似于 Crontab 表达式。
  • statement:SQL查询语句(也可以使用 statement_filepath 指定 SQL 文件的地址)。
  • lowercase_column_names:是否将字段名转换为小写,这里设置为 false。
  • codec:指定字符编码,这里设置为 UTF-8,以处理中文乱码问题。

output 部分具体参数说明:

  • hosts:Elasticsearch 集群的地址。
  • index:指定 Elasticsearch 索引的名称,这里使用了动态索引名 %{user_index},表示根据 MySQL 数据表中的 user_index 字段来决定索引名称。
  • document_id:指定 Elasticsearch 文档的 ID,这里使用了动态ID %{user_id},表示根据 MySQL 数据表中的 user_id 字段来决定文档 ID。
  • user:连接 Elasticsearch 的用户名(如果 Elasticsearch 没有设置,这个配置项可为空)。
  • password:连接 Elasticsearch 的密码(如果 Elasticsearch 没有设置,这个配置项可为空)。

创建容器并启动

1
2
3
docker run -d -v /home/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /home/logstash/mysql-connector-j-9.0.0.jar:/usr/share/logstash/mysql-connector-j-9.0.0.jar \
--name logstash:7.17.9 logstash:7.17.9

我服务器ram太小,等扩容后再验证