OpenStack 高可用性解决方案手动安装指南(三)

时间:2020-12-09 23:11:04

OpenStack 高可用性解决方案手动安装指南(三)

4.4Swift 存储节点的安装步骤
确保安装开始之前已经完成了所有节点的通用安装步骤和所有Swift节点的通用安装步骤。在swift01, swif
t02和swift03节点上运行这些命令,安装Swift存储节点的软件包。
apt-get install -y swift-account swift-container swift-object xfsprogs parted
除了Ubuntu安装磁盘(即/dev/sda)以外的每个硬盘,创建一个有单独分区的XFS卷。我们的例子中每个存储节点使用五个硬
盘(即从/dev/sdb到/dev/sdf)。为每个将被用于快速存储的磁盘重复这一步骤。注意:当你使用parted命令(注意:你可能需
要更新/etc/fstab)的时候你可以忽略下面的信息。
   parted /dev/sdb mklabel msdos
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%
mkfs.xfs -i size=1024 /dev/sdb1
echo "/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab
mkdir -p /srv/node/sdb1
mount /srv/node/sdb1
修改挂载目录的所有权:
   chown -R swift:swift /srv/node
在每个存储节点创建一个Rsync配置文件。在下面的例子中,用节点存储网络的IP地址替换[STORAGE_NET_IP](即
swift01 = 192.168.222.71): 
vi /etc/rsyncd.conf


uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = [STORAGE_NET_IP]


[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
在/etc/default/rsync里编辑下面这行:
RSYNC_ENABLE = true
启动rsync守护进程:
service rsync start
按如下内容编辑 /etc/swift/account-server.conf,用节点的存储网络的IP地址(即swift01 = 192.168.222.71)替换
[STORAGE_NET_IP]:
vi /etc/swift/account-server.conf


[DEFAULT]
bind_ip = [STORAGE_NET_IP]
workers = 2


[pipeline:main]
pipeline = account-server


[app:account-server]
use = egg:swift#account


[account-replicator]


[account-auditor]


[account-reaper]
按如下内容编辑/etc/swift/container-server.conf,用节点的存储网络的IP地址(即swift01 = 192.168.222.71)替换
[STORAGE_NET_IP]:
vi /etc/swift/container-server.conf


[DEFAULT]
bind_ip = [STORAGE_NET_IP]
workers = 2


[pipeline:main]
pipeline = container-server


[app:container-server]
use = egg:swift#container


[container-replicator]


[container-updater]


[container-auditor]
按如下内容编辑 /etc/swift/object-server.conf,用节点的存储网络的IP地址(即swift01 = 192.168.222.71)替换[STORAGE_NET_IP]:
vi /etc/swift/object-server.conf


[DEFAULT]
bind_ip = [STORAGE_NET_IP]
workers = 2


[pipeline:main]
pipeline = object-server


[app:object-server]
use = egg:swift#object


[object-replicator]


[object-updater]


[object-auditor]


[object-expirer]
开始存储服务
  注意:此时,ring文件将不会出现在存储节点上(ring files:ring作为swift核心的模块,rings 决定数据在集
  群中应该存储的位置。有单独的环来管理账户数据库,容器数据库,和单独的对象,但是每一个ring工作在
  同一个方式下。)。这将导致*-replicator服务无法正常启动。 在第一个proxy节点上(在接下来的段)创建
  ring文件和分发ring 文件到存储节点之后,重启服务可以让所有的Swift服务正常启动。 
swift-init object-server start
swift-init object-replicator start
swift-init object-updater start
swift-init object-auditor start
swift-init container-server start
swift-init container-replicator start
swift-init container-updater start
swift-init container-auditor start
swift-init account-server start
swift-init account-replicator start
swift-init account-auditor start
确保每个存储节点都重复这些步骤。
4.5Swift Proxy节点安装步骤
   在安装之前确保你已经完成了所有节点的通用安装和所有Swift节点的通用安装。在节点swiftproxy01和节
点swift02上执行下述安装步骤。首先,安装proxy节点包:
apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3
修改memcached(Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访
问速度。)绑定到存储网络接口(在我们的例子中是192.168.222.x)。在/etc/memcached.conf中编辑以下行,更改:
-l 127.0.0.1 
to
-l [STORAGE_NET_IP]
重启memcached服务器:
service memcached restart
如果 /etc/swift/目录不存在,就创建该目录:
mkdir /etc/swift/
如果swift用户和组没有/etc/swift和/var/cache/swift目录的所有权,更改这些目录的所有权:
chown -R swift:swift /etc/swift/
chown -R swift:swift /var/cache/swift/ 
创建/etc/swift/proxy-server.conf文件,写入如下内容:
[DEFAULT]
bind_port = 8080
workers = 32
user = swift


[pipeline:main]
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server


[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true


[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = Member,admin, swiftoperator


[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
signing_dir = /var/cache/swift
auth_host = 192.168.220.40
auth_port = 35357
auth_protocol = http
auth_uri = http://192.168.220.40:5000
admin_tenant_name = services
admin_user = swift
admin_password = keystone_admin
delay_auth_decision = 10


[filter:cache]
use = egg:swift#memcache
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211


[filter:catch_errors]
use = egg:swift#catch_errors


[filter:healthcheck]
use = egg:swift#healthcheck


[filter:ratelimit]
use = egg:swift#ratelimit
clock_accuracy = 1000
max_sleep_time_seconds = 60
log_sleep_time_seconds = 0
rate_buffer_seconds = 5
account_ratelimit = 0
在所有proxy节点上创建account,container和object rings。builder命令用来创建一个builder文件,这个命令有几
个参数。参数18表示2^18,用来说明分区的大小,此参数基于你整个ring需要使用的总存储量。参数3表示每个
对象的副本数量,最后一个参数1表示移动一个分区时系统限制的时间(单位小时)。关于Swift ring建立的更多
信息可以参考这里(http://docs.openstack.org/admin-guide-cloud/content/preparing-the-ring.html)。
cd /etc/swift


swift-ring-builder account.builder create 18 3 1
swift-ring-builder container.builder create 18 3 1
swift-ring-builder object.builder create 18 3 1
在所有proxy节点,添加每个存储节点的全部存储设备到每个ring.下面的例子为在zone 1中有分区的存储节点
swift01(192.168.222.71)准备了account,container和object ring。这个分区的挂载点是/srv/node/sdb1,在
rsyncd.conf里的路径是/srv/node/,DEVICE是sdb1,命令将会是:
swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100
注意:确保不要把所有的存储设备放在相同的zone(即 z1)。尽可能高级别地配置zone以得到最好的隔离效果,
一些因素需要考虑进去,如物理位置、电源供给和网络连接。例如,在一个小的集群里,你可能决定按照
小格子来分割zone,每个小格子有它自己的电源和网络连接。因为我们的部署仅仅使用3个存储节点,所以
每个存储节点应该在它自己的zone里。然而,在生产级Swift部署中,我们建议至少有5个zone.
在所有proxy节点里,验证每个ring的内容:
swift-ring-builder /etc/swift/account.builder
swift-ring-builder /etc/swift/container.builder
swift-ring-builder /etc/swift/object.builder
你的输出应该和如下内容类似:
root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder
/etc/swift/account.builder, build version 15
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance
The minimum number of hours before a partition can be reassigned is 1
Devices:    id  zone      ip address  port      name weight partitions balance meta
0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 
1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 
2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 
3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 
4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 
5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 
6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 
7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 
8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 
9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 
10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 
11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 
12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 
13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 
14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00
在节点swiftproxy01,再平衡ring。注意:再平衡ring会需要一定时间。你可能会得到一个关于平衡值的消息,
你需要再rebalance/push(平衡/推)最快1小时之后。如果是这样,一个小时之后重新检查状态。
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance
在swiftproxy01节点,复制 copy the account.ring.gz, container.ring.gz, object.ring.gz文件到节点swiftproxy02和
/etc/swift中的三个存储节点。同样需要确认在所有Swift节点上/etc/swift目录中的所有文件的所有者是swift使
用者:
chown -R swift:swift /etc/swift
开始Proxy服务:
swift-init proxy start
提醒:在复制了ring文件,并成功启动了proxy服务之后,确保你重启所有Swift存储节点服务在本文档中关于
Swift存储节点的安装部分。

4.6验证Swift安装

您可以从proxy服务器或任何有权限进入Keystone的服务器运行验证命令。记住,proxy节点被配置成使用
Keystone进行用户验证,在进行Swift验证之前你必须完成Controller节点的安装并且确保Keystone可用。验证你
可以成功地使用Swift认证证书通过Keystone进行身份验证:
apt-get install -y curl


curl -s -d "{\"auth\":{\"passwordCredentials\": {\"username\": \"swift\", \"password\": \"keystone_admin\"}, \"tenantName\"
/: \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
你收到的输出应该和下面的内容类似:
{"access": {"token": {"issued_at": "2013-04-02T14:55:31.149327", "expires": "2013-04-03T14:55:31Z", "id": "bb29ef5439ce4a75bf85332bbadf6538", "tenant": {"description": 
null, "enabled": true, "id": "b38d88aad6314870b746e7d60808e59a", "name": "services"}}, "serviceCatalog": [{"endpoints": [{"adminURL": 
"http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a", "region": "RegionOne", "internalURL": "http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a"
, "id": "45a336cb74e04e11ab95c0ea28b699d6", "publicURL": "http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a"}], "endpoints_links": [], "type": "compute", 
"name": "nova"}, {"endpoints": [{"adminURL": "http://192.168.220.40:9696/", "region": "RegionOne", "internalURL": "http://192.168.220.40:9696/", "id": 
"259fef5e66814f47ac1934d3cf522a3d", "publicURL": "http://192.168.220.40:9696/"}], "endpoints_links": [], "type": "network", "name": "quantum"}, {"endpoints": [
{"adminURL": "http://192.168.220.40:9292/v2", "region": "RegionOne", "internalURL": "http://192.168.220.40:9292/v2", "id": "166de3790eb54c31a58237fe9ea3d301", 
"publicURL": "http://192.168.220.40:9292/v2"}], "endpoints_links": [], "type": "image", "name": "glance"}, {"endpoints": [{"adminURL": 
"http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a", "region": "RegionOne", "internalURL": "http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a"
, "id": "0a2c69157d5948a9ae8ecee5c65a6d2b", "publicURL": "http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a"}], "endpoints_links": [], "type": "volume", 
"name": "cinder"}, {"endpoints": [{"adminURL": "http://192.168.220.40:8773/services/Admin", "region": "RegionOne", 
"internalURL": "http://192.168.220.40:8773/services/Cloud", "id": "05f85b8aacbd4c87b680dcc2fb6da539", "publicURL": "http://192.168.220.40:8773/services/Cloud"}], 
"endpoints_links": [], "type": "ec2", "name": "ec2"}, {"endpoints": [{"adminURL": "http://192.168.220.60:8080/v1", "region": "RegionOne", "internalURL": 
"http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a", "id": "4a1af526137341c0a682eb573101ddde", "publicURL": 
"http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a"}], "endpoints_links": [], "type": "object-store", "name": "swift"}, {"endpoints": [{"adminURL": 
"http://192.168.220.40:35357/v2.0", "region": "RegionOne", "internalURL": "http://192.168.220.40:5000/v2.0", "id": "3e3f7b50b5bd44b7a15b3e4ae55086bf", "publicURL": 
"http://192.168.220.40:5000/v2.0"}], "endpoints_links": [], "type": "identity", "name": "keystone"}], "user": {"username": "swift", "roles_links": [], "id": 
"ed69664ac78a4b65a36d63da6b760863", "roles": [{"name": "_member_"}, {"name": "admin"}], "name": "swift"}, "metadata": {"is_admin": 0, "roles": [
"9fe2ff9ee4384b1894a90878d3e92bab", "6a553ae3be3c4f8c8fe079830d4102a5"]}}}
使用SWIFT客户端的stat命令,确保你可以查看ring的内容。你可以从proxy服务器或任何有swift客户端的服务器
进入Keystone来运行这些命令。
swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin stat
Account: AUTH_3eccdb2a9331419c96ac9ff336110b65
Containers: 1
  Objects: 2
Bytes: 0
Accept-Ranges: bytes
X-Timestamp: 1363989109.30329
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a
Content-Type: text/plain; charset=utf-8
你可以看见已经存在一个container,现在,我们找到这个container的名字:
swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list
glance
注意:glance container在Controller集群创建完成和一个镜像成功上传到Glance之后才能创建。
列出Glance container的内容:
swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance
24164630-ba2f-436a-8bc6-43975717d5e5
858a11dc-ed61-4a18-a778-eabcb454ae45
4.7Controller节点安装
在安装之前确保你已经完成了所有节点的通用安装。在节点control01、control02、control03上运行下述
命令。 
4.7.1MYSQL WSREP 和 Galera 安装
安装MYSQL和GAlera依赖包:
apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb
下载MySQL-WSREP和Galera:
wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate
安装MYSQL和Galera.注意:如果想在Galera包的安装过程中创建root密码,请注意你使用的密码,因为在连
接到MySQL的时候会需要这个密码。
dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb
dpkg -i /tmp/galera-23.2.1-amd64.deb
更改MySQL默认的绑定地址。修改下述命令中的[CONTROLLER_MGT_IP]为每个controller节点的管理IP地址(即 
control01 = 192.168.220.41):
sed -i 's/127.0.0.1/[CONTROLLER_MGT_IP]/g' /etc/mysql/my.cnf
将下面的一行添加到所有controller节点的/etc/rc.local文件中,使得系统重新启动后MySQL能够自动地启动:
service mysql start
为节点control01修改默认的/etc/mysql/conf.d/wsrep.cnf文件
bind-address=192.168.220.41
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="controller_cluster"
wsrep_cluster_address="gcomm://"
wsrep_sst_method=rsync
wsrep_sst_auth=wsrep_sst:password
为节点control02修改默认的/etc/mysql/conf.d/wsrep.cnf文件
bind-address=192.168.220.42
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="controller_cluster"
wsrep_cluster_address="gcomm://192.168.220.41"
wsrep_sst_method=rsync
wsrep_sst_auth=wsrep_sst:password
为节点control03修改默认的/etc/mysql/conf.d/wsrep.cnf文件
bind-address=192.168.220.43
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="controller_cluster"
wsrep_cluster_address="gcomm://192.168.220.42"
wsrep_sst_method=rsync
wsrep_sst_auth=wsrep_sst:password
注:理解Galera背后的gcomm地址概念是非常重要的,当你创建一个新的集群的时候只能使用一个空的
gcomm://地址。如果你的目的是再次连接到一个已经存在的集群就不要使用这个空地址。在Galera集
群建立之后,你应该把gcomm地址从gcomm://修改为gcomm://192.168.220.42或gcomm://192.168.220.43。否则,
在重启的时候control01将不会加入到集群里。确保在对任何相关的配置文件进行更改时,也重新启动
mysql服务。了解在断电的情况下如何重启一个已经存在的Galera集群也是同样重要的。
用下面的命令重启MySQl:control01,contorl02,control03三个节点都要进行:
service mysql restart
验证Galera集群已经建立了, 集群中所有节点的Value应该是4:
mysql -e "show global status where variable_name='wsrep_local_state';"
+------------------------+---+
| Variable_name      | Value |
+------------------------+---+
| wsrep_local_state  |    4  |
+------------------------+---+
4.7.2MySQL WSREP和Galera监控技术
为每个控制节点完成下面的安装步骤,除非一个节点被特别指出说明。。
安装xinetd:
apt-get install -y xinetd
下载mysqlchk服务:
wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate
注意:功能测试完成后,推荐加强mysqlchk服务的安全性。这可以通过编辑/etc/xinetd.d/中only_from和
per_source的值为负载均衡节点所使用的子网来实现。
编辑/etc/xinetd.d/mysqlchk通过把<%= mysqlchk_script_dir %>/galera_chk为如下内容:
/usr/local/bin/galera_chk
确保root是这个文件的所有者:
ls -l /etc/xinetd.d/mysqlchk
如果不是,更改文件的权限:
chown root:root /etc/xinetd.d/mysqlchk
添加mysqlcheck服务到/etc/services通过添加如下行:
mysqlchk        9200/tcp                        # MySQL Galera health check script
下载 MySQL Galera healthy检查脚本:
wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate
设置文件为可执行的:
chmod +x  /usr/local/bin/galera_chk
按如下内容编辑/usr/local/bin/galera_chk。修改[CONTROLLER_MGT_IP]为每个controller节点的管理IP地址(即
control01 = 192.168.220.41)。
MYSQL_HOST="[CONTROLLER_MGT_IP]"
MYSQL_PORT="3306"
MYSQL_USERNAME="mysqlchk_user"
MYSQL_PASSWORD="mysqlchk_password"
MYSQL_OPTS="-N -q -A"
TMP_FILE="/dev/shm/mysqlchk.$$.out"
ERR_FILE="/dev/shm/mysqlchk.$$.err"
FORCE_FAIL="/dev/shm/proxyoff"
MYSQL_BIN="/usr/bin/mysql"
重启 xinetsd:
service xinetd restart
连接到MySQl并添加mysqlchk用户到集群中的每个controller节点:
mysql
use mysql;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));
flush privileges;
给mysqlchk用户授权。修改[CONTROLLER_MGT_IP]为每个controller节点的管理IP地址(即control01 
= 192.168.220.41)。
grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';
quit;
验证MySQl Galera healthy检查服务的运行状态。从slb01或slb02,远程登录使用端口9200(healthy检查服务的端
口),确保你得到一个“MySQL is running”的消息:
telnet 192.168.220.41 9200
Trying 192.168.220.41...
Connected to 192.168.220.41.
Escape character is '^]'.
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 43
<html><body>MySQL is running.</body></html>
Connection closed by foreign host.
为每一个控制节点执行上述安装步骤。

验证你可以使用Galera集群的虚拟IP地址(VIP)进入MySQl数据库:
mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40
仅供参考的信息,这是健康检查脚本所使用的命令。这个例子是针对节点control01的:
/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e "show global status where variable_name='wsrep_local_state';"
   4.7.3升级客户端的库
为了支持RabbitMQ的镜像队列有几个客户端的库必须升级。
更新所需的客户端的库:
apt-get install -y python-pip
pip install kombu==2.4.7
pip install amqp==0.9.4
检查anjson的版本:
pip freeze | grep anyjson
如果anyjson的版本不是0.3.3,请安装正确的版本(0.3.3):
pip install anyjson==0.3.3
4.7.4RabbitMQ的安装
为每个控制节点完成下面的安装步骤,除非一个节点被特别指出说明。
为了Openstack服务的集群能正常运行,需要一个更新版本的RabbitMQ服务器。首先下载2.8.7版本的RabbitMQ
服务器: 
wget -O /tmp/rabbitmq-server_2.8.7-1_all.deb http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.7/rabbitmq-server_2.8.7-1_all.deb --no-check-certificate
安装RabbitMQ Server 2.8.7的依赖包:
apt-get install -y erlang-nox
安装RabbitMQ Server:
dpkg -i /tmp/rabbitmq-server_2.8.7-1_all.deb
配置RabbitMQ集群。首先,在所有控制节点上停止rabbitmq-server服务:
service rabbitmq-server stop
集群要求节点有相同的Erlang cookie。把节点control01的Erlang cookie复制到节点control02、control03:
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie
注意:上面的命令需要用root登录(Ubuntu中默认禁用)。如果你没有root权限,就从/var/lib/rabbimq/复
制Erlang cookie到节点control02、control03的/tmp目录下,然后再移动到/var/lib/rabbimq/。此外,需
要确保文件在三个节点上的权限相匹配。
现在,3个控制节点都具有相同的Erlang cookie了,这确保了RabbitMQ能够启动:
service rabbitmq-server start
注意:如果RabbiMQ没有成工地启动,不要继续进行集群。
集群过程可以使用rabbitmqctl命令或通过修改在RabbitMQ的配置文件来配置,我们的例子使用的是
rabbitmqctl命令方式。在这里你可以看到配置RabbiMQ集群的这两种方法
(http://www.rabbitmq.com/clustering.html#setup)。注意:加入这个集群就会默认重置该节点,从而消除以
前存在该节点上的所有资源和数据。
从节点control02:
rabbitmqctl stop_app
rabbitmqctl cluster rabbit@control01
rabbitmqctl start_app
验证节点control02现在已经和control01节点集群成功:
rabbitmqctl cluster_status


Cluster status of node rabbit@control02 ...
[{nodes,[{disc,[rabbit@control01]},{ram,[rabbit@control02]}]},
{running_nodes,[rabbit@control01,rabbit@control02]}]
...done.
从节点control03:
rabbitmqctl stop_app
rabbitmqctl cluster rabbit@control02
rabbitmqctl start_app
验证节点control03现在已经加入集群:
rabbitmqctl cluster_status


Cluster status of node rabbit@control03 ...
[{nodes,[{disc,[rabbit@control01]},{ram,[rabbit@control03,rabbit@control02]}]},
{running_nodes,[rabbit@control02,rabbit@control01,rabbit@control03]}]
...done.
现在集群已经完成,通过从集群中的一个节点删除默认(访客)用户来保证RabbitMQ集群的安全:
rabbitmqctl delete_user guest
从集群中的一个节点,创建一个将会被用于OpenStack服务的RabbitMQ用户账户:
rabbitmqctl add_userOpenStack_rabbit_userOpenStack_rabbit_password
从集群中的一个节点,为新的RabbitMQ用户账户设置权限:
  rabbitmqctl set_permissions -p /OpenStack_rabbit_user ".*" ".*" ".*"
验证用户设置:
rabbitmqctl list_users
rabbitmqctl list_user_permissionsOpenStack_rabbit_user
4.7.5Keystone 安装
在每个控制节点安装Keystone
apt-get install -y keystone python-keyring
删除sqllite数据库:
rm /var/lib/keystone/keystone.db
为Keystone创建一个MySQL数据库。这个数据库仅仅需要创建在一个控制节点上:
mysql
CREATE DATABASE keystone;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';
quit;
注意:从集群里的其他控制节点上,你可以看见被Galera复制的数据库:
mysql -e "show databases;"
在每个控制节点上编辑/etc/keystone/keystone.conf文件。修改[CONTROLLER_MGT_IP]为控制节点的管理IP地址
(即control01:bind_host = 192.168.220.41)):
[DEFAULT]
admin_token = keystone_admin_token
bind_host = [CONTROLLER_MGT_IP]
verbose = True


[sql]
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone
idle_timeout = 30


[ssl]
enable = False


[signing]
token_format = UUID
创建一个认证文件并且加载该文件,使得OpenStack客户端的每个命令不再需要认证。注意:这需要在每个
节点上创建,你将运行的OpenStack的命令如下:
vi /root/openrc


export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=keystone_admin
export OS_AUTH_URL="http://192.168.220.40:5000/v2.0/"
export OS_AUTH_STRATEGY=keystone
export SERVICE_TOKEN=keystone_admin_token
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/


source /root/openrc
验证MySQL正在通过VIP监听Keystone数据库。如果连接到VIP时遇到任何问题,尝试使用一个控制节点的真实
IP地址监听:
mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone
重启Keystone:
service keystone restart
只在一个控制节点上同步数据库:
keystone-manage db_sync
下载Keystone 数据脚本(Emilien Macchi提供):
wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh
编辑脚本中以下部分:
ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}
export SERVICE_TOKEN="keystone_admin_token"
export SERVICE_ENDPOINT="http://192.168.220.40:35357/v2.0/"
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}
编辑这个文件的权限:
chmod +x keystone-data.sh
运行这个脚本,用数据(用户、租户、服务)来填充Keystone的数据库。注意:如果你看到一个长时间的“连接超
时”错误,这可能会涉及到您的代理设置,删除您的HTTP/HTTPS代理的export,并重新运行脚本。为了其他的外
部下载你必须重新添加您的代理。
./keystone-data.sh
注意:当运行脚本或以后运行任何Keystone的命令时你可以忽略下面的CLI信息:
WARNING: Bypassing authentication using a token & endpoint (authentication credentials are being ignored).
下载Keystone endpoint 脚本(Emilien Macchi提供)
wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh
编辑脚本中以下部分:
# MySQL definitions
MYSQL_USER=keystone_admin
MYSQL_DATABASE=keystone
MYSQL_HOST=192.168.220.40
MYSQL_PASSWORD=keystone_db_pass


# Keystone definitions
KEYSTONE_REGION=RegionOne
SERVICE_TOKEN=keystone_admin_token
SERVICE_ENDPOINT="http://192.168.220.40:35357/v2.0"


# other definitions
MASTER="192.168.220.40"
SWIFT_MASTER="192.168.220.60"
编辑文件的权限:
chmod +x keystone-endpoints.sh
运行脚本,用service endpoint(Endpoint:直译为端点,其实指的是访问服务的地址。如果细分的话,又可以进一
步分为对外提供服务的地址,管理地址等。)填充Keystone的数据库。同样,如果你使用的是代理,在运行这个
命令之前你需要从代理的出口(export)删除它们。
./keystone-endpoints.sh
测试使用一个 curl 请求连接到Keystone:
apt-get install curl openssl -y


curl -d '{"auth": {"tenantName": "admin", "passwordCredentials":{"username": "admin", "password": "keystone_admin"}}}' -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool
如果上述命令执行成功,您将收到的输出应该包括一个标记和一个service endpoint的列表。您可能还需要验
证其他服务帐户的证书:
Glance
curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"glance\", \"password\": \"keystone_admin\"}, \"tenantName\": \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
Nova
curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"nova\", \"password\": \"keystone_admin\"}, \"tenantName\": \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
Swift
curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"swift\", \"password\": \"keystone_admin\"}, \"tenantName\": \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
Quantum
curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"quantum\", \"password\": \"keystone_admin\"}, \"tenantName\": \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
Cinder
curl -s -d  "{\"auth\":{\"passwordCredentials\": {\"username\": \"cinder\", \"password\": \"keystone_admin\"}, \"tenantName\": \"services\"}}" -H "Content-type: application/json" http://192.168.220.40:35357/v2.0/tokens
你也可以使用Keystone客户端去验证这些配置:
keystone tenant-list
keystone user-list
keystone role-list
keystone service-list
keystone endpoint-list
现在Keystone已经能够运行,你可能想倒回去验证Swift的安装那部分以确保Swift可以完全运行。因为如果

Swift不能运行,在接下来的部分你将不能添加镜像到Glance。

(个人水平有限,错误在所难免,转载请注明出处:http://blog.csdn.net/bangbanglovetting)