标签:
继研究了Neutron之后,继续Nova的外围研究之旅。本站是研究块存储服务Cinder。
0。验证环境
环境包括:
1、一个controller节点,运行nova-api, nova-scheduler, cinder-api, cinder-scheduler, mysql, rabbitmq
2、一个Nova compute节点,运行一个虚机
3、三个cinder volume节点,每个节点使用LVMISCSIDriver来使用本地存储
4. 创建一个volume type,设置 volume_backend_name = lvmbackend
cinder.conf 在 block1上 enabled_backends = lvmdriver-b1 [lvmdriver-b1] volume_group = cinder-volumes volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend cinder.conf 在 block2上 enabled_backends = lvmdriver-b21,lvmdriver-b22 storage_availability_zone=az1 [lvmdriver-b21] iscsi_ip_address = 10.0.1.29 volume_group = cinder-volumes1 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend [lvmdriver-b22] volume_group = cinder-volumes2 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend cinder.conf 在 block3上
enabled_backends = lvmdrier-network [lvmdriver-network] volume_group = system volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend
cinder的service如下:
root@controller:/home/s1# cinder service-list +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+ | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+ | cinder-backup | controller | nova | enabled | up | 2015-01-11T16:36:00.000000 | None | | cinder-scheduler | controller | nova | enabled | up | 2015-01-11T16:36:01.000000 | None | | cinder-volume | block1@lvmdriver-b1 | nova | enabled | up | 2015-01-11T16:36:08.000000 | None | | cinder-volume | block2@lvmdriver-b21 | az1 | enabled | up | 2015-01-11T16:36:06.000000 | None | | cinder-volume | block2@lvmdriver-b22 | az1 | enabled | up | 2015-01-11T16:36:05.000000 | None | | cinder-volume | network@lvmdriver-network | nova | enabled | up | 2015-01-11T16:36:02.000000 | None | +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+
说明:
1 |
卷操作 |
创建卷 |
2 |
从已有卷创建卷 (克隆) |
|
3 |
扩展卷 |
|
4 |
删除卷 |
|
5 |
卷-虚机操作 |
挂载卷到虚机 |
6 |
分离虚机卷 |
|
7 |
卷-快照操作 |
创建卷的快照 |
8 |
从已有卷快照创建卷 |
|
9 |
删除快照 |
|
10 |
卷-镜像操作 |
从镜像创建卷 |
11 |
从卷创建镜像 |
下面讲讲几个比较有意思的操作。
两步走:
多种可能的情况:
关于RPC: cinder内部各组件之间使用基于RabbitMQ的RPC通信。cinder-scheduler和cinder-volume分别 会 创建RPC连接,启动消费者线程,然后等待队列消息。当轮询查询到消息到达后,创建线程处理相关消息。
主要服务接口, 负责接受和处理外界的API请求,并将请求放入RabbitMQ队列,交由后端执行。
cinder-scheduler的用途是在多backend环境中决定volume的位置:
0。 首先判断host的状态,只有service状态为up的host才会被考虑。
1。创建volume的时候,根据filter和weight算法选出最优的host来创建volume。
2。迁移volume的时候,根据filter和weight算法来判断目的host是不是符合要求。
如果选出一个host,则使用RPC调用cinder-volume来执行volume操作。
为了维护host的状态,cinder-scheduler接受定时的host上cinder-volume状态上报:
2015-01-12 02:02:56.688 828 DEBUG cinder.scheduler.host_manager [req-403ef666-5551-4f31-a130-7bcad8e9d1ec - - - - -] Received volume service update from block2@lvmdriver-b21: {u‘pools‘: [{u‘pool_name‘: u‘lvmbackend‘, u‘QoS_support‘: False, u‘allocated_capacity_gb‘: 1, u‘free_capacity_gb‘: 3.34, u‘location_info‘: u‘LVMVolumeDriver:block2:cinder-volumes1:default:0‘, u‘total_capacity_gb‘: 5.34, u‘reserved_percentage‘: 0}], u‘driver_version‘: u‘2.0.0‘, u‘vendor_name‘: u‘Open Source‘, u‘volume_backend_name‘: u‘lvmbackend‘, u‘storage_protocol‘: u‘iSCSI‘} update_service_capabilities /usr/lib/python2.7/dist-packages/cinder/scheduler/host_manager.py:434
默认的filter包括 AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter。其中:
经过以上Filter的过滤,cinder-scheduler会得到符合条件的host列表,然后进入weighting环节,根据weighting算法选出最优的host。得到空列表则报No valid host was found错误。
cinder.conf中,scheduler_default_filters不设置的话,cinder-scheduler默认会使用这三个filter。
CapacityWeigher:有最大可使用空间的host胜出。可设置capacity_weight_multiplier为负值来反转算法,其默认值为1
ChanceWeigher:随机从过滤出的host中选择一个host
经过此步骤,cinder-scheduler将得到一个weighted_hosts列表,它将会选择第一个host做为volume的目的host,把它加到retry_hosts列表中,然后通过RPC调用上面的cinder-volume来创建volume。
cinder.conf中,scheduler_default_weighers不设置的话,cinder-scheduler默认使用 CapacityWeigher。
用户可以在cinder.conf中使用scheduler_max_attempts来配置volume创建失败时候的重试次数,默认次数为3,值为1则表示不使用重试机制。
# Maximum number of attempts to schedule an volume (integer value)
#scheduler_max_attempts=3
cinder-sheduler和cinder-volume之间会传递当前是重试次数。如果volume创建失败,cinder-volume会通过RPC重新调用cinder-scheduler去创建volume,cinder-scheduler会检查当前的重试次数是不是超过最大可重试次数。如果没超过,它会选择下一个可以使用的host去重新创建volume。如果在规定的重试次数内仍然无法创建volume,那么会报No valid host was found错误。
比如下面的重试过程:
cinder-volume:
下一篇博文会具体分析volume的操作过程。
探索 OpenStack 之(9):深入块存储服务Cinder (Part 1)
标签:
原文地址:http://www.cnblogs.com/sammyliu/p/4219974.html