OpenStack对象存储管理手册(5) OpenStack对象存储系统管理-3

4. OpenStack对象存储系统管理

4.3 对象布局

       Swift使用底层的文件系统在磁盘上存储数据。管理员可以使用普通的文件系统工具来查找和检测数据。Swift使用如下惯例来存储对象:

/path_to_mount_points/device/objects/partition/hash_suffix/hash/

       账户和容器使用同样的方法存储,只是把其中的“objects”改成“accounts”或者“containers”。

       这个目录是所有对象的数据存储的地方。在这个目录内,一般只有一个文件(叫做<timestamp>.data)。对象的数据存储在这个文件中,对象的元数据存储在文件的扩展属性(xattrs)中。

       如果一个用户删除了对象,那么这个.data文件就被删除了同时一个<timestamp>.ts文件会被创建,这个文件大小为0字节。这是一个删除记号,最终会被移除,但是它的存在保证了删除操作在集群所有的副本中正确地传送了。

       Swift使用在文件名中设置时戳的方案来完成冲突的解决。当请求到达集群时,代理服务器会给每一块数据分配一个时间戳,这个时间戳用来在对象(或者账户或者容器)服务器上命名磁盘上的文件。一般情况下,目录中有一个单独的文件意思是目录中只有一个文件么?)。如果swift收到了对同一个对象的多个并发请求,可能会发生多个.data文件被写入到目录中的情况,swift使用“last-write-wins”(最后一次写入有效)来解决这样的冲突,通过时间戳来选择最近的文件。

4.4 配置和调试OpenStack对象存储

       这部分走一遍OpenStack对象存储的部署和注意事项。

       你有多个部署选项可以选择,swift服务是完全独立自主运行的,为swift分配硬件具有很大的灵活性。主要有4个服务:

l  代理服务

l  对象服务

l  容器服务

l  账户服务

代理服务器是CPU和网络I/O密集型的。如果你在代理服务器使用10G的网络或者在代理端终止SSL traffic,会需要更多的CPU功耗。

       对象、容器和账户服务(存储服务)是磁盘和网络I/O密集型的。

       最简单的部署方法就是在每个服务器上部分不同的服务,这么做没有问题,每个服务都是横向扩展的。

       在Rackspace,我们把代理服务放在单独的服务器上,其他的存储服务放在同一个服务器上。这样我们就可以给代理服务器分配10G的网络,给存储服务器分配1G的网络,使代理服务器的负载均衡更容易管理。增加存储服务器的时候存储服务能够水平扩展。我们可以增加更多的代理服务器来增加API的吞吐量。

       如果你的账户或容器服务需要更多的吞吐量,他们可以被部署在单独的服务器上。比如说你可以使用更快的SAS或者甚至是SSD来获得更快对数据库的磁盘I/O。

       负载均衡和网络设计留给读者做为一个练习(这是原文说的,不是我说的),但是这是集群中非常重要的部分,所有需要花费时间来为swift设计网络架构。

4.5 准备Ring

注意:这个部分的“分区(partition)”指定是swiftring的逻辑分区,而不是存储节点设备的物理分区。你需要在每个磁盘上为对象存储节点磁盘分区分配一个物理分区。

第一步是决定ring中分区的数目。我们推荐每个磁盘上至少有100个分区来保证磁盘间的均匀分布。一个好的做法是计算出集群能够具有的最多的磁盘数,然后乘以100,向上取值到最接近的2的幂。

比如说假设我们要建立一个最多有5000个磁盘的集群,那么这就意味着我们有总共500000个分区,这个值和2的19次方很接近,所以就把分区数设置为2的19次方。

保持分区数相对较少也是一个好想法。分区数越多,复制器和其他后台的进行需要做的工作越多,ring要消耗更多的内存。目标是在小的ring和最大集群大小间找到一个好的均衡。

下一步是决定副本数。当前推荐使用3副本(这是唯一被测试过的值)。这个值越高,需要的存储空间越大,但是丢失数据的可能性越少。

决定集群有多少个区域(zone)也很重要。推荐最少有5个区域。你可以设置少一些,但是我们的测试显示当有故障发生时,至少五个区域是最优的。我们还推荐配置zone时等级越高越好(as high a level as possible),隔离性越高越好。比如可以考虑物理位置、电源可用性和网络连通性。比如,在一个小集群中,你可以用机箱来分离zones,每个机箱都有自己的电源和网络连接。Zone的概念是非常抽象的,你可以随意使用各种方式来隔离你的数据。Zone以数字来代表,从1开始。

你现在可以开始建立ring:

Swift-ring-builder <builder_file>create <part_power> <replicas> <min_part_hours>

这个命令开始创建ring,以2^<part_power>个分区创建<builder_file>。<min_part_hours>表示连续地移动分区的间隔(小时)。

       现在可以将设备添加到ring中:

Swift-ring-builder <builder_file> addz<zone>-<ip>:<port>/<device_name>_<meta> <weight>

       这个命令会添加一个设备到ring中,<builder_file>是之前创建的builder文件。<zone>是这个设备所在的区域,<ip>是设备所在的服务器的ip地址,<port>服务器的端口号,<device_name>是服务器上该设备的名字(比如:sdb1),<meta>是设备的元数据字符串(可选),<weight>是用来决定相对于集群中其他设备来说有多少分区被放在这个设备的一个可浮动的权重(一个好的初始设置是100.0x TB)。把所有要在集群中初始化的设备都添加进来。

       所有设备都添加进来后,运行:

Swift-ring-builder <builder_file>rebalance

       这个命令会将分区分布在ring中的所有设备上。无论何时对ring做出变化时,都要在运行rebalance之前做完所有需要的改变,这一点是重要的。这能够保证ring是尽可能均衡的,尽可能少的移动分区。

       上述过程需要在每个存储服务节点(账户、容器和对象)运行来创建一个ring。Builder文件在将来改变ring时是有用的,所有这些文件需要保留下来并备份。生成的.tar.gz ring文件需要被复制到集群中所有的服务器上。关于创建ring的更多信息,运行不带选项的swift-ring-builder会显示有用的命令行和选项的帮助信息。


****转载请注明出处****

 

你可能感兴趣的:(openstack)