加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 钦州站长网 (https://www.0777zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

unix主机空间 FreeBSD 手册——19.15.高可用性存储(HAST)

发布时间:2023-01-09 10:59:33 所属栏目:Unix 来源:
导读:  19.15.高可用性存储(HAST)

  高可用性是商业应用的主要要求之一,而高可用性存储是这种环境下的一个关键组成部分。在 FreeBSD 中,高可用性存储(HAST)框架允许在由 TCP/IP 网络连接的几台物理上分离的
  19.15.高可用性存储(HAST)
 
  高可用性是商业应用的主要要求之一,而高可用性存储是这种环境下的一个关键组成部分。在 FreeBSD 中,高可用性存储(HAST)框架允许在由 TCP/IP 网络连接的几台物理上分离的机器上透明地存储相同的数据。HAST 可以被理解为基于网络的 RAID1(镜像),并且类似于 GNU/Linux? 平台中使用的 DRBD? 存储系统。与 FreeBSD 的其他高可用性功能(如 CARP)相结合,HAST 使得建立一个高可用性的存储集群成为可能,它可以抵抗硬件故障的发生。
 
  以下是 HAST 的主要特点:
 
  读完本节后,你会了解:
 
  在阅读本节之前,你应该:
 
  HAST 项目由 FreeBSD 基金会赞助,并得到了 和 的支持。
 
  19.15.1 HAST操作
 
  HAST 在两台物理机之间提供同步的块级复制:_主_(_primary_)节点和 _次_(_secondary_)节点。这两台机器一起被称为一个集群。
 
  由于 HAST 在主—次配置中工作,它只允许集群节点中的一个在任何特定时间处于活动状态。主节点,也叫活动节点,是一个将处理所有 I/O 请求的 HAST 管理的设备。次节点是自动从主要节点同步的。
 
  HAST 系统的物理组件是主节点上的本地磁盘,以及远程的次要节点上的磁盘。
 
  HAST 在块级上同步运行,使它对文件系统和应用程序透明。HAST 在/dev/hast/中提供了标准的 GEOM 工具,供其他工具或应用程序使用。使用 HAST 提供的设备和普通磁盘或分区之间没有区别。
 
  每个写入、删除或刷新操作都通过 TCP/IP 发送到本地磁盘和远程磁盘。每个读操作都是从本地磁盘提供的,除非本地磁盘不是最新的或发生 I/O 错误。在这种情况下,读取操作被发送到辅助节点。
 
  HAST 试图提供快速的故障恢复。出于这个原因,在一个节点的故障后减少同步时间是很重要的。为了提供快速的同步,HAST 管理一个磁盘上的脏区映射表,并且只在常规的同步过程中同步这些表,但初始同步除外。
 
  有许多方法来处理同步问题。HAST 实现了几种复制模式来处理不同的同步方法:
 
  19.15.2.配置 HAST
 
  HAST 框架由几个部分组成:
 
  如果用户希望在内核中静态地编译GEOM_GATE支持,则应在定制内核配置文件中加入这一行,然后按照配置 FreeBSD 内核[8]的说明重建内核:
 
  options?GEOM_GATE
  下面的例子示范了如何在主-次操作中配置两个节点,使用 HAST 在两者之间复制数据。一个节点将被称为hastaunix主机空间,其 IP 地址为172.16.0.1;另一个是hastb,其 IP 地址为172.16.0.2。两个节点将有一个相同大小的专用硬盘/dev/ad6用于 HAST 操作。HAST 池,有时被称为资源或/dev/hast/中的 GEOM 设备,将被称为test。
 
  HAST 的配置是使用/etc/hast.conf完成的。这个文件在两个节点上应该是相同的。最简单的配置是:
 
  resource?test?{
  ????on?hasta?{
  ????????local?/dev/ad6
  ????????remote?172.16.0.2
  ????}
  ????on?hastb?{
  ????????local?/dev/ad6
  ????????remote?172.16.0.1
  ????}
  }
  更多高级配置请参考hast.conf(5)[9]。
 
  技巧
 
  如果在/etc/hosts或本地 DNS 中定义的主机是可解析的,也可以在远程语句中使用主机名。
 
  如果配置存在于两个节点上,就可以创建 HAST 池。在两个节点上运行这些命令,将初始元数据放到本地磁盘上并启动hastd(8)[10]:
 
  #?hastctl?create?test
  #?service?hastd?onestart
  注意
 
  不可能使用已经包含文件系统的 GEOM 设备来创建存储池,也不可能将现有的存储转换为 HAST 管理的池。这个程序需要在设备上存储一些元数据,而在现有的设备上没有足够的所需空间可用。
 
  HAST 节点的主或次角色是由管理员或像 Heartbeat 这样的工具通过hastctl(8)[11]来选择的。
 
  在主节点hasta上执行这个命令:
 
  #?hastctl?role?primary?test
  在次节点hastb上执行这个命令:
 
  #?hastctl?role?secondary?test
  通过在每个节点上运行hastctl来验证结果:
 
  #?hastctl?status?test
  检查输出中的status行。如果它显示degraded,说明配置文件出了问题。它应该在每个节点上显示complete,即意味着节点之间的同步已经开始。当hastctl status报告说有 0 byte 的脏区映射时,同步就完成了。
 
  下一步是在 GEOM 设备上创建一个文件系统并挂载它。这必须在主节点上完成。创建文件系统可能需要几分钟时间,这取决于硬盘的大小。这个例子在/dev/hast/test上创建了一个 UFS 文件系统:
 
  #?newfs?-U?/dev/hast/test
  #?mkdir?/hast/test
  #?mount?/dev/hast/test?/hast/test
  如果 HAST 框架被正确配置,最后一步是确保 HAST 在系统启动时自动启动。添加这一行到/etc/rc.conf即可:
 
  hastd_enable="YES"
  19.15.2.1. 故障转移配置
 
  这个例子的目标是建立一个强大的存储系统,它可以抵御任何特定节点的故障。如果主节点发生故障,副节点就会被无缝地接管,检查和挂载文件系统,并继续工作,不会丢失任何一点数据。
 
  为了完成这项任务,共用地址冗余协议(CARP)被用来在 IP 层提供自动故障转移。CARP 允许同一网段的多个主机共享一个IP地址。根据“共用地址冗余协议(CARP)”[12]中提供的文档,在集群的两个节点上设置 CARP。在这个例子中,每个节点将有自己的管理 IP 地址和172.16.0.254的共享 IP 地址。集群的主要 HAST 节点必须是主要的 CARP 节点。
 
  在上一节中创建的 HAST 池现在已经准备好被导出到网络上的其他主机。这可以通过 NFS 或 Samba 导出,使用共享 IP 地址172.16.0.254来完成。唯一没有解决的问题是在主节点发生故障时的自动故障转移。
 
  在 CARP 接口开启或关闭时,FreeBSD 操作系统会生成devd(8)[13]事件,从而可以观察 CARP 接口的状态变化。CARP 接口上的状态变化表明其中一个节点失败或重新上线了。这些状态变化事件使运行一个脚本成为可能,该脚本将自动处理 HAST 故障切换。
 
  为了捕捉 CARP 接口上的状态变化,在每个节点上的/etc/devd.conf中添加这个配置:
 
  notify?30?{
  ????match?"system"?"IFNET";
  ????match?"subsystem"?"carp0";
  ????match?"type"?"LINK_UP";
  ????action?"/usr/local/sbin/carp-hast-switch?primary";
  };
 
  notify?30?{
  ????match?"system"?"IFNET";
  ????match?"subsystem"?"carp0";
  ????match?"type"?"LINK_DOWN";
  ????action?"/usr/local/sbin/carp-hast-switch?secondary";
  };
  注意
 
  如果系统运行的是 FreeBSD 10 及更高版本,把 CARP 配置的接口名称替换carp0。
 
  在两个节点上重新启动devd(8)[14]以使新配置生效:
 
  #?service?devd?restart
  当指定的接口状态因开启或关闭而改变时,系统会产生一个通知,允许devd(8)[15]子系统运行指定的自动故障切换脚本,**/usr/local/sbin/carp-hast-switch**。关于这个配置的进一步说明,请参考devd.conf(5)[16]。
 
  下面是一个自动故障转移脚本的例子:
 
  #!/bin/sh
 
  #?Original?script?by?Freddie?Cash?
  #?Modified?by?Michael?W.?Lucas?
  #?and?Viktor?Petersson?
 
  #?The?names?of?the?HAST?resources,?as?listed?in?/etc/hast.conf
  resources="test"
 
  #?delay?in?mounting?HAST?resource?after?becoming?primary
  #?make?your?best?guess
  delay=3
 
  #?logging
  log="local0.debug"
  name="carp-hast"
 
  #?end?of?user?configurable?stuff
 
  case?"$1"?in
  ????primary)
  ????????logger?-p?$log?-t?$name?"Switching?to?primary?provider?for?${resources}."
  ????????sleep?${delay}
 
  ????????#?Wait?for?any?"hastd?secondary"?processes?to?stop
  ????????for?disk?in?${resources};?do
  ????????????while?$(?pgrep?-lf?"hastd:?${disk}?\(secondary\)"?>?/dev/null?2>&1?);?do
  ????????????????sleep?1
  ????????????done
 
  ????????????#?Switch?role?for?each?disk
  ????????????hastctl?role?primary?${disk}
  ????????????if?[?$??-ne?0?];?then
  ????????????????logger?-p?$log?-t?$name?"Unable?to?change?role?to?primary?for?resource?${disk}."
  ????????????????exit?1
  ????????????fi
  ????????done
 
  ????????#?Wait?for?the?/dev/hast/*?devices?to?appear
  ????????for?disk?in?${resources};?do
  ????????????for?I?in?$(?jot?60?);?do
  ????????????????[?-c?"/dev/hast/${disk}"?]?&&?break
  ????????????????sleep?0.5
  ????????????done
 
  ????????????if?[?!?-c?"/dev/hast/${disk}"?];?then
  ????????????????logger?-p?$log?-t?$name?"GEOM?provider?/dev/hast/${disk}?did?not?appear."
  ????????????????exit?1
  ????????????fi
  ????????done
 
  ????????logger?-p?$log?-t?$name?"Role?for?HAST?resources?${resources}?switched?to?primary."
 
  ????????logger?-p?$log?-t?$name?"Mounting?disks."
  ????????for?disk?in?${resources};?do
  ????????????mkdir?-p?/hast/${disk}
  ????????????fsck?-p?-y?-t?ufs?/dev/hast/${disk}
  ????????????mount?/dev/hast/${disk}?/hast/${disk}
  ????????done
 
  ????;;
 
  ????secondary)
  ????????logger?-p?$log?-t?$name?"Switching?to?secondary?provider?for?${resources}."
 
  ????????#?Switch?roles?for?the?HAST?resources
  ????????for?disk?in?${resources};?do
  ????????????if?!?mount?|?grep?-q?"^/dev/hast/${disk}?on?"
  ????????????then
  ????????????else
  ????????????????umount?-f?/hast/${disk}
  ????????????fi
  ????????????sleep?$delay
  ????????????hastctl?role?secondary?${disk}?2>&1
  ????????????if?[?$??-ne?0?];?then
  ????????????????logger?-p?$log?-t?$name?"Unable?to?switch?role?to?secondary?for?resource?${disk}."
  ????????????????exit?1
  ????????????fi
  ????????????logger?-p?$log?-t?$name?"Role?switched?to?secondary?for?resource?${disk}."
  ????????done
  ????;;
  esac
  简而言之,当一个节点成为主节点时,脚本会采取这些行动:
 
  当一个节点成为次节点时:
 
  当心
 
  这只是一个作为概念证明的脚本例子。它并不能处理所有可能的情况,可以以任何方式对其进行扩展或改变,例如,启动或停止所需的服务。
 
  技巧
 
  在这个例子中,使用了基础的 UFS 文件系统。为了减少恢复所需的时间,可以使用带日志支持的 UFS 或 ZFS 文件系统来代替。
 
  更详细的信息和更多的例子可以在以下网站找到:[17]。
 
  19.15.3. 故障排除
 
  HAST 的工作一般应该没有问题。然而,就像任何其他软件产品一样,可能有的时候它不能像预期的那样工作。问题的来源可能是不同的,但经验法则是确保集群的节点之间的时间是同步的。
 
  当排除 HAST 的故障时,应通过hastd -d来增加hastd(8)[18]的调试级别。这个参数可以指定多次以进一步提高调试级别。也可以考虑使用-F,它将在前台启动hastd。
 
  19.15.3.1. 从“大脑分裂”中恢复过来
 
  当集群的节点无法相互通信,而两个节点都被配置为主节点时,就会出现 _大脑分裂_。这是一个危险的情况,因为它允许两个节点对数据进行不兼容的修改。必须由系统管理员手动纠正这个问题。
 
  管理员必须决定哪个节点含有更重要的变化(或者手动执行合并改动)。然后,让 HAST 对有破损数据的节点执行完全同步。要做到这一点,在需要重新同步的节点上执行这些命令:
 
  #?hastctl?role?init?test
  #?hastctl?create?test
  #?hastctl?role?secondary?test
 

(编辑:PHP编程网 - 钦州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章