1 Swift概述
Swift是Open Stack开源云计算项目的子项目之一,是一个多租户、高扩展性的和高可用性的对象存储系统,用于低成本地存储大量的非结构化数据;Swift通过在软件层面引入一致性哈希技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。
2 Swift关键特性
扩展性:Swift可以根据存储的数据量和用户数量进行线性扩展,扩大规模时,可以通过增加存储节点来提升存储能力;
持久性:Swift采用了复制数据并且将副本分发到集群中来确保数据的持续可用性;
高并发:Swift的设计原则允许将请求分发到多个服务器上。可充分利用可用的服务器性能来同时处理多个请求;
无单点故障:Swift的元数据存储是完全均匀随机分布的,并且与对象文件存储一样,元数据也会存储多份;
3 Swift集群部署
3.1 部署环境
本文主要讲述swift 3节点集群,实现account、container信息存放在ssd盘,Object信息存放ssd盘和hdd盘,2副本策略的集群搭建。下面就是具体搭建步骤及注意事项;
3.1.1 系统环境
系统版本要求:CentOS7.3Build1611 X86_64
更多参考官网:
https://docs.openstack.org/swift/latest/getting_started.html#system-requirements
3.1.2 存储环境
数据盘:12块
文件系统:XFS
备注:物理机多块数据磁盘,建议不使用RAID,不使用LVM管理
3.1.3 网络环境
多网段环境:swift绑定业务网卡地址
单网段环境:bond 0.0.0.0
万兆网卡:建议使用MTU 9000通信
集群模式:集群模式下多台机器确保互通
3.1.4 测试环境
备注:三节点集群方式部署,测试环境中有4块ssd盘,8块hdd盘,因对磁盘的配置是一致的,本文以列举一块ssd01盘,一块hdd01盘为例进行介绍。
3.2 部署准备
3.2.1 配置文件打开数
Swift服务是多线程服务,并且支持高并发。Swift通过基于http的REST服务接口对swift集群进行访问。在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制,这边需要配置下最大进程数和最大文件打开数:
vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 655350
* hard nofile 655350
ulimit -n 65536
3.2.2 配置系统内核
由于Swift是通过基于http的REST接口对swift集群进行访问,需要对TCP/IP堆栈进行配置:
vim /etc/sysctl.conf
fs.file-max =655360
net.core.somaxconn= 65535
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_tw_reuse= 1
sysctl –p
其中:
fs.file-max:表示进程可以同时打开的最大句柄数,这个参数直接限制最大并发连接数。
net.ipv4.tcp_tw_reuse:设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP链接。
3.2.3 禁止防火墙
1)禁用SELINUX
vim /etc/selinux/config
SELINUX=permissive
2)关闭Firewall
systemctl stop firewalld
systemctl disable firewalld
3.2.4 配置locale
1) 配置为UTF-8,临时生效
localectl set-locale LANG="en_US.UTF-8"
2) 配置为UTF-8,永久生效
vim /etc/locale.conf
LANG="en_US.UTF-8"
3.2.5 安装swift
OpenStackSwift的官方发布版本在GitHub(https://github.com/openstack /swift)上,可自由下载,对于OpenStack的每一个主版本,都有一个swift版本与之对应。
安装swift:
cd/tmp
gitclone https://github.com/openstack/swift.git
cd/tmp/swift
pythonsetup.py install
3.2.6 安装swauth认证
cd /tmp
git clone https://github.com/openstack/swauth.git
cd swauth
python setup.py install
注:swift节点均执行以上部署操作;
3.3 配置Swift
在启动swift服务进行之前,你需要对其进行配置。首先需要创建构造器文件(builder file),添加磁盘驱动器并构造环。
3.3.1 复制swift配置文件
创建swift目录并将源代码中的配置文件示例复制过去,以便能够在后续的配置过程中以它们作为模板来编辑配置文件。
mkdir -p /etc/swift
cd /opt/swift/etc
cp account-server.conf-sample/etc/swift/account-server.conf
cp container-server.conf-sample /etc/swift/container-server.conf
cp object -server.conf-sample /etc/swift/ object-server.conf
cp proxy -server.conf-sample /etc/swift/ proxy-server.conf
cp swift -server.conf-sample /etc/swift/ swift-server.conf
此时,可以运行swift-init命令,添加-h标志可以获取帮助信息:
swift-init -h
3.3.2 修改swift配置文件
3.3.2.1 设置哈希路径前缀和后缀
在/etc/swift/swift.conf文件中swift_hash_path_prefix 和swift_hash_path_suffix字段设置一个随机的难以猜测的字符串。
head -c 32 /dev/random | base64
head -c 32 /dev/random | base64
(用以上命令生成两个哈希串,分别设置到swift_hash_path_suffix和swift_hash_path_prefix)
cd /etc/swift
vim swift.conf
swift_hash_path_suffix= EvjucvFN5aX1oAdjlQiw5+HV0JUqSSWwzoiem+fLAZE=
swift_hash_path_prefix= O8wA4HPiYUpfL0TAAdDPMR2MMCzwDrsdS/qX06XXAJE=
3.3.2.2 存储策略
存储策略的主要作用是在集群中对存储空间进行定制化,包括:存储位置、副本数、硬件、分区,以满足特定的树存储要求。集群中至少有一个存储策略,若没有用户自定义策略,swift就会采用内置的存策略0,被称为policy-0.
创建存储策略的分为两步:
第一步在swift.conf文件中声明其名称和编码。
第二步是创建对应的构造器文件和环,第二步中会用到第一步声明的编码。
用户定义的存储策略在声明时,需要指定一个编号和一个名字。编辑/etc/swift目录下swift.conf文件,存储策略的一般格式如下:
[storage-policy:N]
name =
default =
(optional)deprecated =
注:[storage-policy:N]是必需字段,其中N是存储策略的编号,可以取0或者一个正整数,不能重复;当存储策略不再需要时,deprecated =yes将其标记为弃用。声明了存储策略之后,就可以用它们来创建构造器了,对每一个存储策略(storage-policy:N),swift都会创建一个object-N.builder文件与之对应。
测试集群的策略配置如下:
[storage-policy:0]
name = big
default = yes
aliases = hdd
[storage-policy:1]
name = small
aliases = ssd
3.3.2.3 设置swauth认证
配置proxy-server.conf:
cd /etc/swift
vim proxy-server.conf
[pipeline:main]
pipeline =catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulktempurl ratelimit swauth copy container-quotas account-quotas slo dloversioned_writes proxy-logging proxy-server
#认证方式替换为swauth
[filter:swauth]
use =egg:swauth#swauth
set log_name =swauth
super_admin_key= swauthkey
# swauthkey为swauth密钥,自行设置#
default_swift_cluster= production#http:// 172.31.17.206:8080/v1
#以上的IP是测试环境中任意节点主机的地址#
allow_account_management= true
account_autocreate= true
#将以上两个值设为true,以允许对账户进行管理#
3.3.3 创建环构造器文件
构造器是用来构建环的,swift服务进程用这些环来进行数据的存储与检索。
创建构造器文件的命令
构造器文件可以看做是一个大数据库,里面记录了集群中所有的存储设备以及环构建器工具创建环时所用到的数值。
swift -ring-builder的create命令格式:
swift-ring-builder(account|container|object).buildecreate <part_power> <replicas> <min_part_hours>
create命令中三个参数的作用分别为:
part_power:分区幂指数,决定集群中要创建的分区数量。
replicas:副本数,指定要给每份数据存储的副本数量。
min_part_hours:移动分区的最小间隔时间(小时),指定副本能够被移动的频率。
集群中添加构造器:
构建account ring:
swift-ring-builder account.builder create10 2 1
构建container ring:
swift-ring-builder container.builder create10 2 1
构建object ring:
swift-ring-builder object.builder create 102 1
swift-ring-builder object-0.builder create10 2 1
swift-ring-builder object-1.builder create10 2 1
3.3.4 向构建文件中添加磁盘
在构建文件中添加磁盘,以及它们的逻辑分组(域、区)和权重,这部分的配置主要目的是:
1)通过把每个节点放到一个域或区中来标记故障边界。
2)通过设定设备权重来指定集群中的每个磁盘应当存多少数据。
对于每个节点,需要把/srv/node下的存储磁盘加到构造文件中。如果某一磁盘是专门用于来存储特定的数据类型的,可以不把他添加到其他的环构建中。固态硬盘负责所有的账号和容器数据,需要你把这些固态硬盘添加到账号和容器的构造文件中。
用如下格式将磁盘添加到文件中:
swift-ring-builder account.builder add<region><zone>-<IP>:<port>/<device> <weight>
swift-ring-builder container.builder add <region><zone>-<IP>:<port>/<device><weight>
swift-ring-builder object.builder add <region><zone>-<IP>:<port>/<device><weight>
swift-ring-builder object-n.builder add<region><zone>-<IP>:<port>/<device><weight>
具体讲解下region、zone、weight的含义:
Region:swift允许集群按物理位置来划分域。域通常被定义为地理边界,服务器(节点)的几个机架可以用放置在彼此延迟比较高,地理位置相隔较远的不同位置;当跨域集群收到一个读请求时,swift将通过延迟来选择更近的数据副本。
Zones:在域中,swift允许你创建可用区来隔离故障。分区的目的是为了防止存储服务器大规模中断运行。
IP:指定节点所在的IP地址;
Port:每个账号、容器和对象服务进程在不同的端口运行。账号服务进程默认运行在6002端口,容器服务进程默认运行在6001端口,对象服务进程默认运行在6000端口。
Weight(权重):权重是用来决定一个磁盘到底可以拥有多少分区(相对值)的,它是环构建过程的一部分,权重是一个相对数,可自行配置每个硬盘的权重。
在swift01节点上执行,向环中添加磁盘:
cd /etc/swift/
向account.builder中添加ssd01:
swift-ring-builder account.builder addr1z1-172.31.17.206:6202/ssd01 1600
swift-ring-builder account.builder addr1z2-172.31.17.207:6202/ssd01 1600
swift-ring-builder account.builder addr1z3-172.31.17.208:6202/ssd01 1600
container.builder中添加ssd01:
swift-ring-builder container.builder addr1z1-172.31.17.206:6201/ssd01 1600
swift-ring-builder container.builder addr1z2-172.31.17.207:6201/ssd01 1600
swift-ring-builder container.builder addr1z3-172.31.17.208:6201/ssd01 1600
向object.builder中添加ssd01:
swift-ring-builder object.builder add r1z1-172.31.17.206:6200/ssd011600
swift-ring-builder object.builder add r1z2-172.31.17.207:6200/ssd011600
swift-ring-builder object.builder add r1z3-172.31.17.208:6200/ssd011600
向object-0.builder中添加hdd01:
swift-ring-builder object-0.builder addr1z1-172.31.17.206:6200/hdd01 1600
swift-ring-builder object-0.builder addr1z2-172.31.17.207:6200/hdd01 1600
swift-ring-builder object-0.builder addr1z3-172.31.17.208:6200/hdd01 1600
向object-1.builder中添加ssd01:
swift-ring-builder object-1.builder addr1z1-172.31.17.206:6200/ssd01 1600
swift-ring-builder object-1.builder addr1z2-172.31.17.207:6200/ssd01 1600
swift-ring-builder object-1.builder addr1z3-172.31.17.208:6200/ssd01 1600
3.3.5 构建环
硬盘添加完毕,就可以创建环文件了。利用rebalance命令来创建环文件,swift利用环文件来决定数据存储的位置。环创建好了以后,它们需要被复制到集群中每个节点的/etc/swift目录下。复制以后不需要任务操作,因swift每15分钟检测一次环文件。
- 构建环
cd /etc/swift
swift-ring-builder account.builderrebalance
swift-ring-builder container.builderrebalance
swift-ring-builder object.builder rebalance
检查是否成功构建ring:
ll ./*.gz
2)同步ring到集群中其他节点
scp *.ring.gz 172.31.17.207:/etc/swift
scp *.ring.gz 172.31.17.208:/etc/swift
3.3.6 配置swift日志
Swift使用RSyslog来帮它管理日志,在每个配置文件中有一个叫log_name的设置项,默认被设置为swift。
创建日志配置文件:
mkdir /var/log/swift
cd /etc/rsyslog.d
cp openstack-swift.confopenstack-swift.conf.bak
systemctl enable rsyslog.service;
systemctl restart rsyslog.service;
3.3.7 配置Rsync
Swift集群需要很多一致性进程运行以确保集群正常工作。这部分包括:
1)配置及启动rsync
2)启动复制器进程
3)启动其他的一致性进程
配置rsync
cd /etc
cp rsyncd.conf rsyncd.conf.bak
systemctl enable rsyncd.service
systemctl restart rsyncd.service
3.3.8 配置目录权限
chown -R root:swift /etc/swift
chown -R root:swift /srv/node
chown -R swift:swift /var/cache/swift
chown -R root:root /var/log/swift
chmod -R g+w /etc/swift
chmod -R g+w /srv/node
chmod -R g+w /var/cache/swift
chmod -R g+w /var/log/swift
3.4 Swift服务管理
3.4.1 配置开机自启动
systemctl enable memcached.serviceopenstack-swift-proxy.service
systemctl enableopenstack-swift-account.service openstack-swift-account-auditor.serviceopenstack-swift-account-reaper.serviceopenstack-swift-account-replicator.service
systemctl enableopenstack-swift-container.service openstack-swift-container-auditor.serviceopenstack-swift-container-replicator.serviceopenstack-swift-container-updater.service
systemctl enableopenstack-swift-object.service openstack-swift-object-auditor.serviceopenstack-swift-object-replicator.serviceopenstack-swift-object-updater.service
3.4.2 启动所有服务
systemctl restart memcached.serviceopenstack-swift-proxy.service
systemctl restart openstack-swift-account.service openstack-swift-account-auditor.serviceopenstack-swift-account-reaper.serviceopenstack-swift-account-replicator.service
systemctl restart openstack-swift-container.serviceopenstack-swift-container-auditor.serviceopenstack-swift-container-replicator.serviceopenstack-swift-container-updater.service
systemctl restart openstack-swift-object.serviceopenstack-swift-object-auditor.serviceopenstack-swift-object-replicator.serviceopenstack-swift-object-updater.service
3.4.3 查看服务状态
systemctl status memcached.serviceopenstack-swift-proxy.service
systemctl status openstack-swift-account.serviceopenstack-swift-account-auditor.service openstack-swift-account-reaper.serviceopenstack-swift-account-replicator.service
systemctl status openstack-swift-container.serviceopenstack-swift-container-auditor.serviceopenstack-swift-container-replicator.serviceopenstack-swift-container-updater.service
systemctl status openstack-swift-object.serviceopenstack-swift-object-auditor.service openstack-swift-object-replicator.serviceopenstack-swift-object-updater.service
3.5 Swift验证服务
3.5.1 创建用户
swauth-prep -K swauthkey
swift -Ahttp://172.31.17.206:8080/auth/v1.0 -U test:tester -K testing stat –v
3.5.2 验证接口
用户tester认证:
curl -v -H 'X-Auth-User: test:tester' -H'X-Auth-Key: testing' http://172.31.17.206:8080/auth/v1.0