基于之前的文章,精簡(jiǎn)操作而來
- 讓ELK在同一個(gè)docker網(wǎng)絡(luò)下通過名字直接訪問
- Ubuntu服務(wù)器ELK部署與實(shí)踐
- 使用 Docker 部署 canal 服務(wù)實(shí)現(xiàn)MySQL和ES實(shí)時(shí)同步
- Docker部署ES服務(wù),canal全量同步的時(shí)候內(nèi)存爆炸,ES/Canal Adapter自動(dòng)關(guān)閉,CPU100%
1. 拉鏡像
docker pull elasticsearch:7.8.0
docker pull kibana:7.8.0
docker pull canal/canal-server:v1.1.5
docker pull slpcat/canal-adapter:v1.1.5-jdk8
docker pull mysql:5.7
2. mysql環(huán)境配置
2.1 新建mysql docker
首先新建數(shù)據(jù)庫的docker鏡像
docker run -p 3306:3306 --name mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
2.2 修改配置重啟
接下來去/data/mysql/conf
路徑下,新建my.cnf
文件,輸入以下內(nèi)容
[mysqld]
#binlog setting
log-bin=mysql-bin # 開啟logbin
binlog-format=ROW # binlog日志格式
server-id=1 # mysql主從備份serverId,canal中不能與此相同
docker restart重啟mysql
2.3 驗(yàn)證配置結(jié)果
新建新聞表
CREATE SCHEMA MyTest;
use MyTest;
create table News
(
id INT(11),
title VARCHAR(2125),
desc VARCHAR(2125),
image VARCHAR(2125),
url VARCHAR(2125),
source VARCHAR(2125),
date Date
)DEFAULT CHARSET=utf8;
檢查該新聞表的狀態(tài)
mysql -u root -p // mysql登錄
>show databases;
>use MyTest; // 開啟數(shù)據(jù)庫
>show variables like 'log_%';
>show variables like 'binlog_format';
>show master status; // binlog日志文件 mysql-bin.000001
>reset master; // 重置日志
2.4 查看日志文件
cd /var/lib/mysql // 進(jìn)入日志文件目錄
mysqlbinlog -vv mysql-bin.000001 // row格式查看日志
3. ES+Kibana環(huán)境配置
3.1 前置準(zhǔn)備
修改內(nèi)存最大容量
# 查看參數(shù)大小
cat /proc/sys/vm/max_map_count
# 設(shè)置參數(shù)
sysctl -w vm.max_map_count=262144
設(shè)置mynetwork
本想用的bridge,發(fā)現(xiàn)bridge
-
創(chuàng)建一個(gè)自定義網(wǎng)絡(luò)(執(zhí)行到這里就可以了):
## 查看已有網(wǎng)絡(luò) docker network ls ## 新建網(wǎng)絡(luò) docker network create mynetwork
-
啟動(dòng)容器時(shí),將它們連接到相同的網(wǎng)絡(luò)并分配容器名稱:
docker run -d --name containerA --network mynetwork imageA docker run -d --name containerB --network mynetwork imageB
在這個(gè)例子中,我們將容器A和容器B連接到同一個(gè)名為
mynetwork
的網(wǎng)絡(luò),并分別分配了容器名稱containerA
和containerB
。 -
在容器A中通過容器名稱訪問容器B:
ping containerB
- 對(duì)于已經(jīng)啟動(dòng)的Docker放入到指定網(wǎng)絡(luò)
docker network connect <network_name_or_id> <container_name_or_id>
3.2 ES(單節(jié)點(diǎn)模式部署)
#安裝elasticsearch,創(chuàng)建一個(gè)elk文件夾, 后面的elk日志采集系統(tǒng)的配置文件都放在這里面
#創(chuàng)建elk使用配置文件的目錄
mkdir -p /data/elk
#創(chuàng)建es使用的目錄
mkdir /data/elk/conf -p
#配置es的配置文件
cat >/data/elk/conf/elasticsearch.yml<<'EOF'
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產(chǎn)環(huán)境請(qǐng)?jiān)O(shè)置為固定IP
transport.host: 0.0.0.0
# elasticsearch節(jié)點(diǎn)名稱
node.name: node-1
# elasticsearch節(jié)點(diǎn)信息 單節(jié)點(diǎn)模式關(guān)閉這個(gè)
# cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關(guān)閉跨域驗(yàn)證可以實(shí)現(xiàn)瀏覽器查看es的數(shù)據(jù)
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
#創(chuàng)建es使用的存儲(chǔ)卷把數(shù)據(jù)映射出來
[root@centos7 ~]# docker volume create elasticsearch
elasticsearch
#創(chuàng)建并啟動(dòng)elasticsearch容器
docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch --network mynetwork -v /data/elk/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" --mount src=elasticsearch,dst=/usr/share/elasticsearch elasticsearch:7.8.0
#把宿主機(jī)的配置文件映射到es作為配置文件
/data/elk/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
#把es的容器安裝目錄映射到宿主機(jī)
--mount src=elasticsearch,dst=/usr/share/elasticsearch
#創(chuàng)建成功
[root@centos7 elasticsearch]# docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch -v /data/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --mount src=elasticsearch,dst=/usr/share/elasticsearch elasticsearch:7.6.0
317d2a274ec64500c44a7c8c0bea60175c2183a66e8e6e8a5554bc223e836e58
#對(duì)存儲(chǔ)卷創(chuàng)建軟連接實(shí)現(xiàn)快速訪問
/data/docker/volumes/elasticsearch/_data/
ln -s /data/docker/volumes/elasticsearch/_data/ /data/elk/es
測(cè)試是否安裝成功
[root@centos7 es]# curl 127.0.0.1:9200
{
"name" : "node-1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "CK6xnBvaTciqRtWhjZf7WA",
"version" : {
"number" : "7.6.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
"build_date" : "2020-02-06T00:09:00.449973Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注意:如果需要添加插件時(shí),需要將容器的插件目錄映射到實(shí)際的路徑中或者通過命令
(如安裝ik分詞器:docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)將其拷貝到容器中
3.3 kibana
#安裝kibana
#kibana主要用于對(duì)elasticsearch的數(shù)據(jù)進(jìn)行分析查看。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會(huì)無法將無法使用kibana。
#創(chuàng)建配置文件
cat >/data/elk/conf/kibana.yml<<'EOF'
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"] # 這里需要參考我下面的docker網(wǎng)絡(luò)訪問配置
# 操作界面語言設(shè)置為中文
i18n.locale: "zh-CN"
EOF
#創(chuàng)建kibana使用的容器卷
docker volume create kibana
#創(chuàng)建并啟動(dòng)kibana容器
docker run -di --name kibana -p 5601:5601 --network mynetwork -v /data/elk/conf/kibana.yml:/usr/share/kibana/config/kibana.yml --mount src=kibana,dst=/usr/share/kibana kibana:7.8.0
#把宿主機(jī)的kibana配置文件映射到容器內(nèi)部
# -v /data/elk/conf/kibana.yml:/usr/share/kibana/config/kibana.yml
#把容器內(nèi)的kibana的安裝目錄映射到宿主機(jī)的容器卷方便管理
# --mount src=kibana,dst=/usr/share/kibana
#創(chuàng)建kibana容器卷的軟連接方便管理
ln -s /data/docker/volumes/kibana/_data/ /data/elk/kibana
此時(shí)直接curl 127.0.0.1:5601
,有可能遇到問題Kibana server is not ready yet
,解決方法參考kibana解決Kibana server is not ready yet問題。一般都是docker內(nèi)部網(wǎng)絡(luò)訪問配置沒配置好的問題
如果有需要配置密碼,參考kibana+nginx配置密碼 ubuntu
4. Canal Server+Adapter環(huán)境配置
4.1 Canal Server
首先安裝canal-server,復(fù)制配置文件到外面
# 啟動(dòng)docker
docker pull canal/canal-server:v1.1.5
docker run --name canal-server -id canal/canal-server:v1.1.5
mkdir -p /data/canal/canal-server
# 復(fù)制配置文件(注意,復(fù)制的時(shí)候,如果目標(biāo)路徑是/conf/,那就會(huì)在conf中創(chuàng)建一個(gè)新的文件夾用來接收復(fù)制文件。如果是/conf,那句直接復(fù)制到該文件夾下)
docker cp canal-server:/home/admin/canal-server/conf/ /data/canal/canal-server/conf
docker cp canal-server:/home/admin/canal-server/logs/ /data/canal/canal-server/logs
# 刪除并重新啟動(dòng)
docker stop canal-server && docker rm canal-server
docker run --name canalsever_1.1.5 -p 11111:11111 \
-v /data/canal/canal-server/conf/example/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /data/canal/canal-server/conf/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /data/canal/canal-server/logs/:/home/admin/canal-server/logs/ \
--network mynetwork \ # 這個(gè)是我“讓ELK在同一個(gè)docker網(wǎng)絡(luò)下通過名字直接訪問”博客中新建的網(wǎng)絡(luò),以后所有127.0.0.1都寫成docker的name就可以
-d canal/canal-server:v1.1.5
修改Server配置文件example/instance.properties
注意,canal.properties
中的destination要和后續(xù)的Canal Adapter保持一致
驗(yàn)證服務(wù)是否啟動(dòng)成功
docker exec -it [c_id]/bin/bash
cd canal-server/bin/
./start.sh // 啟動(dòng)服務(wù)
cd canal-server/logs/example/
tail -100f example.log // 查看日志
4.2 Canal Adapter
# 啟動(dòng)docker
docker pull slpcat/canal-adapter:v1.1.5-jdk8
docker run --name canal-adapter -id slpcat/canal-adapter:v1.1.5-jdk8
# 復(fù)制配置文件
docker cp canal-adapter:/opt/canal-adapter/conf /data/canal/canal-dapter/conf
docker cp canal-adapter:/opt/canal-adapter/logs /data/canal/canal-dapter/conf
# 刪除并重新啟動(dòng)
docker stop canal-adapter && docker rm canal-adapter
docker run --name canal-adapte_1.1.5 -p 8081:8081 \
-v /data/canal_/canal-dapter/conf:/opt/canal-adapter/conf \
-v /data/canal_/canal-dapter/logs:/opt/canal-adapter/logs \
--network mynetwork \
-d slpcat/canal-adapter:v1.1.5-jdk8
修改兩處配置文件
配置文件取消注釋一定要自己手動(dòng)刪除#
,不要用快捷鍵。否則會(huì)導(dǎo)致文件格式出問題
配置文件詳解
ClientAdapter: Canal的Adapter配置項(xiàng)目 application.ym(application.yml)
Sync ES:Canal的Adapter中ES同步的配置項(xiàng) (user.yml)
修改配置文件application.yml
。
name logger就是在發(fā)生數(shù)據(jù)修改的時(shí)候,直接實(shí)時(shí)更新到log中,如下圖
修改完上述配置,可以看到name為es的canalAdapters被啟動(dòng)了。因此要去es文件夾下修改,注意以下字段的配置。目前只是能夠運(yùn)行起來,至于業(yè)務(wù)實(shí)際應(yīng)用可能還有待驗(yàn)證。
修改啟動(dòng)腳本,使adapter穩(wěn)定運(yùn)行
以下修改方案基于slpcat/canal-adapter:v1.1.5-jdk8
修改
首先docker exec進(jìn)入到容器內(nèi)部,修改啟動(dòng)腳本vi bin/startup.sh
我修改了兩個(gè)地方文章來源:http://www.zghlxwxcb.cn/news/detail-669075.html
- if else判斷的地方,我直接指定JAVA_OPTS為非x64系統(tǒng)的配置
- 修改了原先的
-Xms
和-Xmx
,變成了新的104m和512m (隨便設(shè)置的,就想著要小一點(diǎn)),以及增加了新的參數(shù)-XX:MaxDirectMemorySize=128m
#!/bin/bash
current_path=`pwd`
case "`uname`" in
Linux)
bin_abs_path=$(readlink -f $(dirname $0))
;;
*)
bin_abs_path=`cd $(dirname $0); pwd`
;;
esac
base=${bin_abs_path}/..
export LANG=en_US.UTF-8
export BASE=$base
if [ -f $base/bin/adapter.pid ] ; then
echo "found adapter.pid , Please run stop.sh first ,then startup.sh" 2>&2
exit 1
fi
if [ ! -d $base/logs ] ; then
mkdir -p $base/logs
fi
## set java path
if [ -z "$JAVA" ] ; then
JAVA=$(which java)
fi
ALIBABA_JAVA="/usr/alibaba/java/bin/java"
TAOBAO_JAVA="/opt/taobao/java/bin/java"
if [ -z "$JAVA" ]; then
if [ -f $ALIBABA_JAVA ] ; then
JAVA=$ALIBABA_JAVA
elif [ -f $TAOBAO_JAVA ] ; then
JAVA=$TAOBAO_JAVA
else
echo "Cannot find a Java JDK. Please set either set JAVA or put java (>=1.5) in your PATH." 2>&2
exit 1
fi
fi
case "$#"
in
0 )
;;
2 )
if [ "$1" = "debug" ]; then
DEBUG_PORT=$2
DEBUG_SUSPEND="n"
JAVA_DEBUG_OPT="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$DEBUG_SUSPEND"
fi
;;
* )
echo "THE PARAMETERS MUST BE TWO OR LESS.PLEASE CHECK AGAIN."
exit;;
esac
str=`file -L $JAVA | grep 64-bit`
if [ -n "$str" ]; then
JAVA_OPTS="-server -Xms2048m -Xmx3072m -Xmn1024m -XX:SurvivorRatio=2 -Xss256k -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError"
else
JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m "
fi
## 主要是修改了這個(gè)地方,修改了啟動(dòng)參數(shù)
JAVA_OPTS="-server -Xms104m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxDirectMemorySize=128m -XX:MaxPermSize=128m "
echo $JAVA_OPTS
JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8"
ADAPTER_OPTS="-DappName=canal-adapter"
for i in $base/lib/*;
do CLASSPATH=$i:"$CLASSPATH";
done
CLASSPATH="$base/conf:$CLASSPATH";
echo "cd to $bin_abs_path for workaround relative path"
cd $bin_abs_path
echo CLASSPATH :$CLASSPATH
exec $JAVA $JAVA_OPTS $JAVA_DEBUG_OPT $ADAPTER_OPTS -classpath .:$CLASSPATH com.alibaba.otter.canal.adapter.launcher.CanalAdapterApplication
可以看到插入幾萬條數(shù)據(jù)后(確實(shí)也同步到ES中了),adapter的內(nèi)存反而還下降了?不是很懂,只能說回想起了深度學(xué)習(xí)調(diào)參的日子文章來源地址http://www.zghlxwxcb.cn/news/detail-669075.html
到了這里,關(guān)于實(shí)時(shí)同步ES技術(shù)選型:Mysql+Canal+Adapter+ES+Kibana的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!