{"id":628,"date":"2013-01-21T14:42:45","date_gmt":"2013-01-21T13:42:45","guid":{"rendered":"http:\/\/clark.tipistrani.it\/?p=628"},"modified":"2021-12-15T20:41:11","modified_gmt":"2021-12-15T19:41:11","slug":"drbd-ap-preparazione-dei-device","status":"publish","type":"post","link":"http:\/\/clark.tipistrani.it\/?p=628","title":{"rendered":"DRBD A\/P preparazione dei device"},"content":{"rendered":"<p>Premesso che come spiegato nella sezione di preparazione delle macchine ho ricompilato il kernel senza il supporto dei moduli, aggiungo qui che nella compilazione ho inserito il supporto per drbd.<br \/>\nA questo punto devo installare il software necessario per realizzare i device drb al solito e come pi\u00f9 volte specificato e sottolineato sin ora l&#8217;operazione deve essere eseguita su entrambe le macchine in successione, per pura comodit\u00e0 qui user\u00f2 solo sangiorgio, ma le stesse identiche operazioni vanno eseguite immediatamente dopo anche su perseo(l&#8217;altra macchina).<br \/>\nsangiorgio:~# apt-get -t squeeze-backports install drbd8-utils che al solito si installa e si tira dietro le necessarie dipendenze.<br \/>\nAvendo installato le utility per drbd passiamo a creare l&#8217;ambiente per poter creare e mettere in funzione i device necessari.<br \/>\nil primo passo \u00e8 mettere a posto il networking (DRBD \u00e8 RAID1 over TCP) quindi nel file \/etc\/hosts di entrambe le macchine dobbiamo avere :<\/p>\n<p>127.0.0.1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 localhost<br \/>\n192.168.2.240\u00a0\u00a0 perseo.oceano.lan\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 perseo<br \/>\n192.168.2.10\u00a0\u00a0\u00a0 cluster.oceano.lan\u00a0\u00a0\u00a0\u00a0\u00a0 cluster<br \/>\n192.168.2.239\u00a0\u00a0 sangiorgio.oceano.lan\u00a0\u00a0 sangiorgio<br \/>\n192.168.2.241\u00a0\u00a0 proxy.oceano.lan\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 proxy<br \/>\n192.168.10.239\u00a0 drbd1<br \/>\n192.168.10.240\u00a0 drbd2<\/p>\n<p>in altre parole l&#8217;IP statico delle 2 macchine e delle 2 schede di rete dedicate al DRBD<\/p>\n<p>e nel file \/etc\/networks<\/p>\n<p>default\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.0.0.0<br \/>\nloopback\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 127.0.0.0<br \/>\nlink-local\u00a0\u00a0\u00a0\u00a0\u00a0 169.254.0.0<br \/>\nlocalnet\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 192.168.2.0<br \/>\noceano.lan\u00a0\u00a0\u00a0\u00a0\u00a0 192.168.2.0<br \/>\ndrbd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 192.168.10.0<br \/>\ndmz\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 192.168.200.0<\/p>\n<p>Ovviamente i valori da aggiungere sono da tarare sulle specifiche esigenze di ogni rete e nel mio caso sono quelli dopo localnet.<\/p>\n<p>Il file che governa i device drbd \u00e8\u00a0 \/etc\/drbd.conf\u00a0 e <span style=\"text-decoration: underline;\">deve essere assolutamente uguale su entrambe le macchine<\/span>, nel mio caso contiene:<\/p>\n<p>#include &#8220;drbd.d\/global_common.conf&#8221;;<br \/>\n#include &#8220;drbd.d\/*.res&#8221;;<br \/>\nglobal {<br \/>\nusage-count yes;<br \/>\n}<\/p>\n<p>common {<br \/>\nsyncer { rate 100M; }<br \/>\n}<\/p>\n<p>resource r0 {<\/p>\n<p>protocol C;<\/p>\n<p>handlers {<br \/>\npri-on-incon-degr &#8220;echo o &gt; \/proc\/sysrq-trigger ; halt -f&#8221;;<br \/>\npri-lost-after-sb &#8220;echo o &gt; \/proc\/sysrq-trigger ; halt -f&#8221;;<br \/>\nlocal-io-error &#8220;echo o &gt; \/proc\/sysrq-trigger ; halt -f&#8221;;<br \/>\noutdate-peer &#8220;\/usr\/lib\/heartbeat\/drbd-peer-outdater -t 5&#8221;;<br \/>\npri-lost &#8220;echo pri-lost. Have a look at the log files. | mail -s &#8216;DRBD Alert&#8217; clark@oceano.lan&#8221;;<br \/>\nsplit-brain &#8220;echo split-brain. drbdadm &#8212; &#8211;discard-my-data connect $DRBD_RESOURCE ? | mail -s &#8216;DRBD Alert&#8217;clark@oceano.lan&#8221;;<br \/>\n}<br \/>\nstartup {<br \/>\nwfc-timeout\u00a0 120;<br \/>\ndegr-wfc-timeout 120;\u00a0\u00a0\u00a0 # 2 minutes.<br \/>\n#become-primary-on both;<br \/>\n}<\/p>\n<p>disk {<br \/>\non-io-error\u00a0\u00a0 detach;<\/p>\n<p>}<\/p>\n<p>net {<br \/>\nmax-epoch-size 16000;<br \/>\nmax-buffers 16000;<br \/>\nunplug-watermark 128;<br \/>\nsndbuf-size 524288;<br \/>\n#allow-two-primaries;<br \/>\nafter-sb-0pri discard-zero-changes;<br \/>\nafter-sb-1pri discard-secondary;<br \/>\nafter-sb-2pri disconnect;<br \/>\nrr-conflict disconnect;<br \/>\n}<\/p>\n<p>syncer {<br \/>\nrate 100M;<br \/>\n#al-extents 1801;<br \/>\n# 3389<br \/>\n}<br \/>\non sangiorgio {<br \/>\ndevice\u00a0\u00a0\u00a0\u00a0 \/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/dev\/sda10;<br \/>\naddress\u00a0\u00a0\u00a0 192.168.10.239:7788;<br \/>\nmeta-disk\u00a0 internal;<br \/>\n}<\/p>\n<p>on perseo {<br \/>\ndevice\u00a0\u00a0\u00a0 \/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0\u00a0 \/dev\/sda10;<br \/>\naddress\u00a0\u00a0 192.168.10.240:7788;<br \/>\nmeta-disk internal;<br \/>\n}<br \/>\n}<\/p>\n<p>vediamo in dettaglio le varie sezioni del file.<\/p>\n<p>global {<br \/>\nusage-count yes;<br \/>\n}<br \/>\nQuesta sezione si usa una sola una volta, preferibilmente nella parte superiore del file di configurazione. Tra le poche opzioni disponibili in questa sezione, solo uno \u00e8 di rilevanza per la maggior parte degli utenti:<br \/>\nusage-count yes serve in buona sostanza a crere delel statistiche<br \/>\nQuesto viene fatto contattando un server HTTP ogni volta che viene installato una nuova versione DRBD su un sistema. Questo pu\u00f2 essere disabilitato impostando uso-count no;.<br \/>\nle statistiche sono disponibili su <a href=\"http:\/\/usage.drbd.org.\">http:\/\/usage.drbd.org.<\/a><\/p>\n<p>common {<br \/>\nsyncer { rate 100M; }<br \/>\n}<\/p>\n<p>La sezione comune non e&#8217; strettamente necessaria ma e&#8217; consigliata se si hanno piu&#8217; risorse, in modo da far si che tutte le risorse configurate ereditino questa opzione nello specifico e&#8217; la velocita&#8217;<\/p>\n<p>r0<br \/>\ne&#8217; la prima risorsa e specifichiamo il modo di replicazione col protocollo C che in sostanza dice che la replicazione e&#8217; sincrona, cioe&#8217; la scrittura locale e&#8217; considerata finita solo quando si ha avuto conferma che su entrambi i nodi e&#8217; avvenuta.<br \/>\nnon mi dilungo sulla spiegazione degli handlers li potete trovare sul sito di drbd<\/p>\n<p>startup {<br \/>\nwfc-timeout\u00a0 0;<br \/>\ndegr-wfc-timeout 120;\u00a0\u00a0\u00a0 # 2 minutes.<br \/>\n#become-primary-on both;<br \/>\n}<\/p>\n<p>questa e&#8217; un&#8217;istruzione molto importante perch\u00e8 in buona sostanza dice che al boot il sistema resta in attesa di un intervento umano per poter continuare (wfc-timeout\u00a0 0;) infatti al boot quando compare la scritta waiting for e il n\u00b0 dei secondi che passa bisogna essere sulla console e digitare yes al che il boot continua senza problemi.<br \/>\nSe si mette un valore questo e&#8217; espresso in secondi e dopo il n\u00b0 di secondi indicato il boot continua per suo conto, ho lasciato disabilitata questa opzione perche&#8217; se per caso ci sono dei problemi di rete dovuti a uno switch che e&#8217; andato a $escort, piuttosto che a problemi di tensione o altro si corre il serio rischio di trovarsi con le 2 macchine che tentano di diventare primarie contemporaneamente, questo sarebbe un vero grosso guaio in quanto lo &#8220;split-brain&#8221; \u00e8 matematicamente sicuro e la probabilit\u00e0 di perdere dati altissima, pertanto preferisco che le macchine stiano ferme sino a che io o un qualcun altro che conosce la procedura sblocchi la questione quando siamo sicuri che il problema e&#8217; rientrato\/risolto.<\/p>\n<p>per la spiegazione dettagliata dei parametri sotto elencati si veda man drbdsetup<\/p>\n<p>disk {<br \/>\non-io-error\u00a0\u00a0 detach;<\/p>\n<p>}<br \/>\nserve per ottimizzare le propriet\u00e0 di drbd nei confronti dello storage di basso livello<br \/>\nnello specifico il nodo droppa il suo dispositivo di basso livello e continua in modalit\u00e0 diskless<\/p>\n<p>net {<br \/>\nmax-epoch-size 16000;<br \/>\nmax-buffers 16000;<br \/>\nunplug-watermark 128;<br \/>\nsndbuf-size 524288;<br \/>\n#allow-two-primaries;<br \/>\nafter-sb-0pri discard-zero-changes;<br \/>\nafter-sb-1pri discard-secondary;<br \/>\nafter-sb-2pri disconnect;<br \/>\nrr-conflict disconnect;<br \/>\n}<\/p>\n<p>con questa sezione diciamo alla rete come trasferire i pacchetti, imponiamo la condizione di non poter avere 2 primary e diciamo cosa fare sempre a livello di rete cosa fare in caso di split-brain<\/p>\n<p>syncer {<br \/>\nrate 100M;<br \/>\n#al-extents 1801;<br \/>\n# 3389<br \/>\n}<\/p>\n<p>si lo so che e&#8217; una condizione gi\u00e0 imposta prima ma repetita juvant \ud83d\ude42<\/p>\n<p>on sangiorgio {<br \/>\ndevice\u00a0\u00a0\u00a0\u00a0 \/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/dev\/sda10;<br \/>\naddress\u00a0\u00a0\u00a0 192.168.10.239:7788;<br \/>\nmeta-disk\u00a0 internal;<\/p>\n<p>}<\/p>\n<p>on perseo {<br \/>\ndevice\u00a0\u00a0\u00a0 \/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0\u00a0 \/dev\/sda10;<br \/>\naddress\u00a0\u00a0 192.168.10.240:7788;<br \/>\nmeta-disk internal;<br \/>\n}<br \/>\n}<\/p>\n<p>in questa sezione definiamo invece la risorsa su entrambi i nodi e pi\u00f9 precisamente il nome della risorsa (drbd0) su quale disco fisico in questo caso una partizione lavora (\/dev\/sda10),l&#8217;indirizzo della eth dedicata (ecco perch\u00e8 lo abbiamo messo anche in \/etc\/hosts), la porta su cui lavora e il tipo di meta disk.<\/p>\n<p>Ripeto una volta di pi\u00f9 che \u00e8 assolutamente essenziale procedere di pari passo su entrambe le macchine.<br \/>\n\u00c8 arrivato il momento di generare i dispositivi drbd cosa che facciamo con un:<br \/>\nsangiorgio:\/etc# drbdadm create-md r0<br \/>\nmd_offset 24996589568<br \/>\nal_offset 24996556800<br \/>\nbm_offset 24995790848<\/p>\n<p>Found ext3 filesystem<br \/>\n24410736 kB data area apparently used<br \/>\n24409952 kB left usable by current configuration<\/p>\n<p>Device size would be truncated, which<br \/>\nwould corrupt data and result in<br \/>\n&#8216;access beyond end of device&#8217; errors.<br \/>\nYou need to either<br \/>\n* use external meta data (recommended)<br \/>\n* shrink that filesystem first<br \/>\n* zero out the device (destroy the filesystem)<br \/>\nOperation refused.<\/p>\n<p>Command &#8216;drbdmeta 0 v08 \/dev\/sda10 internal create-md&#8217; terminated with exit code 40<br \/>\ndrbdadm create-md r0: exited with code 40<\/p>\n<p>Niente da fare non c&#8217;\u00e8 spazio, la cosa piu&#8217; comoda e veloce da fare \u00e8:<label for=\"yoast_wpseo_snippetpreview\"><br \/>\n<\/label>sangiorgio:\/etc# dd if=\/dev\/zero of=\/dev\/sda10 bs=1M count=128<br \/>\n128+0 record dentro<br \/>\n128+0 record fuori<br \/>\n134217728 byte (134 MB) copiati, 2,59311 s, 51,8 MB\/s<br \/>\nAttenzione con questo abbiamo distrutto filesystem e\u00a0 label del volume, quindi ritentiamo con:<br \/>\nsangiorgio:\/etc# drbdadm create-md r0<br \/>\nWriting meta data&#8230;<br \/>\ninitializing activity log<br \/>\nNOT initialized bitmap<br \/>\nNew drbd meta data block successfully created.<br \/>\nE ci siamo ovviamente ripetere la sequenza per ogni risorsa necessaria (qui una sola ma ci sono casi in cui si hanno 5\/6 dischi drbd) e altrettanto ovviamente su ambo le macchine, finita la generazione dei device rendiamoli disponibili con:<br \/>\ndrbdadm up r0 se pi\u00f9 device si pu\u00f2 usare drbdadm up all.<br \/>\nControllando con cat \/proc\/drbd vediamo che siamo nella condizione seguente:<\/p>\n<p>sangiorgio:\/etc# cat \/proc\/drbd<br \/>\nversion: 8.3.11 (api:88\/proto:86-96)<br \/>\nbuilt-in<br \/>\n0: cs:Connected ro:Secondary\/Secondary ds:Inconsistent\/Inconsistent C r&#8212;&#8211;<br \/>\nns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:24409952<br \/>\nsangiorgio:\/etc#<br \/>\n\u00e8 normale a questo punto.<\/p>\n<p>Su sangiorgio che \u00e8 la macchina principale digitiamo:<\/p>\n<p>sangiorgio:\/etc# drbdadm &#8211; &#8211; &#8211; -overwrite-data-of-peer primary r0 (al solito all se pi\u00f9 risorse)<\/p>\n<p>controllando su perseo con cat \/proc\/drbd<br \/>\nersion: 8.3.11 (api:88\/proto:86-96)<br \/>\nbuilt-in<br \/>\n0: cs:SyncTarget ro:Secondary\/Primary ds:Inconsistent\/UpToDate C r&#8212;&#8211;<br \/>\nns:0 nr:3029248 dw:3029120 dr:0 al:0 bm:184 lo:1 pe:7438 ua:1 ap:0 ep:1 wo:f oos:21380832<br \/>\n[===&gt;&#8230;&#8230;&#8230;&#8230;&#8230;] sync&#8217;ed: 12.5% (20876\/23836)Mfinish: 0:07:18 speed: 48,728 (48,856) want: 102,400 K\/sec<\/p>\n<p>sino alla fine che sar\u00e0:<\/p>\n<p>perseo:\/etc# cat \/proc\/drbd<br \/>\nversion: 8.3.11 (api:88\/proto:86-96)<br \/>\nbuilt-in<br \/>\n0: cs:Connected ro:Secondary\/Primary ds:UpToDate\/UpToDate C r&#8212;&#8211;<br \/>\nns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0<br \/>\nAvendo prima distrutto il filesystem sulle partizioni si tratta ora di ricrearlo sul device drbd0 da notarsi che un device drbd e&#8217;\u00a0 RW SOLO se primary quindi sulla macchina master in questo caso sangiorgio:<\/p>\n<p>mkfs.ext3 -L \/jumper -m1 \/dev\/drbd0<\/p>\n<p>Una volta fatto drbdadm secondary r0 e passati su perseo drbdadm primary r0 e stessa operazione sino a drbdadm secondary r0, quindi riprendere il primary su sangiorgio e montare drbd0 in \/jumper per fare il\u00a0 test di funzionamento, che molto banalmente si pu\u00f2 fare in questo modo :<\/p>\n<p>sangiorgio:\/# cd \/jumper<\/p>\n<p>sangiorgio:\/jumper# vi file1 e scrvete dentro quello che vi pare tanto per dargli dimensione diversa da 0 salvate e\u00a0 smontate \/jumper\u00a0 quindi drbdadm secondary r0, spostatevi sul nodo secondario in questo caso perseo e drbdadm primary r0 quindi mount \/dev\/drbd0 \/jumper cd jumper e con un ls vedrete che file1 \u00e8 li con un cat leggete il contenuto e quindo come controprova scrivete file2 al solito con dimensione idversa da 0 e rifate alla rovescia loperazione con ls vedrete sia file1 che file2.<\/p>\n<p>Il vostro DRBD funziona ed \u00e8 ora di dire alle macchine di montarlo quando serve (anche se in teoria non dovrebbe essere necessario) editiamo il file \/etc\/fstab e aggiungiamo questa riga :<\/p>\n<p>\/dev\/drbd0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/jumper\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ext3\u00a0\u00a0\u00a0 defaults,noauto\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/p>\n<p>Con questo abbiamo finito il discorso drbd e possiamo passare a Heartbeat.<\/p>\n<div id=\"link64_adl_tabid\" style=\"display: none;\" data-url=\"http:\/\/clark.tipistrani.it\/wp-admin\/post.php?post=628&amp;action=edit\">248<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Premesso che come spiegato nella sezione di preparazione delle macchine ho ricompilato il kernel senza il supporto dei moduli, aggiungo qui che nella compilazione ho inserito il supporto per drbd. A questo punto devo installare il software necessario per realizzare i device drb al solito e come pi\u00f9 volte specificato e sottolineato sin ora l&#8217;operazione [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,8,14,6],"tags":[],"class_list":["post-628","post","type-post","status-publish","format-standard","hentry","category-cluster","category-linux","category-networking","category-work"],"_links":{"self":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=628"}],"version-history":[{"count":12,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/628\/revisions"}],"predecessor-version":[{"id":1278,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/628\/revisions\/1278"}],"wp:attachment":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=628"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}