码迷,mamicode.com
首页 > 编程语言 > 详细

理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置

时间:2015-11-09 17:07:58      阅读:490      评论:0      收藏:0      [点我收藏+]

标签:

本系列文章着重学习和研究OpenStack Swift,包括环境搭建、原理、架构、监控和性能等。

(1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 

(2)Swift 原理和架构

(3)Swift 监控

(4)Swift 性能

 

要实现的系统的效果图:

技术分享

特点:

  • 使用三个对等物理节点,每个节点上部署所有Swift 服务
  • 使用开源的 UCARP 控制一个 VIP,它会被绑定到三个物理网卡中的一个。
  • 使用开源的 HAProxy 做负载均衡
  • 开启 Swift TempURL

1. Swift 集群安装和配置

使用 OpenStack Swift Kilo 版本,按照社区官方文档安装Swift,没什么花头。特点:

  • 物理节点运行 Ubuntu 操作系统
  • 三个物理节点,每个节点上部署所有Swift 服务,因此三节点是对等的。
  • 只使用一个网络。其实是可以将Swift 集群的数据复制(replication)需要的网络单独出来。
  • 每个节点添加两块磁盘,使用 XFS 文件系统,作为 Swift 的数据盘。
  • Swift 使用 Keystone 来进行用户验证。

使用 admin-openrc.sh 中的如下配置:

export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=***
export OS_AUTH_URL=http://controller:35357/v3
export OS_IMAGE_API_VERSION=2
export OS_VOLUME_API_VERSION=2
export OS_AUTH_VERSION=3

进行常见操作:

root@controller:~/s1# swift upload conatiner10 a
a
root@controller:~/s1# swift list conatiner10
a
root@controller:~/s1# swift download conatiner10 a
a [auth 0.408s, headers 0.458s, total 3.564s, 34.404 MB/s]
root@controller:~/s1# swift delete conatiner10 a
a
root@controller:~/s1# swift list conatiner10
root@controller:~/s1#

2. HAProxy 安装和配置

在每个节点上安装 HAProxy,然后修改配置文件:

root@swift1:~/s1# vi /etc/haproxy/haproxy.cfg
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        contimeout 5000
        clitimeout 50000
        srvtimeout 50000

frontend localnodes
        bind *:1002 #HAProxy 在 1002 端口上监听
        mode http
        default_backend swift-cluster
        maxconn 100
        option forwardfor

backend swift-cluster
        mode http
        balance  roundrobin #使用轮询策略
        option httpchk HEAD /healthcheck HTTP/1.0
        option forwardfor # 当 mode 为 ”http“时,设置 forwardfor,使得通过 X-Forward-For 头来保存原始的源 IP 地址
server proxy1 9.115.251.235:8080 weight 5 check inter 5s #节点1
server proxy2 9.115.251.233:8080 weight 5 check inter 5s #节点2
server proxy3 9.115.251.234:8080 weight 5 check inter 5s #节点3

然后运行命令/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg 来启动 HAProxy 进程。

3. UCARP 配置和安装

    UCARP 允许多个主机共享一个虚拟的ip地址,以提供自动的故障恢复功能,当其中某个主机宕机时,其它的主机会自动接管服务。UCARP是CARP协议(通用地址冗余协议,最早在OpenBSD上实现)的linux实现版本,同时也能移植到其它多个unix平台,UCARP的官方网站:http://www.ucarp.org/project/ucarp 。CARP协议的特点在于其非常低的开销,主机间使用加密数据传递信息,并且在冗余主机之间不需要任何额外的网络链接。

在三个节点上安装 UCARP,然后分配创建三个 shell 文件(注意每个节点上需要使用不同的IP地址):

root@swift1:/etc/ucarp# cat master.sh #用于启动 ucarp 进程,指定 VIP 为 9.115.251.238
#!/bin/bash

/usr/sbin/ucarp -i eth0 -v 40 -p gw22 -a 9.115.251.238 -u /etc/ucarp/master-up.sh -d /etc/ucarp/master-down.sh -s 9.115.251.235 -P -B

root@swift1:/etc/ucarp# cat master-up.sh #当UCARP使得本节点做为 VIP 的承载节点时运行的脚本
#!/bin/bash

GATEWAY=9.115.251.1
/sbin/ip addr add 9.115.251.238/24 dev eth0
/bin/hostname swiftproxy
/sbin/route add default gw $GATEWAY
service httpd start

root@swift1:/etc/ucarp# cat master-down.sh #当 UCARP 使得本节点不再作为 VIP 的承载节点时运行的脚本
#!/bin/bash

GATEWAY=9.115.251.1
/sbin/ip addr del 9.115.251.238/24 dev eth0
/bin/hostname swift1
/sbin/route add default gw $GATEWAY
service httpd stop

    简单来说,UCAPR 类似于一个简化版的 VRRP。它在三个服务器之间选择一个作为主节点,由它提供服务,另外两个节点做为备节点,在主节点无法提供服务时升级为主节点。脚本也相对简单,就是将 VIP 加到物理网卡上,在修改 hostname 和 gateway。

最后运行 master.sh 来启动 ucarp 进程。

4. Glance 使用 Swift 的配置

(1)创建 openstack endpoint,使用 UCARP 管理的 VIP 和 HAProxy 管理的 port:

root@controller:~/s1# openstack endpoint show 1f107e61c4024f0a9655fa7276a09c61
+--------------+-------------------------------------------------+
| Field        | Value                                           |
+--------------+-------------------------------------------------+
| adminurl     | http://9.115.251.238:1002                       |
| enabled      | True                                            |
| id           | 1f107e61c4024f0a9655fa7276a09c61                |
| internalurl  | http://9.115.251.238:1002/v1/AUTH_%(tenant_id)s |
| publicurl    | http://9.115.251.238:1002/v1/AUTH_%(tenant_id)s |
| region       | RegionOne                                       |
| service_id   | 3281409aec0c4628a3360bf9403e45e8                |
| service_name | swift                                           |
| service_type | object-store                                    |
+--------------+-------------------------------------------------+

(2)配置 Glance API

使用 Glance API V2,不使用 glance-registry V2。使用 keystone V3 API。修改 /etc/glance/glance-api.conf 文件,

[glance_store]
stores = glance.store.filesystem.Store, glance.store.swift.Store
default_store = swift

swift_store_auth_version = 3
swift_store_auth_address = http://controller:35357/v3/
swift_store_user = service:glance
swift_store_key = 1111
swift_store_container = glance

这里的一个疑惑是 glance 是 service account 而不是 end user account,按照一些文章,需要配置 proxy node 上的 reseller_prefix,但是在这个环境中没配置功能也能工作。

(3)接下来就可以使用 glance CLI 来将镜像保存到 Swift 中了。

5. Swift TempUrl

 这本来是Swift一个比较简单的功能,但是用由于存在于不同文档中的问题(不一致、不全面、没更新),导致花了不少时间才弄出来。

(1)配置

   修改 /etc/swift/proxy-server.conf 文件,在 main pipeline 中加入 tempurl 这个 middleware。需要注意的是,它必须加到 auth middleware 前面,这是因为这些middleware 是按照顺序被调用的。然后打开允许使用的 HTTP 操作。

[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit tempurl authtoken keystoneauth container-quotas account-quotas slo dlo proxy-logging proxy-server

 [filter:tempurl]
 use = egg:swift#tempurl
 # The methods allowed with Temp URLs.
 methods = GET HEAD PUT POST DELETE

另外,需要确保 [filter:authtoken] 部分设置了 delay_auth_decision = true。

(2)添加 Temp-URL-Key meta,设置它为一个 secret key

root@controller:~/s1# swift post -m "Temp-URL-Key:1111" #设置
root@controller:~/s1# swift stat #查看
                        Account: AUTH_dea8b51d28bf41599e63464828102759 (下面第三步会用到)
                     Containers: 5
                        Objects: 11
                          Bytes: 416894908
Containers in policy "policy-0": 5
   Objects in policy "policy-0": 11
     Bytes in policy "policy-0": 416894908
              Meta Temp-Url-Key: 1111

(3)产生 Temp URL。这里需要注意的是,AUTH 后面不是 account name 比如 “admin”,而是 project id。这个也可以使用 swift stat 命令查看其 Account 的值。

root@controller:~/s1# swift tempurl GET 3600 /v1/AUTH_dea8b51d28bf41599e63464828102759/container1/1 1111
/v1/AUTH_dea8b51d28bf41599e63464828102759/container1/1?temp_url_sig=fc9f80211aa5c6262f62ca4d57db65b25f1cef7a&temp_url_expires=1447087996

(4)使用 tempurl。需要确保URL的完整性,否则会得到 401 错误。

root@controller:~/s1# curl "http://9.115.251.238:1002/v1/AUTH_dea8b51d28bf41599e63464828102759/container1/1?temp_url_sig=fc9f80211aa5c6262f62ca4d57db65b25f1cef7a&temp_url_expires=1447087996"
222222222222

另外需要注意的是,各个节点需要(最好)使用 UTC 时区,必须使用 NTP 服务确保时间一致。

(5)得到 401 错误时的调试

Swift 默认情况下日志会写到 /var/log/syslog 文件中。有如下一下调试技巧:

(a). 设置 proxy-server 的 log leve 为 DEBUG

[app:proxy-server]
# You can override the default log routing for this app here:
set log_name = proxy-server
set log_level = DEBUG

[filter:tempurl]
set log_name = tempurl

set log_level = DEBUG

(b). 将 worker 数目设为 0 可以方便调试,默认的话为 2.

workers = 0

(c)可以在 /usr/lib/python2.7/dist-packages/swift/common/middleware/tempurl.py 中加入 logger 输出。

然后你就可以看到 proxy server 和 tempurl 的详细日志了:

Nov  9 15:55:48 swift3 proxy-server: 9.115.251.219 9.115.251.233 09/Nov/2015/15/55/48 GET /v1/AUTH_dea8b51d28bf41599e63464828102759/container1/1%3Ftemp_url_expires%3D1447087996%26temp_url_sig%3Dfc9f80211aa5c6262f62ca4d57db65b25f1cef7a HTTP/1.0 200 - curl/7.35.0 - - 12 - tx9ce884232d5a48bb9b5d8-005640c204 - 0.0261 - - 1447084548.853318930 1447084548.879395962

  Nov 9 15:55:48 swift3 tempurl: hmac_vals is [‘fc9f80211aa5c6262f62ca4d57db65b25f1cef7a‘] (txn: tx9ce884232d5a48bb9b5d8-005640c204)

如果使用非 UTC 时区的话,上面蓝色字体部分的两个时间会不一致,会导致问题。

 

更详细的 Swift 说明,在接下来的文章中会分析。 

参考文档:

理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置

标签:

原文地址:http://www.cnblogs.com/sammyliu/p/4923432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!