本文主要译自David Stilson所著的《OpenStack Operations Guide》,目前Openstack社区官网中已经找不到该文档了,估计是内容需要更新,但其中的体系结构和运维方法的介绍十分全面,非常值得初学者学习与参考的,本文仅为个人学习Openstack过程中的内容摘录,详细内容请阅读原文,翻译不当之处在所难免,恳请各位指正。
早期的开发实现
最大程度的提高网络连接的性能(引入bond双网卡绑定)
节点图
硬件选择
服务分离
数据库
消息队列
Conductor服务
API
扩展
调度
镜像
安全认证
网络注意事项
计算节点通常比存储节点需要更多的内存和CPU资源。
物理主机间虚拟机的无缝迁移,例如执行升级时需要重启计算节点但这只适用于共享存储。
Openstack允许在计算节点上过载使用CPU和内存。
CPU分配比例:16:1
RAM分配比例:1.5:1
因该对面向用户的服务例如dashboard、nova-api、Object Storage proxy进行负载均衡,如利用循环复用DNS负载均衡技术、硬件负载均衡器、Pound或HAProxy软件负载均衡器等标准HTTP负载均衡方法。
硬件购买
容量规划
试机检测:CPU、Disk基准测试
短暂存储
永久存储:对象存储、块存储、文件系统存储
对象存储:large datasets
块存储:永久性、
文件系统存储
检查API调用
1 |
openstack --debug server list |
利用cURL进一步检查
1 2 3 |
curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \ -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \ -H "Content-type: application/json" | jq . |
查看Json响应的目录结构
1 2 3 |
TOKEN=`curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \ -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \ -H "Content-type: application/json" | jq -r .access.token.id` |
请求服务endpoint
1 2 3 |
curl -s \ -H "X-Auth-Token: $TOKEN" \ http://203.0.113.10:8774/v2.0/98333aba48e756fa8f629c83a818ad57/servers | jq . |
查看服务器
1 |
# openstack service list |
查看cinder返回值
1 |
cinder-manage host list | sort |
查看目录结构
1 |
# openstack catalog list |
检测计算节点
检查虚拟机
1 |
nova diagnostics |
网络
查看网络
1 |
nova network-list |
查看计算服务
1 |
openstack compute service list |
浮动IP查询
1 |
openstack ip floating list |
工程及用户查询
1 2 |
openstack project list openstack user list |
虚拟机查询
1 2 |
nova list --all-tenants nova show |
一组用户可以被成为project或tenant,两个术语可以互换,Openstack计算模块最初实现有其认证系统成为project,当认证系统后来被移动到Keystone时被称为tenant。
创建Project
1 |
openstack project create demo |
设置配额
1、设置镜像配额
在/etc/glance/glance-api.conf配置文件中[DEFAULT]标签中
1 |
user_storage_quota = 5368709120 |
2、设置计算服务配额
查看默认配置
1 |
nova quota-defaults |
设置方式
1 |
nova quota-class-update default key value |
例如
1 2 |
nova quota-class-update default --instances 15 tenant=$(openstack project list | awk '/tenantName/ {print $2}') |
查看当前设置
1 2 |
nova quota-show --tenant $tenant nova quota-update --quotaName quotaValue tenantID |
例如
1 |
nova quota-update --floating-ips 20 $tenant |
3、设置存储配额
1 2 |
cinder quota-defaults $tenant cinder quota-show $tenant |
用户间干扰
计算密集的用户对其他用户造成干扰,需要采取合适的方案进行隔离,例如主机聚合(host aggregation)、分区(regions)。
用户消耗大量带宽,需要限制其传送速率而避免影响其他用户,或者移动其他高带宽的区域。另外,用户虚拟机如果遭受DDOS攻击而变成僵尸网络。虽然网络上其他服务器被黑了,解决方案是一样,联系用户并给予处理时间,如果未能处理,关闭虚拟机。
如果用户反复申请云资源,联系用户并了解其目的,可能他并不知道他的操作是不合适的。或者他的请求在队列中或滞后而造成错误。
1、镜像操作
增加镜像
1 2 3 4 |
wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img openstack image create --file cirros-0.3.4-x86_64-disk.img \ --public --container-format bare \ --disk-format qcow2 "cirros image" |
查看帮助
1 |
openstack help image create |
查看镜像属性
1 |
openstack image show |
添加签名镜像
……
删除镜像
1 |
openstack image delete |
镜像服务数据库查询
1 2 3 4 |
mysql> select glance.images.id, glance.images.name, keystone.tenant.name, is_public from glance.images inner join keystone.tenant on glance.images.owner=keystone.tenant.id; |
1 |
select name, value from image_properties where id =’ fe4a4c4a-fdcd-4a64-bdf4-4203c1d439ab’; |
虚拟机元数据
1 |
nova show 实例名 |
虚拟机用户数据
文件注入
1 2 |
nova boot --image ubuntu-cloudimage --flavor 1 \ --file /root/.ssh/authorized_keys=special_authorized_keysfile authkeyinstance |
关联与移除安全组
1 2 |
nova add-secgroup nova remove-secgroup |
浮动IP
1 2 3 |
nova floating-ip-create openstack ip floating add nova remove-floating-ip |
连接块存储
1 |
nova volume-attach |
可以利用如下制定卷的信息
1 |
--block-device-mapping |
参数格式
例如启动虚拟机时同时连接块存储
1 2 3 |
nova boot --image 4042220e-4f5e-4398-9054-39fbd75a5dd7 \ --flavor 2 --key-name mykey --block-device-mapping vdc=13:::0 \ boot-with-vol-test |
快照
1 |
nova image-create |
Live Snapshots
虚拟机运行时无需中断而拍摄快照(QEMU 1.3+ and libvirt 1.0+ are used)
快照获取文件系统状态,但不会保存内存的状态,因此,为了保证数据完整,拍摄快照前需要确保:运行的程序已经将数据写入到磁盘;文件系统不存在“脏”缓存数据:程序已经发出了写磁盘命令,但操作系统尚未完成该写操作。
如果不能完成程序的写磁盘操作,需要停止这些运行的服务
拍摄快照前同步命令
Sync
仅执行sync不能保证文件系统的一致性,建议使用fsfreeze工具,它会暂停访问文件系统的新需求,创建稳定的磁盘镜像,支持ext3, ext4,和XFS文件系统,
当给块存储卷拍摄快照时,例如被客户机操作系统识别为/dev/vdb并挂载在/mnt上时,fsfreeze命令具备两个参数
-f 冻结系统
-u 解冻系统
拍摄快照前,在虚拟机中执行fsfreeze前需要挂载文件系统,
1 |
fsfreeze -f /mnt |
当执行fsfreeze –f时,正在执行的操作允许执行完成,新的写操作将被暂停,其他修改文件系统的操作也被暂停,最重要的是所有脏数据、元数据、日志信息要被写入到磁盘。
一旦volume被冻结,此时不允许读写该卷,所有的I/O操作将会被挂起,直到操作系统被解封。
拍摄快照完成后,执行以下命令解封
1 |
fsfreeze -u /mnt |
如果想备份根文件系统/,不能仅仅运行以上命令,以为会冻结系统,运行以下命令代替:
1 |
fsfreeze -f / && read x; fsfreeze -u / |
确保window客户机快照一致性
Window上运行了Volume Shadow Copy Service,VSS提供的框架可以使兼容的应用程序在live文件系统上一致性地备份。QEMU提供的客户机代理能够在KVM虚拟机监控程序运行虚拟机,此客户机代理能够与window VSS服务一致,保证一致性快照。至少需要QEMU 1.7,相关客户机代理命令如下:
guest-file-flush,写“脏”缓存数据到磁盘,类Linux上的sync操作。
guest-fsfreeze,暂停磁盘I/O,类Linux上fsfreeze –f操作
guest-fsfreeze-thaw,恢复磁盘I/O,类Linux上fsfreeze –u操作
有计划的维护
云管理节点或存储代理维护有计划维护,如凌晨1点、2点。如果需要不间断服务,需要研究选择HA。
重启
执行reboot,重启前备份,
重启后产看服务启动情况
1 2 3 4 |
# ps aux | grep nova- # ps aux | grep glance- # ps aux | grep keystone # ps aux | grep cinder |
所有控制节点失败,考虑HA方案。
或者利用配置管理工具,例如Puppet,自动构建云管理节点。存在可用的备用服务器情况下,恢复不会超过15分钟。
计算节点上nova-compute服务,在长时间重启之后不总会重新连接管理节点上rabbitmq,需要重启计算节点上nova服务。
OpenStack Docs: Zed Administrator Guides
计划维护
因软件或硬件升级而需要重启计算节点,需要执行以下步骤
1 |
nova service-disable --reason maintenance c01.example.com nova-compute |
如果利用的共享存储
列出需要转移的实例
1 |
nova list --host c01.example.com --all-tenants |
依次迁移所有实例
1 |
nova live-migration |
如果没有利用共享存储
1 |
nova live-migration --block-migrate |
1 |
systemctl stop nova-compute |
重启计算节点之后
检查服务是否运行
查看AMQP
1 |
grep AMQP /var/log/nova/nova-compute |
列出该节点上的虚拟机实例
1 |
nova list --host c01.example.com --all-tenants |
可以重启该实例
1 |
nova reboot |
如果实例未启动,计算节点上virsh list将不会显示该实例,查看计算节点日志,
1 |
tail -f /var/log/nova/nova-compute.log |
再次执行nova reboot,查看错误原因
错误可能是在libvirt的XML(/etc/libvirt/qemu/instance-xxxxxxxx.xml)某项,但该文件不存在了,可以利用该文件强制重新生成该文件,
从失败的虚拟机实例上检查和恢复数据
情景:不能通过ssh访问、VNC控制台显示启动失败、内核错误信息。这些可能预示着VM冲突,如果需要恢复文件或检查实例内容,qemu-nbd可以用来挂载磁盘。
获取实例硬盘(/var/lib/nova/instances/instance-xxxxxx/disk)需要以下几步:
1 2 |
virsh list virsh suspend 140 |
1 2 3 |
cd /var/lib/nova/instances/instance-0000274a ls –lh qemu-nbd -c /dev/nbd0 `pwd`/disk |
Ceph作为存储后端,未找到该存储后端。
1 2 3 4 5 |
mount /dev/nbd0p1 /mnt/ umount /mnt qemu-nbd -c /dev/nbd1 `pwd`/disk.local mount /dev/nbd1 /mnt/ ls -lh /mnt/ |
1 |
umount /mnt |
1 |
qemu-nbd -d /dev/nbd0 |
1 |
virsh resume 30 |
如果不执行最后三步,openstack将不再能管理实例,不能执行openstack命令,并标记为关机。
管理虚拟机实例浮动IP地址
假设Public_AGILE不支持浮动IP,利用neutron ports提供一个变通方法
1 |
neutron port-create Public_AGILE |
1 2 |
neutron port-create Public_AGILE --name \ "example-fqdn-01.sys.example.com" |
1 2 |
nova boot --flavor m1.medium --image ubuntu.qcow2 --key-name team_key \ --nic port-id=PORT_ID "example-fqdn-01.sys.example.com" |
1 |
Openstack server show |
1 |
nc -v -w 2 96.118.182.107 22 |
解除绑定
1 2 3 |
neutron port-list | grep -B1 96.118.182.107 neutron port-update 731c3b28-3753-4e63-bae3-b58a52d6ccca \ --device_id "" --device_owner "" --binding:host_id "" |
全部计算节点失败
如果节点失败,几个小时未恢复时,如果使用了共享存储可以重启实例,实例保存在/var/lib/nova/instances中。
查询元数据
1 2 |
mysql> select uuid from instances where host = 'c01.example.com' and deleted = 0; |
更新元数据到另一个计算节点
1 2 |
mysql> update instances set host = 'c02.example.com' where host = 'c01.example.com' and deleted = 0; |
如果利用了网络服务ML2插件,更新网络服务元数据声明所有端口更新到另一个计算节点
1 2 3 4 |
mysql> update ml2_port_bindings set host = 'c02.example.com' where host = 'c01.example.com'; mysql> update ml2_port_binding_levels set host = 'c02.example.com' where host = 'c01.example.com'; |
然后重启实例
1 |
nova reboot --hard |
/var/lib/nova/instances目录下说明
_base包含缓存的基础镜像
instance-xxxxxxxx目录对应不同实例
OpenStack Docs: Zed Administrator Guides
重启reboot
关闭节点
替换Swift盘
优先顺序,尽量恢复对影响用户使用服务,尽管所列为单一条目,但恢复的每一步需要大量的工作。例如,启动数据库后,需要检查其完整性;启动nova服务后,需要验证hypervisor与数据库是否一致,如不一致需要修复不一致。
Table. Example service restoration priority list | |
Priority | Services |
1 | Internal network connectivity |
2 | Backing storage services |
3 | Public network connectivity for user virtual machines |
4 | nova-compute, nova-network, cinder hosts |
5 | User virtual machines |
10 | Message queue and database services |
15 | Keystone services |
20 | cinder-scheduler |
21 | Image Catalog and Delivery services |
22 | nova-scheduler services |
98 | cinder-api |
99 | nova-api services |
100 | Dashboard node |
Openstack云需要管理大量机器,手动配置容易出错,需要利用配置管理工具,这些工具自动配置。配置工具例如Puppet、Chef、Juju, Ansible, 和Salt。
增加计算节点:利用自动化部署系统引导裸机服务器安装操作系统,并利用配置工具部署安装计算节点,实现自动化的云扩展。
如果块存储节点同计算节点分离开,扩展方法类同。
增加对象存储节点:利用自动化安装及部署工具,然后增加对象存储的本地磁盘到对象存储环中,然后利用相同命令增加目的磁盘到环中。
组件替换:需要考虑处理时间及节约时间
查看配置文件中连接
1 2 |
grep -hE "connection ?=" /etc/nova/nova.conf /etc/glance/glance-*.conf \ /etc/cinder/cinder.conf /etc/keystone/keystone.conf |
性能及优化
MySQL :: MySQL 8.0 Reference Manual :: 8.1 Optimization Overview
1、服务挂起Hang
当重启或挂起时,Rabbitmq容易挂起,需要手动重启控制节点上的RabbitMQ
1 2 |
# service rabbitmq-server stop # service rabbitmq-server start |
如果无法停止,利用pkill结束服务并重启
1 2 |
# pkill -KILL -u rabbitmq # service rabbitmq-server start |
重启后验证是否运行
1 2 3 |
# ps -ef | grep rabbitmq # rabbitmqctl list_queues # rabbitmqctl list_queues 2>&1 | grep -i error |
如果存在错误,运行cluster_status确保没有partitions
1 |
rabbitmqctl cluster_status |
重启服务,如果还存在错误,删除/var/lib/rabbitmq/mnesia/目录下内容并重启。
2、服务警告Alert
判断哪个节点发出Alert
在受影响的环境中尝试重启nova虚拟机
如果不能够启动虚拟机,继续寻找原因
登录受影响的控制节点查看日志/var/log/rabbitmq,查看日志中连接问题
检查/etc/init.d中nova*, cinder*, neutron*, 或者glance*,检查RabbitMQ消息队列,重启受影响的openstack服务。
如果在Dashboard中创建虚拟机成功,问题解决,否则检查/var/log/rabbitmq日志,重启所有控制节点上的rabbitmq服务
1 2 |
# service rabbitmq-server stop # service rabbitmq-server start |
然后在创建虚拟机检查日志是否还存在错误。
3、数据库管理内存过度消耗
检查内存消耗
1 |
rabbitmqctl status |
编辑/etc/rabbitmq/rabbitmq.config配置文件,改变参数collect_statistics_interval在30000-60000毫秒,或者关闭collect_statistics,设置其值为none。
4、扩展云时文件描述限制
执行rabbitmqctl status查看文件描述扩展,修改配置文件/etc/security/limits.conf调整至合适的值。
Hourly:检查预警系统并采取措施;检查ticket queue for new tickets
Daily:检查失败虚拟机或出错虚拟机,并找出原因;检查安全补丁并安装更新所需要的
Weekly:检查云使用量(用户配额、磁盘空间、镜像使用、超大实例、带宽及IP网络资源使用)、检验预警机制是否还能工作;
Monthly:检查过去几个月的使用量及趋势、检查需要移除的用户账户、检查需要移除的系统运维账户。
Quarterly:审查过去几月使用情况和趋势、准备关于使用情况的季度报告和统计、审查和规划云资源扩展、审查和计划openstack升级
Semiannually:升级、清理(不用的服务,并注意一些新的服务)
查看日志,如
1 |
tail -f /var/log/nova/nova-api.log |
在CLI上运行daemon
1 |
sudo -u glance -H glance-api |
认证:可能是token表变大,可用利用keystone-manage token_flush命令修复
镜像:后端存储连接缓慢,检查存储服务是否Down掉
块存储:检查认证相关服务、后端存储、镜像、AMQP、SQL
计算服务:认证、授权、AMQP、SQL
网络服务:与物理或虚拟网络相关、namespaces不存在、DHCP daemons暂停或挂起、检查网络、AMQP、SQL
AMQP broker:MQ服务停止或者无法处理请求队列
SQL后端:加锁或长连接。
OpenStack Docs: Zed Administrator Guides
在计算节点和运行nova-network的网络节点上,利用如下命令查看网卡的IP、VLANs、启动状态等相关信息。
利用 “ip a”检查网卡状态
# ip a
查看启动状态
1 2 3 4 5 6 7 8 |
# ip a | grep state 1: lo: 2: eth0: qlen 1000 3: eth1: master br100 state UP qlen 1000 4: virbr0: 5: br100: |
可以忽略virbr0的状态,它是libvirt创建的默认的网桥,不会在Openstack中使用。
(实际环境中,ovs-system、br-tun、br-int处于DOWN状态,br-ex处于UNKNOWN状态)
登录虚拟机实例中ping一个外部主机,例如Google,ping的数据包路由如下图所示。
1 |
$ brctl show |
可以查看nova.conf配置文件下flat_interface_bridge选项;
ping回复的路径是反方向的,可以看到,一个数据包传输经过了4个不同网卡。任何一个网卡出现问题,网络就会出现问题。
相比于nova-network,OpenStack网络服务更灵活,因为它具有可插拔式的后端。Openstack网络可以基于开源插件或供应商专用插件配置,可以利用Open vSwitch或Linux Bridge等Linux主机上自带设备来控制SDN硬件。
可以参考OpenStack Docs: Zed Administrator Guides 进行排错。
Open vSwitch (OVS)是最流行的网络部署驱动,参考neutron网络路径介绍ovs流量路径。
TAP设备和虚拟机接口设备int-br-eth1、phy-br-eth1是典型的Linux网络设备,可用被ip和tcpdump等工具探测到。Open vSwitch内部设备如patch-tun,只在Open vSwitch环境中可见,如果运行tcpdump -i patch-tun会报设备不存在的错误。
数据包可以在内部接口中监测到,但需要一些网络的操作,首先需要创建一个虚拟的网络设备能够让Linux工具监测到,然后将其增加到网桥所包含的并且你想检测到的内部接口上。最后,需要通知Open vSwitch反馈检测到所有流量从内部接口到该虚拟端口。最后,你可以运行tcpdump在虚拟接口上并查看内部端口的流量。
在集成网桥br-int的patch-tun内部接口上捕获流量:
1 2 |
# ip link add name snooper0 type dummy # ip link set dev snooper0 up |
1 |
# ovs-vsctl add-port br-int snooper0 |
1 2 3 4 |
# ovs-vsctl -- set Bridge br-int mirrors=@m -- --id=@snooper0 \ get Port snooper0 -- --id=@patch-tun get Port patch-tun \ -- --id=@m create Mirror name=mymirror select-dst-port=@patch-tun \ select-src-port=@patch-tun output-port=@snooper0 select_all=1 |
1 2 3 |
# ovs-vsctl clear Bridge br-int mirrors # ovs-vsctl del-port br-int snooper0 # ip link delete dev snooper0 |
在集成网桥上,网络通过内部的VLANs来区分而不管网络服务如何定义他们。这允许同一台宿主机器上的虚拟机实例可以直接连接而不通过其他虚拟或物理网络。内部的VLAN IDs基于同一个节点上出现的顺序而创建,不同节点上VLAN IDs可能不同。
VLAN tags在网络设置的外部标记之间转换,内部标记出现在几个地方,在br-int,从int-br-eth1传入的数据包被从外部标记到内部标记。
通过使用ovs-ofctl发现所给的外部VLAN所使用的内部标记
1 2 3 4 5 6 7 8 |
neutron net-show --fields provider:segmentation_id +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | provider:network_type | vlan | | provider:segmentation_id | 2113 | +---------------------------+--------------------------------------+ |
1 2 3 4 |
# ovs-ofctl dump-flows br-int | grep vlan=2113 cookie=0x0, duration=173615.481s, table=0, n_packets=7676140, n_bytes=444818637, idle_age=0, hard_age=65534, priority=3, in_port=1,dl_vlan=2113 actions=mod_vlan_vid:7,NORMAL |
可以看到,数据包接受到了从端口ID为1的VLAN tag 2113,已经转成内部internal VLAN tag 7。更近一步查看,可以发现端口1实际上就是int-br-eth1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ovs-ofctl show br-int OFPT_FEATURES_REPLY (xid=0x2): dpid:000022bc45e1914b n_tables:254, n_buffers:256 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE 1(int-br-eth1): addr:c2:72:74:7f:86:08 config: 0 state: 0 current: 10GB-FD COPPER speed: 10000 Mbps now, 0 Mbps max 2(patch-tun): addr:fa:24:73:75:ad:cd config: 0 state: 0 speed: 0 Mbps now, 0 Mbps max 3(tap9be586e6-79): addr:fe:16:3e:e6:98:56 config: 0 state: 0 current: 10MB-FD COPPER speed: 10 Mbps now, 0 Mbps max LOCAL(br-int): addr:22:bc:45:e1:91:4b config: 0 state: 0 speed: 0 Mbps now, 0 Mbps max OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0 |
1 2 3 4 |
# ovs-ofctl dump-flows br-eth1 | grep 2113 cookie=0x0, duration=184168.225s, table=0, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=4,in_port=1,dl_vlan=7 actions=mod_vlan_vid:2113,NORMAL |
数据包此时已经携带了外部VLAN tag,并通过eth1退出物理网络。Layer2交换机的这个接口连接到必须被配置接受VLAN ID的网络流量。数据包的下一跳同样也在同一个layer-2的网络上。
查找该接口
1 2 3 4 5 6 |
# ovs-vsctl show | grep -A 3 -e Port\ \"gre- Port "gre-1" Interface "gre-1" type: gre options: {in_key=flow, local_ip="10.10.128.21", out_key=flow, remote_ip="10.10.128.16"} |
所有br-tun上的接口都在Open vSwitch内部,为了能够监控上面的流量,必须像上面br-int网桥上的patch-tun一样建立端口。
利用ovs-ofctl命令发现用于GRE tunnel上的内部VLAN tag标记。
1 2 3 4 5 6 7 |
# neutron net-show --fields provider:segmentation_id +--------------------------+-------+ | Field | Value | +--------------------------+-------+ | provider:network_type | gre | | provider:segmentation_id | 3 | +--------------------------+-------+ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ovs-ofctl dump-flows br-tun|grep 0x3 cookie=0x0, duration=380575.724s, table=2, n_packets=1800, n_bytes=286104, priority=1,tun_id=0x3 actions=mod_vlan_vid:1,resubmit(,10) cookie=0x0, duration=715.529s, table=20, n_packets=5, n_bytes=830, hard_timeout=300,priority=1, vlan_tci=0x0001/0x0fff,dl_dst=fa:16:3e:a6:48:24 actions=load:0->NXM_OF_VLAN_TCI[], load:0x3->NXM_NX_TUN_ID[],output:53 cookie=0x0, duration=193729.242s, table=21, n_packets=58761, n_bytes=2618498, dl_vlan=1 actions=strip_vlan,set_tunnel:0x3, output:4,output:58,output:56,output:11,output:12,output:47, output:13,output:48,output:49,output:44,output:43,output:45, output:46,output:30,output:31,output:29,output:28,output:26, output:27,output:24,output:25,output:32,output:19,output:21, output:59,output:60,output:57,output:6,output:5,output:20, output:18,output:17,output:16,output:15,output:14,output:7, output:9,output:8,output:53,output:10,output:3,output:2, output:38,output:37,output:39,output:40,output:34,output:23, output:36,output:35,output:22,output:42,output:41,output:54, output:52,output:51,output:50,output:55,output:33 |
1 2 3 4 5 6 |
# ip netns exec qrouter-e521f9d0-a1bd-4ff4-bc81-78a60dd88fe5 ip a | grep state 10: qr-e6256f7d-31: state UNKNOWN 11: qg-35916e1f-36: qdisc pfifo_fast state UNKNOWN qlen 500 28: lo: |
利用ping命令,如果可以ping通外网服务器,则没有问题,
如果不能ping通外网,尝试ping虚拟机所在主机IP,如果可以,问题则出在计算节点和计算节点的网关上面;
如果不能ping通所在计算节点,问题可能是虚拟机实例和计算节点,主要包括计算节点上网卡与虚拟机虚拟机网卡连接的网桥问题。
最后测试是两个虚拟机之间可否相互ping通,如果可以,问题可能与计算节点上的防火墙相关。
使用tcpdump是一个很好且深入的网络故障排除方法。
例如执行以下命令:
1 |
tcpdump -i any -n -v 'icmp[icmptype] = icmp-echoreply or icmp[icmptype] = icmp-echo' |
运行在如下机器上:
可用的云外的服务器上、计算节点上、运行在计算节点上的虚拟机实例上。
在虚拟机实例上ping云外服务器,查看各个服务器上的输出。外部服务器上会收到ping请求并返回ping回复。在计算节点上可以看到通过的虚拟机和外部之间的ping请求和ping回复。因为tcpdump可以捕获在网桥和输出接口之间的数据包。
通过nova-network或neutron,Openstack计算服务能够自动管理iptables,包括转发的数据包、来着计算节点上虚拟机实例的、转发的浮动IP流量和管理安全规则。执行以下命令可以查看iptables的配置
1 |
# iptables-save |
可以通过虚拟机实例的日志查看
1 |
$ nova console-log |
如果无法通过DHCP获取IP,错误如下,
1 2 3 4 5 6 7 8 9 |
udhcpc (v1.17.2) started Sending discover... Sending discover... Sending discover... No lease, forking to background starting DHCP forEthernet interface eth0 [ [1;32mOK[0;39m ] cloud-setup: checking http://169.254.169.254/2009-04-04/meta-data/instance-id wget: can't connect to remote host (169.254.169.254): Network is unreachable |
如果dnsmasq进程出错,重启,然后在查看进程
1 2 3 |
# killall dnsmasq # restart nova-network # ps aux | grep dnsmasq |
如果仍不能获取IP,需要检查dnsmasq是否收到了虚拟机的DHCP请求,在运行dnsmasq的节点上查看/var/log/syslog检查dnsmasq的输出,如下:
1 2 3 4 5 6 7 |
Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPDISCOVER(br100) fa:16:3e:56:0b:6f Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPOFFER(br100) 192.168.100.3 fa:16:3e:56:0b:6f Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPREQUEST(br100) 192.168.100.3 fa:16:3e:56:0b:6f Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPACK(br100) 192.168.100.3 fa:16:3e:56:0b:6f test |
如果未发现DHCPDISCOVER,问题出在虚拟机到运行dnsmasq机器过程中。日志输出如下:
1 2 |
Feb 27 22:01:36 mynode dnsmasq-dhcp[25435]: DHCPDISCOVER(br100) fa:16:3e:78:44:84 no address available |
这是与dnsmasq或nova-network相关的问题。
检查dnsmasq的日志信息,并查看相应进程,输出类似下面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ps aux | grep dnsmasq 108 1695 0.0 0.0 25972 1000 ? S Feb26 0:00 /usr/sbin/dnsmasq -u libvirt-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override nobody 2438 0.0 0.0 27540 1096 ? S Feb26 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro root 2439 0.0 0.0 27512 472 ? S Feb26 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro |
上面dnsmasq进程具备DHCP子网范围为192.168.122.0,属于libvirt,可忽略。其他两个进程属于nova-network。
如果问题不出在dnsmasq上,可以利用tcpdump采集网卡流量判断数据包是否丢失。
DHCP流量利用UDP、客户端端口为68、服务器端口为67,尝试启动虚拟机并监听网卡知道未发现流量。如果监听br100上67、68端口,命令如下:
1 |
# tcpdump -i br100 -n port 67 or port 68 |
同时利用ip a和brctl show确保网卡已经启动并正确配置。
如果可以ssh登录虚拟机,但需要很长时间才能弹出提示符,可能是DNS的问题,之所以会是DNS的问题是因为SSH服务器在做做一个反向DNS查找在所连接的IP地址,如果机器上DNS停止工作,必须等待DNS反向查询超时出现才能继续处理SSH登录。
调试DNS的问题,首先要确定宿主机上运行dnsmasq进程并能保证虚拟机实例能够正确解析出IP,如果宿主机无法解析域名,虚拟机实例也无法解析。
宿主机上运行host命令判断DNS的是否工作:
1 2 3 4 |
$ host openstack.org openstack.org has address 174.143.194.225 openstack.org mail is handled by 10 mx1.emailsrvr.com. openstack.org mail is handled by 20 mx2.emailsrvr.com. |
如果运行Cirros镜像,可以运行ping命令代替,
1 2 |
$ ping openstack.org PING openstack.org (174.143.194.225): 56 data bytes |
在openstack云中,dnsmasq进程作为虚拟机实例的DNS服务器和DHCP服务器,如果该进程出现问题会影响虚拟机实例相关的问题,可以重启dnsmasq进程和nova-network,但会影响未出该问题的其他租户,
1 2 |
# killall dnsmasq # restart nova-network |
如果问题尚未修复,需要利用tcpdump采集数据包查看失败原因,DNS服务器监听UDP 53端口,需要查看计算节点网桥上的DNS请求,例如
1 2 |
# tcpdump -i br100 -n -v udp port 53 tcpdump: listening on br100, link-type EN10MB (Ethernet), capture size 65535 bytes |
此时,SSH到虚拟机,执行ping openstack.org命令,可以看到tcpdump如下输出:
1 2 3 4 5 6 7 |
16:36:18.807518 IP (tos 0x0, ttl 64, id 56057, offset 0, flags [DF], proto UDP (17), length 59) 192.168.100.4.54244 > 192.168.100.1.53: 2+ A? openstack.org. (31) 16:36:18.808285 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 75) 192.168.100.1.53 > 192.168.100.4.54244: 2 1/0/0 openstack.org. A 174.143.194.225 (47) |
按照前面的实例,Open vSwitch通常问题会出现在br-int、br-tun和br-ex等网桥或者连接的端口上面。尽管Open vSwitch驱动可以自动管理,但手动执行ovs-vsctl命令十分有用。
在计算节点上执行ovs-vsctl list-br可以列出系统上的网桥。
1 2 3 4 |
# ovs-vsctl list-br br-int br-tun eth1-br |
查看内部物理端口,例如网桥eth1-br,包含物理网卡eth1和虚拟接口phy-eth1-br:
1 2 3 |
# ovs-vsctl list-ports eth1-br eth1 phy-eth1-br |
类似可以查看其他网桥端口br-int、br-tun,如果这些连接丢失或者错误,预示着配置错误,网桥可以通过ovs-vsctl add-br来进行添加,端口可以通过ovs-vsctl add-port进行添加。
Linux网络命名空间具备内核功能,网络服务利用overlapping IP地址范围用于支持多个隔离的l2网络,该功能可以关闭,但默认开启。如果开启,网络节点将在隔离命名空间中运行dhcp-agents和l3-agents。在这些接口上的网卡和流量将在默认命名空间上不可见。
执行ip netns查看是否使用网络命名空间:
1 2 3 4 5 6 |
# ip netns qdhcp-e521f9d0-a1bd-4ff4-bc81-78a60dd88fe5 qdhcp-a4d00c60-f005-400e-a24c-1bf8b8308f98 qdhcp-fe178706-9942-4600-9224-b2ae7c61db71 qdhcp-0a1d0a27-cffa-4de3-92c5-9d3fd3f2e74d qrouter-8a4ce760-ab55-4f2f-8ec5-a2e858ce0d39 |
L3-agent路由器命名空间命名为qrouter-
可以利用ip netns exec
1 2 3 4 5 6 7 8 9 10 11 12 |
# ip netns exec qdhcp-e521f9d0-a1bd-4ff4-bc81-78a60dd88fe5 ip a 10: tape6256f7d-31: link/ether fa:16:3e:aa:f7:a1 brd ff:ff:ff:ff:ff:ff inet 10.0.1.100/24 brd 10.0.1.255 scope global tape6256f7d-31 inet 169.254.169.254/16 brd 169.254.255.255 scope global tape6256f7d-31 inet6 fe80::f816:3eff:feaa:f7a1/64 scope link valid_lft forever preferred_lft forever 28: lo: link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever |
可以看到DHCP服务器上利用tape6256f7d-31设备且IP为10.0.1.100,通过169.254.169.254不难看出dhcp-agent运行着metadata-proxy服务。
Node type | Service | Log location |
Cloud controller | nova-* | /var/log/nova |
Cloud controller | glance-* | /var/log/glance |
Cloud controller | cinder-* | /var/log/cinder |
Cloud controller | keystone-* | /var/log/keystone |
Cloud controller | neutron-* | /var/log/neutron |
Cloud controller | horizon | /var/log/apache2/ |
All nodes | misc (swift, dnsmasq) | /var/log/syslog |
Compute nodes | libvirt | /var/log/libvirt/libvirtd.log |
Compute nodes | Console (boot up messages) for VM instances: | /var/lib/nova/instances/instance- |
Block Storage nodes | cinder-volume | /var/log/cinder/cinder-volume.log |
Openstack服务运用标准的日志级别,按照严重程度递增为:DEBUG, INFO, AUDIT, WARNING, ERROR, CRITICAL和TRACE。
禁用DEBUG级别,例如编辑/etc/nova/nova.conf文件
1 |
debug=false |
Keystone略有不同,修改日志级别,编辑/etc/keystone/logging.conf的logger_root 和handler_file部分。
Horizon日志在/etc/openstack_dashboard/local_settings.py中配置,因为horizon采用了Django Web框架,参考 Django Logging framework conventions.
排除错误的首要步骤就是找到日志中CRITICAL, TRACE和ERROR等信息输出。
例如:
2013-02-25 20:26:33 6619 ERROR nova.openstack.common.rpc.common [-] AMQP server on localhost:5672 is unreachable:
[Errno 111] ECONNREFUSED. Trying again in 23 seconds.
如果虚拟机实例发生错误,需要跟踪控制节点和计算节点上nova-*服务日志中有关虚拟机中的部分。典型方法是查找服务日志中与UUID相关的部分,虚拟机实例的UUID可以通过以下查询:
1 |
$ nova list |
查看/var/log/nova-*.log文件,如控制节点上的nova-api.log和nova-scheduler.log文件,计算节点上的nova-network.log和nova-compute.log文件。如果没有ERROR或CRITICAL出现,新增的日志内容会提供问题的线索。
如果日志信息不足,需要在nova-*服务中增加自定义的日志记录。源文件在/usr/lib/python2.7/dist-packages/nova处。为了增加日志语句,文件首部需要增加如下文件,大多数文件中已经存在,
1 2 |
from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) |
增加调试级别语句如下:
1 |
LOG.debug("This is a custom debugging statement") |
可能会发现所有现存日志之前都在下划线和括号包围,例如
1 |
LOG.debug(_("Logging statement appears here")) |
这个格式是利用gettext 国际化的类库支持将日志消息翻译成不同的语言,
RabbitMQ日志文件对于调试Openstack相关问题作用不大,建议采用RabbitMQ web 管理接口作为代替,在管理节点上开启如下:
1 2 |
# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management # service rabbitmq-server restart |
RabbitMQ Web管理接口可以通过控制节点的http://localhost:55672访问。
除了应用RabbitMQ web管理接口之外,运行rabbitmqctl命令也可以作为替代。例如,rabbitmqctl list_queues| grep cinder显示队列中关于cinder的信息。如果存在消息,可能预示着cinder服务没有合适的连接rabbitmq,可能需要进行重启。
RabbitMQ的监控包括队列长度数量、服务器处理时间长度。
云有诸多机器组成,需要检查每台机器上的日志片段,一个比较好的方案是将所有节点上的日志发送到一个集中的位置,方便访问。
同日志工具的组织要求一样,集中日志引擎的选择也将独立于所使用的操作系统。
对于系统日志的选择,有许多系统日志引擎可选,每种都有不同的特点及配置要求,如
rsyslog。它可以发送日志到远程位置,并且无需安装额外组件而只需修改配置文件即可,可以考虑在管理网上面运行日志传输,或者使用加密VPN而避免窃听。
rsyslog客户端配置
首先,除了Openstack的标准位置外,配置所有的OpenStack组件记录日志到syslog日志文件。同时,配置每个组件记录到不同的系统日志设备中,这样更容易分拆日志到中心服务器的独立组件中。配置如下:
nova.conf:
1 2 3 4 5 6 7 8 9 10 11 |
use_syslog=True syslog_log_facility=LOG_LOCAL0 glance-api.conf和glance-registry.conf: use_syslog=True syslog_log_facility=LOG_LOCAL1 cinder.conf: use_syslog=True syslog_log_facility=LOG_LOCAL2 keystone.conf: use_syslog=True syslog_log_facility=LOG_LOCAL3 |
默认的,对象存储记录到syslog中。
接下来,创建/etc/rsyslog.d/client.conf,追加以下内容:
1 |
*.* @192.168.1.10 |
以上指明所有日志发往的主机。
rsyslog服务器的配置
指定一个服务器作为中心日志服务器,最好是选择一个仅用于记录日志目的的服务器。创建/etc/rsyslog.d/server.conf,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Enable UDP $ModLoad imudp # Listen on 192.168.1.10 only $UDPServerAddress 192.168.1.10 # Port 514 $UDPServerRun 514 # Create logging templates for nova $template NovaFile,"/var/log/rsyslog/%HOSTNAME%/nova.log" $template NovaAll,"/var/log/rsyslog/nova.log" # Log everything else to syslog.log $template DynFile,"/var/log/rsyslog/%HOSTNAME%/syslog.log" *.* ?DynFile # Log various openstack components to their own individual file local0.* ?NovaFile local0.* ?NovaAll & ~ |
以上配置能够将每个计算节点上日志文件分隔开,并且能够聚合所有节点上的nova日志文件。
监控分为故障监控和使用量趋势监控。前者确保所有服务启动、运行、并创建一个功能性的云平台;后者包括监控过去时间内资源的使用量,主要用于潜在瓶颈和升级决策提供信息服务。
Nagios是一种开源的监控服务。它能够执行任意的命令用于检验服务器和网络服务的状态,具备直接在服务器上远程执行命令、运行服务器基于被动监控的方式推送通知。自从1999年以来,Nagios被广泛应用,尽管新的监控服务不断出现,Nagios仍是一个行之有效的系统管理产品。
基本监控仅仅是检查服务进程是否运行,例如,检查控制节点上的nova-api服务是否进行,如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
# ps aux | grep nova-api nova 12786 0.0 0.0 37952 1312 ? Ss Feb11 0:00 su -s /bin/sh -c exec nova-api --config-file=/etc/nova/nova.conf nova nova 12787 0.0 0.1 135764 57400 ? S Feb11 0:01 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf nova 12792 0.0 0.0 96052 22856 ? S Feb11 0:01 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf nova 12793 0.0 0.3 290688 115516 ? S Feb11 1:23 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf nova 12794 0.0 0.2 248636 77068 ? S Feb11 0:04 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf root 24121 0.0 0.0 11688 912 pts/5 S+ 13:07 0:00 grep nova-api |
可以通过Nagios and NRPE创建关键进程的自动警告,例如,确保计算节点上nova-compute进程是否运行,在Nagios服务器上创建警告如下:
1 2 3 4 5 6 7 8 |
define service { host_name c01.example.com check_command check_nrpe_1arg!check_nova-compute use generic-service notification_period 24x7 contact_groups sysadmins service_description nova-compute } |
然后在实际的计算节点上,创建如下的NRPE配置:
1 |
\command[check_nova-compute]=/usr/lib/nagios/plugins/check_procs -c 1: -a nova-compute |
Nagios无论何时总会检查至少有一个nova-compute在运行。
资源告警是当一个或多个资源极低时提供通告功能。针对特定的云环境需要设定合适的监控阈值,资源使用量告警不仅限于Openstack,任何通用类型都可以。
监控资源包括:
-> 硬盘使用量
-> 服务器负载
-> 内存使用量
-> 网络I/O
-> 可用的vCPUs
例如,利用Nagios监控计算节点上的磁盘使用量,Nagios配置如下:
1 2 3 4 5 6 7 |
define service { host_name c01.example.com check_command check_nrpe!check_all_disks!20% 10% use generic-service contact_groups sysadmins service_description Disk } |
在计算节点上,NRPE配置如下:
1 |
command[check_all_disks]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -e |
Nagios会在计算节点上磁盘使用量超过80%时发出WARNING警告,超过90%时发出CRITICAL警告。
StackTach是一个用于收集和报告nova服务所发送通知的工具。通知与日志同等重要,但更具体。当重大事件发生时,几乎所有的Openstack组件都能产生通知。通知是放置于可供下游系统消费的Openstack队列之中的消息。
配置nova.conf,使得nova能够发送通知:
1 2 |
notification_topics=monitor notification_driver=messagingv2 |
一旦nova开始发送通知,例如安装配置StackTach,消耗队列的StackTach workers被配置用于读取RabbitMQ通知并保存与数据库中,用户就可以通过浏览器接口或命令行工具(如Stacky)查询实例,请求和服务器。因为StackTach比较新且一直在变化,安装说明很快就会过时,具体可参考官网http://stacktach.com/。
Logstash是一个高性能的日志索引和查询引擎。它可以审阅用一个简单test审阅多源日志,查找错误和事件,查找日志事件趋势。具备4个主要层次,
每层都可以水平扩展,当日志数增加时,可以增加更多的Log Pusher、Log Indexer、ElasticSearch节点。
Telemetry服务的数据收集服务可以用于计费。根据部署配置,收集的数据可以被用户获取得到。提供Restful API。
内存、磁盘、CPU这些通用资源对于所有服务都很重要,针对Openstack而言,这些资源重要性也体现在确保足够的资源创建虚拟机上。可以利用如下命令查看Openstack资源使用量:
例如:
1 |
# nova usage-list |
此命令可以显示每个租户运行了多少个实例,并基于所有实例的统计数据。此命令可以快速浏览云中使用情况,但不具备更多细节。
接下来,nova数据库中包含了具有存储使用量的三个表。nova.quotas、nova.quota_usages存储配额信息,租户配额不同于默认配额,它存储与nova.quotas表中:
1 |
mysql> select project_id, resource, hard_limit from quotas; |
nova.quota_usages表中存储了多少个资源在被当前租户使用。
1 |
mysql> select project_id, resource, in_use from quota_usages where project_id like '628%'; |
对比,当前用户使用量与配额限制,可查看使用量。利用利用SQL或者脚本定制。例如
novac/novac-quota-report at dev · cybera/novac · GitHub。
智能告警可以作为运维的一种持续集成方式。例如,可以简单地通过判断glance-api或glance-registry进程是否运行、或查看glace-api端口9292是否有响应来检查镜像服务是否启动并运行。
但如何判断镜像是否能够成功上传到镜像服务?可能运行镜像服务所在的硬盘已经满了或者S3服务后端已经不再运行了,这时自然需要检查镜像的上传,如下:
1 2 3 4 5 6 7 |
#!/bin/bash # assumes that reasonable credentials have been stored at # /root/auth . /root/openrc wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img glance image-create --name='cirros image' --is-public=true --container-format=bare --disk-format=qcow2 < cirros-0.3.4-x86_64-disk.img |
将这个脚本集成到预警系统如Nagios中,可以形成一种自动检测镜像上传至镜像目录的方法。
智能预警需要花费相当多的时间来计划和实现上述方法,实现智能预警的大概提纲如下:
其他一些智能预警包括:
趋势分析可以很好的预见云的日常状态,例如,如果着手开始增加计算节点那么云的忙等待就很少发生。
趋势分析与告警略微不同,预警只有成功或失败的两个结果,但确实分析需要记录特定时间点上的当前状态,一旦记录的足够的时间点,就可以看到过去一段时间的变化值。
一些趋势情况包括:
例如,记录nova-api使用量追踪扩展控制节点的需求,留意nova-api的请求数,可以决定是否需要增加更多的nova-api进程数或引入新节点来运行nova-api。为了获取大概的请求数,可以统计/var/log/nova/nova-api.log中的INFO数目,如:
1 |
# grep “INFO” /var/log/nova/nova-api.log | wc |
通过进一步获取成功的请求数:
1 |
# grep " 200 " /var/log/nova/nova-api.log | wc |
周期性的运行该命令并记录该结果,可以创建过去一段时间的趋势报告用于显示nova-api使用的变化。
collectd工具可以存储该信息,参见collectd’s documentation。
参考:OpenStack Docs: Zed Administrator Guides
备份频率关乎丢失数据恢复的速度。如果不容许有任何的数据丢失,参考高可用部署,OpenStack High Availability Guide 提供了减少单点故障的解决方案。其他的备份情况应该包括:
此处只介绍备份Openstack组件运行时所需的配置文件和数据库,不涉及对象存储中对象或块存储中的数据备份。通常这个部分留给用户自己备份。
Openstack的数据包含nova、glance、cinder、keystone等数据库实例,将所有数据库实例备份到同一个文件中如下:
1 |
mysqldump --opt --all-databases -uroot -h 192.168.100.201 -p123456 > openstack.sql |
单独备份一个数据库实例,如下:
1 |
mysqldump -uroot -h 192.168.100.201 -p123456 --opt nova > nova.sql |
每天备份的脚本,如下:
1 2 3 4 5 6 7 |
#!/bin/bash backup_dir="/var/lib/backups/mysql" filename="${backup_dir}/mysql-`hostname`-`eval date +%Y%m%d`.sql.gz" # Dump the entire MySQL database /usr/bin/mysqldump --opt --all-databases | gzip > $filename # Delete backups older than 7 days find $backup_dir -ctime +7 -type f -delete |
该脚本备份整个数据库并删除超过三天的备份。
Compute
管理节点和计算节点上的/etc/nova目录需要定期备份。
/var/log/nova目录如果使用了中心化管理日志方法就无需备份,强烈建议使用中心化日志服务器或备份日志目录。
/var/lib/nova是另一个重要的备份目录,但计算节点上的/var/lib/nova/instances子目录例外,因为该目录包含了运行虚拟机的KVM镜像。当需要备份虚拟机副本才需要备份该目录,但大多数情况下不需要备份。应该注意到,备份一个正在运行的虚拟机实例,可能会导致从备份中恢复的虚拟机实例无法启动。
Image Catalog and Delivery
Glance与nova相对应的目录是/etc/glance and /var/log/glance。
/var/lib/glance应该被备份,特别注意/var/lib/glance/images,如果利用基于文件的glance后端,/var/lib/glance/images是存储镜像的位置应该考虑备份。
存在两种方法保证该目录的稳定性,第一种是确保该目录运行在RAID磁盘阵列中,如果一个磁盘损坏,目录仍可用;另一个方法是运用工具同步或复制镜像到另外服务器上。如下:
1 |
# rsync -az --progress /var/lib/glance/images backup-server:/var/lib/glance/images/ |
Identity
/etc/keystone和/var/log/keystone与以上组件对应。
/var/lib/keystone尽管不包含所使用的数据,但以防万一仍需备份。
Block Storage
/etc/cinder和/var/log/cinder与以上组件对应。
/var/lib/cinder也应该需要备份。
Object Storage
/etc/swift十分重要,需要备份。该目录包含配置文件、Ring文件和Ring生成器文件。一旦丢失,会导致集群上数据无法获取。最好的方法是复制Ring生成器文件和Ring文件到所有的存储节点。多副本备份同样适用于存储集群。
Telemetry
备份包含配置文件的/etc/ceilometer目录。
Orchestration
备份HOT模板yaml文件和/etc/heat/目录。
备份恢复相当简单。首先,确保所要恢复的服务不再运行。例如,如果要恢复nova服务,首先关掉所有的nova服务:
1 |
# systemctl stop openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service |
然后导入先前备份的数据库
1 |
# mysql nova < nova.sql |
然后恢复nova后端目录
1 2 |
# mv /etc/nova{,.orig} # cp -a /path/to/backup/nova /etc/ |
一旦文件恢复后,启动nova所有服务。
1 |
# systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service |
……
升级计划
升级前的测试环境
最重要的是升级前的测试。发布新版本后计划立即升级,未发现的漏洞会妨碍升级进程。一些开发者倾向于等到第一次单点发行宣布后再升级。然而,如果有很重要的部署,可能首先需要进行部署和测试发布版,确保用例可以被修复。
尽管存在几乎一样的结构,但每个云环境都是不同的,你必须利用近乎克隆当前的环境来测试不同的版本。这并非说采用相同规格和同等的硬件作为生产环境,重点是考虑考虑所升级环境的硬件和规模,以下给出减少成本的建议:
安装测试环境时,可以利用以下的一种方法:
强烈建议备份数据库,并利用这些备份数据测试升级后的版本。因为一些MYSQL的bugs由于数据库表版本的不同而未发现。这可能会影响真实的大数据集。
人工测试存在局限性,升级后需要检查云的性能。
升级级别
特殊的升级说明
Upgrading the Networking service
前提
1 2 |
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini current" neutron |
执行备份
1 2 3 4 5 6 |
# for i in keystone glance nova neutron openstack-dashboard cinder heat ceilometer; \ do mkdir $i-kilo; \ done # for i in keystone glance nova neutron openstack-dashboard cinder heat ceilometer; \ do cp -r /etc/$i/* $i-kilo/; \ done |
1 |
mysqldump -u root -p --opt --add-drop-database --all-databases > icehouse-db-backup.sql |
管理软件仓库
在所有计算节点上,
清除先前的软件发布包;
增加新的发布包;
更新软件仓库的数据库。
升级每个节点上的软件包
如果软件包管理器提示更新配置文件,拒绝发生改变。包管理器会在新版本配置文件前增加后缀用于区分。
升级服务
在每个节点上更新服务,通常会修改一个或多个配置文件,首先要停止服务,同步数据库schema,开启服务。一些服务需要不同的步骤,建议在升级下个服务前验证操作。
升级服务的顺序和升级服务改变描述如下:
控制节点
存储节点
块存储服务:升级该服务,只需要重启该服务;
计算节点
网络服务:编辑配置文件,重启该服务。
最后步骤
所有版本升级时需要执行以下操作完成升级过程:
回滚操作主要包括:恢复配置文件、恢复数据库、恢复软件包。
以Ubuntu介绍回滚操作,其他版本同样适用:
执行回滚
1 |
# mysql -u root -p < RELEASE_NAME-db-backup.sql |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# dpkg --get-selections | grep -e keystone -e glance -e nova -e neutron \ -e cinder | grep -v deinstall | tee openstack-selections cinder-api install cinder-common install cinder-scheduler install cinder-volume install glance install glance-api install glance-common install glance-registry install neutron-common install neutron-dhcp-agent install neutron-l3-agent install neutron-lbaas-agent install neutron-metadata-agent install neutron-plugin-openvswitch install neutron-plugin-openvswitch-agent install neutron-server install nova-api install nova-cert install nova-common install nova-conductor install nova-consoleauth install nova-novncproxy install nova-objectstore install nova-scheduler install python-cinder install python-cinderclient install python-glance install python-glanceclient install python-keystone install python-keystoneclient install python-neutron install python-neutronclient install python-nova install python-novaclient install |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# apt-cache policy nova-common nova-common: Installed: 1:2013.2-0ubuntu1~cloud0 Candidate: 1:2013.2-0ubuntu1~cloud0 Version table: *** 1:2013.2-0ubuntu1~cloud0 0 500 http://ubuntu-cloud.archive.canonical.com/ubuntu/ precise-updates/havana/main amd64 Packages 100 /var/lib/dpkg/status 1:2013.1.4-0ubuntu1~cloud0 0 500 http://ubuntu-cloud.archive.canonical.com/ubuntu/ precise-updates/grizzly/main amd64 Packages 2012.1.3+stable-20130423-e52e6912-0ubuntu1.2 0 500 http://us.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages 2012.1-0ubuntu2 0 500 http://us.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages |
这会提示安装包的当前版本,最新的候选版本,除了软件仓库以外的其他所有版本。选择合适的版本,例如1:2013.1.4-0ubuntu1~cloud0,从冗长列表中手动挑选版本会很费时,考虑利用以下脚本进行处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# for i in `cut -f 1 openstack-selections | sed 's/neutron/quantum/;'`; do echo -n $i ;apt-cache policy $i | grep -B 1 grizzly | grep -v Packages | awk '{print "="$1}';done | tr '\n' ' ' | tee openstack-grizzly-versions cinder-api=1:2013.1.4-0ubuntu1~cloud0 cinder-common=1:2013.1.4-0ubuntu1~cloud0 cinder-scheduler=1:2013.1.4-0ubuntu1~cloud0 cinder-volume=1:2013.1.4-0ubuntu1~cloud0 glance=1:2013.1.4-0ubuntu1~cloud0 glance-api=1:2013.1.4-0ubuntu1~cloud0 glance-common=1:2013.1.4-0ubuntu1~cloud0 glance-registry=1:2013.1.4-0ubuntu1~cloud0 quantum-common=1:2013.1.4-0ubuntu1~cloud0 quantum-dhcp-agent=1:2013.1.4-0ubuntu1~cloud0 quantum-l3-agent=1:2013.1.4-0ubuntu1~cloud0 quantum-lbaas-agent=1:2013.1.4-0ubuntu1~cloud0 quantum-metadata-agent=1:2013.1.4-0ubuntu1~cloud0 quantum-plugin-openvswitch=1:2013.1.4-0ubuntu1~cloud0 quantum-plugin-openvswitch-agent=1:2013.1.4-0ubuntu1~cloud0 quantum-server=1:2013.1.4-0ubuntu1~cloud0 nova-api=1:2013.1.4-0ubuntu1~cloud0 nova-cert=1:2013.1.4-0ubuntu1~cloud0 nova-common=1:2013.1.4-0ubuntu1~cloud0 nova-conductor=1:2013.1.4-0ubuntu1~cloud0 nova-consoleauth=1:2013.1.4-0ubuntu1~cloud0 nova-novncproxy=1:2013.1.4-0ubuntu1~cloud0 nova-objectstore=1:2013.1.4-0ubuntu1~cloud0 nova-scheduler=1:2013.1.4-0ubuntu1~cloud0 python-cinder=1:2013.1.4-0ubuntu1~cloud0 python-cinderclient=1:1.0.3-0ubuntu1~cloud0 python-glance=1:2013.1.4-0ubuntu1~cloud0 python-glanceclient=1:0.9.0-0ubuntu1.2~cloud0 python-quantum=1:2013.1.4-0ubuntu1~cloud0 python-quantumclient=1:2.2.0-0ubuntu1~cloud0 python-nova=1:2013.1.4-0ubuntu1~cloud0 python-novaclient=1:2.13.0-0ubuntu1~cloud0 |
1 |
# apt-get install `cat openstack-grizzly-versions` |
此操作会完成回滚操作,当解决掉了所有妨碍升级的问题之后,应移除升级的软件仓库避免因运行apt-get update而导致意外升级。