声明:

本博客欢迎转载,但请保留原作者信息!

作者:李人可

团队:华为杭州OpenStack团队

讨论的是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字段携带后端存储名称,即“host@backname”这样的形式。见例如以下代码:

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

即表示一个host能够对接多个不同存储后端,host名分别为“host@backend1”,host@backend2等,然后分别启动一个独立的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 = "%s@%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也应是lirenke@lvm,只是:





奇葩的事情出现了,为啥在后面又加了“#LVM_iSCSI”,什么玩意儿。

rpc使用topic又是什么字段了呢?不知道。于是乎仅仅能看下J版本号源代码了。

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

完整的host名称(即volume对象的host属性)为: host@backend#pool

查看cinder-scheduler下发给cinder-volume的rpc topic,使用了backend级别,即取到‘#’号之前的字符串。如“lirenke@lvm”。

至于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属性会是“lirenke@lvm#LVM_iSCSI”。

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

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

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

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

  1. mysql数据库user表host字段的%问题

    搜索: mysql数据库user表host字段的%问题 连接:http://blog.csdn.net/xiaomengh/article/details/48706149 在mysql数据库中,使用 ...

  2. k2 4.6.9安装记录-够复杂了

    首先需要准备一台Windows server 2008R2 系统.可以从微软官方下载. 下载地址: http://www.microsoft.com/zh-cn/download/confirmati ...

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

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了 ...

  4. ALV可输入状态下输入金额字段变小数的问题

    http://blog.163.com/mxb_sap@yeah/blog/static/10335262520167109022155/ 小数位数两位    当我在给ALV上给该字段输入整数 '12 ...

  5. 拓扑优化中SIMP方法与水平集方法有何优缺点,水平集法变换到高维,不是更复杂了

    作者:周平章链接:https://www.zhihu.com/question/52008623/answer/187927508来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. C# 越来越复杂了

    自从三年前来到现在的公司以后,基本上不怎么使用.NET进行开发了.但最近因为公司有个CRM的项目,所以只有重新检起.NET进行开发. 因为近3年没有搞.NET的开发了,因此也不敢乱整个框架,在看了一周 ...

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

    Description As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the ...

  8. .Net程序员学用Oracle系列(19):我知道的导出和导入

    1.传统的导出/导入工具 1.1.EXP 命令详解 1.2.IMP 命令详解 1.3.EXP/IMP 使用技巧 2.新的导出/导入工具 2.1.EXPDP/IMPDP 参数说明 2.2.EXPDP/I ...

  9. .Net程序员学用Oracle系列(19):导出、导入(备份、还原)

    1.传统的导出/导入工具 1.1.EXP 命令详解 1.2.IMP 命令详解 1.3.EXP/IMP 使用技巧 2.新的导出/导入工具 2.1.EXPDP/IMPDP 参数说明 2.2.EXPDP/I ...

随机推荐

  1. poj 1077 Eight(双向bfs)

    题目链接:http://poj.org/problem?id=1077 思路分析:题目要求在找出最短的移动路径,使得从给定的状态到达最终状态. <1>搜索算法选择:由于需要找出最短的移动路 ...

  2. Google Play和基于Feature的过滤

    田海立@CSDN 翻译自Google Play and Feature-Based Filtering GooglePlay会过滤出那些对用户可见的应用程序,因此用户只能看到和下载那些与他们的设备兼容 ...

  3. Sightseeing Cows(最优比率环)

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8915   Accepted: 3000 ...

  4. 最长回文(Manacher)

    HOT~ 杭电2015级新生如何加入ACM集训队? 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. Java_java多线程下载-断点下载-超详细

    基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读 ...

  6. c#程序将excel文件转换成xml文件

    要程序你自己去组装去,我只写两个部分,一个是读Excel的部分,然后是写入到xml的1) 从指定的excel读出信息string strConn="provider=Microsoft.Je ...

  7. .Net将多个DLL打包为一个DLL(ILMerge)

    在做.Net底层编码过程中,为了功能独立,有可能会生成多个DLL,引用时非常不便.这方面微软提供了一个ILMerge工具原版DOS工具,可以将多个DLL合并成一个.下载完成后需要安装一下,然后通过DO ...

  8. Ownership qualifiers of Objective-C: In Details

    虽然这里讲的大部分知识以前都看过,但是时不时出现某些点让我如茅塞顿开: 以前经常会忘记一些细节,这篇文章可以更好的理解细节,巩固知识体系. Ownership qualifiers In Object ...

  9. 两台linux机器时间同步

    Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间. 配 ...

  10. Java疯狂讲义