9、对象存储服务
9.1、安装并配置控制器节点
9.1.1、创建服务凭证和API端点
9.1.1.1、获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ . admin-openrc
9.1.1.2、要创建身份认证服务的凭证,完成这些步骤:
创建 swift 用户:
$ openstack user create --domain default --password-prompt swift
设置密码:P@ssw0rd
给 swift 用户添加 admin 角色:
$ openstack role add --project service --user swift admin
注解:这个命令执行后没有输出。
创建 swift 服务条目:
$ openstack service create --name swift --description "OpenStack Object Storage" object-store
9.1.1.3、创建对象存储服务 API 端点:
$ openstack endpoint create --region RegionOne object-store public http://controller:8080/v1/AUTH_%\(tenant_id\)s
$ openstack endpoint create --region RegionOne object-store internal http://controller:8080/v1/AUTH_%\(tenant_id\)s
$ openstack endpoint create --region RegionOne object-store admin http://controller:8080/v1
控制节点防火墙开放端口:8080
# firewall-cmd --permanent --add-port=8080/tcp
# firewall-cmd --reload
确认端口开放成功
# firewall-cmd --list-all
9.1.2、安全并配置组件
9.1.2.1、安装软件包:
# yum install -y openstack-swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware memcached
9.1.2.2、从对象存储的仓库源中获取代理服务的配置文件:
# curl -o /etc/swift/proxy-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/proxy-server.conf-sample?h=stable/mitaka
注解:本次没有下载到这个文件,就用安装后的默认配置文件进行配置了。
9.1.2.3、编辑文件 vi /etc/swift/proxy-server.conf 并完成如下动作:
在 [DEFAULT] 部分,配置绑定端口,用户和配置目录。
bind_port = 8080
user = swift
swift_dir = /etc/swift
注解:默认有配置,只增加了swift_dir这一行
在``[pipeline:main]``部分,删除``tempurl``和``tempauth``模块并增加``authtoken``和``keystoneauth``模块
[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server
以上内容为官方文档配置,经过本次实测,可能是没有下载配置文件而是使用默认配置的原因,也可能是安装组件不全的原因,按照上面配置始终服务无法启动,并且报错!
经过查看/var/log/messages内容发现如下报错(注意红框内容):
经过比对是versioned_writes没有找到,可能是没有安装,也可能是模块顺序不对。因为是第一次部署,所以很粗暴的把这个模块从配置去掉,然后再次重启服务。
但是再次报错了,再次有新的模块未找到,然后继续删减模块,最终配置如下图所示:
注解:注释掉默认配置,同时不要改变配置中的模块顺序。
在 [app:proxy-server] 部分,启动自动账户创建。
[app:proxy-server]
use = egg:swift#proxy
account_autocreate = True
注解:默认已存在
在 [filter:keystoneauth] 部分,配置操作员角色。
[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = admin,user
注解:本部分为新增,和上面的[filter:keystone]配置有重合部分,暂时不清楚关系就新增了。
在 [filter:authtoken] 部分,配置认证服务访问。
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = swift
password = P@ssw0rd
delay_auth_decision = True
注解:注释或者删除掉在 [filter:authtoken] 部分的所有其他的内容。
在 [filter:cache] 部分,配置 memcached 的位置:
[filter:cache]
use = egg:swift#memcache
memcache_servers = controller:11211
注解:默认有一个相同配置注释掉
9.2、安装和配置存储节点
本章节描述怎样为操作帐号,容器和对象服务安装和配置存储节点。
环境所限,这里配置一个存储节点(就是计算节点),包含三个空本地块存储设备。这个向导用的是 /dev/sdc、 /dev/sdd、/dev/sde
9.2.1、先决条件
9.2.1.1、安装支持的工具包:
# yum install -y xfsprogs rsync
9.2.1.2、使用XFS格式化三个设备:
# mkfs.xfs /dev/sdc
# mkfs.xfs /dev/sdd
# mkfs.xfs /dev/sde
9.2.1.3、创建挂载点目录结构:
# mkdir -p /srv/node/sdc
# mkdir -p /srv/node/sdd
# mkdir -p /srv/node/sde
9.2.1.4、编辑``/etc/fstab``文件并添加以下内容:
/dev/sdc /srv/node/sdc xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sdd /srv/node/sdd xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sde /srv/node/sde xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
9.2.1.5、挂载设备:
# mount /srv/node/sdc
# mount /srv/node/sdd
# mount /srv/node/sde
9.2.1.6、创建并编辑 vi /etc/rsyncd.conf 文件并包含以下内容:
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = 111.111.111.202
[account]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/object.lock
address为存储节点管理网络的IP地址。
注解:``rsync``服务不需要认证,所以考虑将它安装在私有网络的环境中
9.2.1.7、启动 “rsyncd” 服务和配置它随系统启动:
# systemctl enable rsyncd
# systemctl start rsyncd
# systemctl status rsyncd
9.2.2、安全并配置组件
注解:在每个存储节点上执行这些步骤。
9.2.2.1、安装软件包:
# yum install -y openstack-swift-account openstack-swift-container openstack-swift-object
9.2.2.2、从对象存储源仓库中获取accounting, container以及object服务配置文件
# curl -o /etc/swift/account-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/account-server.conf-sample?h=stable/mitaka
# curl -o /etc/swift/container-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/container-server.conf-sample?h=stable/mitaka
# curl -o /etc/swift/object-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/object-server.conf-sample?h=stable/mitaka
本次操作未从网上下载配置文件,使用默认配置文件。
9.2.2.3、编辑 vi /etc/swift/account-server.conf 文件并完成下面操作:
在``[DEFAULT]`` 部分,配置绑定IP地址,绑定端口,用户,配置目录和挂载目录:
bind_ip = 111.111.111.202
bind_port = 6002
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
bind_ip为存储节点管理网络的IP地址。
在 [pipeline:main] 部分,启用合适的模块:
[pipeline:main]
pipeline = healthcheck recon account-server
上面为官方文档配置,也是启动服务报错有模块找不到,删除healthcheck模块后就启动成功了,配置如下图所示:
[pipeline:main]
pipeline = recon account-server
在 [filter:recon] 部分,配置recon (meters)缓存目录:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
9.2.2.4、编辑 vi /etc/swift/container-server.conf 文件并完成下列操作:
在``[DEFAULT]`` 部分,配置绑定IP地址,绑定端口,用户,配置目录和挂载目录:
bind_ip = 111.111.111.202
bind_port = 6001
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
bind_ip为存储节点管理网络的IP地址。
在 [pipeline:main] 部分,启用合适的模块:
[pipeline:main]
pipeline = healthcheck recon container-server
上面为官方文档配置,也是启动服务报错有模块找不到,删除healthcheck模块后就启动成功了,配置如下图所示:
[pipeline:main]
pipeline = recon container-server
在 [filter:recon] 部分,配置recon (meters)缓存目录:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
9.2.2.5、编辑 vi /etc/swift/object-server.conf 文件并完成下列操作:
在 [DEFAULT] 部分,配置绑定IP地址,绑定端口,用户,配置目录和挂载目录:
bind_ip = 111.111.111.202
bind_port = 6000
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
bind_ip为存储节点管理网络的IP地址。
在 [pipeline:main] 部分,启用合适的模块:
[pipeline:main]
pipeline = healthcheck recon object-server
上面为官方文档配置,也是启动服务报错有模块找不到,删除healthcheck模块后就启动成功了,配置如下图所示:
[pipeline:main]
pipeline = recon object-server
在 [filter:recon] 部分,配置recon(meters)缓存和lock目录:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock
9.2.2.6、确认挂载点目录结构是否有合适的所有权:
# chown -R swift:swift /srv/node
9.2.2.7、创建 “recon” 目录和确保它有合适的所有权:
# mkdir -p /var/cache/swift
# chown -R root:swift /var/cache/swift
# chmod -R 775 /var/cache/swift
计算节点防火墙开放端口:6000、6001、6002
firewall-cmd --permanent --add-port=6000/tcp
firewall-cmd --permanent --add-port=6001/tcp
firewall-cmd --permanent --add-port=6002/tcp
firewall-cmd --reload
确认端口开放成功
# firewall-cmd --list-all
***********************************分割线***********************************
报错排错:
报错一:
这三个服务全部有报错:
openstack-swift-account-replicator Can't find itself 127.0.0.1 with port 6202 in ring file, not replicating
openstack-swift-container-replicator Can't find itself 127.0.0.1 with port 6201 in ring file, not replicating
openstack-swift-object-replicator Can't find itself 127.0.0.1 with port 6200 in ring file, not replicating
经过排错:
分别将三个配置文件/etc/swift/account-server.conf、/etc/swift/container-server.conf、/etc/swift/object-server.con中的
默认bind_ip = 127.0.0.1 bind_port = 6202、默认bind_ip = 127.0.0.1 bind_port = 6201、默认bind_ip = 127.0.0.1 bind_port = 6200
这个配置注释掉,然后重启三个服务就可以了。如下图所示是吧account-server.conf 的示例:
报错二:
上面这个报错从内容看是sde这块盘存在问题,马上想起来本次计算节点开始只准备了2块虚拟硬盘做对象存储,但是后来报错显示需要2块以上,所以临时加了一块虚拟硬盘就是sde。
然后所有配置都做了,就是漏了 9.2.2.6 这一步没做:chown -R swift:swift /srv/node,经过查看如下图所示权限缺失:
重新执行chown -R swift:swift /srv/node即可:
最后记得重启openstack-swift-object-replicator服务:
***********************************分割线***********************************
9.3、创建,分发并初始化rings
注解:在控制节点上执行这些步骤。
9.3.1、创建账户ring
帐户服务器使用帐户 ring 来维护一个容器的列表。
9.3.1.1、切换到 /etc/swift 目录。
9.3.1.2、创建基本 account.builder 文件:
# swift-ring-builder account.builder create 10 3 1
注解:这个命令执行后没有输出。
9.3.1.3、添加每个节点到 ring 中:
# swift-ring-builder account.builder \
add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6002 \
--device DEVICE_NAME --weight DEVICE_WEIGHT
将 STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点管理网络的IP地址。将 DEVICE_NAME``替换为同一个存储节点存储设备名称。例如,使用 :ref:`swift-storage` 中的第一个存储节点的 ``/dev/sdb 存储设备,大小为100:
# swift-ring-builder account.builder add \
--region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdb --weight 100
在每个存储节点上面重复执行这个命令。在这个例子的架构中,使用该命令的三个变量:
# swift-ring-builder account.builder add \
--region 1 --zone 1 --ip 111.111.111.202 --port 6002 --device sdc --weight 100
# swift-ring-builder account.builder add \
--region 1 --zone 2 --ip 111.111.111.202 --port 6002 --device sdd --weight 100
# swift-ring-builder account.builder add \
--region 1 --zone 3 --ip 111.111.111.202 --port 6002 --device sde --weight 100
注意:本次操作是在控制节点和存储节点上都执行了!!!!!
9.3.1.4、验证 ring 的内容:
# swift-ring-builder account.builder
9.3.1.5、平衡 ring:
# swift-ring-builder account.builder rebalance
9.3.2、创建容器ring
容器服务器使用容器环来维护对象的列表。但是,它不跟踪对象的位置。
9.3.2.1、切换到 /etc/swift``目录。
9.3.2.2、创建基本``container.builder``文件:
# swift-ring-builder container.builder create 10 3 1
注解:这个命令执行后没有输出。
9.3.2.3、添加每个节点到 ring 中:
# swift-ring-builder container.builder \
add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6001 \
--device DEVICE_NAME --weight DEVICE_WEIGHT
将 STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点管理网络的IP地址。将 DEVICE_NAME``替换为同一个存储节点存储设备名称。例如,使用 :ref:`swift-storage` 中的第一个存储节点的 ``/dev/sdb 存储设备,大小为100:
# swift-ring-builder container.builder add \
--region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdb --weight 100
在每个存储节点上面重复执行这个命令。在这个例子的架构中,使用该命令的三个变量:
# swift-ring-builder container.builder add \
--region 1 --zone 1 --ip 111.111.111.202 --port 6001 --device sdc --weight 100
# swift-ring-builder container.builder add \
--region 1 --zone 2 --ip 111.111.111.202 --port 6001 --device sdd --weight 100
# swift-ring-builder container.builder add \
--region 1 --zone 3 --ip 111.111.111.202 --port 6001 --device sde --weight 100
9.3.2.4、验证 ring 的内容:
# swift-ring-builder container.builder
9.3.2.5、平衡 ring:
# swift-ring-builder container.builder rebalance
9.3.3、创建对象ring
对象服务器使用对象环来维护对象在本地设备上的位置列表。
9.3.3.1、切换到 ``/etc/swift``目录。
9.3.3.2、创建基本``object.builder``文件:
# swift-ring-builder object.builder create 10 3 1
注解:这个命令执行后没有输出。
9.3.3.3、添加每个节点到 ring 中:
# swift-ring-builder object.builder \
add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6000 \
--device DEVICE_NAME --weight DEVICE_WEIGHT
将 STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点管理网络的IP地址。将 DEVICE_NAME``替换为同一个存储节点存储设备名称。例如,使用 :ref:`swift-storage` 中的第一个存储节点的 ``/dev/sdb 存储设备,大小为100:
# swift-ring-builder object.builder add \
--region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdb --weight 100
在每个存储节点上面重复执行这个命令。在这个例子的架构中,使用该命令的三个变量:
# swift-ring-builder object.builder add \
--region 1 --zone 1 --ip 111.111.111.202 --port 6000 --device sdc --weight 100
# swift-ring-builder object.builder add \
--region 1 --zone 2 --ip 111.111.111.202 --port 6000 --device sdd --weight 100
# swift-ring-builder object.builder add \
--region 1 --zone 3 --ip 111.111.111.202 --port 6000 --device sde --weight 100
9.3.3.4、验证 ring 的内容:
# swift-ring-builder object.builder
9.3.3.5、平衡 ring:
# swift-ring-builder object.builder rebalance
9.3.4、分发环配置文件(本次测试就一个存储节点,而且我把控制节点和存储节点都执行了命令)
复制``account.ring.gz``,container.ring.gz``和``object.ring.gz 文件到每个存储节点和其他运行了代理服务的额外节点的 /etc/swift 目录。
9.4、完成安装
9.4.1、从对象存储源仓库中获取 /etc/swift/swift.conf 文件:
# curl -o /etc/swift/swift.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/swift.conf-sample?h=stable/mitaka
注解:本次没有下载,直接使用默认配置文件
9.4.2、编辑 vi /etc/swift/swift.conf 文件并完成以下动作:
在``[swift-hash]``部分,为你的环境配置哈希路径前缀和后缀:
[swift-hash]
...
swift_hash_path_suffix = LEO_TEST_SUFFIX
swift_hash_path_prefix = LEO_TEST_PREFIX
将其中的 HASH_PATH_PREFIX和 HASH_PATH_SUFFIX替换为唯一的值。
警告:这些值要保密,并且不要修改或丢失。
在``[storage-policy:0]``部分,配置默认存储策略:
[storage-policy:0]
name = Policy-0
default = yes
9.4.3、复制``swift.conf`` 文件到每个存储节点和其他允许了代理服务的额外节点的 /etc/swift 目录。
注解:本次操作已经在两个节点都配置好了。
20200313:最终还是把计算节点的三个builder文件全部删除,然后把控制节点的ring文件传过来了。
9.4.4、在所有节点上,确认配置文件目录是否有合适的所有权:
# chown -R root:swift /etc/swift
9.4.5、在控制节点和其他运行了代理服务的节点上,启动对象存储代理服务及其依赖服务,并将它们配置为随系统启动:
# systemctl enable openstack-swift-proxy memcached
# systemctl start openstack-swift-proxy memcached
# systemctl status openstack-swift-proxy memcached
注解:本次只在控制节点运行了代理服务,计算节点没有运行。
9.4.6、在存储节点上,启动对象存储服务,并将其设置为随系统启动:
# systemctl enable openstack-swift-account openstack-swift-account-auditor \
openstack-swift-account-reaper openstack-swift-account-replicator
# systemctl start openstack-swift-account openstack-swift-account-auditor \
openstack-swift-account-reaper openstack-swift-account-replicator
# systemctl status openstack-swift-account openstack-swift-account-auditor \
openstack-swift-account-reaper openstack-swift-account-replicator
# systemctl enable openstack-swift-container openstack-swift-container-auditor \
openstack-swift-container-replicator openstack-swift-container-updater
# systemctl start openstack-swift-container openstack-swift-container-auditor \
openstack-swift-container-replicator openstack-swift-container-updater
# systemctl status openstack-swift-container openstack-swift-container-auditor \
openstack-swift-container-replicator openstack-swift-container-updater
# systemctl enable openstack-swift-object openstack-swift-object-auditor \
openstack-swift-object-replicator openstack-swift-object-updater
# systemctl start openstack-swift-object openstack-swift-object-auditor \
openstack-swift-object-replicator openstack-swift-object-updater
# systemctl status openstack-swift-object openstack-swift-object-auditor \
openstack-swift-object-replicator openstack-swift-object-updater
9.5、验证操作
9.5.1、导入``demo``凭证
$ . demo-openrc
9.5.2、显示服务状态:
$ swift stat
有报错:
使用命令查看报错:
swift stat --debug
20200313官方文档可能存在问题,需要重新寻找部署教程。暂停实验环境。
第二天啥都没干,重启后就好了。。。
9.5.3、创建``container1``容器
$ openstack container create container1
9.5.4、上传一个测试文件到``container1``容器
$ openstack object create container1 FILE
9.5.5、列出``container1``容器里的所有文件
$ openstack object list container1
9.5.6、从``container1``容器里下载一个测试文件
$ openstack object save container1 FILE
注解:这个命令执行后没有输出。
来源:oschina
链接:https://my.oschina.net/u/4291687/blog/3220107