Enterprise-Wide Unique 标识符

实现业务连续性的最佳实践

在大型 IBM® AIX® 环境中,是否能够成功地实现业务连续性,取决于是否能够在支持的计算机系统上消除资源冲突。业务连续性的许多方面(比如虚拟化、高可用性和灾难恢复)要求系统配置中涉及的许多资源参数具有惟一的标识值。本文讨论为各种配置参数生成 Enterprise-Wide Unique(企业范围惟一,EWU)标识值的机制。

Dana French, 总裁, Mt Xia Inc.

http://www.ibm.com/developerworks/i/p-dfrench.jpgFrench 先生在 IT 行业中的从业经验已有三十多年,所涉及的行业也非常之多。他的工作重点主要是业务连续性、灾难恢复以及高可用性等领域,并且他设计和编写了许多软件包,以实现灾难恢复和高可用性过程的自动化。他最大的贡献是将系统管理作为一项自动化的、面向业务的过程(而不是面向系统的、交互的过程)。他还是 Korn Shell 编程领域的著名专家。



2009 年 4 月 16 日

简介

在跨越多个数据中心的大型 IBM AIX 计算环境中,必须要实现业务连续性、灾难恢复、高可用性和虚拟化。设计和部署大型环境的一个必要条件是,要确保关键的配置参数具有 Enterprise-Wide unique (EWU) 标识符。EWU 标识符可以消除重复的值,这些重复的值会破坏和拖延灾难恢复、高可用性和虚拟化过程。

EWU 标识符是指在整个企业范围内具有单一值的任何参数。这个标识符可以是字符串、数字或字母数字值。使用 EWU 标识符的目的是消除系统管理的所有方面涉及的冲突值和重复值。这包括普通操作、紧急操作、启动、关闭、自动或手工故障转移、灾难恢复或高可用性过程。为了决定哪些参数可能需要 EWU 标识符,需要建立关键配置参数的清单。关键配置参数包括:

  • 用户名
  • 用户 ID 号
  • 组名
  • 组 ID 号
  • 集群 ID 号
  • 资源组名
  • 卷组名
  • 逻辑卷名
  • 文件系统挂装点目录名
  • 数据库记录 ID 号
  • 服务组名
  • HACMP 应用服务器名
  • 应用程序启动和关闭脚本
  • 错误号

前面的清单并不完整,只是提供一些示例。


Enterprise-wide unique 标识符

在试图实现 EWU 标识符时,大多数系统管理员遇到的一个问题是如何跟踪和记录它们。大多数系统管理员会创建一个数据库或电子表格,在其中映射和记录必须为所有位置和所有数据中心的所有 AIX 系统生成的数以千计的标识符。这种方法从一开始就注定了失败的结局。电子表格常常会过时、很不可靠,管理员无法确定电子表格是最新的,甚至无法确定它是正确的电子表格。电子表格不应该用来存储系统配置管理信息,但是这个问题留到另一篇文章中讨论。

在存储系统配置管理信息方面,数据库有许多与电子表格相同的问题,但是通常只有一个包含此类信息的数据库。因此,系统管理员至少能够确定他们访问的数据来自正确的位置,但是不一定能够确定信息是最新的。

最好的解决方案是不使用电子表格或数据库把 EWU 值映射到关键配置参数。最好的解决方案是,根据需要从关键配置参数动态地生成 EWU 值。这需要一种跨异类平台生成相同 EWU 值的机制。通过生成 EWU 值,就不再需要维护电子表格或数据库。对于跨 UNIX® 平台生成 EWU 值,可移植性最好的机制是 shell 脚本。

如果使用 shell 脚本生成 EWU 值,那么脚本必须能够接受任何输入字符串。必须允许用户选择输出值的格式和位数。使用 shell 脚本的原因是,能够在任何 UNIX 平台上为任何字符串生成相同的 EWU 标识符。例如,在需要获得一个用户名的 UID 号时,不需要在电子表格或数据库中查找,而是在任何 UNIX 系统上使用 EWU 值生成脚本生成它。

生成 EWU 值的脚本应该编写为一个函数,并把它包含在组织的标准 shell 函数集中。这使系统管理员能够轻松地把这个函数合并到自己的 shell 脚本中,确保以一致且可重复的方式生成 EWU 值。脚本函数应该能够以多种格式生成 EWU 值,比如十进制、二进制、八进制或十六进制。还必须能够选择输出位数,以便适应各种用途和应用程序的需要。

  • 基数:
    • 基数 16 - 十六进制 (0-f)
    • 基数 10 - 普通计数数字 (0-9)
    • 基数 8 - 八进制 (0-7)
    • 基数 2 - 二进制 (0-1)

下面是使用 AIX 命令和语法计算 EWU 值的示例:

print "any string requiring an enterprise wide unique identifier" | cksum | 
awk '{ print $1 }'

341023782

使用前面生成的 CRC 校验和值计算 EWU 值:

d输出值中的位数
b计数基数(十进制、十六进制、八进制、二进制)
c校验和值
m以计数基数的输出位数次方为分母,对 CRC 校验和值取模数

基数 10(十进制):

d=4
c = 341023782
m = c % 10**d
m = 3782

基数 16(十六进制):

d = 4
m = c % 16**d
m = 39976 = 9C26 HEXADECIMAL

基数 8(八进制):

d = 4
m = c % 8**d
m = 3110 = 6046 OCTAL

基数 2(二进制):

d = 4
m = c % 2**d
m = 6 = 0110 BINARY

下面是以 Korn Shell 93 语法计算基数 16(十六进制)EWU 值的代码:

#!/usr/bin/ksh93   
d=4        
b=16          
v="any string requiring an enterprise wide unique identifier"  
c=$( print -- ${v} | cksum | awk '{ print $1 }' )   
(( m = c % b**d ))    
print -- "ibase=10; obase=${b}; ${m}" | bc
9C26

下面是以 Korn Shell 93 语法计算基数 10(十进制)EWU 值的代码:

#!/usr/bin/ksh93  
d=4
b=10
v="any string requiring an enterprise wide unique identifier"
c=$( print -- ${v} | cksum | awk '{ print $1 }' )
(( m = c % b**d ))
print -- "ibase=10; obase=${b}; ${m}" | bc
3782

下面是以 Korn Shell 93 语法计算基数 8(八进制)EWU 值的代码:

#!/usr/bin/ksh93 
d=4  
b=8   
v="any string requiring an enterprise wide unique identifier"
c=$( print -- ${v} | cksum | awk '{ print $1 }' ) 
(( m = c % b**d )) 
print -- "ibase=10; obase=${b}; ${m}" | bc
6046

下面是以 Korn Shell 93 语法计算基数 2(二进制)EWU 值的代码:

#!/usr/bin/ksh93 
d=4      
b=2     
v="any string requiring an enterprise wide unique identifier" 
c=$( print -- ${v} | cksum | awk '{ print $1 }' )
(( m = c % b**d ))
print -- "ibase=10; obase=${b}; ${m}" | bc
110

下面解释一下使用 CRC 校验和命令计算 EWU 值所需的各个成分:

  • 校验和:

    为用户通过命令行提供的每个字符串计算 CRC 校验和。

  • 分母:

    这是根据计数基数和输出值所需的位数计算出来的。这个值也是使用计数基数和输出值的位数能够生成的惟一输出值的总数。

  • 模数:

    校验和值除以分母值的余数。这是代表用户通过命令行提供的字符串的十进制惟一值。

  • ewuid:

    按照所需的输出计数基数和输出字符数转换后的 EWU 值。

前面的技术可以为任何用户提供的字符串生成惟一的标识符;但是,在每次需要 EWU 值时都执行这一系列命令比较麻烦。幸运的是,有一个使用此技术的脚本,可以使用它以各种计数基数生成 EWU 标识符,同时允许用户选择所需的输出位数。此脚本称为 mkewuid,可以从 这里 获得。

下面是 mkewuid Korn Shell 脚本函数产生的用法信息:

Generate an Enterprise Wide Unique (EWU) identifier
value for any given input string of characters. For
example, this script can be used to generate an
Enterprise Wide Unique UID number for any given user
name.  The output value may be calculated in a user
selectable format and number of digits.

Usage: ${1##*/} [-?vV] [-hdob] [-mM] [-c] [-p #] [-ul] [string...]
  Where:
    -h = Hexadecimal (Base 16) output value (default)
    -d = Base 10  output value
    -o = Octal (Base 8) output value
    -b = Binary (Base 2) output value
    -p # = Number of characters in output value         (default: 4)
   -c = Display column headers in output (default: no headers)
    -m = Minimize output
    -M = Maximize output (default)
    -u = Uppercase Enterprise Wide Unique output values
    -l = Lowercase Enterprise Wide Unique output values (default)>
    -v = Verbose mode - displays mkewuid function info
    -V = Very Verbose Mode - debug output displayed
    -? = Help - display this message
    string = any alphanumeric string such as user names, group names, host names, 
        node names, etc.
             (default: local node name )
Example Usage:
  mkewuid -c -h -p 6 teststring1

Example Output:
  # string : base : cksum : denom: modulo : ewuid
  teststring1:16:542276492:16777216:5405580:527b8c

mkewuid 脚本函数为命令行上提供的每个字符串输出一个记录行。

为了适应应用程序和数据库的需求差异,mkewuid 脚本函数可以把输出值转换为全大写或全小写字符(分别使用命令行选项 -u-l)。

mkewuid 脚本函数的默认输出记录包含五个字段,字段之间由冒号 (:) 分隔:

  • 字段 1:用户在命令行上提供的字符串。
  • 字段 2:用来计算 EWU 值的计数基数。
  • 字段 3:用户提供的字符串的 CRC 校验和值。
  • 字段 4:根据计数基数和 EWU 输出值所需的位数计算出来的分母。
  • 字段 5:EWU 输出值。

一个命令行选项可以缩减输出记录,只显示在命令行上提供的每个字符串的 EWU 值。这个最简化选项是 -m;但是,这个脚本函数的默认行为是显示所有字段 (-M)。通常,在系统管理员编写的 shell 脚本中调用这个脚本函数,用它为单一字符串计算 EWU 值。然后,把输出赋值给一个 shell 变量,供 shell 脚本中的后续命令使??:

#!/usr/bin/ksh93
...
...
...
EWUID=$( mkewuid -d -p 7 -m   myusername )
...
...
...

上面的示例演示如何使用 mkewuid 脚本函数动态地计算用户名的 UID 号。另外,因为这个脚本可以在任何系统上为相同的字符串生成相同的数字,所以不需要把 UID 号存储在电子表格或数据库中。


结束语

使用 mkewuid 这样的脚本生成 EWU 值有许多原因,这对现代数据中心环境的操作和管理非常重要。系统管理员必须通过一种一致、可重复且可移植的方法确保用惟一的值标识各种硬件、软件、设施、网络和人员资源。如果关键资源的标识值出现重复,就会在实现和实施业务连续性原则时造成严重的问题。灾难恢复和高可用性故障转移要求跨所有节点惟一地标识这些过程中涉及的资源。在故障转移(无论是自动的还是手工的)期间,花时间解决资源标识冲突会延长停机时间。通过用 EWU 值定义这些资源,可以在自动或手工故障转移、高可用性操作和灾难恢复测试或实现期间消除冲突。

使用标准化机制生成 EWU 值的另一个好处是,不再需要把这些值存储在电子表格或数据库中。对于存储这类数据来说,电子表格非常不可靠。管理员常常复制电子表格,对这个拷贝做修改,几天之后才把它复制回中心位置。在此期间,另一位管理员可能修改过电子表格,这些修改会被覆盖。更常见的情况是,没有及时更新电子表格,内容与最新数据不一致。用数据库存储这些信息也有同样的问题。数据常常是过时的,或者在紧急情况下需要数据时无法访问数据库。由于这些原因,必须避免用电子表格和数据库存储关键的配置信息。如果可能的话,应该以一致且可重复的方式动态地生成配置信息。

尽管编译的程序的运行速度通常比脚本快得多,但是对于生成 EWU 值的机制,速度并不是主要关注点。主要关注点是这种机制应该独立于平台,应该能够在系统之间方便地复制。编译的程序需要重新编译,才能迁移到另一个平台上,因此需要编译器。尽管可以为每个平台生成二进制代码,但是这需要更高的技能水平。在灾难恢复实现期间,可能找不到具备这种技能的人员。生成 EWU 值的最佳机制是使用 shell 脚本。

最后,动态地生成 EWU 值的最重要的原因是数据中心自动化。在实现数据中心自动化过程中,必须使用一致、可重复且可靠的机制支持 EWU 标识符。因为电子表格不可靠且不一致,所以绝对不能使用电子表格。数据库是可靠的,但是这要求部署过程能够访问数据库所在的网络,这个条件不一定成立。另外,在灾难恢复实现期间,很可能需要在恢复数据库之前执行自动部署。在这种情况下,无法获得数据中心自动化过程所需的关键配置信息。同样,最好的解决方案是尽可能动态地生成关键配置信息。

参考资料

学习

  • Enterprise Wide Unique 标识符生成器 为任何给定的用户名生成 Enterprise Wide Unique UID 号。
  • AIX 灾难恢复讨论在灾难恢复期间常常出现的资源冲突,并提供解决这些冲突的建议。
  • Korn Shell Scripting Template 是一个用于创建新的 korn shell 脚本的 korn shell 脚本模板。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播。
  • AIX:访问此 AIX 相关技术信息的协作环境。
  • Podcasts:收听 Podcast 并了解 IBM 技术专家的最新想法。

获得产品和技术

  • IBM 试用软件:使用可直接从 developerWorks 下载的试用软件构建您的下一个项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=382830
ArticleTitle=Enterprise-Wide Unique 标识符
publish-date=04162009