在顺利的安装部署了KeyStone之后,原以为swift的安装调试也会如KeyStone一般,但过程却充满了坎坷,在结合源代码中的一些函数之后,终于成功的完成了swift的安装,并实验了上传下载文件等功能,下面整理了swift的安装过程,并对遇到的问题进行了总结,希望对遇到同样问题的人有些启示或帮助。安装过程依然参考的是OpenStack的官方安装手册,但补充了一些细节。在安装之前,先简单的介绍一下Swift是什么、主要功能是什么。OpenStack的对象存储(Swift)是一个多租户的、高可扩展的对象存储系统,通过RESTful HTTP API管理着大量的非结构化数据,在部署对象存储之前必须至少安装了身份服务(KeyStone)。Swift包含的组件包括:

  1. 代理服务器(swift-proxy-server):接受对象存储API和HTTP请求以上传文件、修改元数据和创建容器,也向浏览器提供文件或容器的列表。为了改进性能,代理服务器可以使用可选的缓存,通常选择memcache与代理服务器一起部署。
  2. 账户服务(account-server):管理对象存储中的账户。
  3. 容器服务(container-server):管理对象存储中容器或文件夹的映射。
  4. 对象服务(object-server):管理存储节点上的实际对象,比如文件。
  5. Wsgi中间层:处理认证,通常是身份服务(KeyStone)。
  6. 周期性进程:在集群中执行各种维护任务,比如复制(replicator)服务确保集群中数据的一致性和可用性,其它还包括:auditor,updater和reaper。

代理服务依赖于认证和授权机制,如果使用身份服务完成认证和授权的话,则在配置管理swift之前,首先要在keystone中创建swift的认证信息和endpoint。对象存储在控制节点上不适用sql数据库。由于之前已经成功部署了KeyStone,所以这里就不在赘述KeyStone的安装过程,直接进入Swift的安装。本次安装是在单节点的虚拟机进行的,也就是控制节点和存储节点部署在相同的主机中,操作系统为CentOS7.1。首先在KeyStone中创建Swift的用户、服务及endpoint,具体命令及结果如下:

[openstack@localhost ~]$ keystone user-create --name swift --pass 123456
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |                                  |
| enabled  |               True               |
|    id    | ed4f45ac3e8a4ac683d54b642e61ac04 |
|   name   |              swift               |
| username |              swift               |
+----------+----------------------------------+
keystone user-role-add --user swift --role admin --tenant service
[openstack@localhost ~]$ keystone service-create --name swift --type object-store
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |                                  |
|   enabled   |               True               |
|      id     | 094cc0da43e348f8b792f77ef99f8e7e |
|     name    |              swift               |
|     type    |           object-store           |
+-------------+----------------------------------+
[openstack@localhost ~]$ keystone endpoint-create --region regionOne --service swift --publicurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s' --internalurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s' --adminurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s'
+-------------+-----------------------------------------------------------------+
|   Property  |                              Value                              |
+-------------+-----------------------------------------------------------------+
|   adminurl  |                    http://locoalhost:8080/v1/                   |
|      id     |                 c0da7d196e204e038766740e405dbbce                |
| internalurl | http://locoalhost:8080/v1/AUTH_2835009c452b4d408f95ff5a920fc877 |
|  publicurl  | http://locoalhost:8080/v1/AUTH_2835009c452b4d408f95ff5a920fc877 |
|    region   |                            regionOne                            |
|  service_id |                 094cc0da43e348f8b792f77ef99f8e7e                |
+-------------+-----------------------------------------------------------------+
然后安装proxy-server,swift客户端、memcached等:yum install openstack-swift-proxy python-swiftclient python-keystone-auth-token python-keystonemiddleware memcached。上面命令中的python-keystone-auth-token是无法安装的,当使用yum安装时将会报如下的异常信息:没有可用软件包 python-keystone-auth-token。经过在OpenStack的官网确认,该问题属于文档中的错误,直接忽略该问题或者执行yum install openstack-swift-proxy python-swiftclient python-keystonemiddleware memcached。安装执行完毕后,执行下面的命令下载proxy-server.conf文件:
curl -o /etc/swift/proxy-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/proxyserver.conf-sample
下载完成后需要对文件中的配置参数进行修改,修改的具体内容如下:
  • 在[DEFAULT]中指定端口号、用户名和配置文件目录:
[DEFAULT]
...
bind_port = 8080
user = swift
swift_dir = /etc/swift
  • 在[pipeline:main]中,启用合适的模块:
[pipeline:main]
pipeline = authtoken cache healthcheck keystoneauth proxy-logging proxy-server
  • 在[app:proxy-server]中,启用用户管理功能:
[app:proxy-server]
...
allow_account_management = true
account_autocreate = true
  • 在[filter:keystoneauth]中配置合适的操作角色;
[filter:keystoneauth]
use = egg:swift#keystoneauth
...
operator_roles = admin,_member_
  • 在[filter:authtoken]中配置认证服务的相关信息:
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
...
auth_uri = http://localhost:5000/v2.0
identity_uri = http://localhost:35357
admin_tenant_name = service
admin_user = swift
admin_password = SWIFT_PASS #指定为使用keystone创建swift用户时设置的密码,比如123456
delay_auth_decision = true
  • 在[filter:cache]中,配置memcached的位置:
[filter:cache]
...
memcache_servers = 127.0.0.1:11211
这样就完成了proxy-server的安装和部署,可以使用systemctl启动该服务了,但目前先不启动该服务,直到部署配置存储服务后。在安装存储服务之前,先为存储服务指定存储目录,这需要将磁盘分区挂载到存储目录。根据官方的安装手册,挂载的磁盘必须具备分区表,也就是该磁盘已经分区完毕。经过测试,该磁盘具备几个分区不重要,但必须执行了分区,可以使用fdisk命令进行磁盘分区操作。虽然Swift支持各种文件系统,但根据测试XFS文件系统具有最好的性能和稳定性,所以对磁盘分区后,比如/dev/sdb1,需要使用命令mkfs.xfs对/dev/sdb1进行格式化:mkfs.xfs /dev/sdb1。格式化完成后,创建挂载目录:mkdir -p /srv/node/,然后编辑/etc/fstab,添加下面语句:
/dev/sdb1 /srv/node/ xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
最后挂载设备的存储目录:mount /srv/node,并修改该目录的所有者为运行swift的用户:chown -R swift:swift /srv/。挂载目录是swift一个潜在的容易出问题的地方,有可能是权限问题,也有可能和后面介绍的配置文件有关,具体的问题后面再详细介绍。挂载设备后,还需要修改/etc/rsyncd.conf文件,具体内容如下:
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT_INTERFACE_IP_ADDRESS
[account]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/object.lock
做完准备工作后,执行下面的命令进行存储服务的安装,包括account-server、container-server和object-server:yum install openstack-swift-account openstack-swift-container openstack-swift-object。安装完成后,执行下面的命令下载account-server.conf、container-server.conf和object-server.conf文件:
curl -o /etc/swift/account-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/account-server.conf-sample

curl -o /etc/swift/container-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/container-server.conf-sample

curl -o /etc/swift/object-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/object-server.conf-sample
三个配置文件所要修改的内容很相似,因此仅对account-server.conf进行说明,其它两个文件不同的地方将进行标记。
  • 在[DEFAULT]中,配置ip地址、端口号、用户、配置文件所在目录和挂载目录,需要注意的地方是挂载目录,该目录为挂载点的上级目录,比如/dev/sdb1挂载到目录/srv/node目录,在该配置文件的中的挂载目录应该为/srv,而不是/srv/node。
[DEFAULT]
...
bind_ip = 127.0.0.1
bind_port = 6002 #不同的服务使用不同的端口
user = swift
swift_dir = /etc/swift
devices = /srv/ #设备挂载目录的上级目录
  • 在[pipeline:main]中,设置合适的模块:
[pipeline:main]
pipeline = healthcheck recon account-server#account-server在其它配置文件中应该改为container-server、object-server
  • 在[filter:recon]中,配置recon缓存目录:
[filter:recon]
...
recon_cache_path = /var/cache/swift
container-server.conf和object-server.conf只需要修改上面注释的地方即可,其它地方完全一致。修改完所有配置文件后,将/var/cache/swift的拥有者改为运行swift的用户,比如swift用户:chown -R swift:swift /var/cache/swift。在执行完所有上述步骤后,接下来就是要生成ring文件,命令的具体含义不会做深入解释,可以在命令直接输入swift-ring-builder查看详细说明。首先进入到/etc/swift目录,该目录在上述几个配置文件中进行设置,然后分别为account、container和object生成ring文件,由于所有的存储服务都部署在单节点上,所以副本的数量设置为1,具体命令为:
swift-ring-builder account.builder create 8 1 1
swift-ring-builder container.builder create 8 1 1
swift-ring-builder object.builder create 8 1 1
其中第一个参数指定了要生成的partition的数量,比如2^8=256,第二个参数执行了副本的数量,此处为1,第三个参数的含义为至少移动分区一次间隔的小时数。创建了ring文件后,需要将存储节点或者目录增加到ring中:
swift-ring-builder account.builder add r1z1-127.0.0.1:6002/node 100
swift-ring-builder container.builder add r1z1-127.0.0.1:6001/node 100
swift-ring-builder object.builder add r1z1-127.0.0.1:6000/node 100
其中的端口号一定要匹配相应配置文件中设置的端口号,而斜线/后面的内容要匹配挂载点的最后一级目录,比如将/dev/sdb1挂载到/srv/node上,则/后面的内容为node,而配置文件中的devices的值则为/srv/,如果设置错位或者不匹配挂载目录的话,会出现下面的错误:
object-replicator: node is not mounted
proxy-server: ERROR Insufficient Storage 127.0.0.1:6002/node
还可以在python命令行下输入下面的语句验证设置是否挂载正常、配置是否正确,如果一切正确,返回True,否则返回False:
from swift.common.constraints import check_mount
check_mount('/srv','node') #第一个参数为配置文件中devices的值,第二个参数为向ring增加设备时/后面的值
然后运行下面的命令对ring进行rebalance:
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance
注意上述生成ring文件,增加存储节点到ring的步骤都是在控制节店中执行的。下载swift.conf文件并对其进行修改:
curl -o /etc/swift/swift.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/swift.conf-sample
  • 在[swift-hash]中配置hash路径的前缀和后缀:
[swift-hash]
...
swift_hash_path_suffix = HASH_PATH_PREFIX
swift_hash_path_prefix = HASH_PATH_SUFFIX
  • 在[storage-policy:0]配置默认的存储策略:
[storage-policy:0]
...
name = Policy-0
default = yes
如果是多节点部署swift的话,还需要将上述步骤生成的ring文件、swift.conf文件复制到所有节点中,并修改/etc/swift的拥有者为swift用户:chown -R swift:swift /etc/swift。
部署配置完成后,就需要启动所有服务。除了proxy-server、account-server、container-server和object-server外,swift还包括许多其它的周期性进程,如果每次都要逐一启动、停止、重启这些服务,将会是繁琐且无聊的过程,因此建议将所有启动、停止或重启的命令编入相应的脚本,这样只需执行脚本就可以了,比如:
[openstack@localhost ~]$ cat swift-stop.sh 
#! /bin/bash
systemctl stop openstack-swift-account.service openstack-swift-account-auditor.service openstack-swift-account-reaper.service openstack-swift-account-replicator.service
systemctl stop openstack-swift-container.service openstack-swift-container-auditor.service openstack-swift-container-replicator.service openstack-swift-container-updater.service
systemctl stop openstack-swift-object.service openstack-swift-object-auditor.service openstack-swift-object-replicator.service openstack-swift-object-updater.service
所有服务启动完毕后,就可以检验一下向swift上传下载文件的功能了:
[openstack@localhost ~]$ source demo-openrc.sh 
[openstack@localhost ~]$ swift stat
        Account: AUTH_1928446a6c364ace8a40043b5318bd9f
     Containers: 0
        Objects: 0
          Bytes: 0
X-Put-Timestamp: 1434681204.28622
     Connection: keep-alive
    X-Timestamp: 1434681204.28622
     X-Trans-Id: tx60e7648bf53f4365a2c84-0055837f72
   Content-Type: text/plain; charset=utf-8
 
          
[openstack@localhost ~]$ swift upload demo swift-stop.sh --object-name stop
stop
[openstack@localhost ~]$ swift list
demo
[openstack@localhost ~]$ swift list demo
stop
至此就完成了swift的单节点部署工作,并且从测试结果来看,一切动作正常。成功部署swift并不意味者对swift的所有功能、流程都已经熟悉了,相反还有很多需要学习的,比如swift客户端命令的详细使用方法,上传下载文件的具体流程,ring文件的具体含义,如何调整partition的数量等,还需要进一步的学习。

OpenStack之swift安装笔记的更多相关文章

  1. ios – Xcode警告:“没有处理文件的规则”和“找不到目录”

    重命名我的项目文件夹后,我收到以下错误消息:什么可能出错?解决方法关于第一个警告,您可以在项目设置中的“构建阶段”中检查XCode,即头文件不会出现在“编译源”列表中.

  2. 你如何将xcode项目转换为cocoapod?

    我有一段代码,我发现我在多个不同的项目中重复使用,所以我想把它变成一个cocoapod并使用私人cocoapod仓库.我的问题是如何将xcode项目设置为cocoapod?它应该是一个静态库还是一个带有appdelegate的空“项目”?

  3. ios – 如何将文件添加到主包的/ Library / Sounds目录中?

    根据Apple’sdocumentation,/Library/Sounds中的声音文件将在尝试播放声音时由系统搜索.如何将声音文件添加到此文件夹?适用于iOS的正确文档应为here总之,您只需将声音文件作为应用程序包的非本地化资源添加到项目中.

  4. ios – 资产目录与文件夹参考:何时使用其中一个?

    我可以将文件放入Assets.xcassets,或者我可以将文件放入文件夹引用.我何时会选择一个而不是另一个?

  5. ios – 从icloud备份中限制sqlite-wal和sqlite-shm

    我是第一次使用coredata,我必须从文档目录中的iCloud备份限制sqlitedb文件,我使用下面的代码完成了它//阻止iCloud备份文档目录文件夹现在我不明白的是,我们还需要从icloud备份中限制sqlite-wal和sqlite-shm文件,如果是,那么如何从icloud备份限制sqlite-wal和sqlite-shm文件我想要一个解决方案,而无需从文档目录文件夹中更改sqlitedb位置…

  6. iOS:如何从文档目录中删除具有特定扩展名的所有现有文件?

    当我更新我的iOS应用程序时,我想删除Documents目录中的任何现有sqlite数据库.现在,在应用程序更新时,我将数据库从软件包复制到文档目录,并通过附加软件包版本来命名它.因此,在更新时,我还想删除可能存在的任何旧版本.我只是希望能够删除所有sqlite文件,而无需循环浏览并查找以前版本的文件.是否有任何方法可以对removeFileAtPath:方法进行通配符?解决方法那么,你想要删除所有*.sqlite文件?

  7. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  8. ios – 从文件目录加载UIImage

    我正在尝试从文件目录加载一个UIImage,并将其设置为UIImageView,如下所示:但是,每当我尝试以上,图像从不加载.该图像在Documents/MyAppCustomDirectory/school.png中.以上是否正确从该目录加载?我也尝试了其他几个:UIImageimageWithContentsOfFile,以及基于SO响应的其他方法.解决方法要获取您应该使用的文档目录:我不太清

  9. Xcode 6 / iOS 8模拟器数据和软件包文件夹脚本

    随着xcode6的最新更改,它看起来像.app文件和文档文件夹不再驻留在iPhone模拟器目录中的同一个文件夹中.以前,我们可以访问目录和.app文件但在Xcode6中,模拟器目录是完全不同的:和其中CryptNumber1,2和3都不同.有没有办法找到包含.app文件的文件夹后,我可以得到相应的文件夹?我有这个麻烦.为什么…?

  10. ios – 上传符号文件

    我该如何解决?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部