高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

联通大数据 5000 台规模集群故障自愈实践

  • 2019-08-28
  • 本文字数:4098 字

    阅读完需:约 13 分钟

联通大数据5000台规模集群故障自愈实践

本文由 dbaplus 社群授权转载


背景

作为运维人员,做得最多的工作就是日常巡检、故障恢复。公司集群规模越庞大,故障发生率和故障实例数也在成倍增加。每天来到公司,第一件事儿就是要看看有哪些机器坏了?坏哪儿了?集群存储还够吗?底层数据存储是否均衡?然后针对每个故障逐一解决。笔者亲身经历就是过年连懒觉都睡不成,集群故障了,一个电话过来立马清醒,然后默默地恢复故障。这样的经历我觉得每个运维人都含着泪经历过。


改变

通过采集分析 Prometheus 里的告警数据,利用 fabric 或 ansible 等多线程安全并发远程连接工具,执行相关角色实例的恢复工作。



fabric 建立连接执行恢复命令。



目前集群规模将近 5000 台,其中两个大规模的集群节点数均为一千多台。


目前自动化恢复涉及的集群日常运维操作有:


  • 计算节点检测出使用 swap 交换分区,将会自动清理 swap 分区并关闭 swap 分区;

  • 计算节点检测出时钟偏差,将会自动纠偏时钟偏差;

  • Cloudera Manager 代理挂掉,将会自动重启;

  • 主机检测出有坏盘,坏盘更换完成后,自动恢复;

  • 角色实例检测出异常掉线,自动恢复上线(如 NameNode、DataNode、ResourceManager、NodeManager 等);

  • 集群存在多个节点多块磁盘存储剩余空间不足,自动进行磁盘级别的数据 Balancer;

  • 集群存储达到阈值,自动进行节点级别的数据 Balancer。


自动化恢复的适用场景很多,但一定要做到严谨地对症下药,并且要考虑清楚问题的严重性和普遍性。


以上 7 点自动恢复是集群常见故障,该类故障频发且影响范围较小,并不会影响集群的可用性,因此可以实施自动化恢复。


对于平台罕见故障,且该故障有一定概率会对平台造成部分功能性能影响的,最好的办法是做好告警和应急处理。


下面分享几个自动化恢复实践:


1)计算节点检测出使用 swap 交换分区,将会自动清理 swap 分区并关闭 swap 分区


根据监控数据,获取 swap 开启的计算机点,远程连接进行 swap 分区关闭。


def recover_HOST_MEMORY_SWAPPING(self,list):
com=("swapoff -a") for i in range(len(list)): con = Connection(list[i]['ipAddress'], port=22, user=user, connect_timeout=360, forward_agent=True, connect_kwargs={'password': self.password}) con.sudo(command=com,password=self.password,shell=False,hide='stderr',encoding='utf-8',pty=True) con.close()
复制代码


2)Cloudera Manager 代理挂掉,将会自动重启


根据监控数据,获取 agent 异常下线的计算节点,远程连接进行 agent 上线操作。


def recover_HOST_SCM_HEALTH(self,list):
com=("/opt/cm-5.13.1/etc/init.d/cloudera-scm-agent restart") for i in range(len(list)): con = Connection(list[i]['ipAddress'], port=22, user=user, connect_timeout=360, forward_agent=True, connect_kwargs={'password': self.password}) con.sudo(command=com,password=self.password,shell=False,hide='stderr',encoding='utf-8',pty=True) con.close()
复制代码


3)计算节点检测出时钟偏差,将会自动纠偏时钟偏差


由于集群资源每天有将近 16 小时处于打满状态,容易造成集群部分计算节点负载过高,导致节点上的 DN、NM 掉线。这时候需要重启计算节点,但重启节点会造成机器时钟偏差,通过监控告警我们检测到了时钟偏差,接下来通过读取 Prometheus 中的时钟偏差节点信息,来进行时钟源同步操作。



具体时钟偏差恢复的代码实例如下:


from fabric import  Connectiondef recover_HOST_CLOCK_OFFSET(self,list):    com=["systemctl stop ntpd","ntpdate ntp_src","sleep 1","ntpdate ntp_src","sleep 1","ntpdate ntp_src","sleep 1","systemctl start ntpd","/opt/cm-5.13.1/etc/init.d/cloudera-scm-agent restart"]    for i in range(len(list)):        con = Connection(list[i]['ipAddress'], port=22, user=user, connect_timeout=360, forward_agent=True,                         connect_kwargs={'password': self.password})        for j in range(len(com)):            con.sudo(command=com[j], password=self.password, shell=False, hide='stderr', encoding='utf-8', pty=True)        con.close()
复制代码


4)集群角色异常退出


如下图:监控告警发现 NodeManager 实例发生故障实践在 2019-08-12 04:28:02,一般这个时间段,运维人员都在深度睡眠。这时自愈程序将根据告警自动恢复角色实例,恢复实践周期在 5 分钟之内,于 2019-08-12 04:32:02 DN 实例和 NM 实例恢复上线。




当前集群使用的 CDH5.13.1 版本,可以直接通过 CM_API 实现角色实例自愈,如果是手工搭建版本,可以使用 fabric 或者 Paramiko 连接到节点启动相应角色实例。


「CM_API 使用说明」参考链接:https://cloudera.github.io/cm_api/docs/python-client-swagger/


具体 DN 角色自愈代码如下:


import cm_clientapi_url = api_host + ':' + port + '/api/' + api_versionapi_client = cm_client.ApiClient(api_url)cluster_api_instance = cm_client.ClustersResourceApi(api_client)
# Lists all known clusters.api_response = cluster_api_instance.read_clusters(view='SUMMARY')for cluster in api_response.items: print (cluster.name, "-", cluster.full_version)

if cluster.full_version.startswith("5."): services_api_instance = cm_client.ServicesResourceApi(api_client) services = services_api_instance.read_services(cluster.name, view='FULL')
for service in services.items: #print (service.name) if service.type == 'HDFS': hdfs = serviceif cluster.full_version.startswith("5."): roles_api_instance = cm_client.RolesResourceApi(api_client)
//根据集群名称,服务实例名称获取相对应的角色实例列表role_response = roles_api_instance.read_roles(cluster.name, hdfs.name, view='FULL')//获取状态为bad的dn角色实例(手工搭建集群可以通过读取prometheus的告警数据进行掉线角色实例的恢复。)bad_dn_roles = [role.name for role in role_response.items if (role.type == 'DATANODE' and role.health_summary == 'BAD')]roles_cmd_api_instance = cm_client.RoleCommandsResourceApi(api_client)role_names = cm_client.ApiRoleNameList(bad_dn_roles)//重启角色实例cmd_list = roles_cmd_api_instance.restart_command(cluster.name, hdfs.name, body=role_names)for cmd in cmd_list.items: print (cmd.name, "(", cmd.id, cmd.active, cmd.success, ")")
复制代码


执行完成后,返回执行结果:



5)集群个别节点上的磁盘存储超过 90%的阈值


背景:集群节点数过多后,默认的数据落盘策略为轮训,由于部分节点存储异构,会导致有部分节点存储打满,这时我们可以修改数据落盘策略为剩余空间策略,即根据节点剩余存储空间的多少来决定数据优先落盘的顺序。


但是,即使这样解决了节点存储的均衡,也不能解决个别磁盘的存储打满,在 Apache 社区的 Hadoop3 版本中 dfs.disk.balancer 才可以使用。在 CDH5.13.1 的 Hadoop2.6.0 版本,已经可以使用该功能。但是磁盘何时快打满无法预测,并且在大规模集群中,往往多了一个账期的数据,就会有大量的磁盘达到存储告警阈值。当 HDFS 集群单节点内部多块数据硬盘数据倾斜时,会造成热点硬盘使用量激增,甚至打满,此时集群 balance 是无用的,就需要用 DiskBalancer,这时我们就可以根据告警信息来自动化的进行磁盘数据均衡。


开启方法:


修改 hdfs-site.xml 文件。



true 表示开启 DiskBalancer。


命令:


hdfs diskbalancer -[command] [options]


command:


  1. plan(制定平衡计划)


可执行参数


–bandwidth <arg>:平衡带宽,默认单位 M/S


–out <arg>:计划输出目录


–v:输出计划


  1. execute(执行计划)

  2. query(查询进度)

  3. cancel(取消计划)


实例:


DN 节点 lf-319-sq210 发生数据倾斜。



登陆到 lf-319-sq210 主机,切换至 HDFS 用户。


制定平衡计划:


hdfs diskbalancer -plan lf-319-sq210.plan.json --out ~/2019-Jul-20-15-25-29 --thresholdPercentage 10



执行平衡计划:


hdfs diskbalancer -execute /var/lib/hadoop-hdfs/2019-Jul-20-15-25-29/lf-319-sq210.plan.json



查询计划:


hdfs diskbalancer -query lf-319-sq210



圈中部分为正在进行,PLAN_DONE 为完成。


过一段时间观察 lf-319-sq210 磁盘情况:



可以清晰的看出,磁盘已经开始平衡了。


以上是磁盘级别的数据平衡操作步骤,以下是通过 fabric 进行远程命令的执行,以实现自动化恢复。


def recover_DATA_NODE_FREE_SPACE_REMAINING(self,list):    com=("su hdfs -c 'whoami;export JAVA_HOME=/opt/jdk;export CLASSPATH=.:$JAVA_HOME/lib:$CLASSPATH;export PATH=$JAVA_HOME/bin:$PATH;hdfs diskbalancer -plan $HOSTNAME.plan.json --out ~/`date \'+diskbalancer_%Y_%m_%d\'` --thresholdPercentage 10;sleep 5;hdfs diskbalancer -execute /var/lib/hadoop-hdfs/`date \'+diskbalancer_%Y_%m_%d\'`/$HOSTNAME.plan.json'")    for i in range(len(list)):        con = Connection(list[i]['ipAddress'], port=22, user=user, connect_timeout=360, forward_agent=True,                         connect_kwargs={'password': self.password})        con.sudo(command=com,password=self.password,shell=False,hide='stderr',encoding='utf-8',pty=True)        con.close()
复制代码


集群自愈也是大规模集群治理工作的一项重要环节,遵循降本增效、安全至上的原则,能减少运维人员的大量常规工作量,也能及时有效地恢复故障,减少小故障引发集群大事故的可能性。


作者介绍


余澈,中国联通大数据技术部平台组核心技术负责人,项目管理高级工程师,具有多年大数据平台运维管理及开发优化经验。管理过多个上千节点集群,擅长对外多租户平台的维护开发。信科院大数据性能测试、功能测试主力,大厂 PK 获得双项第一。


原文链接


https://mp.weixin.qq.com/s/S7V2KnXWitpp2lfWSx2kmg


2019-08-28 08:003040
用户头像
dbaplus社群 数据连接未来

发布了 176 篇内容, 共 60.0 次阅读, 收获喜欢 582 次。

关注

评论

发布
暂无评论
发现更多内容

模块二作业

bin

极客时间架构实战营作业二

jjn0703

架构实战营

架构设计系列二 如何抓住架构设计的关键点

nydia

微信朋友圈高性能复杂度分析

看,有只猪

架构实战营 - 模块二作业

Geek_de900a

架构实战营 - 模块七作业

李东旭

「架构实战营」

架构训练营 模块二

初一

Go的测试框架

Rayjun

Go 语言

微信朋友圈的高性能复杂度分析与设计

眼镜盒子

架构实战营

架构实战训练营模块 2 作业

Sonichen

模块七

SAKIN

架构实战营 - 模块七作业

思梦乐

架构实战营作业 -- 模块二

冬瓜茶

微信朋友圈高性能复杂度分析

Sky

#架构实战营

架构训练营 模块二

Leach Sun

学习-2

4anonymous

转型 Golang 开发的心路历程

baiyutang

php 云原生 求职 Go 语言 9月日更

朋友圈高性能复杂度分析

陈家豪

架构实战营

微信朋友圈高性能复杂度分析

Geek_85eb5f

解读顶会CIKM'21 Historical Inertia论文

华为云开发者联盟

华为云 论文 长序列时间 时间序列预测 CIKM’21

【Flutter 专题】55 日常问题小结 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

Node.js 应用全链路追踪技术——[全链路信息获取]

vivo互联网技术

node.js 大前端 编程语言 全链路追踪 语言 & 开发

在线JSON转ClickHouse数据表工具

入门小站

工具

微信朋友圈高性能复杂度分析

消失的子弹

微信 架构 互联网 云原生

11. 有大数据就有人工智能的机会

数据与智能

人工智能

自己动手写个微型博客吧,还能实现网页版 Blink,No.1

梦想橡皮擦

9月日更

Vue进阶(九十六):VuePress 详解

No Silver Bullet

Vue 9月日更

分析一下微信朋友圈的高性能复杂度

Yina🌝很浪🌊

架构实战营 - 模块二作业

Alex.Wu

架构实战营模块二作业-分析微信朋友圈的高性能复杂度

李焕之

模块二作业

紫云

联通大数据5000台规模集群故障自愈实践_大数据_dbaplus社群_InfoQ精选文章