Multipath在OpenStack中的faulty device的成因及解决(part 2)
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:wangxu198709@gmail.com
简介
在上次的文章OpenStack中的Multipath faulty device的成因及解决(part 1)中,我详细解释了fault device的成因,这篇文章重点介绍下os-brick中是如何在并发的情况下,通过哪些具体的实现避免了faluty device的形成。
在讲具体实现前,有必要提到Linux上SCSI Block device(块设备)地址(寻址)的一些细节。
Linux kernel中通过如下的层次来定位特定的LUN:
SCSI adapter number [host]
channel number [bus]
id number [target]
lun [lun]
更多细节可以参考[SCSI Addressing],也就是说,一个LUN可以用 [host-bus(channel)-target-lun] 来表示。
Linux每连接一个iscsi target,kernel都会在本地的 /sys/class/iscsi_host/host*/device/session 建立对应的目录结构,用来表示一个SCSI的设备。
$ ls -l /sys/class/iscsi_host/host3/device/session1/
total
drwxr-xr-x root root Apr : connection1:
drwxr-xr-x root root Apr : iscsi_session
drwxr-xr-x root root Apr : power
drwxr-xr-x root root Apr : target3:0:0
-rw-r--r-- root root Apr : uevent
上面的 :: 就是一个iSCSI target所在host:channel:target
BTW: 如果你看不到如上的目录结构,你应该先要连接一个iSCSI target,下面是我连接的target:
$ sudo iscsiadm -m session
tcp: [] 172.17.0.2:, tgt1 (non-flash)
方案
由于在上篇已经介绍过,os-brick使用的是连接(connect_volume)和断开(disconnect_volume)的时候,分别使用了 multipath -r 和 iscsiadm -m session -R
以上的命令会造成所有的iSCSI target对应的BUS的所有LUN都会被扫描一遍。
os-brick就对症下药,根据用户要连接的target和LUN,缩小扫描范围,只扫描特定target上的特定LUN。
具体的过程如下:
1. 首先根据用户的输入的session id和LUN id找到对应的h-c-t-l(代码LINK):
def get_hctl(self, session, lun):
"""Given an iSCSI session return the host, channel, target, and lun."""
glob_str = '/sys/class/iscsi_host/host*/device/session' + session
paths = glob.glob(glob_str + '/target*')
if paths:
__, channel, target = os.path.split(paths[0])[1].split(':')
# Check if we can get the host
else:
target = channel = '-'
paths = glob.glob(glob_str) if not paths:
LOG.debug('No hctl found on session %s with lun %s', session, lun)
return None # Extract the host number from the path
host = paths[0][26:paths[0].index('/', 26)]
res = (host, channel, target, lun)
LOG.debug('HCTL %s found on session %s with lun %s', res, session, lun)
return res
上面的参数session就是 tcp: [1] 172.17.0.2:3260,1 tgt1 (non-flash) 中的[],lun就是要连接的LUN的ID,一般由Cinder driver提供。
对于我的这个session,LUN=1对应的hctl为: HCTL ('', '', '', 1) found on session 1 with lun 1
2. 扫描时使用上面的htcl:(代码link)
def scan_iscsi(self, host, channel='-', target='-', lun='-'):
"""Send an iSCSI scan request given the host and optionally the ctl."""
LOG.debug('Scanning host %(host)s c: %(channel)s, '
't: %(target)s, l: %(lun)s)',
{'host': host, 'channel': channel,
'target': target, 'lun': lun})
self.echo_scsi_command('/sys/class/scsi_host/host%s/scan' % host,
'%(c)s %(t)s %(l)s' % {'c': channel,
't': target,
'l': lun})
在log里面会看到类似的tee开头的scsi command,作用跟 echo '0 0 1' | tee -a /sys/class/scsi_host/host3/scan 一样,让kernel做一个小范围的host scan。
这样只有用户想要的一个LUN会被scan出来,而无关的LUN是不会被扫描出来,从而避免了fault device的形成。
参考资料
[SCSI Addressing]: http://www.tldp.org/HOWTO/SCSI-2.4-HOWTO/scsiaddr.html
[os-brick]: https://github.com/openstack/os-brick/
[Refactor iSCSI connect]: https://github.com/openstack/os-brick/commit/56c8665d3d342ce90f5d9433966c0f244063b4c1
Multipath在OpenStack中的faulty device的成因及解决(part 2)的更多相关文章
- Multipath在OpenStack中的faulty device的成因及解决(part 1)
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介: Multip ...
- OpenStack中的Multipath faulty device的成因及解决(part 1)
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介: Multip ...
- OpenStack中MySQL高可用配置
采用Heartbeat+DRBD+mysql高可用方案,配置两个节点的高可用集群 l 配置各节点互相解析 gb07 gb06 l 配置各节点时间同步 gb07 [root@gb07 ~]# ntp ...
- OpenStack中Keystone的基本概念理解
原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...
- openstack中eventlet使用
openstack中使用eventlet的协程来实现并发. 第一种,使用eventlet.GreenPool来管理绿色线程 如l3-agent在开启了8个绿色线程来处理router消息 def _pr ...
- 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用
本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...
- openstack中彻底删除计算节点的操作记录
在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...
- OpenStack中给wsgi程序写单元測试的方法
在 OpenStack 中, 针对web应用, 有三种方法来写单元測试 1) 使用webob生成模拟的request from __future__ import print_function imp ...
- openstack中iptables的使用
openstack中nova使用了iptables实现其网络相关功能,乍看openstack的iptables表比较复杂,整理了一下iptables的filter表和nat表的结构,以一个all in ...
随机推荐
- 分享:docker swarm集群搭建
[Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu. 网上有用docker-machine创建虚拟机做的例子. 这里直接用VMware创建这三台虚拟机,然后用xshell连 ...
- DEVC使用问题集锦
一.DEVC++编译出现"Id return 1 exit status" 这是初学者刚用DEVC经常碰到问题,一般有如下解决方法: 1.首先检查下是否有c的exe程序开着,若开着 ...
- alpha-咸鱼冲刺day8
一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在进行页面整合.然后还有注册跟登陆的功能完善-- 四,问题困难 数据流程大概是搞定了.不过语法不是很熟悉,然后还有各种判定. ...
- 关于python中argsort()函数的使用
在实现<机器学习实战>中kNN代码时遇到需要将计算好的距离进行排序,即可使用argsort()函数,在此依据个人理解对该函数进行简单的介绍. 总的来说,argsort()函数是对数组中的元 ...
- 第201621123043 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 2 ...
- raid5两块硬盘离线怎么办? 强制上线失败如何恢复数据
服务器故障描述: 客户使用Dell 2850服务器组建了raid5磁盘阵列,阵列中包含有6块硬盘(SCSI硬盘,单盘容量300G),服务器操作系统为linux Redhat4:文件系统为ext3文件系 ...
- 自制 h5 音乐播放器 可搜索
闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...
- 17-TypeScript代理模式
在有些情况下,我们需要把客户端真正调用的类和方法隐藏起来,而通过暴露代理类给客户端.客户端调用代理类的方式就可以访问到真实类提供的功能. abstract class Called{ protecte ...
- JAVA_SE基础——52.匿名内部类
电信的电箱烧了,害我断了2天网,真拿命,耽误了 Java匿名内部类的总结: 没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类 ...
- webpack你值得拥有-从四个核心配置谈起
很久没有发文章了,但是强调一点,大-熊同学最近可没闲着.学习算法,复习计算机网络,也顺便学习了一下webpack,看了看操作系统(没办法,都没学,要是不学连实习笔试都过不了,伤心--).本来比较纠结是 ...