Docker部署ES服务,canal全量同步的时候内存爆炸,ES/Canal Adapter自动关闭,CPU100%

news2025/1/18 16:47:37

文章目录

    • 问题
    • 解决方案
      • 1. 对ES的限制
      • 2. 对Canal-Adapter的限制

问题

使用canal-adapter全量同步(参考Canal Adapter1.1.5版本API操作服务,手动同步数据(4))的时候

  • 小批量数据可以正常运行(几千条)
  • 只要数据量一大(上万条),就会内存、CPU双线爆炸,ES自动被docker关闭。

数据量大的时候系统负荷如下所示(用宝塔监控)
在这里插入图片描述
docker stats监控如下所示,很快其他容器全都变成--,完全无法提供服务
在这里插入图片描述

解决方案

1. 对ES的限制

参考Docker部署ES(增加内存限制启动)

最关键的一句话:启动的时候按照如下参数启动。必须得先设置single-node单节点模式,然后设置ES_JAVA_OPTS="-Xms64m -Xmx512m" 才会成功。

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

ES_JAVA_OPTS的意思是设置ES中Java虚拟机环境的上下限

discovery.type=single-node是单节点模式的意思。和集群有关的配置可以参考ElasticSearch 设置-配置(一)发现和集群形成设置

  • discovery.seed_hosts:提供集群中符合主节点条件的节点列表。也可以是以逗号分隔的单个字符串。每个节点都是host:port或者host格式。host是由DNS解析出来的任意主机名称。IPV6必须用方括号括起来。如果一个主机名通过DNS解析出来多个地址,ElasticSearch会使用所有被解析出来的地址。

  • discovery.seed_providers:指定种子主机提供程序的类型来获取用于启动发现进程的种子节点的地址。默认情况下,它是基于设置的种子主机提供程序,它从 discovery.seed_hosts 设置中获取种子节点地址。此设置以前称为 discovery.zen.hosts_provider。

  • discovery.type:指定 Elasticsearch 是否应形成多节点集群。默认情况下,Elasticsearch 在形成集群时会发现其他节点,并允许其他节点稍后加入集群。如果discovery.type 设置为single-node,Elasticsearch 会形成一个单节点集群并不支持cluster.publish.timeout 设置的超时。

  • cluster.initial_master_nodes:设置全新群集中符合条件的主节点的初始集。默认情况下,此列表为空,表示此节点希望加入已引导的集群。请参阅cluster.initial_master_nodes。

ES的内存占用显著小了很多,并且可以直接同步大批量数据
在这里插入图片描述

2. 对Canal-Adapter的限制

我在canal-adapter中也提了一个issue,并尝试自己解决

我对docker canal-adapter内部的start.sh进行了修改,似乎好像解决了这个问题?但是只是本地部署没有看出问题,不知道线上如何。先记录一下修改方案

以下修改方案基于slpcat/canal-adapter:v1.1.5-jdk8修改

首先docker exec进入到容器内部,修改启动脚本vi bin/startup.sh

我修改了两个地方

  1. if else判断的地方,我直接指定JAVA_OPTS为非x64系统的配置
  2. 修改了原先的-Xms-Xmx,变成了新的104m和512m (随便设置的,就想着要小一点),以及增加了新的参数-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
## 主要是修改了这个地方,修改了启动参数
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

可以看到插入几万条数据后(确实也同步到ES中了),adapter的内存反而还下降了?不是很懂,只能说回想起了深度学习调参的日子在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python获取、修改主机名称和IP地址实践

Python获取、修改主机名称和IP地址的方法有多种,内置socket模块、执行系统命令、第三方模块等等,本文只是完成功能的一次成功的实践。 1. 获取、修改主机名称 本案例使用python的socket模块获取、修改主机名称,socket模块是一个用于实现网络…

对抗通胀的信心回升,美国消费者预期短期通胀降至两年多低点

KlipC报道:据纽约联储最新消费者预期调查显示美国消费者预计一年后短期通胀从3.8%下降至3.5%,创2021年4月以来新低,为连续第四个月下降。三年期和五年期的通胀预期也下降,未来几年通胀将会走弱。 与此同时他们对个人的财务状况也趋…

JDK8 Optional优雅的判空操作

一、前言 在我们编程过程中因为疏忽经常会遇到NullPointerException空指针异常,所以与此同时就避免不了对变量一层一层的进行判空。JDK8新特性所提供的Optional类,可以让我们更优雅的进行判空操作。学习其的意义就是提醒开发者注意空值情况,…

怎么自己制作动图表情包?在线gif生成的操作步骤

gif表情包在我们平时的生活里斗图的时候经常会用到,那么如何用图片制作gif(https://www.gif.cn)表情包呢?今天就分享一个在线gif生成的简单方法,利用gif制作工具将图片转gif动图,下面是详细的操作步骤。 打…

爬楼梯(一次爬1或2层)

一,题目描述 二,解题思路 动态规划 动规五部曲: 1. 确认dp数组以及下标含义 2. 推导递推公式 3. 确认dp数组如何初始化 4. 确认遍历顺序 5. 打印dp数组 dp数组含义:到第i层的方法数目 下标含义:层数 递推公式&…

2023年服贸会在哪里举行?北京有哪些媒体可以做宣传?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 8月14日,”2023年服贸会新闻发布会在北京首钢园举行,宣布2023年服贸会将于9月2日至6日在国家会议中心和首钢园区举办,采用‘线下线上’‘综合专题’办…

跳跳!(贪心)

题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去。 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 i 块的石头高度为 h_i,地面的高度是 h_0 0。你估计着,从第 i 块石…

eNSP:mplsvpn综合实验

要求完成下图实验&#xff1a; 拓扑信息标注&#xff1a; 命令操作&#xff1a; r1: <Huawei>sys [Huawei]sys r1 [r1]int lo0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int g 0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.2.1 30[r1]ip route-static 19…

【BASH】回顾与知识点梳理(二十九)

【BASH】回顾与知识点梳理 二十九 二十九. 进程和工作管理29.1 什么是进程 (process)进程与程序 (process & program)子进程与父进程&#xff1a;fork and exec&#xff1a;进程呼叫的流程系统或网络服务&#xff1a;常驻在内存的进程 29.2 Linux 的多人多任务环境多人环境…

C#__委托的基本用法

// 委托A class DelegateA{// 委托&#xff0c;一个类型&#xff0c;可以赋值一个方法的引用// 定义delegate void Tool(int x);delegate long ToolLong(long x, long y);delegate string GetString();public void Delegate(){// 赋值Tool tool null;ToolLong toollong null…

clickhouse 集群搭建

目录 一、 首先要安装单节点集群 二、安装zookeeper并搭建集群 1. 配置host 2. 安装zookeeper 3. 配置zookeeper 三、clickhouse 集群配置 1.配置metrika.xml文件 2. 修改clickhouse的配置文件 一、 首先要安装单节点集群 在这里就不太赘述。官网下载安装包&#xff0…

离线安装Nginx(rpm方式)

环境&#xff1a;centos7.9 下面将展示通过rpm方式安装Nginx 1.官方下载Nginx rpm包 下载地址 http://nginx.org/packages/ 下载版本根据操作系统版本进行选择&#xff0c;本次操作系统是centos7.9 - 64位系统&#xff0c;所以对应的下载路径是&#xff1a; http://nginx.or…

视频监控管理平台EasyCVR视频平台通过navicat修改登录密码的具体操作步骤

TSINGSEE青犀视频监控管理平台EasyCVR可以根据不同的应用场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;平台可实现视频实时直播、云端录像、云存储、回放与检索、告警上报、视频快照、…

OJ练习第147题——字符串中的查找与替换

字符串中的查找与替换 力扣链接&#xff1a;833. 字符串中的查找与替换 题目描述 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices, sources, targets。 要完成第 i 个替换操…

RDMA Send Receive操作

1. 前言 RDMA指的是远程直接内存访问&#xff0c;这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法。RDMA与传统的网络接口不同&#xff0c;因为它绕过了操作系统。这允许实现了RDMA的程序具有如下特点&#xff1a; 绝对的最低时延最高的吞吐量最小的CPU足迹 &am…

《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern

定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这是定义&#xff0c;看不懂就看不懂吧&#xff0c;我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

二叉树的构建及遍历

题目链接:https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking 题目 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建…

视频播放相关记录

一、场景 App应用测试在二次回归时&#xff0c;提出了安卓端视频定位不准的问题。 二、分析 代码层面使用了安卓原始的MediaPlayer中的seekTo接口来定位&#xff1a; mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {Overridepublic boolean onInfo(MediaPlayer mp, i…

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验1

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验1 01 多旋翼动力系统简介 多旋翼无人机的动力系统通常包括螺旋桨、电机、电调以及电池。动力系统是多旋翼最重要的组成部分&#xff0c;它决定了多旋翼的主要性能&#xff0c;如悬停时间、载重能力、飞行速度和飞行距…

The kernel appears to have died. It will restart automatically.

在使用pytorch运行一个小案例时&#xff0c;绘制图像时出现了 The kernel appears to have died. It will restart automatically. 查看 anaconda prompt OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means…