引言

Zookeeper集群部分节点连接数量瞬时跌零,导致不少服务发生重连,对业务造成了影响(惊吓),本文就发生的现象进行分析和整理。

一、ZK监控情况

zk集群部分节点服务发生重连

伴随着集群CPU也发生抖动

ZK日志主要为Socket关闭等

[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2182:NIOServerCnxn@368] - caught end of stream exception
EndOfStreamException: Unable to read additional data from client sessionid 0x0, likely client has closed socketat org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:239)at org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:203)at java.lang.Thread.run(Thread.java:745)

小结: zk节点不稳定,导致服务发生重新注册。

二、ZK系统日志

节点x.x.x.15 系统日志在「2021-09-26T19:16:50」「2021-09-26T19:17:50」均发生SYN flooding。

x.x.x.89 系统日志在「2021-09-26T19:16:50」和 「2021-09-26T19:17:50」均发生SYN flooding。

x.x.x.45 系统日志如下「2021-09-26T19:17:50」发生SYN flooding。

小结: 在问题发生时间段三个节点均在「2021-09-26T19:17:50」附近有系统错误日志发生SYN flooding。另外,这三个节点「2021-09-26T12:54:03」均有SYN flooding错误日志,但是未发现ZK节点连接断开情况。那是由于zk抖动客户端重连触发了SYN flooding ? 还是由于先发生SYN flooding导致客户端zk的客户端。

可以确定的是发送了大量请求到zk节点,节点处理不过来了。

三、解决方式

SYN flood维基释意

SYN flood或称SYN洪水、SYN洪泛是一种拒绝服务攻击,起因于攻击者发送一系列的SYN(TCP握手)请求到目标系统。
SYN flood攻击目前有两种方法,不过都与服务端没收到ACK有关。恶意用户可以跳过发送最后的ACK信息;或者在SYN里透过欺骗来源IP地址,这让服务器送SYN-ACK到假造的IP地址,因此永不可能收到ACK。这两个案例服务器会花点时间等抄收通知,故一个简单的网络壅塞可能是由于没有ACK造成的。

也就是客户端发送大量TCP连接,TCP的等待队列被塞满,导致CPU内存等资源不足,无法提供服务。关于TCP三次握手详见以前文章《HTTP/2协议之连接前言【原理笔记】》

第一步:Client发送[SYN]报文到Server。Client进入SYN_SENT状态,等待Server响应。[SYN]报文序号Seq=x《备注:截图中Seq=0》

第二步:Server收到后发送[SYN,ACK]报文给Client,ACK为x+1(备注:截图中ACK=1); [SYN,ACK]报文序号为y(备注:截图中Seq=0),Server进入SYN_RECV状态

第三步:Client收到后,发送[ACK]报文到Server,包序号Seq=x+1,ACK=y+1。Server收到后Client/Server进入ESTABLISHED状态。

解决方式:

参考下面文章主要对tcp_max_syn_backlog(能接受SYN同步包的最大客户端数)和somaxconn(服务端所能accept即处理数据的最大客户端数量)参数做了调大处理。

https://access.redhat.com/solutions/30453

小结: 通过调整系统参数和升级zk集群配置来应对,当前的4C8G配置过低,出现的该系统错误日志总体来说是资源处理不过来了。不升级可能在未来某个时间对公司所有服务造成不可计量和不可承受的损失,在相对低峰期升级,同样会对全部服务影响,但是可控可应急,两害相权取其轻。

四、ZK参数优化

ZK配置调整

# ZK中的一个时间单元
tickTime=2000# 默认10,Follower在启动过程中,会从Leader同步所有最新数据,将时间调大些
initLimit=30000# 默认5,Leader与flower的心跳检测,超过后flower表示下线,略微调大一些
syncLimit=10# 默认60,单客户端IP级别与单zk节点的连接数限制,调整为2000
maxClientCnxns=2000# 最大的会话超时时间,其实交给客户端了
# 默认的Session超时时间是在2 * tickTime ~ 20 * tickTime这个范围
maxSessionTimeout=60000000    # 两次事务快照之间可执行事务的次数,默认的配置值为100000
snapCount=3000000# 日志文件大小kb,切换快照生成日志
preAllocSize=131072    # 自动清理snapshot和事务日志,清理频率,单位是小时
autopurge.purgeInterval=6  # 保留的文件数目,默认3个
autopurge.snapRetainCount=10# 存储快照文件snapshot的目录
dataDir=/data/zookeeper# 事务日志输出目录
dataLogDir=/data/zookeeper/log

Jvm参数

在zookeeper/conf创建java.env文件

export JVMFLAGS="-Xms10G -Xmx10G -Xmn4G -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/zkout/gc/gc-%t.log $JVMFLAGS"

日志滚动

conf/log4j.properties调整为滚动输出

zookeeper.root.logger=INFO, ROLLINGFILzookeeper.log.dir=/data/zkout/logslog4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
#log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.DatePattern='.'yyyy-MM-ddlog4j.appender.ROLLINGFILE.MaxFileSize=100MB

zkEnv.sh调整日志输出方式

if [ "x${ZOO_LOG_DIR}" = "x" ]
thenZOO_LOG_DIR="/data/zkout/logs/"
fiif [ "x${ZOO_LOG4J_PROP}" = "x" ]then# ZOO_LOG4J_PROP="INFO,CONSOLE"ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

系统参数调整

limits.conf 设置用户能打开的最大文件数

vim /etc/security/limits.conf
# End of file
root soft nofile 655360  #根据部署用户
root hard nofile 655360
* soft nofile 655360
* hard nofile 655360

/etc/sysctl.conf调整

vim /etc/sysctl.conf# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;为1,开启
net.ipv4.tcp_tw_reuse = 1# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;为1,开启;
net.ipv4.tcp_tw_recycle = 1  # 修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_fin_timeout = 5    # the kernel's socket backlog limit
net.core.somaxconn = 65535# the application's socket listen backlog
net.ipv4.tcp_max_syn_backlog = 100000sysctl -p

Q2# ZK SYN Flood与参数优化相关推荐

  1. Linux系统TCP内核参数优化总结

    简介:Linux系统TCP内核参数优化总结 日常运维工作中,会遇到很多TCP相关的问题,网上有很多文章介绍需要优化哪些TCP内核参数,但是并没有很详细说明优化的依据.适用的场景是什么,如果我们不了解各 ...

  2. linux tcp文件分包_Linux内核参数优化

    前言: 1:介绍下linux内核的整个知识体系,(学会它,你肯定对linux内核有不一样的理解.) 2:谈谈Linux内核参数优化 一:linux内核技术点 Linux内核知识体系分为五个部分 1:l ...

  3. TCP协议中的核心知识点,SYN Flood?ISN?滑动窗口?数据重传?拆包粘包?单tcp连接多请求?拥塞管理?(个人收藏学习笔记)

    TCP协议中的核心知识点,滑动窗口?数据重传?拆包粘包?单tcp连接多请求? 1.前言 2.TCP/IP四层结构 3. TCP 3.1 TCP 协议头 3.2 TCP通信过程 3.2.1 建立连接的三 ...

  4. SYN Flood DNS Query Flood HTTP Flood DDoS CC常见网络功击

    本人从事网络安全行业20年.有15年防ddos攻击防护经验.被骗了很多回(都说能防300G,500G,买完就防不住了),本文当然重点给大家说明,ddos攻击是什么,中小企业如何防护,用到成本等. 20 ...

  5. DDOS SYN Flood攻击、DNS Query Flood, CC攻击简介——ddos攻击打死给钱。限网吧、黄网、博彩,,,好熟悉的感觉有木有...

    摘自:https://zhuanlan.zhihu.com/p/22953451 首先我们说说ddos攻击方式,记住一句话,这是一个世界级的难题并没有解决办法只能缓解 DDoS(Distributed ...

  6. 如何应対syn flood

    syn flood的原理就不介绍了 主要总结一下解决方法: 防火墙禁IP 内核参数的调优 Linux内核参数调优主要有下面三个: 增大tcp_max_syn_backlog 减小tcp_synack_ ...

  7. centos内核参数优化

    2019独角兽企业重金招聘Python工程师标准>>> 1: 先来看一下阿里云机器的内核参数优化: vm.swappiness = 0 net.ipv4.neigh.default. ...

  8. pythonddos防御_浅谈拒绝服务攻击的原理与防御(7):用Python和C实现syn flood攻击...

    01 前言 以前做DDOS的实验都是用python来编写工具的,开始不会编写结构不会算校验和的时候就用scapy写,后来学会了报文结构开始自己构造各种报文,但是用python写成之后虽然是能实现基本功 ...

  9. Windows下tcp参数优化

    Windows系统下的TCP参数优化 2013-04-25      0 个评论       作者:最初的幸福ever 收藏     我要投稿 Windows系统下的TCP参数优化   TCP连接的状 ...

最新文章

  1. com.android.tools.build:gradle:2.0.0-alpha3 build errors
  2. 如何认识TOS----DSCP 对照表
  3. 小米网关控制空调伴侣_小爱同学怎么控制灯?
  4. 彻底了解JS中难懂的闭包
  5. 如何制作统计报表(盈帆报表: efreprt.com)
  6. java工具类书写规范
  7. Objectdock stacks docklet 无法启动程序快捷方式
  8. 尼克 超级智能 路线_他山石|《超级智能》作者尼克·波斯特洛姆:超级智能将决定人类的未来...
  9. 数据库编程入门培训(一)
  10. FPGA——1位全加器和4位全加器的实现
  11. java 文件移动文件夹_java移动文件到另一个文件夹中
  12. 计算机容差技术CAT最新应用,cat是计算机辅助什么?
  13. 解决Mybatis报错问题:org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is
  14. 跟驰理论 matlab,第5章-跟驰理论ppt课件
  15. 毕业三年,初心你忘记了吗?
  16. 图片/文字间隙去除方法(html)
  17. 计算机启动异常卡顿,解决开机卡顿的问题,电脑卡在开机界面的解决办法
  18. mysql 数据库初始化失败怎么办_mysql数据库失败的解决方法
  19. 【云云怪】明星人脸识别——模板在手,万物皆可学习
  20. Atmega168 外部10M晶振熔丝位设置方法

热门文章

  1. AI小白也可以用的人工智能算力平台—极链AI云(附yolov5的测试与部署)
  2. HealthKit的使用
  3. Android学习笔记(十二)——实战:制作一个聊天界面
  4. JS实现把表格数据导出,并生成为excel下载到本地
  5. 记一次HTTPS证书升级导致的公众号网页白屏
  6. java写dnf外掛_Linux JDK 编译安装
  7. Ubuntu 20.04 设置开机自启脚本
  8. 发个好玩的:椰子de鼠标键盘记录器 V1.3
  9. python123中棋盘放米的故事_棋盘里放麦粒的故事你只知道一半
  10. java jxl使用_java创建excel示例(jxl使用方法)