当前位置: 首页 > news >正文

Greenplum的segment故障自愈小试

这是学习笔记的第 2142 篇文章


640?wx_fmt=gif

  在工作中,总是不可避免会碰到故障,最近Greenplum集群总是会时不时的抛出segment节点的问题,不过GP的高可用机制是比较完善的,数据segment节点出现故障,节点会从Primary切换到Mirror,相对还是很健壮的,另外Greenplum里面的角色是我见过数据库里面的设计最全的,Master,Standby,Primary,Mirror全都齐了。

640?wx_fmt=png

在一段时间的观察和实践之后,发现问题的情况都大抵相同,基本都是开发人员提交的重量级SQL导致,修复的步骤相对是比较常规的。

有的时候碰到节点问题的时候,还是很让人纠结的,尤其是工作外的时间处理,其实是很占用个人时间的,处理的步骤也是常规的,生成转储文件得到segment列表,然后恢复mirror节点,如果是角色发生了切换,还需要重新对调下角色。

我碰到的90%的场景下都是Primary和mirror的异常通信,所以处理起来基本都是靠神器gprecoverseg ,执行-o和-i选项即可。 

几次三番几次三番的处理之后,都有些麻木了,所以我就在想这样的处理方式就不要麻烦我了,因为默认的处理方式是需要命令确认是否修复,在查看了gprecoverseg 的帮助之后,发现了额外的选项-a,可以自动确认。 

所以就开始写脚本,写脚本的过程中刚好节点出现问题,就顺手拿来做了下故障自愈测试。以下是我设置的crontab任务,每隔一个周期就会检测segment的状态,如果出现异常就开始转储问题进行恢复,以下是巡检和恢复的部分日志。

640?wx_fmt=png

完整的脚本内容如下:

#!/bin/sh	
. /home/gpadmin/.bash_profile	
GP_Cmd="/usr/local/greenplum-db/bin/psql"	

	
function check_segment_cnt(){	
err_segment_cnt=`${GP_Cmd} -t -c "select count(*) from gp_segment_configuration where status='d';"`	
echo $err_segment_cnt	
}	

	
err_segment_cnt=`check_segment_cnt`	

	

	
if [ $err_segment_cnt -gt 0 ];then	
  echo '#### INFO: '`date` '## There are ' $err_segment_cnt 'segments have failed to connect ...' >> /tmp/gp_recovery.log	
else	
  echo '#### INFO: '`date` '## There are ' $err_segment_cnt 'segments have failed to connect ...' >> /tmp/gp_recovery.log	
  exit	
fi	

	
/usr/local/greenplum-db/bin/gprecoverseg -o /home/gpadmin/recov >>/tmp/gp_recovery.log 2>&1	

	
sleep 50;	

	

	
if [ -s /home/gpadmin/recov ];then 	
   echo '#### INFO: '`date` '##  segment recovery file is not empty,start segment recovery  ...' >>/tmp/gp_recovery.log  	
  /usr/local/greenplum-db/bin/gprecoverseg -i /home/gpadmin/recov -a  >>/tmp/gp_recovery.log  2>&1	
else	
  echo '#### INFO: '`date` '##  segment recovery file is empty  ...' >> /tmp/gp_recovery.log	
fi	

	
sleep 120;	

	
err_segment_cnt=`check_segment_cnt`	
echo '#### INFO: '`date` '## There are ' $err_segment_cnt 'segments have failed to connect ...' >> /tmp/gp_recovery.log	
echo  >/home/gpadmin/recov

小结:这个简单的脚本算是拯救了自己的碎片时间,也通过这样的故障自愈让自己解放一下。

近期热文:

相关文章:

  • MySQL表添加了一个字段,竟然导致数据无法写入,反思
  • 通过Maxwell解析MySQL Binlog,打好业务多活的基础
  • 快到买买买的日子了,对于买书我提几点建议
  • 深度解读:我为什么从来不过“双十一”
  • 《黑客与画家》经典语录
  • 一个MySQL服务CPU 100%的优化案例反思
  • MySQL双主模式下是如何避免数据回环冲突的
  • MySQL中的SQL优化建议那么多,该如何有的放矢
  • dbaplus广州站归来
  • 梳理这件事情做不好,很多努力都是白费
  • 怎么证明根号2是无理数,我们来推导和计算,还有逼格极高的算法
  • 行锁:InnoDB 替代 MyISAM 的重要原因
  • 数据双向复制中的6个数据冲突场景和解决思路
  • MySQL多活数据消费服务设计方案
  • 数学有趣地超乎你的想象
  • 【Amaple教程】5. 插件
  • angular2 简述
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Docker 笔记(2):Dockerfile
  • DOM的那些事
  • es6--symbol
  • es6要点
  • HashMap剖析之内部结构
  • Java基本数据类型之Number
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js正则,这点儿就够用了
  • Map集合、散列表、红黑树介绍
  • MySQL的数据类型
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于web的全景—— Pannellum小试
  • 力扣(LeetCode)357
  • 前端
  • 线性表及其算法(java实现)
  • 新版博客前端前瞻
  • 一些css基础学习笔记
  • 移动端解决方案学习记录
  • 赢得Docker挑战最佳实践
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​学习一下,什么是预包装食品?​
  • #vue3 实现前端下载excel文件模板功能
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (8)STL算法之替换
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (全注解开发)学习Spring-MVC的第三天
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一)认识微服务
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • *2 echo、printf、mkdir命令的应用
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .form文件_SSM框架文件上传篇