2015年5月25日星期一

为DELL 2900添加全局热备磁盘

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
为DELL 2900添加全局热备磁盘  阅读原文»

我们在规划服务器本地存储的时候,一般是为服务器配置RAID,并在机房放置一块同样容量、大小的硬盘做为备用。并且定期巡检机房,一旦看到磁盘报警(红灯或黄灯),应该用备用硬盘替换故障磁盘,此时RAID卡会检测到硬盘替换,并在新替换的磁盘上重建数据。这种方式是目前大多数单位使用的方法,但是,服务器一般都能正常使用三、五年不出问题,开始的时候,可能还会定期检查服务器,之后可能管理员就很少去机房检查,即使去机房检查也很少一一查看服务器的硬盘指示灯。在配置RAID5时,如果阵列中只有一块硬盘出现故障,系统会正常工作,如果有多块硬盘出现故障,则系统将不能正常工作。如果长时间不检查,等发现系统出现问题时再去检查,一般都是出现不止一块磁盘出现故障,此时修复系统就比较麻烦。今天我就碰到一例,一台有6块300GB硬盘、配置了RAID5的服务器,有两个硬盘出现故障(一块呈琥珀色闪烁,表示驱动器出现故障;另一块呈绿色/琥珀色闪烁,驱动器预报故障)的问题。

1 替换有故障磁盘

一台工作多年的DELL 2900服务器,近期有一块磁盘(位置为3)出现故障(呈琥珀色闪烁,离线),而另一块磁盘(位置为0)亦开始呈绿色/琥珀色闪烁,该提示是驱动器预报故障。该服务器共有6块3.5寸、15K、300GB硬盘,配置RAID5,这6块磁盘依次插在0~5的位置。如图1-1所示。

图1-1 服务器正面图

此时服务器已经不能进入系统(提示找不到系统盘)。我到机房之后,看到服务器硬盘档板都是灰尘(如图1-2所示),先关闭服务器电源,将每个硬盘拔下,先清理灰尘,注意不要一下把所有硬盘拔下来,而是一个一个清理灰尘,避免插错位置。

图1-2 硬盘档板灰尘

等清理完灰尘之后,重新打开服务器的电源,按Ctrl+R键进入RAID配置配置,在"Physical Disk Management"(物理磁盘管理)视图中,可以看到03盘位的磁盘已经标记为"Failed",如图1-3所示。

图1-3 磁盘03已经失败

因为机房有一块备用硬盘,换上备用硬盘之后,开始重建,如图1-4所示。

图1-4 磁盘3 Rebuild

返回到"VD Mgmt"界面,在"Physical Disks(物理磁盘组)"可以看到重建进度,如图1-5所示。

图1-5 重建进度

对于300GB的磁盘,在没有进入操作系统界面、在RAID卡配置界面中,大约需要70分钟的时间就可以完成重建。如图1-6所示,重建完成。

图1-6 重建完成

在重建完成后,需要进行数据的一致性校验。在"Virtual Disks(虚拟磁盘)"中,选择每一个逻辑磁盘,按F2键,选择"Consistency Check(一致性检查,以便验证使用 RAID 级别 1、5、6、10、50 和 60 的虚拟磁盘中的冗余数据)",如图1-7所示,检查数据是否完好、正确。

图1-7 一致性检验

一致性检查速度较快,如图1-8所示,这是检验进度。应该几分钟完成。注意,不要误选中"Initialization(初始化)",完全初始化将对所有已经存在的数据造成永久性破坏。

图1-8 校验进度

应该对每一个逻辑磁盘进行校验。检验完成后,退出RAID卡配置界面,此时系统会得以恢复。

对于00位置的磁盘、间隔大约120秒闪烁一次黄灯的硬盘,为了防患于未然,也应该替换,但当前机房只有一个硬盘,需要购买新的硬盘替换。

2 添加全局备用磁盘

当前情况是,该单位有两台DELL 2900服务器,每台服务器都是6块硬盘做RAID5,在机房准备了一块备用磁盘,发现那台服务器磁盘出现问题就人工替换。由于服务器已经使用多年,管理人员怕硬盘再次出现问题,毕竟不可能每天都来机房检查。此时就引来一个问题,有没有办法,不是人工替换硬盘,而是由服务器自动替换损坏硬盘呢?这可以通过在服务器中添加全局热备用磁盘来解决。

全局热备用磁盘,是在磁盘子系统中配置一块或多块额外的磁盘,额外的磁盘平常不用,处于备用状态,一旦系统中出现有故障的磁盘,系统可以用备用的磁盘自动重建磁盘控制器上任何发生故障的驱动器。奇偶/镜像数据用于将有故障磁盘中丢失的数据写入到热备用磁盘中,从而将处于临界状态的时间降为最低。

RAID-0没有必要采用热备用驱动器,因为它不提供任何镜像数据或奇偶校验信息,当然也不能实现磁盘重建。

如果要为所有服务器都配置全局备用磁盘,需要为每台服务器再次配置一块相同容量、性能的磁盘。

等过了几天,磁盘到位之后,我们先在有故障硬盘的服务器的空闲盘位上(磁盘位置07)插上新的硬盘,进入系统将这块新添加的硬盘配置为全局热备磁盘,然后拔下00位置的故障磁盘,查看全局热备是否启用。主要步骤如下。

(1)进入RAID卡配置界面,在物理磁盘管理界面,可以看到07位置已经添加了一个同样大小、接口的磁盘,状态为Ready(就绪),而其他正在使用的磁盘状态为online,如图1-9所示。

图1-9 查看磁盘

(2)选中新添加的磁盘,按F2,在弹出的快捷菜单中选择"Make Global HS(成为全局热备用)",如图1-10所示。

图1-10 标准全局热备

(3)在弹出的对话框中选择"YES",如图1-11所示。

图1-11 确认

(4)设置为全局热备磁盘状态为"Hotspare",如图1-12所示。

图1-12 设置为全局热备

(5)返回到"VD Mgmt"管理界面,可以看到07硬盘为全局热备,信息为"Global,Affinity",如图1-13所示。此时工作磁盘为00、01、02、03、04、05。

图1-13 查看配置

此时如果要退出RAID配置界面,系统会正常使用。

(6)拔下位置0的故障磁盘,此时原来在"Hot spares"磁盘07会替换0位置的磁盘,开始重建,如图1-14所示。此时数据磁盘为01、02、03、04、05、07。

图1-14 全局热备磁盘代替故障磁盘

(7)在00位置插上新买的磁盘,这个磁盘状态为Ready,如图1-15所示。

图1-15 新添加的00位置磁盘状态

(8)之后将这个磁盘再次标记为全局热备,如图1-16所示。

图1-16 标准新添加磁盘为全局热备

(9)之后这块新添加的00位置磁盘变为全局热备,而原来07位置状态为Rebuild,代替原来的00位置的磁盘,如图1-17所示。

<div使用Jenkins发布腾讯云项目  阅读原文»

使用Jenkins发布腾讯云项目

最近研究使用jenkins来发布项目,使用publish-over-ssh插件,把打包好的zip或者war包上传到远程服务器上,并执行一些命令,本来也没什么问题,但是公司主要业务在腾讯云上,但是腾讯云的服务器并没有外网地址,SSH连接到服务器只能通过腾讯云HTTP代理服务器,并且需要token+服务器的密码,才能连接到服务器。

问题来了 publish-over-ssh插件 并没有设置访问时ssh时通过HTTP代理服务器,如何解决才好?

到jenkins服务器上该插件的lib目录下看看该插件的构成,该插件依赖于jsch-0.1.45.jar这个jar包,刚好对jsch比较熟悉,于是找到publish-over-ssh的源码下载下来,找到ssh连接的代码,加上http代理的代码,加的代码如下:

src\main\java\jenkins\plugins\publish_over_ssh\BapSshHostConfiguration.java

  public BapSshClient createClient(final BPBuildInfo buildInfo, final boolean connectSftp) {          final JSch ssh = createJSch();          final Session session = createSession(buildInfo, ssh);          final BapSshClient bapClient = new BapSshClient(buildInfo, session, isEffectiveDisableExec());          try {              final BapSshKeyInfo keyInfo = getEffectiveKeyInfo(buildInfo);              final Properties sessionProperties = getSessionProperties();              Properties properties = new Properties();              // 得到jar包所在的路径              String jarPath = BapSshHostConfiguration.class.getProtectionDomain().getCodeSource().getLocation().getPath();              String sep = File.separator;              int lastIndex = jarPath.lastIndexOf(File.separator);              // 读取配置文件              FileInputStream fileInputStream = new FileInputStream(jarPath.substring(0,lastIndex)+ sep +"configure.properties");              properties.load(fileInputStream);              String enableHttpProxy = properties.getProperty("enable_http_proxy");              String proxyServer = properties.getProperty("http_proxy_server");              String proxyPort = properties.getProperty("http_proxy_port");              if (keyInfo.useKey()) {                  setKey(buildInfo, ssh, keyInfo);                  sessionProperties.put(CONFIG_KEY_PREFERRED_AUTHENTICATIONS, "publickey");              } else {                  session.setPassword(Util.fixNull(keyInfo.getPassphrase()));                  sessionProperties.put(CONFIG_KEY_PREFERRED_AUTHENTICATIONS, "keyboard-interactive,password");              }              session.setConfig(sessionProperties);              if ("1".equals(enableHttpProxy)){                  session.setProxy(new ProxyHTTP(proxyServer,Integer.parseInt(proxyPort)));              }              connect(buildInfo, session);              if (connectSftp) setupSftp(buildInfo, bapClient);              return bapClient;          } catch (IOException ioe) {              bapClient.disconnectQuietly();              throw new BapPublisherException(Messages.exception_failedToCreateClient(ioe.getLocalizedMessage()), ioe);          } catch (RuntimeException re) {              bapClient.disconnectQuietly();              throw re;          }      }  

这个方法其中以下是添加的

  Properties properties = new Properties();  // 得到jar包所在的路径  String jarPath = BapSshHostConfiguration.class.getProtectionDomain().getCodeSource().getLocation().getPath();  String sep = File.separator;  int lastIndex = jarPath.lastIndexOf(File.separator);  // 读取配置文件  FileInputStream fileInputStream = new FileInputStream(jarPath.substring(0,lastIndex)+ sep +"configure.properties");  properties.load(fileInputStream);  String enableHttpProxy = properties.getProperty("enable_http_proxy");  String proxyServer = properties.getProperty("http_proxy_server");  String proxyPort = properties.getProperty("http_proxy_port");  if ("1".equals(enableHttpProxy)){          session.setProxy(new ProxyHTTP(proxyServer,Integer.parseInt(proxyPort)));  }  

通过maven重新打包成publish-over-0.18.jar,然后重命名为classes.jar,到插件的lib备份原有的classes.jar之后删除,上传新生成的classes.jar到lib目录,下载该文件

classes.jar

然后新建configure.properties文件,里面写上配置,如下:

  #### Enable HTTP Proxy 0:disable 1:enable####  enable_http_proxy=1  http_proxy_server=cvm-proxy.opencloud.qq.com  http_proxy_port=80  

classes.jar和configure.properties上传之后,位于如下位置,注意自己的jenkins安装位置

270895242.png

然后重启一下jenkins服务器,在添加主机的IP时候,就填上腾讯云服务器的内网地址和端口,用户名是你的appid,密码是服务器的密码,只不过等发布的时候可以临时把token关闭一下,这样就行了。

只不过这里还有点小问题,这里要是jenkins服务器不只给腾讯云服务器发布项目呢,连接其他的服务器时,不需要通过HTTP代理,这时候 看配置文件里面的

  enable_http_proxy=1  

这一项如果是1,就启用http代理,0 就禁用http代理,所以在使用在把部署文件传到服务器之前把该值修改一下(通过shell命令),就OK了。

至此就大功告成。

本文出自 "雷纳科斯的博客" 博客,请务必保留此出处http://linux5588.blog.51cto.com/65280/1654767

分享至 一键收藏,随时查看,分享好友!
每日博报 精彩不止一点

阅读更多内容

没有评论:

发表评论