How to create your own cdn with drbd,heartbeat,nginx,ftpd on debian

Накратко идеята – имаме си много интернет и се чудим кво да го правим 🙂 имаме и 2 машини с големи хардове и гигабитова връзка помежду си. Решаваме да обединим всичко и да си създадем свой CDN (content delivery network).

Всичко това го правим с помоща на debian linux. И така.. започваме …

Имаме машини cdn1 и cdn2 с айпи адреси 172.22.2.61/24 и 172.22.2.62/24 и 172.22.2.63 който ще използваме за връзка към cdn сървъра ни. Същи така имаме предварително подготевени дялове на всеки един от сървърите ни не форматиран с чакащи за използване 500гб.

  • /dev/sda1 за системен дял (/)
  • /dev/sda2 за нашият drbd дял, монтиран като /r1
  • /dev/sda3 за linux swap.

drbd0

Започваме с инсталирането на необходимите пакети:

apt-get install drbd8-utils heartbeat

Това го пишем и на двата сървъра.
След това и на двата сървъра отваряме /etc/drbd.conf , изтриваме всичко и въвеждаме следното:
global {
usage-count no;
}
common {
protocol C;
syncer {
rate 10M;
al-extents 257;
}
}
resource r1 {
startup {
become-primary-on cdn1;
}
disk {
on-io-error detach;
}
net {
cram-hmac-alg sha1;
shared-secret "secret";
}
on cdn1 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.22.2.61:7788;
meta-disk internal;
}
on cdn2 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.22.2.62:7788;
meta-disk internal;
}
}

Тук важното е каквото излиза при uname -n да бъде въведено като име като по-горе (cdn1,cdn2>

Сега трябва да заредим модула за drbd : modprobe drbd и да стартираме процеса : /etc/init.d/drbd start

Следва да създадем дяла който ще монтираме по мрежата. Командите са следните, и се пишат и на двата сървъра:

drbdadm create-md r1
drbdadm attach r1
drbdadm connect r1

И на cdn1(главният ни сървър) пишем:
drbdadm -- --overwrite-data-of-peer primary r1

След това ако всичко е ок, трябва да започне синхронизиране между дяловете по мрежата. Можем да проверим как върви чрез: cat /proc/drbd или /etc/init.d/drbd status
Трябва да излезе нещо такова:
version: 8.3.11 (api:88/proto:86-96)
srcversion: F937DCB2E5D83C6CCE4A6C9
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:8 nr:30711656 dw:30711608 dr:725 al:1 bm:1890 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:28053172
[=========>..........] sync'ed: 52.3% (27392/57384)Mfinish: 0:44:40 speed: 10,460 (10,240) want: 10,240 K/sec

Сега е време да създадем файлова система на дяла ни и да го монтираме като папка в сървъра ни. Пишем следното:
mkfs.ext4 /dev/drbd0
mount -t ext4 /dev/drbd0 /data

Време е и heartbeat да влезе в действие.Тук всичко трябва да се пише и на двата сървъра. Влизаме в /etc/ha.d/ и отваряме ha.cf и пишем добавяме следното:
mcast eth0 239.0.0.6 694 1 0
keepalive 2
warntime 10
deadtime 15
initdead 120
node cdn1
node cdn2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth default uid=nobody gid=haclient
apiauth ipfail uid=hacluster
apiauth ping gid=nogroup uid=nobody,hacluster
auto_failback on
ping 172.22.2.1 #нашият gateway
deadping 15
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0

Отваряме /etc/ha.d/authkeys и слагаме следното:
auth 1
1 sha1 secret

Остана да добавим и файла /etc/ha.d/haresources и да сложим следното:
cdn1 IPaddr::172.22.2.63/24/eth0 drbddisk::r1 Filesystem::/dev/drbd0::/data::ext4

и да не забравим да сложим права 0600 на файла /etc/ha.d/authkeys!
Накрая стартираме и процеса и на двата сървъра: /etc/init.d/heartbeat start

Сега за теста можем да видим че на сървъра ни cdn1 имаме вдигнати айпи адреси 172.22.2.63 и 172.22.2.61 както и монтирана директория /dev/drbd0 като /data
Ако спрем процеса heartbeat на cdn1 чрез /etc/init.d/heartbeat stop ще видим че на cdn2 освен стария ни айпи адрес 172.22.2.62 имаме вдигнат и 172.22.2.63 и директорията /data се е монтирала автоматично!
В лога на cdn2 можем да видим следното:

Aug 27 22:44:46 cdn2 heartbeat: [2466]: WARN: node cdn1: is dead
Aug 27 22:44:46 cdn2 heartbeat: [2466]: info: Dead node cdn1 gave up resources.
Aug 27 22:44:46 cdn2 heartbeat: [2466]: info: Link cdn1:eth0 dead.
Aug 27 22:44:46 cdn2 ipfail: [2495]: info: Status update: Node cdn1 now has status dead
Aug 27 22:44:48 cdn2 ipfail: [2495]: info: NS: We are still alive!
Aug 27 22:44:48 cdn2 ipfail: [2495]: info: Link Status update: Link cdn1/eth0 now has status dead
Aug 27 22:44:49 cdn2 ipfail: [2495]: info: Asking other side for ping node count.
Aug 27 22:44:49 cdn2 ipfail: [2495]: info: Checking remote count of ping nodes.

Ако стартираме процеса heartbeat на cdn1 ще видим че всичко ще се върне при него 🙂
Сега вече имаме два напълно самостоятелни сървъра които можем да използваме за хранилище на нашите данни, без да се притесняваме че единия ще падне, то другия веднага ще го замести.
Аз лично слагам на друга машина която играе като load balancer един varnish(може и nginx) който да праща виртуалния хост към локалното ни айпи 172.22.2.63. По подразбиране на двата ни cdn сървъра си инсталираме nginx и proftpd/pure-ftpd и започваме да прехвърляме информация в /data 🙂
Аз лично съветвам прехвърлянето да го направим с rsync или unison

Това е.. 🙂