声明:

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

作者:李人可

团队:华为杭州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. 宣布在日本地区正式发布 Windows Azure

     昨天,我与 Microsoft 日本的集团副总裁 Yasuyuki Higuchi 一同站在台上,宣布在两个新地区正式发布 Windows Azure:日本东部和日本西部.能够亲自见证 Micr ...

  2. 算法导论 6.5.9 堆实现K路归并问题

    问题: 设计一个时间复杂度为O(NlogK)的算法,它能够将K个有序链表合并为一个有序链表,这里的N为所有输入链表包含的总的元素个数 分析: 该问题为经典的利用堆完成K路归并的问题: 当K个序列满足一 ...

  3. Leetcode 动态规划 Unique Paths

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Unique Paths Total Accepted: 17915 Total Submi ...

  4. 用nodejs安装hexo,将hexo部署到github

    跌跌撞撞写这篇博文,希望下一篇可以好点 运行环境:最新版本的nodejs + git 安装好nodejs 和 git ,注册好github账号,新建仓库****.github.io(****为gith ...

  5. HTML5+CSS3正式开课

    HTML5+CSS3 HTML5+CSS3 HTML5+CSS3

  6. jQuery 1.9+ ajaxStart事件无效,无法被触发的原因。

    AJAX 事件需要绑定到document 在jQuery 1.9中, 全局的AJAX事件(ajaxStart, ajaxStop, ajaxSend, ajaxComplete, ajaxError, ...

  7. MVC框架浅析(基于PHP)

    MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...

  8. 监测scroll

    $(window).scroll(function() { var scrollValue = $(this).scrollTop(); var h=200+scrollValue; $('.yui3 ...

  9. 安装CDH

    Cloudera Manager 4.8.2 http://www.idefs.com/recordsubuntu-12-04-cloudera-installation-manager-4-8-2- ...

  10. Linux 中将用户添加到组的指令

    在 Linux 操作系统下,如何添加一个新用户到一个特定的组中?如何同时将用户添加到多个组中?又如何将一个已存在的用户移动到某个组或者给他增加一个组?对于不常用 Linux 的人来讲,记忆 Linux ...