天天看點

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:偏移量

   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)

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

  Allocated to snapshot  19.69%  #使用率增加了

[root@node1 lvm]# ls /mnt/lvm

etc  lost+found  test  test1

[root@node1 lvm]# ls /mnt/snap/

etc  lost+found  test

                        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

[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

Disk /dev/dm-7: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

#出現多路徑裝置/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"

 \_ 22:0:0:1 sdb 8:16  [active][ready] 

 \_ 23:0:0:1 sdd 8:48  [active][faulty]   #該路徑處于故障狀态

[root@target ~]# ifup eth0:1

 \_ 23:0:0:1 sdd 8:48  [active][ready]   #該路徑恢複正常狀态

本文轉自netsword 51CTO部落格,原文連結:http://blog.51cto.com/netsword/765039