NFS высокодоступное файловое хранилище drbd+pacemaker

Thank you for reading this post, don't forget to subscribe!

В нали­чие име­ет­ся 2 сервера:
nfs1 nfs2
192.168.1.130 и 192.168.1.131

пра­вим фай­лы /etc/hosts

на оба сер­ве­ра добав­ле­ны 2 дис­ка по 10 гб

cat /etc/sysctl.conf
net.ipv4.ip_forward=1
# drbd tuning
net.ipv4.tcp_no_metrics_save = 1
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 87380 33554432
vm.dirty_ratio = 10
vm.dirty_background_ratio = 4

sysctl -p

Ставим DRBD на обе ноды:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum install -y kmod-drbd84 drbd84-utils
modprobe drbd
echo drbd > /etc/modules-load.d/drbd.conf

cat /etc/drbd.d/replicated.res

[codesyntax lang="php"]

[/codesyntax]

reboot

mkfs.ext4 /dev/sdb

dd if=/dev/zero of=/dev/sdb bs=1M oflag=direct status=progress

 

НА NFS1

 

[root@nfs1 ~]# drbdadm create-md replicated

[codesyntax lang="php"]

[/codesyntax]

 

далее на NFS1 и NFS2 стартуем:

[root@nfs1 ~]# systemctl start drbd
[root@nfs2 ~]# systemctl start drbd

Про­ве­ря­ем:

 

[codesyntax lang="php"]

[/codesyntax]

 

[codesyntax lang="php"]

[/codesyntax]

 

видим что drbd0  появился.

Запус­ка­ем при­ну­ди­тель­ную репли­каю толь­ко на NFS1:

[root@nfs1 ~]# drbdadm primary replicated --force

про­ве­ря­ем статус:
[root@nfs1 ~]# cat /proc/drbd

[codesyntax lang="php"]

[/codesyntax]

созда­ём фай­ло­вую систе­му  и мон­ти­ру­ем устройство.
ТОЛЬКО НА NFS1

[root@nfs1 ~]# mkfs.ext4 /dev/drbd0
[root@nfs1 ~]# mount /dev/drbd0 /nfs/
[root@nfs1 ~]# df -h | grep drbd
/dev/drbd0 9.8G 37M 9.2G 1% /nfs

копи­ру­ем хомяк в эту директорию:

[root@nfs1 ~]# cp -r /home/* /nfs/

пере­клю­ча­ем на вто­рой nfs:

[root@nfs1 ~]# umount /nfs/
[root@nfs1 ~]# drbdadm secondary replicated

[root@nfs2 ~]# drbdadm primary replicated
[root@nfs2 ~]# mount /dev/drbd0 /nfs/
[root@nfs2 ~]# ls -lah /nfs/
total 40K
drwxr-xr-x 7 root root 4.0K Sep 12 14:32 .
dr-xr-xr-x. 19 root root 4.0K Sep 5 13:53 ..
drwx------ 3 root root 4.0K Sep 12 14:32 ansible
drwx------ 2 root root 4.0K Sep 12 14:32 ceph
drwx------ 2 root root 16K Sep 12 14:02 lost+found
drwx------ 3 root root 4.0K Sep 12 14:32 mid
drwx------ 3 root root 4.0K Sep 12 14:32 user1

воз­вра­ща­ем на пер­вый nfs1:

[root@nfs2 ~]# umount /nfs/
[root@nfs2 ~]# drbdadm secondary replicated
[root@nfs1 ~]# drbdadm primary replicated
[root@nfs1 ~]# mount /dev/drbd0 /nfs/

добав­ля­ем в автомонтирование:

cat /etc/fstab
/dev/drbd0 /nfs ext4 noatime,noauto,nobarrier 0 0

DRBD НАСТРОЕН

отме­тим что точ­но такую же настрой­ку мож­но делать и с LVM томами.

[codesyntax lang="php"]

[/codesyntax]

[codesyntax lang="php"]

[/codesyntax]

-------------- --------------------- --------------------- -------------------------

Настройка NFS сервера и NFS клиента:

ста­вим необ­хо­ди­мые пакеты:

yum install nfs-utils -y

systemctl stop nfs-lock && systemctl disable nfs-lock

------------------ ---------------------------------- ------------------------------

Ставим pacemaker на nfs1 nfs2:

yum install -y pacemaker pcs
echo "H@xorP@assWD" | passwd hacluster --stdin
systemctl start pcsd

 

НА NFS1

pcs cluster auth nfs1 nfs2 -u hacluster -p H@xorP@assWD
pcs cluster setup --start --name mycluster nfs1 nfs2

 

На nfs1 nfs2:

systemctl start corosync
systemctl enable corosync
pcs cluster start --all
pcs cluster enable --all

про­ве­ря­ем. Мастер дол­жен быть с id 1 и слейв с id2

corosync-cfgtool -s

[codesyntax lang="php"]

[/codesyntax]

 

 

на NFS1

pcs cluster cib mycluster

Отклю­чи­те поли­ти­ку кво­ру­ма и STONITH в фай­ле кон­фи­гу­ра­ции кластера.

pcs -f /root/mycluster property set no-quorum-policy=ignore
pcs -f /root/mycluster property set stonith-enabled=false
pcs -f /root/mycluster resource defaults resource-stickiness=300

 

Теперь добавим в кластер наш DRBD ресурс replicated

pcs -f /root/mycluster resource create replicated ocf:linbit:drbd drbd_resource=replicated op monitor interval=10s

Создай­те допол­ни­тель­ный ресурс кло­ни­ро­ва­ния replicated -clone, что­бы поз­во­лить ресур­су рабо­тать на обо­их узлах в одно время

pcs -f /root/mycluster resource master replicated-clone replicated master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

добав­ля­ем фай­ло­вую систе­му drbd

pcs -f /root/mycluster resource create replicated-fs Filesystem device="/dev/drbd0" directory="/nfs" fstype="ext4"

фай­ло­вая систе­ма долж­на быть запу­ще­на на том же узле, что и  replicated-clone, поскольку
служ­бы кла­сте­ра pacemaker, кото­рые рабо­та­ют на одном узле, зави­сят друг от друга/

pcs -f /root/mycluster constraint colocation add replicated-fs with replicated-clone INFINITY with-rsc-role=Master

добав­ля­ем вир­ту­аль­ный айпишник:

pcs -f /root/mycluster resource create vip1 ocf:heartbeat:IPaddr2 ip=192.168.1.136 cidr_netmask=24 op monitor interval=10s

VIP тре­бу­ет, что­бы актив­ная фай­ло­вая систе­ма рабо­та­ла, поэто­му нам нуж­но убе­дить­ся, что ресурс DRBD
стар­ту­ет до VIP

pcs -f /root/mycluster constraint colocation add vip1 with replicated-fs INFINITY
pcs -f /root/mycluster constraint order replicated-fs then vip1

про­ве­ря­ем:

pcs -f /root/mycluster resource show
pcs -f /root/mycluster constraint

[codesyntax lang="php"]

[/codesyntax]

сохра­ня­ем все изменения:

[root@nfs1 ~]# pcs cluster cib-push mycluster
CIB updated

 

теперь про­из­во­дим установку:

pcs -f /root/mycluster resource create nfsd nfsserver nfs_shared_infodir=/nfs

pcs -f /root/mycluster resource create nfsroot exportfs clientspec="192.168.1.0/24" options=rw,sync,no_root_squash directory=/nfs fsid=0

pcs -f /root/mycluster constraint colocation add nfsd with vip1 INFINITY

pcs -f /root/mycluster constraint colocation add vip1 with nfsroot INFINITY

pcs -f /root/mycluster constraint order vip1 then nfsd

pcs -f /root/mycluster constraint order nfsd then nfsroot

pcs -f /root/mycluster constraint order promote replicated-clone then start replicated-fs

pcs resource cleanup

pcs cluster cib-push mycluster

про­ве­ря­ем:

[codesyntax lang="php"]

[/codesyntax]

созда­дим дирек­то­рию и пере­клю­чим на вто­рой NFS сервер:

[root@nfs1 ~]# mkdir /nfs/TEEEEEEEEEEEEEEEEEEEESSSSSSSSSSSTTTTTT
[root@nfs1 ~]# pcs resource move replicated-fs nfs2

смот­рим на nfs2 что под­мон­ти­ро­вал­ся диск и там есть дирек­то­рия, созда­ём ещё одну дирек­то­рию и пере­клю­ча­ем всё на пер­вый nfs1

[codesyntax lang="php"]

[/codesyntax]

[root@nfs2 ~]# pcs resource move replicated-fs nfs1

[codesyntax lang="php"]

[/codesyntax]

------------------ ------------------------ ------------------

если необ­хо­ди­мо уда­лить ресурс:

обно­вить кластер:
cibadmin --query > tmp.xml
cibadmin --replace --xml-file tmp.xml

Уда­лить ресурс
pcs -f /root/mycluster resource delete db
Уда­лить кластер
pcs cluster destroy

на NFS2
drbdadm secondary all
drbdadm disconnect all
drbdadm -- --discard-my-data connect all

на NFS1
drbdadm primary all
drbdadm disconnect all
drbdadm connect all

на nfs1 nfs2
drbdadm status
cat /proc/drbd