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

Originally published at: https://root.bg/tutorials/create-cdn-drbdheartbeatnginxftpd-debian/

Накратко идеята - имаме си много интернет и се чудим кво да го правим :slight_smile: имаме и 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|475x467](upload://eoxJqLCrvxaqv3Jwsyh2M21NaFZ.png)

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

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

Това е… :slight_smile: