[openstack swift]install multi node

来源:互联网 发布:java switch if 效率 编辑:程序博客网 时间:2024/05/02 01:50

原文地址:http://swift.openstack.org/howto_installmultinode.html

openstack swift版本:1.4.2-dev


多结点 Swift 安装 (Ubuntu)¶

先决条件¶

  • Ubuntu Server 10.04 LTS 安装媒介

基本结构和一些术语¶

  • node - 提供一种或多种 Swift 服务的主机
  • Proxy node - 提供 Proxy 服务的node; 同时也提供 TempAuth 的服务
  • Storage node - 提供 Account, Container, 和 Object services服务
  • ring - Swift数据和物理设备之间的一系列映射

本文介绍一个由以下node组成的机群:

  • 一个 Proxy node

    • 运行 swift-proxy-server 进程, 会转送来自客户端的 request 到合适的

      Storage nodes。 proxy server 也可以提供 WSGI 中间件形式的 TempAuth 服务

  • 五个 Storage node

    • 运行 swift-account-server, swift-container-server, 和swift-object-server 进程, 管理account、container数据和实际存储的object。

本文描述的每个 Storage node 都安排在 ring 中不同的 zone 里。推荐至少配置5个 zone. 一个 zone 是一组隔离的 node (各自隔离的服务器,网络,电源配置,甚至是地理位置)。ring 维护着每个副本( replica )存储在不同的 zone 上。关于 ring 和 zone 的更多信息请查看: The Rings.

为了增强可靠性,你可能会增加其他的 Proxy server,这里你会得到帮助 增加一个 Proxy Server.

网络配置的一些注意事项¶

本文提到了两个网络。“外部网络”用来连接 Proxy server, “内部存储网络”在机群外则是不可见的。内部网络用来node之间的互联。所有的Swift 服务,包括每个Storage node中的 rsync 守护进程,都时时监听STORAGE_LOCAL_NET,即内网中分配到的IP地址。

通用的 OS 配置¶

  1. 所有 node 安装 Ubuntu Server 10.04 LTS

  2. 安装 Swift 的先决条件:

    apt-get install python-software-propertiesadd-apt-repository ppa:swift-core/ppaapt-get updateapt-get install swift openssh-server
  3. 创建 Swift 的工作目录:

    mkdir -p /etc/swiftchown -R swift:swift /etc/swift/
  4. 在第一个 node , 创建 /etc/swift/swift.conf:

    cat >/etc/swift/swift.conf <<EOF[swift-hash]# random unique string that can never change (DO NOT LOSE)swift_hash_path_suffix = `od -t x8 -N 8 -A n </dev/random`EOF
  5. 后续的 node : 拷贝上一步的swift.conf文件到相应目录,这个文件在所有的 node 上都必须相同:

    scp firstnode.example.com:/etc/swift/swift.conf /etc/swift/
  6. 定义内部网络 IP 地址,之后的配置会遇到:

    export STORAGE_LOCAL_NET_IP=10.1.2.3export PROXY_LOCAL_NET_IP=10.1.2.4

配置 Proxy node¶

  1. 安装 swift-proxy 服务:

    apt-get install swift-proxy memcached
  2. 创建SSL自签名证书 cert

    cd /etc/swiftopenssl req -new -x509 -nodes -out cert.crt -keyout cert.key
  1. 配置 memcached ,监听默认的端口。推荐配置为内部的、非公用的IP网络地址。编辑 /etc/memcached.conf,并做配置,例如:

    perl -pi -e "s/-l 127.0.0.1/-l $PROXY_LOCAL_NET_IP/" /etc/memcached.conf
  2. 重启 memcached server:

    service memcached restart
  3. 创建 /etc/swift/proxy-server.conf:

    cat >/etc/swift/proxy-server.conf <<EOF[DEFAULT]cert_file = /etc/swift/cert.crtkey_file = /etc/swift/cert.keybind_port = 8080workers = 8user = swift[pipeline:main]pipeline = healthcheck cache tempauth proxy-server[app:proxy-server]use = egg:swift#proxyallow_account_management = true[filter:tempauth]use = egg:swift#tempauthdefault_swift_cluster = local#https://$PROXY_LOCAL_NET_IP:8080/v1# Highly recommended to change this key to something else!super_admin_key = tempauth[filter:healthcheck]use = egg:swift#healthcheck[filter:cache]use = egg:swift#memcachememcache_servers = <PROXY_LOCAL_NET_IP>:11211EOF
  4. 创建 account, container 和 object ring。swift-ring-builder 命令创建相应的.builder文件会有几个参数。18代表partition的数目会到2^18幂,这个数字取决于你希望一个ring中会有多少个partition。3代表每个object的副本数。最后一个参数1,代表一个partition至少在1小时之后才能被移动。:

    cd /etc/swiftswift-ring-builder account.builder create 18 3 1swift-ring-builder container.builder create 18 3 1swift-ring-builder object.builder create 18 3 1
  5. ring 需要记录每个 Store Node /srv/node 中记录的存储设备(下例为sdb1):

    export ZONE=                    # 为存储设备设定ZONE的编号export STORAGE_LOCAL_NET_IP=    #  IP 地址export WEIGHT=100               # 相对权重( weight) (更大或者更快的磁盘应有更大的权重)export DEVICE=sdb1swift-ring-builder account.builder add z$ZONE-$STORAGE_LOCAL_NET_IP:6002/$DEVICE $WEIGHTswift-ring-builder container.builder add z$ZONE-$STORAGE_LOCAL_NET_IP:6001/$DEVICE $WEIGHTswift-ring-builder object.builder add z$ZONE-$STORAGE_LOCAL_NET_IP:6000/$DEVICE $WEIGHT
  6. 确认 ring 的内容是否正确:

    swift-ring-builder account.builderswift-ring-builder container.builderswift-ring-builder object.builder
  7. 平衡(Rebalance) ring:

    swift-ring-builder account.builder rebalanceswift-ring-builder container.builder rebalanceswift-ring-builder object.builder rebalance
  8. 拷贝 account.ring.gz, container.ring.gz, object.ring.gz 到其它 Proxy node 和 Storage node 的 /etc/swift 目录下。

  9. 确保所有的配置文件都属于 swift 用户:

    chown -R swift:swift /etc/swift
  10. 开启 Proxy 服务:

    swift-init proxy start

配置 Storage node¶

  1. 安装配置 Storage node 相关:

    apt-get install swift-account swift-container swift-object xfsprogs
  2. 对 Storage node 的每一个存储设备, 安装 XFS 逻辑卷 (下例中为 /dev/sdb ):

    fdisk /dev/sdb  (挂载了单独的一个物理卷,或磁盘)mkfs.xfs -i size=1024 /dev/sdb1echo "/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstabmkdir -p /srv/node/sdb1mount /srv/node/sdb1chown -R swift:swift /srv/node
  3. 创建 /etc/rsyncd.conf:

    cat >/etc/rsyncd.conf <<EOFuid = swiftgid = swiftlog file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidaddress = $STORAGE_LOCAL_NET_IP[account]max connections = 2path = /srv/node/read only = falselock file = /var/lock/account.lock[container]max connections = 2path = /srv/node/read only = falselock file = /var/lock/container.lock[object]max connections = 2path = /srv/node/read only = falselock file = /var/lock/object.lockEOF
  4. 修改 /etc/default/rsync 中的 RSYNC_ENABLE= 属性

    perl -pi -e 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
  5. 开启 rsync 守护进程:

    service rsync start
  6. 创建 /etc/swift/account-server.conf:

    cat >/etc/swift/account-server.conf <<EOF[DEFAULT]bind_ip = $STORAGE_LOCAL_NET_IPworkers = 2[pipeline:main]pipeline = account-server[app:account-server]use = egg:swift#account[account-replicator][account-auditor][account-reaper]EOF
  7. 创建 /etc/swift/container-server.conf:

    cat >/etc/swift/container-server.conf <<EOF[DEFAULT]bind_ip = $STORAGE_LOCAL_NET_IPworkers = 2[pipeline:main]pipeline = container-server[app:container-server]use = egg:swift#container[container-replicator][container-updater][container-auditor]EOF
  8. 创建 /etc/swift/object-server.conf:

    cat >/etc/swift/object-server.conf <<EOF[DEFAULT]bind_ip = $STORAGE_LOCAL_NET_IPworkers = 2[pipeline:main]pipeline = object-server[app:object-server]use = egg:swift#object[object-replicator][object-updater][object-auditor]EOF
  9. 开启 storage 服务. 下面的命令会开启所有具有相关配置文件的服务(比如proxy-server.conf,auth-server.conf存在,会开启proxy 和auth服务), 并可能因为部分配置文件不存在而抛出警告:

    swift-init all start

如果你希望一次只启动一个服务,按照如下格式手动启动服务即可。有一点需要注意,您遇到问题的server 在用swift-init启动时,可能把标准输出、错误重定向到了 /dev/null。 如果您遇到什么问题,停止相应 server 的服务,并手动启动它可能是更好的选择。所有的 server 都可以通过 “swift-$SERVER-$SERVICE /etc/swift/$SERVER-config” 的格式启动。其中 $SERVER 可以是 object, continer, 或者 account, $SERVICE 可以是 server,replicator, updater, 或者 auditor。:

swift-init object-server startswift-init object-replicator startswift-init object-updater startswift-init object-auditor startswift-init container-server startswift-init container-replicator startswift-init container-updater startswift-init container-auditor startswift-init account-server startswift-init account-replicator startswift-init account-auditor start

创建 Swift 管理员 account 并作测试¶

在 Proxy node 运行如下命令

  1. 获得 X-Storage-Url 和 X-Auth-Token:

    curl -k -v -H 'X-Storage-User: system:root' -H 'X-Storage-Pass: testpass' https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0
  2. 检测是否可以使用 HEAD 命令查询 account 状态:

    curl -k -v -H 'X-Auth-Token: <token-from-x-auth-token-above>' <url-from-x-storage-url-above>
  3. 检测 swift 命令是否工作正常 (输出应为 zero containers, zero objects, 和 zero bytes):

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass stat
  4. 使用 swift 命令上载 ‘bigfile[1-2].tgz’两个文件到’myfiles’的 container

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass upload myfiles bigfile1.tgzswift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass upload myfiles bigfile2.tgz
  5. 使用 swift 命令下载 container ‘myfiles’中的所有文件

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass download myfiles
  6. 使用 swift 保存ring的.builder 构建文件到container ‘builders’. 这些构建文件很重要,不要丢失!:

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass upload builders /etc/swift/*.builder
  7. 使用 swift 命令列表特定用户的 container

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass list
  8. 使用 swift 命令列表container ‘builders’中的 object

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass list builders
  9. 使用 swift 命令下载container ‘builders’中的object

    swift -A https://$PROXY_LOCAL_NET_IP:8080/auth/v1.0 -U system:root -K testpass download builders

增加一个 Proxy Server¶

从系统可靠性的角度,我们更希望有多个proxy server。这一小节介绍如何在已有一个proxy server 的基础上增加另一个 Proxy Server。

一旦有超过两个proxy server,我们可能期望增加负载均衡的机制,这往往意为着存储结构的变化(增加了一层负载均衡设备)。我们可以选择不同的负载均衡策略。 比如循环dns(round robin dns)算法,或者在多个proxy server之前使用负载均衡的中间件 (比如 pound) , 把指向 storage url 的请求转嫁给负载均衡器。

参考 配置 Proxy node 中的初始安装, 之后按如下步骤操作。

  1. 所有的Proxy server中,更新/etc/swift/proxy-server.conf的memcache server配置。如果有多个memcache server,用以下的格式进行分隔: IP:port ,例如在每个Proxy server 的配置文件中: 10.1.2.3:11211,10.1.2.4:11211 ,说明是以10.1.2.3、10.1.2.4作为共享的缓存:

    [filter:cache]use = egg:swift#memcachememcache_servers = $PROXY_LOCAL_NET_IP:11211
  2. 改变/etc/swift/proxy-server.conf中storage url的指向,使所有请求指向负载均衡设备的url,而不是初始设置时的那台Proxy server。

    [filter:tempauth]use = egg:swift#tempauthuser_system_root = testpass .admin http[s]://<LOAD_BALANCER_HOSTNAME>:<PORT>/v1/AUTH_system
  3. 之后,拷贝所有ring 的信息到所有node中,包括新加入的proxy node, 确保ring 的内容包括了所有的storage node。

  4. 同步(?)所有的结点之后, 确保管理员( admin)可以访问 /etc/swift 目录,并且确保所有ring的.gz文件所有者都是正确的。

故障检测的便签¶

如果遇到什么问题,查看 var/log/syslog 中日志信息是非常必要的。

在 Rackspace,我们会查看/var/log/kern.log找到磁盘故障的一些线索。

Administrator’s Guide中会有更多的调试技巧。

原创粉丝点击