SinoDB SDS在linux实现裸设备配置共享存储

1.SDS共享存储介绍

  SinoDB SDS产品(全称Shared Disk Secondary):其架构由主服务器和备用服务器共享磁盘方式进行工作,所有的实例可执行读写操作,写操作只由主节点完成,这样的工作机制避免了节点之间的锁等待,同时也避免了数据重复储存的问题,既节省了空间,同时安装和配置更加简单。

  由于 SDS 备用节点利用了主服务器的磁盘并且可以轻松快速地启动,因而非常适合规模扩展场景。并且SDS 备用服务器非常接近主服务器(即它们共享相同的磁盘),因此最适合在主服务器遇到问题时作为故障转移服务器。

  其工作原理图如下:

  通常来说,SDS在商用Unix系统上使用其系统自带或第三方的共享集群文件系统(Shared Cluster File System)作为Cluster Management,Multi-owner LVM和 IO Fencing三个主要功能,常见的共享集群文件系统有:GFS/GPFS/VCFS。但是,在Linux系统本身并不自带共享集群文件系统的情况下,如何实现在SAN架构存储下SDS共享磁盘配置呢?

  配置共享存储的前提是:在存储系统底层配置的LUN设备对所有SDS的节点可见并具备了Multi-owner LVM特点。用通俗的话来说,同一块磁盘设备在不同节点可同步读写。以经典的SAN架构存储为例,在SAN交换机上划出对应的存储LUN 并对相关的服务器设置可见是很简单常见的做法。

  在Linux系统层面,为了实现多节点同时读写同一块磁盘设备,通常的配置方式采用多路径软件(Linux系统自带即可)聚合裸设备来实现。具体做法为:在所有节点直接绑定LUN设备的相同且唯一wwid并设置别名,然后进行裸化绑定并赋权。以下的配置过程在CentOS 6.5测试通过。

2.配置LUN的别名

  不同于cooked file system,SinoDB SDS对裸设备的使用需要对每个dbspace对应的chunk做提前做命名和大小规划。一般来说,每个chunk对应一个裸设备,以下规划为例进行测试:

 别名             大小
rootdbs             2G
plogdbs             2G
llogdbs             2G
sds_alt_comm        2G

  存储系统依据以上的大小规划需求由系统管理员做4个LUN进行划分,完成之后,由系统层面识别。SAN交换机映射出来的LUN存储设备需要通过多路径软件绑定之后形成一个唯一的wwid标识,通过wwid和我们自定义的别名进行一一绑定,确保系统重启后存储设备不变。

  定义别名做法:以root用户在SDS所有节点上配置(配置信息需根据现场环境设定)/etc/multipath.conf文件。

  以其中一个节点为例配置:

multipaths {
        multipath {
                wwid                    36000d31000bbfb0000000000000000d5
                alias                   rootdbs
        }
        multipath {
                wwid                    36000d31000bbfb0000000000000000d6
                alias                   plogdbs
        }
        multipath {
                wwid                    36000d31000bbfb0000000000000000d7
                alias                   llogdbs
        }        
        multipath {
                wwid                    36000d31000bbfb0000000000000000dc
                alias                   sds_alt_comm
        }        
}

  重启multipathd服务使其生效:

#service multipathd restart

  设置multipathd服务随系统自启动:

#chkconfig -level 345 multipathd on

  其他节点配置同理。

  以上完成配置后,系统在/dev/mapper下自动生成多个LUN设备文件的别名。

3.裸设备定义及赋权

  对LUN 的别名设置后,还需要通过裸设备定义及权限设置使其在系统层面由数据库用户读写操作。

  为了让系统每次启动后都能绑定正确的磁盘设备,需要在启动文件/etc/rc.local中批量运行裸设备绑定和赋权命令,示例如下:

raw /dev/raw/raw1 /dev/mapper/rootdbs
raw /dev/raw/raw2 /dev/mapper/plogdbs
raw /dev/raw/raw3 /dev/mapper/llogdbs
raw /dev/raw/raw4 /dev/mapper/sds_alt_comm
chown sinodb:sinodb /dev/raw/raw1
chown sinodb:sinodb /dev/raw/raw2
chown sinodb:sinodb /dev/raw/raw3
chown sinodb:sinodb /dev/raw/raw4
chmod 660  /dev/raw/raw1
chmod 660  /dev/raw/raw2
chmod 660  /dev/raw/raw3
chmod 660  /dev/raw/raw4

  系统reboot后,通过命令raw -qa查看共享存储设备是否已经绑定生效,如:

#raw -qa
/dev/raw/raw1:	bound to major 253, minor 16
/dev/raw/raw2:	bound to major 253, minor 15
/dev/raw/raw3:	bound to major 253, minor 13
/dev/raw/raw4:	bound to major 253, minor 12

  完成以上步骤后,接下来就要进行共享存储的一致性进行验证。

4.共享设备一致性验证

  为严谨起见,共享存储设备的一致性验证通过两个方面进行验证。

  首先,LUN ID一致验证法:

  运行命令multipath -ll,查看多路径聚合后各设备的LUN ID和对应绑定的别名在每个节点必须一致。如:

#multipath -ll
Dec 06 18:13:28 | multipath.conf line 32, duplicate keyword: defaults
llogdbs (36000d31000bbfb0000000000000000d7) dm-16 COMPELNT,Compellent Vol
size=2.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 9:0:1:3   sdd  8:48   active ready running
  `- 10:0:1:3  sdu  65:64  active ready running
rootdbs  (36000d31000bbfb0000000000000000d5) dm-2 COMPELNT,Compellent Vol
size=2.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 9:0:1:1   sdc  8:32   active ready running
  `- 10:0:1:1  sdt  65:48  active ready running
plogdbs  (36000d31000bbfb0000000000000000d6) dm-9 COMPELNT,Compellent Vol
size=2.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 9:0:3:2   sdl  8:176  active ready running
  `- 10:0:3:2  sdac 65:192 active ready running
sds_alt_comm (36000d31000bbfb0000000000000000dc) dm-10 COMPELNT,Compellent Vol
size=2.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 9:0:3:8   sdo  8:224  active ready running
  `- 10:0:3:8  sdaf 65:240 active ready running

  如上,rootdbs所对应的LUN ID=36000d31000bbfb0000000000000000d5,这在所有其他节点上也必须一致。否则,表示rootdbs所对应的不是同一块存储设备,同理,其他磁盘的LUN ID按此法确保一致。

  其次,通过dd读写做进一步验证。

  共享存储划完后,会在/dev目录下生成相应的以dm-开头的设备名,通过dd命令读写同一裸设备内容进行测试。原理在于:在一个节点上的裸设备dd写入的内容,应在其他节点相对应的裸设备可以读出相同的数据。

  具体做法,在主节点上:任意vi一个文件,内容自定义。

#vi /tmp/1.txt   
 just for raw test.
#dd if=/tmp/1.txt of=/dev/dm-2 bs=1024 count=1 #此例,dm-2绑定rootdbs
#dd if=/dev/mapper/rootdbs bs=1024 count=1  #需要在屏幕上显示内容:just for raw test.

  之后,在其他SDS节点上dd导出进行验证:

#dd if=/dev/mapper/rootdbs bs=1024 count=1  #需要在屏幕上显示内容:just for raw test.

  以上dd打印出来的结果必须和主节点上dd写入的内容一致,才表示共享磁盘为同一设备验证成功。其他裸设备读写验证同理进行。

5.设置chunk链接到裸设备

  为了让SDS能够更方便直观使用这些裸设备文件,定义了裸设备的软链接,使得SDS数据库需要创建dbspace的chunk有了基础,实现以普通的文件系统方式访问数据库文件。

  例子:在/home/sinodb/dbs路径下执行命令对相应的裸设备进行链接:

$ln -s /dev/raw/raw1        /home/sinodb/dbs/rootdbs
$ln -s /dev/raw/raw2        /home/sinodb/dbs/llogdbs
$ln -s /dev/raw/raw3        /home/sinodb/dbs/plogdbs
$ln -s /dev/raw/raw4        /home/sinodb/dbs/tempdbs1

  以上链接操作,在SDS所有节点上都进行配置。

  因此,采用共享存储的裸设备方式来实现SDS架构对磁盘同步读写,为不同环境的SDS搭建提供了更多选项。