host字段变复杂了

讨论的是openstack中卷的host属性。

印象中,社区H版本对于volume的host值表示的就是对应cinder-volume服务的host配置项,默认为GuestOS的hostname。比如单板A上的cinder-volume创建了卷V,那么V的host就是A。同时,把该host值作为rpc转发的topic,即cinder-scheduler组件已不同的host为单位进行区分,调度确定到具体哪个host后,再下发消息。这种方式跟nova模块很类似,nova-scheduler也是以底下nova-compute所在的host为区分。但cinder另外还支持host字段携带后端存储名称,即“[email protected]”这种形式,见如下代码:

    if CONF.enabled_backends:
        for backend in CONF.enabled_backends:
            host = "%[email protected]%s" % (CONF.host, backend)
            server = service.Service.create(host=host,
                                            service_name=backend)
            launcher.launch_server(server)

即表示一个host可以对接多个不同存储后端,host名分别为“[email protected]”,[email protected]等,然后分别启动一个独立的cinder-volume以对应。 我觉得nova也是可以这么玩耍的,一个host上理论上也可以存在多个hypervisor,也可以同时运行多个nova-compute,这也是数据表compute_nodes中node字段的含义吧。

这里有个很严重的问题,因为rpc的消息转发依赖卷的host字段,如果单板A上已经创建了很多卷,现在很不幸的事情发生了,单板A宕机且长时间不能恢复!这样一来,整个数据中心岂不是傻眼了,所有想操作原本由A创建的卷都宣告失败,挂不了卷,删不了卷等等。为了避免这么可怕的事情发生,可以如此修改,让多个cinder-volume服务对接同一个后端存储,同时统一host字段。这么一来,即使其中有个别单板发生宕机,其他正常单板也可以处理cinder-api发送过来的rpc消息。相当于把cinder-scheduler到cinder-volume之间的通信模型转变成为类似cinder-api到cinder-scheduler之间的通信模型,所谓负载均衡。

当然这么改依靠的是cinder-volume的状态无关性,也会带来一些不兼容的其他小问题,但都应该不算问题了,全加起来也比上述的问题来的轻。不知道社区如何看待此问题。

再来看Juno,同样是cinder-volume的启动脚本:

    if CONF.enabled_backends:
        for backend in CONF.enabled_backends:
            CONF.register_opts([host_opt], group=backend)
            backend_host = getattr(CONF, backend).host
            host = "%[email protected]%s" % (backend_host or CONF.host, backend)
            server = service.Service.create(host=host,
                                            service_name=backend)
            launcher.launch_service(server)

有点变化的是,J版本支持配置项中对具体backend域设置host值,而非统一值。这就比H版本增加了一点灵活性。

比如我可以这样玩,在后端是LVM的单板上,cinder.conf这么配:

enabled_backends=lvm
[lvm]
host=lirenke

然后当cinder-volume起来后,如此结果:

这符合预期,然后我尝试创建一个卷,成功后show下,按照H版本,这个host也应是[email protected],不过:

奇葩的事情出现了,为啥在后面又加了“#LVM_iSCSI”,什么玩意儿。rpc使用topic又是什么字段了呢?不知道,于是乎只能看下J版本源码了。

原来,J版本引入了pool的概念,即存储池子。一个cinder-volume管辖的领域内可以有多个pool,即一个backend和pool是一对多的关系,资源上报需要按照pool为单位上报,而非原来的host。再进一步讲,cinder-scheduler中保存的host_state对象单位变成了pool。

完整的host名称(即volume对象的host属性)为: [email protected]#pool

查看cinder-scheduler下发给cinder-volume的rpc topic,使用了backend级别,即取到‘#’号之前的字符串,如“[email protected]”。至于pool名称的选取,在LVM的代码中,使用volume_backend_name的配置项,默认值即为LVM_iSCSI。如果有driver连默认值都没有,那么就会使用__pool”来做名称。

在调度模块通过方法:

hosts = self.host_manager.get_all_host_states(elevated)

来获取所有hosts时,其实返回的对象不是先前的HostState对象了,而是PoolState对象,PoolState对象的host属性做过特殊处理,把实际host的值和pool的名称做了结合,所以刷新到数据库的volume对象host属性值,就变成了host#pool_name。这就是为什么我创建的卷host属性会是“[email protected]#LVM_iSCSI”。

注意的是,在数据库查询API方法如volume_get_all_by_host,传入的是初始的hostname,实现的时候已经做了模糊处理,即传入lirenke,也会把[email protected]**,[email protected]**#**给查出来,不影响正常逻辑。

host,backend,pool三个概念容易让人困惑,灵活性的确是增加了。但是不是这样做就解决了上述严重的HA问题呢?似乎可以解决,原理一样,可以让两个cinder-volume取相同的host,相同的backend,不同的pool,但这么做其实跟后端存储driver的实现强相关了,框架这么实现给了driver一定灵活性,没有能通吃所有后端的配置。

先讨论到这,其隐藏的灵活性有待进一步体会和实践,总之,host字段是变复杂了。

时间: 2024-11-04 03:54:00

host字段变复杂了的相关文章

k2 4.6.9安装记录-够复杂了

首先需要准备一台Windows server 2008R2 系统.可以从微软官方下载. 下载地址: http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=11093 然后使用VMware Workstation打开此镜像文件. 安装K2 server 需要.NET FRAMEWORK 4.0 以及域环境. .NetFrameWork4.0 安装就不要我说了,大家自己下载一个安装即可. 域环境安装: 运行CMD 输入 dcprom

51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了,然后每一次都跑一次kruskal 这样的复杂度是O(E * 64),然后被卡TLE了 然后观察到kruskal的时候,如果最大边是val,那么比val大的是不要的了,然后整个数组也是有序的. 比如7.6.5.4.3.2.1等,这个也是可以lower_bound的,然后lower_bound后就能过

题目1003:A+B------------------------写的复杂了点

AC: #include<stdio.h> int main() { char str1[12],str2[12]; while(scanf("%s %s",&str1,&str2)!=EOF) { int f1=1,f2=1,i=0,j=0; long long int res=0,tem1=0,tem2=0; for (i=0;str1[i]!='\0';i++) { if (str1[0]=='-') f1=-1; if (str1[i]!=','&a

Talented Chef(简单题,被我想的太复杂了,用复杂的方法当然会超时咯,由此可见,并非所有题都是想的越多越好)

Description As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the same time. Tonight he is going to have a hearty dinner with his girlfriend at his home. Of course, Coach Gao is going to cook all dishes himself, in

在.net中序列化读写xml方法的总结

在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些

Effective前端1:能使用html/css解决的问题就不要使用JS

  借用Effective之名,开始写Effective系列,总结一些前端的心得. 为什么说能使用html/css解决的问题就不要使用JS呢?两个字,因为简单.简单就意味着更快的开发速度,更小的维护成本,同时往往具有更好的体验,下面介绍几个实例. 1. 导航高亮 导航高亮是一种很常见的问题,包括当前页面的导航在菜单里面高亮和hover时高亮.你可以用js控制,但是用一点CSS技巧就可以达到这个目的,不需要使用JS. 在正常态时,每个导航的默认样式为: 正常态透明度为0.5 CSS 1 2 3 n

C#_在.net中序列化读写xml方法的总结

阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些数据,或者是一些配置参数. 使用C#,我

关于大型网站技术演进的思考--存储的瓶颈(转)

(一)第一部分 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难完整理出全部听到的知识,今天我换了个思路是回味这次培训,这个思路就是通过本人目前的经验和技术水平来思考下大型网站技术演进的过程. 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技术指标角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点行的人也许会认为是网站在单位时间里的并发量的大小来作为指标,如果按这些标准那

关于大型网站技术演进的思考(六)-存储的瓶颈6

本文开篇提个问题给大家,关系数据库的瓶颈有哪些?我想有些朋友看到这个问题肯定会说出自己平时开发中碰到了一个跟数据库有关的什么什么问题,然后如何解决的等等,这样的答案没问题,但是却没有代表性,如果出现了一个新的存储瓶颈问题,你在那个场景的处理经验可以套用在这个新问题上吗?这个真的很难说. 其实不管什么样的问题场景最后解决它都要落实到数据库的话,那么这个问题场景一定是击中了数据库的某个痛点,那么我前面的六篇文章里那些手段到底是在解决数据库的那些痛点,下面我总结下,具体如下: 痛点一:数据库的连接数不