xiaoming728

xiaoming728

Docker部署ElasticSearch、ELK、canal组件

Docker部署ElasticSearch、ELK、canal组件

一、ElasticSearch

1、ElasticSearch简介

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。

2、Docker安装ElasticSearch

拉取镜像

docker pull elasticsearch:7.6.2

查看镜像

docker images

运行容器

docker run -d -p 9200:9200 -p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
--name elasticsearch  \
elasticsearch:7.6.2

把配置文件挂载到主机上

docker run -d -p 9200:9200 -p 9300:9300 \
-v /home/docker/elasticsearch/config:/usr/share/elasticsearch/config \
-v /home/docker/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/docker/elasticsearch/logs:/usr/share/elasticsearch/logs \
-e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
-e "discovery.type=single-node" \
--name elasticsearch \
elasticsearch:7.6.2

  • -e "discovery.type=single-node" 设置为单节点

  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 在启动时要设置ES的初始内存和最大内存,初始设置为2G,可能因为过大导致启动不了ES。

访问ES,查看ES相关信息(ip:9200)

容器已经启动完成。现在可以在浏览器输入 ip + 端口号访问。

安装ElasticSearch的中文分词器IK

使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题。

  • 下载Ik分词器地址

下载Ik分词器地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2

注意:IK分词器版本号应和ES版本号一致

  • 进入容器

docker exec -it elasticsearch /bin/bash
  • 在/usr/share/elasticsearch/plugins目录下创建ik文件夹

mkdir /usr/share/elasticsearch/plugins/ik
docker cp  /home/elasticsearch-analysis-ik-7.6.2.zip  elasticsearch:/usr/share/elasticsearch/plugins/ik/
docker exec -it elasticsearch  /bin/bash
 cd /usr/share/elasticsearch/plugins/ik
 unzip elasticsearch-analysis-ik-7.6.2.zip 
 rm -rf  elasticsearch-analysis-ik-7.6.2.zip
  • 退出容器并重启容器

exit
docker restart  elasticsearch
  • 测试效果

未使用ik,使用默认
POST archives_info/_analyze
{
  "text": "我是中国人"
}

使用ik分词器
POST archives_info/_analyze
{
  "analyzer": "ik_max_word",
  "text": "我是中国人"
}

二、ElasticSearch Head管理界面

1、ElasticSearch Head简介

elasticsearch-head将是一款专门针对于elasticsearch的客户端工具。提供集群管理、数据可视化、增删改查工具, elasticsearch语句可视化等功能。

2、Docker安装ElasticSearch Head

拉取镜像

docker pull mobz/elasticsearch-head:5

运行容器

因和后面Canal配置端口冲突此处映射端口改为9001

docker run -d -p 9001:9100 --name elasticsearch-head mobz/elasticsearch-head:5

访问并连接elasticsearch(ip:9001)

可能遇到的问题

  • 可能会出现跨域拒绝访问问题,无法连接ES服务

解决方法:

进入elasticsearch容器内部,修改配置文件elasticsearch.yml

cd ./config
vim elasticsearch.yml 

在elasticsearch.yml中添加:

http.cors.enabled: true
http.cors.allow-origin: "*"

重启 elasticsearch容器

  • Docker容器ElasticSearch-Head创建索引无响应406

解决方法:修改head的 Content-Type 设置,需要安装vi

1、进入容器
docker exec -it 容器id /bin/bash
2、修改vendor.js
vim /usr/src/app/_site/vendor.js
3、6886行 /contentType: "application/x-www-form-urlencoded 
   改成 contentType: "application/json;charset=UTF-8" 
  7574行 var inspectData = s.contentType === "application/x-www-form-urlencoded" &&` 
    改成 var inspectData = s.contentType === "application/json;charset=UTF-8" &&
4、退出容器,重启容器

三、ElasticSearch监控工具 - cerebro

1、cerebro简介

  • 监控es集群状态

  • 管理es节点信息

  • 通过REST结构对索引进行操作

2、docker安装cerebro

拉取镜像

docker pull lmenezes/cerebro

运行容器

docker run -d --name cerebro -p 9001:9000 lmenezes/cerebro

注意:cerebro的9000端口会与Portainer端口重复,所以这里映射成9001端口。

访问cerebro,连接es服务(ip:9001)

四、ELK Stack

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elastic Stack 是 ELK Stack 的更新换代产品。新增了一个Beats,它是一系列轻量型的单一功能数据采集器,如Filebeat它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

1、Docker安装Kibana

拉取镜像

docker pull kibana:7.6.2

注意:版本必须与es一致

运行容器

docker run -d -p 5601:5601 --link 37d1e505576f:elasticsearch --name kibana f70986bc5191

37d1e505576f:es的容器id

访问域名:5601

汉化kibana

安装后,默认是英文的,可以修改一下kibana的配置文件,显示成中文

登录容器,然后修改配置文件kibana.yml加上一行配置i18n.locale: zh-CN

重启kibana

常用工具:用来通过rest请求查询es中数据

2、Docker安装Logstash

拉取镜像

docker pull logstash:7.6.2

运行容器

docker run --name logstash -d -p 5044:5044 fa5b3b1e9757

根据实际需要配置logstash

3、Docker安装Filebeat

拉取镜像

docker pull elastic/filebeat:7.6.2

运行容器

// 临时启动容器
docker run -d --name=filebeat elastic/filebeat:7.6.2
// 拷贝数据文件
docker cp filebeat:/usr/share/filebeat ./

五、canal

1、canal简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

简单来说canal的原理是根据mysql的主从复制原理实现的,canal伪装成slave库从而向master库读取binlog日志获取增量日志。

canal-admin(非必须但推荐使用):为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

canal-server:服务端,从mysql读取binlog日志获取增量日志,可以通过tcp、kafka、RocketMQ等方式与客户端通信;通过zookeeper搭建集群。

canal-adapter:客户端,根据canal-server获取的增量日志执行适配到其他诸如elasticsearch、redis、mysql等端,实现数据同步。

2、准备

1)使用canal-server需要先准备mysql,对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,/mysql.conf.d/mysqld.cnf中配置如下:

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

配置完成后重启mysql,并查询是否配置生效:

show variables like 'log_bin%';
show variables like 'binlog_format%';

2)授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant。

CREATE USER canal IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

3、docker安装canal-admin

拉取镜像

docker pull canal/canal-admin:latest

运行容器

docker run -d -p 8089:8089 -e server.port=8089 --name canal-admin canal/canal-admin

用户名:admin

密码:123456

4、docker安装canal-server

拉取镜像

docker pull canal/canal-server:latest

运行容器

docker run -d -p 9100:9100 -p 11110:11110 -p 11111:11111 -p 11112:11112 \
-v /home/docker/canal-server/logs:/home/admin/canal-server/logs \
-e canal.admin.manager=192.168.8.128:8089 \
-e canal.admin.port=11110 \
-e canal.admin.user=admin \
-e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441 \
--name=canal-server \
--restart=always \
canal/canal-server

应用配置

canal-server启动完成后访问canal-admin链接(IP:8089)因为docke启动的时候配置admin地址,canal-admin服务管理里会自动识别到canal-server的服务

第一步:现在 Instance 管理里添加一个实例,先输入实例名称和选择服务,点击载入模板修改数据库配置

...
# position info
canal.instance.master.address=192.168.8.128:3306
...
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=linewell@123
# table regex
canal.instance.filter.regex=archives_center\\..*
# mq config
canal.mq.topic=example
canal.mq.partition=0

第二部:在Server 管理中选择操作下拉框配置,在配置文件99行添加刚配置的实例名称,多个用,(逗号)隔开

#################################################
######### 		destinations		#############
#################################################
canal.destinations = archives

5、docker安装canal-adapter

拉取镜像

docker pull liazhan/canal-adapter:v1.1.5

运行容器

docker cp canal-adapter:/opt/canal/adapter/conf /home/docker/canal-adapter
docker run -d -p 8081:8081 \
-v /home/docker/canal-adapter/conf:/opt/canal/adapter/conf \
-v /home/docker/canal-adapter/logs:/opt/canal/adapter/logs \
--name canal-adapter \
liazhan/canal-adapter:v1.1.5 

应用配置

修改/conf/application.yml配置文件中的canalServerHost、数据源及instance和ES服务器地址

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null
# canal conf
canal.conf:
  mode: tcp
  canalServerHost: 192.168.8.128:11111 # canal server host
  batchSize: 500
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  username:
  password:
  vhost:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://192.168.8.128:3306/archives_center?useUnicode=true
      username: canal
      password: linewell@123
  canalAdapters:
  - instance: archives # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es7
        hosts: 192.168.8.128:9300 # 127.0.0.1:9200 for rest mode
        properties:
          mode: transport # or rest
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: docker-cluster

参考文献

1、Docker安装ElasticSearch

https://blog.csdn.net/qq_32101993/article/details/100021002

2、docker安装elasticsearch及head插件

https://www.cnblogs.com/afeige/p/10771140.html

3、Docker容器ElasticSearch-Head创建索引无响应406

https://blog.csdn.net/gang_luo/article/details/104210051/

4、docker搭建cerebro(elasticsearch监控工具)

https://blog.csdn.net/wyfsxs/article/details/89305935

5、使用Docker安装IK分词器

https://blog.csdn.net/qq_49470767/article/details/112463810

6、安装Kibana:7.6.2完整教程

https://blog.csdn.net/WoAiShuiGeGe/article/details/106647832

7、docker部署elk时汉化Kibana服务

https://www.cnblogs.com/abclife/p/12697866.html

8、docker logstash安装

https://blog.csdn.net/qq_33547169/article/details/86629261

9、docker安装canal同步mysql8与elasticsearch7数据

https://blog.csdn.net/daziyuanazhen/article/details/106098887

10、github——canal

https://github.com/alibaba/canal