使用GFS和DRBD在CentOS 5.5上进行Samba CTDB集群部署
1、初步说明
Linux发行版:我们使用的是CentOS 5.5 64位发行版,当然本文介绍的方法一样适用于Fedora和Red Hat Enterprise Linux,CentOS的安装很简单,安装时选择基础包和其它你需要的软件包,值得注意的是,我们使用DRBD复制节点之间的数据,它需要独占一个磁盘或分区,因此在安装CentOS时注意预留好空间或直接为DRBD创建好一个分区。
网络硬件和拓扑结构:在每个节点上,我们使用了两块千兆网卡,一个(eth0)连接到网络(LAN),另一个(eth1)通过交叉线实现两个节点间的连接,DRBD在两个节点之间复制数据时,是不会通过网络交换机或其它网络设备的,而是直接走交叉线。
- 本教程使用的两个物理节点分别是:node1.clusterbr.int和node2.clusterbr.int。
- node1.clustersmb.int:使用IP 10.0.0.181 (LAN) 和IP 172.16.0.1 (交叉)
- node2.clustersmb.int:使用IP 10.0.0.182 (LAN) 和IP 172.16.0.2 (交叉)
- vip1.clustersmb.int:它是集群IP,来自节点1 10.0.0.183
- vip2.clustersmb.int:它是集群IP,来自节点2 10.0.0.184
磁盘:两个节点均配备了两块磁盘,/dev/sda安装操作系统,/dev/sdb供DRBD使用,正如前面提到的,只使用一块磁盘也是可以的,只需要为DRBD分配一个独立的分区即可。
CTDB:它是TDB的集群实现,为了在集群文件系统上使用Samba,我们需要一个主动/主动集群,让两边的smb服务都能响应网络请求,详细信息请参考http://ctdb.samba.org/。
2、准备节点
首先,我们需要禁用SELinux,用vi打开selinux配置文件:
vi /etc/selinux/config
修改下面这一行内容,其它内容不变:
SELINUX=disabled
接下来需要修改主机名和节点的网关。
vi /etc/sysconfig/network
节点1:
NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=node1.clustersmb.int GATEWAY=10.0.0.9
节点2:
NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=node2.clustersmb.int GATEWAY=10.0.0.9
接下来配置网络接口。
节点1 LAN接口:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
内容如下:
DEVICE=eth0 BOOTPROTO=static IPADDR=10.0.0.181 NETMASK=255.255.255.0 ONBOOT=yes HWADDR=a6:1e:3d:67:66:78
节点1交叉/DRBD接口:
vi /etc/sysconfig/network-scripts/ifcfg-eth1
内容如下:
DEVICE=eth1 BOOTPROTO=static IPADDR=172.16.0.1 NETMASK=255.255.255.0 ONBOOT=yes HWADDR=ee:ef:ff:9a:9a:57
节点2 LAN 接口:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
内容如下:
DEVICE=eth0 BOOTPROTO=static IPADDR=10.0.0.182 NETMASK=255.255.255.0 ONBOOT=yes HWADDR=52:52:a1:1a:62:32
节点2交叉/DRBD接口:
vi /etc/sysconfig/network-scripts/ifcfg-eth1
内容如下:
DEVICE=eth1 BOOTPROTO=static IPADDR=172.16.0.2 NETMASK=255.255.255.0 ONBOOT=yes HWADDR=1a:18:b2:50:96:1e
接下来在两个节点上设置DNS配置。
vi /etc/resolv.conf
内容如下:
search clustersmb.int nameserver 10.0.0.9
接下来配置基本的主机名解析,打开/etc/hosts文件:
vi /etc/hosts
内容如下:
127.0.0.1localhost.localdomain localhost 10.0.0.191 node1.clustersmb.intnode1 10.0.0.192 node2.clustersmb.intnode2
Ps:这里根据你的实际情况可以添加更多类似的快速解析条目。
设置好后,检查一下网络连接是否正常,首先在节点1上通过LAN接口ping节点2。
[root@node1 ~]# ping -c 2 node2 PING node2 (10.0.0.182) 56(84) bytes of data. 64 bytes from node2 (10.0.0.182): icmp_seq=1 ttl=64 time=0.089 ms 64 bytes from node2 (10.0.0.182): icmp_seq=2 ttl=64 time=0.082 ms --- node2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.082/0.085/0.089/0.009 ms
然后通过交叉接口ping节点2。
[root@node1 ~]# ping -c 2 172.16.0.2 PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data. 64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=0.083 ms 64 bytes from 172.16.0.2: icmp_seq=2 ttl=64 time=0.083 ms --- 172.16.0.2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.083/0.083/0.083/0.000 ms
一切正常,然后在节点2上通过LAN接口ping节点1。
[root@node2 ~]# ping -c 2 node1 PING node1 (10.0.0.181) 56(84) bytes of data. 64 bytes from node1 (10.0.0.181): icmp_seq=1 ttl=64 time=0.068 ms 64 bytes from node1 (10.0.0.181): icmp_seq=2 ttl=64 time=0.063 ms --- node1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.063/0.065/0.068/0.008 ms
接下来通过交叉接口ping节点1。
[root@node2 ~]# ping -c 2 172.16.0.1 PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data. 64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=1.36 ms 64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=0.075 ms --- 172.16.0.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.075/0.722/1.369/0.647 ms
配置启动选项,我将启动级别设为3。
vi /etc/inittab
修改下面这行内容,其它不变。
id:3:initdefault:
我喜欢将多余的启动服务去掉,只留下真正需要的服务,下面是我需要的服务列表。
现在需要重启两个节点,让配置生效。
Reboot
3、安装先决条件和集群程序包
在开始之前需要安装一些先决条件程序包。
yum -y install drbd82 kmod-drbd82 samba
接下来安装Red Hat集群套件。
yum -y groupinstall "Cluster Storage" "Clustering"
4、配置DRBD
首先,我们需要在两个节点上配置/etc/drbd.conf。
vi /etc/drbd.conf
内容如下:
global { usage-count yes; } common { syncer { rate 100M; al-extents 257; } } resource r0 { protocol C; startup { become-primary-on both; ### For Primary/Primary ### degr-wfc-timeout 60; wfc-timeout30; } disk { on-io-errordetach; } net { allow-two-primaries;### For Primary/Primary ### cram-hmac-alg sha1; shared-secret "mysecret"; after-sb-0pri discard-zero-changes; after-sb-1pri violently-as0p; after-sb-2pri violently-as0p; } on node1.clustersmb.int { device /dev/drbd0; disk/dev/sdb; address172.16.0.1:7788; meta-diskinternal; } on node2.clustersmb.int { device /dev/drbd0; disk/dev/sdb; address172.16.0.1:7788; meta-diskinternal; } }
配置要点:
Resource:由DRBD管理的资源,注意我们称之为“r0”。
Disk:DRBD要使用的磁盘(或磁盘分区)。
Address:DRBD要使用的IP地址和端口号(注意我们使用的是交叉接口)。
Syncer:节点间的传输速度(我们使用100M,因为我们用的是千兆网卡)。
如果要任何疑问,请参考DRBD用户指南:www.drbd.org/users-guide-emb/。
接下来我们在r0资源上创建元数据,在两个节点上执行下面的命令:
drbdadm create-md r0
接下来启动DRBD服务,创建initdb,在两个节点上执行下面的命令:
/etc/init.d/drbd start
为了让两个节点都成为主节点,在两个节点上执行下面的命令:
drbdsetup /dev/drbd0 primary -o
如果要检查同步的进度和DRBD资源的状态,查看/proc/drbd:
cat /proc/drbd
现在需要等待同步结束,根据同步数据大小和磁盘性能,这个时间可能会很长,同步结束后,我们可以查看资源r0的状态。
节点1:
[root@node1 ~]# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17 0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r--- ns:2097052 nr:0 dw:0 dr:2097052 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 oos:0
节点2:
[root@node2 ~]# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17 0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r--- ns:0 nr:2097052 dw:2097052 dr:0 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 oos:0
需要注意的是,两个服务器都是最新状态(UpToDate/UpToDate),都是主节点(Primary/Primary),有关状态的详细信息,请参考www.drbd.org/users-guide-emb/ch-admin.html#s-proc-drbd。
我们需要将DRBD服务设为随系统启动而启动。
chkconfig --level 35 drbd on
5、配置GFS
接下来需要配置Red Hat全局文件系统(GFS),它是DRBD要使用的集群文件系统,首先,我们需要在两个节点上配置/etc/cluster/cluster.conf。
vi /etc/cluster/cluster.conf
内容如下:
<?xml version="1.0\"?> <cluster name="cluster1" config_version="3"> <cman two_node="1" expected_votes="1"/> <clusternodes> <clusternode name="node1.clustersmb.int" votes="1" nodeid="1"> <fence> <method name="single"> <device name="manual" ipaddr="10.0.0.181"/> </method> </fence> </clusternode> <clusternode name="node2.clustersmb.int" votes="1" nodeid="2"> <fence> <method name="single"> <device name="manual" ipaddr="10.0.0.182"/> </method> </fence> </clusternode> </clusternodes> <fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/> <fencedevices> <fencedevice name="manual" agent="fence_manual"/> </fencedevices> </cluster>
接下来需要在两个节点上启动cman服务(同时启动)。
/etc/init.d/cman start
然后在两个节点上启动其他服务。
/etc/init.d/clvmd start /etc/init.d/gfs start /etc/init.d/gfs2 start
我们必须确保两个节点上所有服务都在系统初始化时启动。
chkconfig --level 35 cman on chkconfig --level 35 clvmd on chkconfig --level 35 gfs on chkconfig --level 35 gfs2 on
接下来在任一节点上格式化设备。
gfs_mkfs -p lock_dlm -t cluster1:gfs -j 2 /dev/drbd0
然后在两个节点上创建挂载点,并挂载drbd设备。
mkdir /clusterdata mount -t gfs /dev/drbd0 /clusterdata
在两个节点上,将设备添加到fstab中。
vi /etc/fstab
在文件后面追加:
/dev/drbd0 /clusterdatagfsdefaults0 0
接下来最好检查一下集群文件系统是否工作正常,在节点1上执行:
tar -zcvf /clusterdata/backup-test.tgz /etc/
然后在节点2上检查文件是否存在。
[root@node2 ~]# ls -l /clusterdata total 12576 -rw-r--r-- 1 root root 12844520 Jul 23 16:01 backup-test.tgz
接下来测试节点2是否可写入,在节点2上执行:
tar -zcvf /clusterdata/backup-test2.tgz /etc/
在节点1上检查两个文件是否存在。
[root@no2 ~]# ls -l /clusterdata/ total 25160 -rw-r--r-- 1 root root 12850665 Jul 23 16:03 backup-test2.tgz -rw-r--r-- 1 root root 12844520 Jul 23 16:01 backup-test.tgz
如果一切正常,我们还可以在任一节点上删除文件。
rm -f /clusterdata/backup*
6、配置Samba
Samba配置非常简单,相关教程已经很多,本文不打算详细讲解如何配置Samba,只简要介绍一些基本的配置,在两个节点上执行:
vi /etc/samba/smb.conf
内容如下:
[global] clustering = yes idmap backend = tdb2 private dir=/clusterdata/ctdb fileid:mapping = fsname use mmap = no nt acl support = yes ea support = yes [public] comment = public share path = /clusterdata/public public = yes writeable = yes only guest = yes
我们必须在任一节点上创建Samba要使用的目录。
mkdir /clusterdata/ctdb mkdir /clusterdata/public chmod 777 /clusterdata/public
在任一节点上执行下面的命令给Samba添加root用户:
smbpasswd -a root
7、配置CTDB
安装CTDB的过程很简单,首先下载它(注意,下面的操作要在两个节点上执行)。
cd /usr/src rsync -avz samba.org::ftp/unpacked/ctdb . cd ctdb/
编译
cd /usr/src/ctdb/ ./autogen.sh ./configure make make install
创建启动脚本,配置链接。
cp config/ctdb.sysconfig /etc/sysconfig/ctdb cp config/ctdb.init /etc/rc.d/init.d/ctdb chmod +x /etc/init.d/ctdb ln -s /usr/local/etc/ctdb/ /etc/ctdb ln -s /usr/local/bin/ctdb /usr/bin/ctdb ln -s /usr/local/sbin/ctdbd /usr/sbin/ctdbd
接下来在两个节点上打开/etc/sysconfig/ctdb文件。
vi /etc/sysconfig/ctdb
内容修改如下:
CTDB_RECOVERY_LOCK="/dadoscluster/ctdb/storage" CTDB_PUBLIC_INTERFACE=eth0 CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses CTDB_MANAGES_SAMBA=yes ulimit -n 10000 CTDB_NODES=/etc/ctdb/nodes CTDB_LOGFILE=/var/log/log.ctdb CTDB_DEBUGLEVEL=2 CTDB_PUBLIC_NETWORK="10.0.0.0/24" CTDB_PUBLIC_GATEWAY="10.0.0.9"
然后在两个节点上打开/etc/ctdb/public_addresses。
vi /etc/ctdb/public_addresses
内容如下:
10.0.0.183/24 10.0.0.184/24
接着在两个节点上打开/etc/ctdb/nodes。
vi /etc/ctdb/nodes
内容如下:
10.0.0.181 10.0.0.182
再在两个节点上打开/etc/ctdb/events.d/11.route。
vi /etc/ctdb/events.d/11.route
内容如下:
#!/bin/sh . /etc/ctdb/functions loadconfig ctdb cmd="$1" shift case $cmd in takeip) # we ignore errors from this, as the route might be up already when we're grabbing # a 2nd IP on this interface /sbin/ip route add $CTDB_PUBLIC_NETWORK via $CTDB_PUBLIC_GATEWAY dev $1 2> /dev/null ;; esac exit 0
给脚本设置可执行权限。
chmod +x /etc/ctdb/events.d/11.route
最后,启动相关服务。
/etc/init.d/ctdb start /etc/init.d/smb start chkconfig --level 35 ctdb on chkconfig --level 35 smb on
至此,一个Samba主动/主动集群就搭建好了。