{"id":283,"date":"2021-10-31T10:05:53","date_gmt":"2021-10-31T08:05:53","guid":{"rendered":"https:\/\/jochem.jochemenbianca.nl\/?p=283"},"modified":"2021-10-31T10:05:53","modified_gmt":"2021-10-31T08:05:53","slug":"clusteren-met-corosync-en-pacemaker","status":"publish","type":"post","link":"https:\/\/jochem.jochemenbianca.nl\/?p=283","title":{"rendered":"Clusteren met Corosync en Pacemaker"},"content":{"rendered":"<p>Afgelopen week ben ik bezig geweest met het uitzoeken hoe Corosync werkt. Ik had namelijk een 2 node cluster nodig om een iSCSI lun via NFS aan de buitenwereld aan te bieden. Corosync met Pacemaker is daar een goede kandidaat voor.<br \/>\nIk heb een aantal VM&#8217;s geinstalleerd. 2 voor het cluster (node1, de primary en node2, de secondary) en een aantal voor een Ceph cluster voor de iSCSI koppeling, allen met Ubuntu 20.04LTS.<br \/>\nNadat Ubuntu en het Ceph cluster geinstalleerd is en het netwerk geconfigureerd gaan we de cluster software installeren.<br \/>\nAls eerste voeren we op beide de installatie voor pacemaker en corosync uit. Corosync is een dependancy\u00a0 van pacemaker.<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo dpkg-reconfigure tzdata\r\nsudo apt-get update\r\nsudo apt-get -y install ntp\r\nsudo apt-get install pacemaker<\/code><\/pre>\n<p>Daarna zorgen we ervoor dat de 2 nodes veilig met elkaar kunnen communiceren. Dit doen we door op node1 de volgende commando&#8217;s te gebruiken.<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo apt-get install haveged\r\nsudo corosync-keygen\r\nsudo scp \/etc\/corosync\/authkey username@node2:\/etc\/corosync\/\r\n<\/code><\/pre>\n<p>Op node2 moeten we dan nog de volgende instellingen doen<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo chown root: \/etc\/corosync\/authkey\r\nsudo chmod 400 \/etc\/corosync\/authkey<\/code><\/pre>\n<p>En vervolgens op beide nodes<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo vim \/etc\/corosync\/corosync.conf<\/code><\/pre>\n<p>In dit bestand moet hetvolgende komen te staan. het <code>&lt;private_binding_IP_address&gt;<\/code>is het cluster adres. Deze &#8220;hopt&#8221; tussen de nodes. Ook dien je nog de ipadressen van de nodes aan te passen.<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>totem {\r\n  version: 2\r\n  cluster_name: lbcluster\r\n  transport: udpu\r\n  interface {\r\n    ringnumber: 0\r\n    bindnetaddr: &lt;private_binding_IP_address&gt;\r\n    broadcast: yes\r\n    mcastport: 5405\r\n  }\r\n}quorum {\r\n  provider: corosync_votequorum\r\n  two_node: 1\r\n}nodelist {\r\n  node {\r\n    ring0_addr: &lt;IP_address_node1&gt;\r\n    name: primary\r\n    nodeid: 1\r\n  }\r\n  node {\r\n    ring0_addr: &lt;IP_address_node2&gt;\r\n    name: secondary\r\n    nodeid: 2\r\n  }\r\n}logging {\r\n  to_logfile: yes\r\n  logfile: \/var\/log\/corosync\/corosync.log\r\n  to_syslog: yes\r\n  timestamp: on\r\n}<\/code><\/pre>\n<p>Daarna gebruiken we de volgende commando&#8217;s op beide nodes om een service te maken:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo mkdir -p \/etc\/corosync\/service.d\r\nsudo vim \/etc\/corosync\/service.d\/pcmk<\/code><\/pre>\n<p>Met daarin als inhoud<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>service {\r\n  name: pacemaker\r\n  ver: 1\r\n}<\/code><\/pre>\n<p>En<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo vim \/etc\/default\/corosync<\/code><\/pre>\n<p>Waarin we het volgende toevoegen<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>START=yes<\/code><\/pre>\n<p>Nu is het cluster voorbereid en kunnen we gaan testen of het werkt:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo systemctl start corosync\r\nsudo corosync-cmapctl | grep members<\/code><\/pre>\n<p>Om te zorgen dat pacemaker en corosync in de goede volgorde starten bij een reboot geven we weer op beide nodes het volgende commando<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>sudo update-rc.d pacemaker defaults 20 01\r\nsudo systemctl start pacemaker<\/code><\/pre>\n<p>Nu is je cluster gemaakt. Dit cluster werkt met resources. Beheren van het cluster doe je met crm. Hieronder staan dus een aantal commando&#8217;s om resources toe te voegen, je cluster status te bekijken en resources te verwijderen. Editen van resources kan (ook) met het commando:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm configure edit <\/code><\/pre>\n<p>Een iSCSI mountpoint configureren:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm configure primitive mnt_nfs ocf:heartbeat:Filesystem \\\r\nparams device=\"\/dev\/mapper\/&lt;iscsidisk&gt;\" directory=\"\/mnt\/iscsi\" \\\r\nfstype=\"ext3\" op start interval=\"0\" timeout=\"120\" op monitor \\\r\ninterval=\"60\" timeout=\"60\" OCF_CHECK_LEVEL=\"20\" op stop interval=\"0\" timeout=\"240\" <\/code><\/pre>\n<p>Een NFS export configuren:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm configure primitive mnt_nfs_export ocf:heartbeat:exportfs \\\r\nparams fsid=10 directory=\"\/mnt\/iscsi\" \\\r\noptions=\"rw,no_root_squash,subtree_check\" clientspec=&lt;ip_of_nfs_client&gt; \r\n<\/code><\/pre>\n<p>En we configureren een group, zodat dit alles bij elkaar blijft:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm configure group &lt;group_name&gt; mnt_nfs mnt_nfs_export meta target-role=\"Started\"<\/code><\/pre>\n<p>Nu zou je vanaf vanaf het hierboven gespecificeerde <code>&lt;ip_of_nfs_client&gt;<\/code> moeten kunnen connecten met het cluster via het <code>&lt;private_binding_IP_address&gt;<\/code> adres.<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>mount &lt;private_binding_IP_address&gt;:\/mnt\/iscsi \/mnt\/nfs-external<\/code><\/pre>\n<p>Om resources te stoppen gebruik je op node1 of node2 het commando<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm resource stop &lt;resource_name&gt; <\/code><\/pre>\n<p>En om resources te verwijderen het commando<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>crm configure delete &lt;resource_name&gt;<\/code><\/pre>\n<p>Tot zover het maken van een redelijk simple cluster.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Afgelopen week ben ik bezig geweest met het uitzoeken hoe Corosync werkt. Ik had namelijk een 2 node cluster nodig om een iSCSI lun via NFS aan de buitenwereld aan te bieden. Corosync met Pacemaker is daar een goede kandidaat voor. Ik heb een aantal VM&#8217;s geinstalleerd. 2 voor het [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,3],"tags":[],"class_list":["post-283","post","type-post","status-publish","format-standard","hentry","category-corosync","category-open-source"],"_links":{"self":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=283"}],"version-history":[{"count":3,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/283\/revisions"}],"predecessor-version":[{"id":286,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/283\/revisions\/286"}],"wp:attachment":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}