RH436-5 devicemapper和多路径

 Device Mapper

1.用于生成一个逻辑设备到物理设备的映射平台
2.支持将多个存储设备组合成一个虚拟设备
3.使用Device Mapper的应用程序:
  LVM2
  Multipathing
4.管理mapper设备:create,remove
5.利用mapping tables生成设备文件
6.可在线调整
7.通过block设备生成DM设备
8.支持堆积(如:raid10)
9.DM模块是可动态加载的模块:(device-mapper.rpm安装包后会自动加载该模块)
 
DM-multipath的功能:
1.故障的切换和恢复
2.IO流量的负载均衡
3.磁盘的虚拟化
 
DM Table
1.通过DM table来生成逻辑设备
2.描述了物理设备到逻辑设备的每一个扇区映射的关系
3.DM Table的行格式
  1.逻辑设备的起始扇区
  2.逻辑设备的扇区数(size)
  3.创建逻辑设备的类型
  4.创建逻辑设备的参数
 
mapping table实例:
1. 0 1024 linear /dev/sda 204 1024 512 linear /dev/sdb 766 1536 128 linear /dev/sdc 0
  #将逻辑设备0~1023扇区、1024~1535扇区以及1536~1663三个地址范围分别以线形映射的方式映射到/dev/sda设备第204号扇区、/dev/sdb设备第766号扇区和/dev/sdc设备的第0号扇区开始的区域
 
2. 0 2048 striped 2 64 /dev/sda 1024 /dev/sdb 0
  #将逻辑设备从0号扇区开始的,长度为2048个扇区的段以条带的方式映射的到/dev/sda设备的第1024号扇区以及/dev/sdb设备的第0号扇区开始的区域。同时告诉内核这个条带类型的target driver存在2个条带设备与逻辑设备做映射,并且条带的大小是64个扇区,使得驱动可以该值来拆分跨设备的IO请求。
 
3. 0 4711 mirror core 2 64 nosync 2 /dev/sda 2048 /dev/sdb 1024
  #将逻辑设备从0号扇区开始的,长度为4711个扇区的段以镜像的方式映射到/dev/sda设备的第2048个扇区以及/dev/sdb设备的第1024号扇区开始的区域。
 
dmsetup
1.dmsetup用于创建、管理、查询DM设备的工具
2.支持stdin获取参数来创建Mapping table信息#建议利用stdin方式使用dmsetup创建mapping table信息
 e.g. #dmsetup create mydevice map_table
3.实例:将/dev/sda和/dev/sdb两个设备以线性的方式组成逻辑设备/dev/mapper/combined
[root@node1 ~]#vim createmapdev.sh
#!/bin/bash
size1=$(blockdev --getsize $1)
size2=$(blockdev --getsize $2)
echo -e "0 $size1 linear $1 0\n$size1 $size2 linear $2 0" | dmsetup create combined
 
[root@node1 ~]#./createmapdev.sh /dev/sda /dev/sdb
 
[root@node1 ~]#ls -ls /dev/mapper/combined
0 brw-rw---- 1 root disk 252, 2 10-28 11:36 /dev/mapper/combined
#blockdev --getsize /dev/sda 计算/dev/sda的所有扇区数
 
[root@node1 home]# mkfs -t ext3 /dev/mapper/combined
 
[root@node1 home]# mount /dev/mapper/combined /mnt
 
[root@node1 home]# df -h /mnt
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/combined   19G  173M   18G   1% /mnt
 
Mapping Targets
1. linear:线性,连续写入
2. striped:条带化,分段写入,raid0
3. error:定义“out-of-bounds"屏蔽区域,坏道等
4. snapshot: -copy-on-write device:COW写实复制设备
5. snapshot-origin-device:起始卷
6. zero:零设备,可模拟大容量设备
7. multipath:多路径,多条路由到设备
 
Mapping Target - linare
1. dm-linare 驱动
2. 将多个物理设备组成一个连续的逻辑设备
3.参数:
    物理设备路径
    offset:偏移量
4.实例
    0 20000 linear /dev/sda 0
    20000 60000 linear  /dev/sdb 0
 #将设备/dev/sda从0扇区开始的20000个扇区作为线性逻辑设备的从0开始的20000个扇区
 #将设备/dev/sdb从0扇区开始的60000个扇区作为线性逻辑设备的从20000开始的60000个扇区
 #线性逻辑设备的总大小为80000个扇区(1扇区=512byte)
[root@node1 ~]# echo -e "0 20000 linear /dev/sda 0\n20000 60000 linear /dev/sdb 0" | dmsetup create combined
[root@node1 ~]# ls /dev/mapper/combined
/dev/mapper/combined
[root@node1 ~]# mkfs -t ext3 /dev/mapper/combined
[root@node1 ~]# mount /dev/mapper/combined /mnt
[root@node1 ~]# df -h /mnt
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/combined   38M  4.5M   32M  13% /mnt    #combined大小:80000*512/1024/1024=39M
 
 
Mapping Target - striped
1. dm-stripe driver
2. 通过多个指定设备轮询分段写入的方式组建逻辑设备
3. 参数:
   参与条带化的物理设备数量
   chunk size
   设备路径
   offset:偏移量
4.实例
   0 1024 striped 2 256 /dev/sda 0 /dev/sdb 0
 #0 1024:新建逻辑设备从0扇区开始1024个扇区,扇区数必须是chunksize的倍数。
 #striped 2 :条带化,设备数量为2
 #256:chunk size
 #/dev/sda 0 /dev/sdb 0:从两物理设备的第0个扇区开始
 
 注:所有操作必须写入到开启脚本,否则重启失效。
 
 
Mapping Target - error
1. I/O设备中出现访问错误,如坏道
2. 在逻辑设备中定义该错误部分为error避免访问该部分。
3.实例
  0   80 linear /dev/sda 0
  80  100 error
  180 200 linear /dev/sdb 0
 #从第80扇区开始100个扇区为error区,该区将不会被访问,其坏道应该在/dev/sda上。
 
 
Mapping Target - snapshot-origin
1. dm-snapshot driver
2. dm mapping源卷
3. 所有未改变的数据将直接读取源卷
4. 与snapshot连接在一起工作
5. 写数据时,修改的源卷数据会保存在snapshot的COW(copy on write写实复制)设备上。
6. Example:
   0   1000 snapshot-origin /dev/sda
   #将/dev/sda创建成源卷设备即逻辑卷设备
 
Mapping Target - snapshot
1. dm-snapshot driver
2. 与snapshot-origin连接在一起工作
3. snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data),并不会有数据的物理拷贝
4. 写操作时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里即COW中。
5. 读操作时,直接定向到原始卷上
6. 创建snapshot时会创建三个设备snap、cow、real
7. Example:
  0 1000 snapshot /dev/sda1 /dev/vg0/realdev P 16
  #/devsda1:源设备
  #0  10000:从0开始1000个扇区
  #/dev/vg0/realdev用于做/dev/sda1的快照
  #P:下次启动该设备持续有效,N:重启无效
 
LVM2 Snapshots
1. LVM2快照时会使用四个DM-Device
   <name>-real :源卷设备,即真实设备
  snapshot-origin:拷贝原始卷里数据的元数据(meta-data)
  snapshot:The COW device改变的数据
  <name>:包含<name>-real和COW的最终被修改后的设备
2.Example:
[root@node1 lvm]#lvcreate -L 512M -n lv00 vg01
[root@node1 lvm]#lvcreate -L 100M -n lvsnap --snapshot /dev/vg01/lv00
[root@node1 lvm]# ll /dev/mapper/ | grep vg01
brw-rw---- 1 root disk 252,  2 11-02 14:14 vg01-lv00
brw-rw---- 1 root disk 252,  4 11-02 14:15 vg01-lv00-real
brw-rw---- 1 root disk 252,  3 11-02 14:15 vg01-lvsnap
brw-rw---- 1 root disk 252,  5 11-02 14:15 vg01-lvsnap-cow
[root@node1 lvm]# dmsetup table | grep vg01 | sort
vg01-lv00: 0 1048576 snapshot-origin 252:4
vg01-lv00-real: 0 1048576 linear 8:0 384
vg01-lvsnap: 0 1048576 snapshot 252:4 252:5 P 8
vg01-lvsnap-cow: 0 106496 linear 8:0 1048960
[root@node1 lvm]# dmsetup ls --tree
vg01-lvsnap (252:3)
 ├─vg01-lvsnap-cow (252:5)
 │  └─ (8:0)
 └─vg01-lv00-real (252:4)
    └─ (8:0)
vg01-lv00 (252:2)
 └─vg01-lv00-real (252:4)
    └─ (8:0)
 
 
LVM-snapshot实例:
[root@node1 /]# lvcreate -L 512M -n lv00 vg01
  Logical volume "lv00" created
[root@node1 /]# mkfs -t ext3 /dev/mapper/vg01-lv00
[root@node1 /]# mount /dev/mapper/vg01-lv00 /mnt/lvm
[root@node1 /]# cp -a /etc/ /mnt/lvm/
[root@node1 lvm]# dd if=/dev/zero of=test bs=1M count=100M
[root@node1 lvm]# lvcreate -L 50M -s -n lvsnap /dev/vg01/lv00
  Rounding up size to full physical extent 52.00 MB
  Logical volume "lvsnap" created
[root@node1 mnt]# lvdisplay /dev/vg01/lvsnap
  --- Logical volume ---
  LV Name                /dev/vg01/lvsnap
  VG Name                vg01
  LV UUID                6ZgZDl-tASI-f7pD-m96h-OpUl-ANJe-gotSe0
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/vg01/lv00
  LV Status              available
  # open                 1
  LV Size                512.00 MB
  Current LE             128
  COW-table size         52.00 MB
  COW-table LE           13
  Allocated to snapshot  0.05%
  Snapshot chunk size    4.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3
[root@node1 lvm]# mount /dev/vg01/lvsnap /mnt/snap/
[root@node1 lvm]# ls /dev/mapper/
vg01-lv00  vg01-lv00-real  vg01-lvsnap  vg01-lvsnap-cow
[root@node1 mnt]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
                         37G  2.7G   33G   8% /
/dev/vda1                99M   15M   79M  16% /boot
tmpfs                    252M     0  252M   0% /dev/shm
/dev/mapper/vg01-lv00    496M  195M  276M  42% /mnt/lvm
/dev/mapper/vg01-lvsnap  496M  195M  276M  42% /mnt/snap #显示snap和原数据一样
[root@node1 lvm]# dd if=/dev/zero of=/mnt/lvm/test1 bs=1M count=10
[root@node1 mnt]# lvdisplay /dev/vg01/lvsnap
  --- Logical volume ---
  LV Name                /dev/vg01/lvsnap
  VG Name                vg01
  LV UUID                6ZgZDl-tASI-f7pD-m96h-OpUl-ANJe-gotSe0
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/vg01/lv00
  LV Status              available
  # open                 1
  LV Size                512.00 MB
  Current LE             128
  COW-table size         52.00 MB
  COW-table LE           13
  Allocated to snapshot  19.69%  #使用率增加了
  Snapshot chunk size    4.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3
[root@node1 lvm]# ls /mnt/lvm
etc  lost+found  test  test1
[root@node1 lvm]# ls /mnt/snap/
etc  lost+found  test
[root@node1 mnt]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
                        37G  2.7G   33G   8% /
/dev/vda1               99M   15M   79M  16% /boot
tmpfs                   252M     0  252M   0% /dev/shm
/dev/mapper/vg01-lv00   496M  205M  266M  44% /mnt/lvm
/dev/mapper/vg01-lvsnap 496M  195M  276M  42% /mnt/snap  #快照未改变,改变的数据到cow中了,即创建snapshot时创建的50M空间里
 
#snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。当然,如果你的snapshot大小和原始卷一样大,甚至还要大,那它的寿命就是“与天齐寿”了
 
 
Mapping Taget - zero
1. dm-zero driver
2. 同/dev/zero一样,但是一个block设备
3. 用于创建虚拟大容量设备,多用于测试。
4. 无法往其写入数据,其中无真实数据,读时返还zero数据。
5. Example:
[root@node1 lvm]# export Hugsize=$[100 *(2**40)/512]
[root@node1 lvm]# echo $Hugsize
214748364800
[root@node1 lvm]# echo "0 $Hugsize zero" | dmsetup create zerodev
[root@node1 lvm]# fdisk -l /dev/mapper/zerodev
Disk /dev/mapper/zerodev: 109951.1 GB, 109951162777600 bytes
255 heads, 63 sectors/track, 13367467 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
 
Device Mapper Multipath
1. 提供冗余:一条或多条路径连接到相同物理存储设备
2. 监控每条路径并自动切换故障路径
3. 自动恢复并传递应用程序
4. dm-multipath创建的设备名(e.g.:/dev/dm-2)
5. dm-multipath支持GFS文件系统
6. dm-multipath是线路冗余,不是磁盘冗余
 
dm multipath components
1. Multipath priority groups多路径优先级:
    优先级不一样则冗余优,先级高的工作,低的备份
    优先级一样则提供负载均衡,同时工作
2. dm-multipath kernel module内核模块
3. multipath命令:查询和配置多路径设备
4. multipathd daemon:监控多路径进程或附件
5. kpartx:创建dm设备
 
Multipath Priority Groups
1. 到存储设备的路径可以定义优先级组
2. 优先级组范围:0-1024
3. 默认只有一个优先级组在工作
4. active/active路径属于相同的优先级组,负载均衡模式(默认状态)
5. active/passive路径属于不同的优先级组,优先级组高的工作,优先级组低备份
 
Mapping Target-multipath
1. dm-multipath driver
2. 参数:
   优先级组的分段
3. 第一个优先级组的参数
  3.1. 优先级组对应的I/O
  3.2. 优先级组对应的路径数量
  3.3. 列出路径的优先级
 
Setup Multipathing Fc Storage
1. 安装device-mapper-multipath RPM包
2. 配置/etc/multipath.conf
3. modprobe dm_multipath
4. modprobe dm-round-robin
5. chkconfig multipathd on
6. service multipathd start
7. multipath -l
 
Multipath Configuration
/etc/multipath.conf Sections:
1. defaults - multipath tools default settings
2. blacklist -list of specific device names to not consider for multipathing
3. blacklist_exceptions - list of multipathing candidates that would otherwise be blacklisted
4. multipaths - list of multipath characteristic settings
5. devices - list of per storage controller settings
6. Allows regular expression description syntax
7. Only specify sections that are needed
  
多路径配置实例
1. target配置
IP:ifcfg-eth0     192.168.32.219
    ifcfg-eth0:1   192.168.32.220
[root@target ~]# service tgtd start
 
[root@target ~]#tgtadm --lld iscsi --mode target --op new --tid 1 -T iqn.2011-10.target:dsk1
 
[root@target ~]#tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store=/dev/VolGroup00/lv06
 
[root@target ~]#tgtadm --lld iscsi --mode target --op bind --tid=1 --initiator-address=ALL
 
2. node1配置
 
[root@node1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.32.220
192.168.32.220:3260,1 iqn.2011-10.target:dsk1
 
[root@node1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.32.219
192.168.32.219:3260,1 iqn.2011-10.target:dsk1
 
[root@node1 ~]# iscsiadm -m node -T iqn.2011-10.target:dsk1 -p 192.168.32.220 -l
Logging in to [iface: default, target: iqn.2011-10.target:dsk1, portal: 192.168.32.220,3260]
Login to [iface: default, target: iqn.2011-10.target:dsk1, portal: 192.168.32.220,3260]: successful
 
[root@node1 ~]# iscsiadm -m node -T iqn.2011-10.target:dsk1 -p 192.168.32.219 -l
Logging in to [iface: default, target: iqn.2011-10.target:dsk1, portal: 192.168.32.219,3260]
Login to [iface: default, target: iqn.2011-10.target:dsk1, portal: 192.168.32.219,3260]: successful
 
[root@node1 ~]# fdisk -l
Disk /dev/sdb: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
Disk /dev/sdd: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
[root@node1 ~]# yum install device-mapper-multipath
 
[root@node1 ~]# vim /etc/rc.d/multipath.conf
#blacklist {                    #注销blacklist
#        devnode "*"  
#}
 
defaults {
        udev_dir                /dev
        polling_interval        10
        selector                "round-robin 0"    #轮询,优先级都为0
        path_grouping_policy    failover
        getuid_callout          "/sbin/scsi_id -g -u -s /block/%n"
        prio_callout            /bin/true
        path_checker            readsector0
        rr_min_io               100
        max_fds                 8192
        rr_weight               priorities
        failback                immediate
        no_path_retry           fail
        user_friendly_names     yes
}
#通常特有厂商有其特有的配置,该配置是redhat的默认配置
 
[root@node1 ~]#chkconfig multipathd on
 
[root@node1 ~]#service multipathd start
 
[root@node1 ~]# fdisk -l
Disk /dev/sdb: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
Disk /dev/sdd: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
Disk /dev/dm-7: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
#出现多路径设备/dev/dm-7,其实/dev/sdb、/dev/sdd、/dev/dm-7是一个设备
 
[root@node1 ~]# mkfs.ext3 /dev/dm-7
 
[root@node1 ~]# mount /dev/dm-7 /mnt/path/
 
[root@node1 ~]# cp /etc/passwd /mnt/path/.
 
[root@node1 ~]# multipath -ll             #查询多路径状态
mpath0 (1IET_00010001) dm-7 IET,VIRTUAL-DISK
[size=5.0G][features=0][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 22:0:0:1 sdb 8:16  [active][ready]
\_ round-robin 0 [prio=0][enabled]
 \_ 23:0:0:1 sdd 8:48  [active][ready]
 
3.测试
[root@target ~]# ifdown eth0:1          #断开路径192.168.32.219
 
[root@node1 ~]# multipath -ll
sdd: checker msg is "readsector0 checker reports path is down"
mpath0 (1IET_00010001) dm-7 IET,VIRTUAL-DISK
[size=5.0G][features=0][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 22:0:0:1 sdb 8:16  [active][ready] 
\_ round-robin 0 [prio=0][enabled]
 \_ 23:0:0:1 sdd 8:48  [active][faulty]   #该路径处于故障状态
[root@target ~]# ifup eth0:1
[root@node1 ~]# multipath -ll
mpath0 (1IET_00010001) dm-7 IET,VIRTUAL-DISK
[size=5.0G][features=0][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 22:0:0:1 sdb 8:16  [active][ready]
\_ round-robin 0 [prio=0][enabled]
 \_ 23:0:0:1 sdd 8:48  [active][ready]   #该路径恢复正常状态

你可能感兴趣的:(职场,mapper,休闲,device,多路径,rhca)