声明:

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

作者:李人可

团队:华为杭州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. android studio 快捷笔记

    setting->editor->打勾 ctrl+Q ctrl+tab alt+回车 ctrl+shift+回车

  2. HDU 2152 Fruit

    系数为1的母函数…… #include <cstdio> #include <cstring> using namespace std; int n,m,size[105][2 ...

  3. 如何让Table显示滚动条

    Table显示滚动条,要先把table放到一个div中,div的长度和宽度要固定,控制overflow属性为scroll <div style="width:700px; height ...

  4. ASP.NET页面传值的几种方式

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值. 存储对象传值.ajax.类.model.表单等!下面欧柏泰克和大家一起来看看asp.net页面传值方式一般有哪些?常用的较简单 ...

  5. UVA 674 Coin Change(dp)

    UVA 674  Coin Change  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...

  6. C++之类的静态变量

    成员变量 通过对象名能够访问public成员变量 每个对象都可以有只属于自己的成员变量 成员变量不能在对象之间共享 类的静态成员 静态成员变量  存储在   全局数据区 #include<std ...

  7. SPOJ8222 Substrings( 后缀自动机 + dp )

    题目大意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.F(1)..F(Length(S)) 建出SAM, 然后求出Right, 求Right可以按拓扑序dp..Right ...

  8. Spring AOP报错

    八月 01, 2016 10:08:48 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRe ...

  9. 替换NavigationController里面的返回按钮

    通过navigationController push进来的controller,默认的返回按钮是将本controller pop出去. 但有时候想在pop出去前完成一些自己的一些事情,这时可以自己写 ...

  10. Basic REST API Design