How to nginx reverse proxy cluster

V tomto navode sa pozreme na konfiuracie vysoko dostopneho reverzneho proxy postaveneho na NGINX. Na riesenie bude pouzity pacemaker stack a samotny nginx.

Pacemaker stack
V súčasnosti predstavuje najpouživanejší nástroj na realizáciu klastra s otvoreným zdrojovým kódom. Pacemaker stack spája dve samostatné služby Corosync a Pacemaker. Corosync je správcu klastra a je zodpovedný za členstvo uzlov v klastri. Pacemaker je správca zdrojov klastra a je mozog celého klastra, ktorý spracováva a reaguje na udalosti týkajúce sa klastra.

Corosync
Služba ktorá zabezpečuje základnú komunikáciu medzi uzlami klastra. Corosync používa protokol totem na sledovanie dostupnosti ostatných uzlov. Uzly si medzi sebou v stanovenom intervale posielajú token (uzol potvrdzuje prijatie tokenu a posiela nový), aby uzol vedel o dostupnosti zvyšných uzlov v klastri. Ak uzol po uplynutí stanoveného krátkeho časového intervalu nedostane naspäť token, uzol je vyhlásený za stratený. Akonáhle je uzol vyhlásený za stratený, zostávajúce uzly vytvárajú nový klaster. Ak zostane dostatočný počet uzlov na vytvorenie kvóra (nadpolovičná väčšina), nový klaster pokračuje v poskytovaní služieb. V prípade dvoj uzlového klastra je kvórum vypnuté a obidva uzly môžu pracovať samostatne. Samotný corosync sa stará iba o členstvo uzlov v klastri, posielaní správ (tokenov) medzi uzlami a kvórum. Čo sa stane po vytvorení nového klastra má na starosti správca zdrojov

Pacemaker
Pokročilý, škálovateľný správca zdrojov pre vysoko dostupné riešenia klastra. Pacemaker beží nad komunikačnou vrstvou klastru Corosync. Podporuje “N-uzlový” klaster s pokročilými možnosťami pre správu zdrojov. Pacemaker slúži na inicializáciu a správu služieb pri zmene stavu klastra. Umožňuje aj periodické monitorovanie zdrojov.

Instalacia
Ako prove nainstalujeme softver s oficialneho repo na obidva uzly.

# yum install pcsd corosync pacemaker pcs-snmp fence-agents-vmware-soap nginx

Vytvorenie klastra
Ako prve skontrolujeme ze obidva uzly maju nastaveny spravny cas, idealne pouzivat ntp client a skontrolujeme ze existuje spravny dns zaznam pripadne maju zaznal ulozeny v subore /etc/hosts
Nastavime heslo uzivalelovi hacluster na obidvoch uzloch. Tymto uctom konfigurejeme cluster pouzitim nastroja pcs

# passwd hacluster

Po nastaveni hesla na uzle z kotreho ideme konfigorovat klaster prevedieme autentifikaciu obidvoch uzlov.

# pcs cluster auth lb-01.dubnik.sk lb-02.dubnik.sk

Teraz mozeme vytvorit klaster. Tento prikaz vytvori konfiguracny subor /etc/corosync/corosync.conf. Ak potrebujeme nieco zmenit mozeme dat dolpnujuce parametre do prikazu, pripadne rucne zeditovat spominany conf subor.

# pcs cluster setup --name lb-cluster  lb-01.dubnik.sk lb-02.dubnik.sk

Teraz mozeme inicializovat a spustit cluster

# pcs cluster start --all

V tomto stadiu je vytvoreny klaster uzly spolu komikuju posielanum tokenov ale samotny kalster nic nerobi. Na to aby klaster plnil nejaku ulohu musim nakonfigurovat zdroje. V pripade vysoko dostupneho reverzenho proxy v rezime active/passive potrebujeme plavajucu ip adresu a sluzbu nginx. Oba zdroje budu aktivne vzdy iba na jednom uzle. Este predtym je vsak potrebne zabezpecit fencing teda ohradenie uzla. Ohradenie je súbor metód ako dočasne vylúčiť uzol z klastra a zabrániť tak poškodeniu
zdieľaných dát. Za normálnych okolnosti uzly spolu komunikujú a vymieňajú si medzi seboutoken a dávajú si vedieť že uzol je dostupný a zdravý. Ak však nastane výpadok uzla a uzol v klastri nedostane v dohodnutom čase odpoveď pokúsi sa neodpovedajúci uzol ohradiť.V momente keď uzol stratí token zostávajúci členovia klastra nevedia v akom stave je neodpovedajúci uzol a preto ho treba zastaviť. Najčastejším spôsobom je reštart systému. Na ohradenie existuje cela rada nastrojov ako iLO, IMM, APC atd. V mojom pripade bezia nginx servery v prostredi vsphere od vmware-u a preto pouzijem agent vmware-soap.
Vytvorime teda zdroje na ohradenie uzlov, pre kazdy uzol jeden zdroj.

pcs stonith create lb-01-vmware-fence fence_vmware_soap ipaddr=vcenter.dubnik.sk ipport=443 ssl=1 ssl_insecure=1 login=administrator@vcenter.dubnik.sk passwd=passw0rd pcmk_host_map="lb-01.dubnik:lb01"
pcs stonith create lb-02-vmware-fence fence_vmware_soap ipaddr=vcenter.dubnik.sk ipport=443 ssl=1 ssl_insecure=1 login=administrator@vcenter.dubnik.sk passwd=passw0rd pcmk_host_map="lb-02.dubnik.sk:lb02"

Konfiguracia je priamociara a jednotlive direktivy hovoria sami za seba. Direktiva pcmk_host_map mapuje hostname (ktory bol pouzity pri vytvoreni clustera) a meno VM vo vcentry. Po vytvoreni nastavime obmedzenia aby sa zdroje spustali primarne na uzloch ku ktorym patria.

#pcs constraint location lb-01-vmware-fence prefers lb-01.dubnik.sk INFINITY
#pcs constraint location lb-02-vmware-fence prefers lb-02.dubnik.sk INFINITY

Po vytvoreni skontrolujeme ci zdroje bezia a ci su na spravnom uzle

[root@lb-01 ~]# pcs status | grep -i fence
 lb-01-vmware-fence	(stonith:fence_vmware_soap):	Started lb-01.dubnik.sk
 lb-02-vmware-fence	(stonith:fence_vmware_soap):	Started lb-02.dubnik.sk

Ak zdroje na ohradenie uspesne bezia dporucujem vyskusat aj manunalne ohradenie oboch uzlov nasedujicim prikazom. Uzol bude ohradeny a dojde k restartu uzla.

pcs stonith fence lb-02.dubnik.sk
Node: lb-02.dubnik.sk fenced

A mozeme vidiet aj vo vcentry ze VM bola restartnuta na poziadanie.

Teraz je prvotna konfiguracia klastra pre spravne fungovanie dokoncena a mozeme pridat sluzby aby nas klaster aj realne nieco robil.Vysoká dostupnosť klastra je realizovaná plávajúcou virtuálnou adresou. Aktivny uzol ma priradenu tuto adresu a na tuto adresu je smerovana http/s komunikacia. V pripade vypadku aktivneho uzla si IP adresu prevezme povodne pasivny uzol a stane sa aktivnym. Vytvorime zdroj pre virtualnu IP adresu.

# pcs resource create lb_virtual_ip ocf:heartbeat:IPaddr2 ip=10.20.20.15 cidr_netmask=24 op monitor interval=20s

Ako dalsi zdroj vytvorime spustenie sluzby nginx

# pcs resource create lb_nginx_service systemd:nginx op monitor interval=20s

Teraz zostava nastavit obmedzenia aby sa zdroje spusali spolocne a vzdy iba na jednom uzle. Vyhodne je vytvorit skupinu zdrojov ktora definuje zdroje ktore maju bezat spolu a zabezpeci aj spravne poradie spustenia.

# pcs resource group add lb_resource_group lb_virtual_ip lb_nginx_service

A nastavime obmedzeie pre skupinu aby primarne bezala na uzle lb-01.

# pcs constraint location lb_resource_group prefers lb-01.dubnik.sk INFINITY

Tymto je konfiguracua klastra dokoncena a stav klastra mozeme skontrolovat oblubenym prikazom

Cluster name: lb-cluster
Stack: corosync
Current DC: metoo-ba-vmlx-lb-02.metoo.sk (version 1.1.19-8.el7_6.1-c3c624ea3d) - partition with quorum
Last updated: Mon Dec 24 00:19:02 2018
Last change: Thu Dec 20 23:17:10 2018 by hacluster via crmd on metoo-ba-vmlx-lb-02.metoo.sk

2 nodes configured
4 resources configured

Online: [ lb-01.dubnik.sk lb-02.dubnik.sk ]

Full list of resources:

 lb-01-vmware-fence	(stonith:fence_vmware_soap):	Started lb-01.dubnik.sk
 lb-02-vmware-fence	(stonith:fence_vmware_soap):	Started lb-02.dubnik.sk
 Resource Group: lb_resource_group
     lb_virtual_ip	(ocf::heartbeat:IPaddr2):	Started lb-01.dubnik.sk
     lb_nginx_service	(systemd:nginx):	Started lb-01.dubnik.sk

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Na zaver doporucujem otestovat klaster nejakymi nahodnymi restartami uzlov aby sme mali prehlad o tom ako sa klaster sprava. V kazdom pripade by sa mal vzdy zotavit.

Tomcat Load Balancing

Kedze som sa zacal ucit na skusku RHCE v7 tak tento clanok bude uz na najnovsej verzii centosu. A novinka v dalsich clankoch bude zapnuty firewall aj selinux nakolko potrebujem ziskat trosku prax.Kratke oveview k dnesnej teme je ze v praci mame dochadzkovy sytem napisany v jave a potreboval som zabezpecit vysoky dostupnost tak sa pozrime ako na to.Budeme potrbovat tri vmky, jeden loadbalancer a dva aplikacne tomcat serveriky.V tomto pripade bude spof loadbalancer ale ako zabezpecit HA pre loadbalancer sa nachadza na inom mieste.

lb      - lb.dubnik.local      192.168.122.120
tomcat1 - tomcat1.dubnik.local 192.168.122.101
tomcat2 - tomcat2.dubnik.local 192.168.122.200

Ako prve si nakonfigureme apliakcne servery tomcat.Ako prve nainstalujeme potrebny software.

tomcat1#yum install tomcat

Z nejakeho dovodu tomcat pocuva default na ipv6 adresach, kedze mi sa ipv6 nejdem zaoberat, vypneme v systeme ipv6

tomcat1#echo net.ipv6.conf.all.disable_ipv6 = 1 >> /etc/sysctl.conf
tomcat1#echo net.ipv6.conf.default.disable_ipv6 = 1 >> /etc/sysctl.conf
tomcat1#echo net.ipv6.conf.lo.disable_ipv6 = 1 >> /etc/sysctl.conf
tomcat1#systemctl -p

Upravime tomcat server.xml riadok 104

Engine name="Catalina" defaultHost="localhost"  jvmRoute="node01

jvmRoute je nazov workera ktory definujeme na loadbalancery
To je na strane tomcatu vsetko. Este spustime aplikaciu, nastavime fw a zabezpecime spustanie po starte.

tomca1#systemctl enable tomcat
tomcat1#firewall-cmd --add-port=8080/tcp
tomcat1#firewall-cmd --add-port=8009/tcp
tomcat1#systemctl start tomcat

Ak je vsetko v poriadku mali by sme vediet otvorit java apliackiu pomocou naseho aplikacneho server.Mozeme vytovrit adresar v /usr/share/tomcat/webapps napriklad test a vytvorit nasledujci subor index.jsp
Ked otovirme nasu stranku v prehliadaci mali by sme viediet testovaciu stranku s nasim hostname.Toto iste zopakujeme aj pre node2 akurat v konfiguracii tomcatu nastavime
jvmROute na node2.

Teraz si nakonfigurujeme load balancer ktorym bude apache a mod_jk.Nainstauljeme potrebny software.

lb# yum install httpd httpd-devel apr apr-devel apr-util apr-util-devel gcc gcc-c++ make

Zo stanky tomcatu si stahneme module mod_jk a nainstalujeme.

lb#tar xvfz tomcat-connectors-1.2.41-src.tar.gz 
lb#cd tomcat-connectors-1.2.41-src/native
lb#./configure  --with-apxs=/usr/bin/apxs 
lb#make
lb#make install

Teraz nakonfiguruje na napachovi virtual hosta s mod_jk, ktory bude sluzit na samostatny load-balancing

@lb# cat /etc/httpd/conf.d/mod_jk.conf 
LoadModule jk_module "/usr/lib64/httpd/modules/mod_jk.so" 
JkWorkersFile "/etc/httpd/conf.d/worker.properties" 
JkLogFile "/var/log/httpd/mod_jk.log" 
JkLogLevel emerg

#NameVirtualHost *:80
 
ServerName  app.dubnik.local 
JkMount /* bal1
RewriteEngine On

A ako posledne nam zostava nastavit woreker properties kde uz definujeme nase aplikacne beckendy.

lb# cat /etc/httpd/conf.d/worker.properties
worker.list = bal1,stat1

worker.bal1.type=lb
worker.bal1.sticky_session=1
worker.bal1.balance_workers=node01,node02 

worker.stat1.type=status

worker.node01.type=ajp13 
worker.node01.host=tomcat1.dubnik.local
worker.node01.port=8009
worker.node01.lbfactor=10

worker.node02.type=ajp13
worker.node02.host=tomcat2.dubnik.local
worker.node02.port=8009
worker.node02.lbfactor=10

Teraz uz len spustime apacha nastavie fw a otestujeme funkcnost redirektu na tomcat servery.

lb#systemctl enable httpd
lb#firewall-cmd --add-service=http
lb#systemctl start http

Percona XtraDB Cluster

Percona predstavuje jedoduchy, high-performance cluster pre MySQL.V tomto návode sa pozrieme ako si postaviť HA, Load balanced MySQL cluster.V našom príklade si postavíme 2-nodový.

10.10.70.200 – haproxy -load balancer
10.10.70.201 – percona1 -db1
10.10.70.202 – percona2 -db2

Ako prvé si nainštalujeme percona repozitár odkiaľ si nainsštaujeme potrebné balíčky pre XtraDB Cluster

[root@db1]#rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
[root@db1]#yum install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client

Individuálne nody by mali byť nastavené aby boli schopné bootstrapu (Bootstrap -počiatočna inicializácia clustra, Bootstrapom nastavíme ktorá noda obsauje správne dáta a s tuto nodou sa budú ostatné synchronizovať pomocou SST).
Nastavenie mysql konfigu pre prvú nodu:

 
[root@percona1 ~]# cat /etc/my.cnf 
[mysqld]

 max_connect_errors=4294967295

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Cluster connection URL contains the IPs of node#1, node#2 
wsrep_cluster_address=gcomm://10.10.70.201,10.10.70.202

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #1 address
wsrep_node_address=10.10.70.201

# SST method
wsrep_sst_method=xtrabackup

# Cluster name
wsrep_cluster_name=my_centos_cluster

# Authentication for SST method
wsrep_sst_auth="sstuser:s3cret"


[mysqld_safe]
log-error=/var/log/mysqld.log

Teraz môžeme spustiť prvú nodu následovným príkazom

[root@percona1 ~]# /etc/init.d/mysql start --wsrep-cluster-address="gcomm://
Starting MySQL (Percona XtraDB Cluster).. SUCCESS! 

Tento príkaz spúšta cluster s inicializačnou “wsrep_cluster_address” nastavenou na gcomm://.Týmto je cluster “bootstrapnuty” a v prípade reštartu alebo pádu nejakej nody nebude potrebná úprava configu.
Ak máme spustenú prvú nodu môžeme skontrolovať stav clustru.

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | 906b6679-35a4-11e3-a26e-a37f7e1d26ad |
| wsrep_protocol_version     | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cert_index_size      | 0                                    |
| wsrep_causal_reads         | 0                                    |
| wsrep_incoming_addresses   | 10.10.70.201:3306                    |
| wsrep_cluster_conf_id      | 1                                    |
| wsrep_cluster_size         | 1                                    |
| wsrep_cluster_state_uuid   | 906b6679-35a4-11e3-a26e-a37f7e1d26ad |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| wsrep_local_index          | 0                                    |
| wsrep_provider_name        | Galera                               |
| wsrep_provider_vendor      | Codership Oy     |
| wsrep_provider_version     | 2.7(r157)                            |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.00 sec)

Ešte nastavíme heslo pre administrátora db

mysql> UPDATE mysql.user SET password=PASSWORD("Passw0rd") where user='root';
mysql> FLUSH PRIVILEGES;

a aby sme mohlo zabezpečit SST transfer medzdi nodami musime pridať usera s príslušnými právami.

mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;

Pre SST transfer môže byť použitž aj root, ale z bezpečnostných dôvodov sa to nedoporučuje.
Teraz si nastavíme druhú nodu

[root@percona2 ~]# cat /etc/my.cnf 
[mysqld]

max_connect_errors=4294967295

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.10.70.201,10.10.70.202

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #2 address
wsrep_node_address=10.10.70.202

# Cluster name
wsrep_cluster_name=my_centos_cluster

# SST method
wsrep_sst_method=xtrabackup

#Authentication for SST method
wsrep_sst_auth="percona:s3cret"


[mysqld_safe]
log-error=/var/log/mysqld.log

A spustíme službu

[root@percona2 ~]# /etc/init.d/mysql start
Starting MySQL (Percona XtraDB Cluster)... SUCCESS! 

Po tom ako bol service spustený mal by obdržať autoaticky transfer snapshotu.To znamená že druhá noda už nebude mať práznde heslo pre roota.Ale po tranfere bude použitý tenistý ako pre prvú nodu.Opáť skontrolujem stav clustru tentokrát z druhej nody.

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | 906b6679-35a4-11e3-a26e-a37f7e1d26ad |
| wsrep_protocol_version     | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cert_index_size      | 0                                    |
| wsrep_causal_reads         | 0                                    |
| wsrep_incoming_addresses   | 10.10.70.201:3306                    |
| wsrep_cluster_conf_id      | 2                                   |
| wsrep_cluster_size         | 2                                    |
| wsrep_cluster_state_uuid   | 906b6679-35a4-11e3-a26e-a37f7e1d26ad |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| wsrep_local_index          | 0                                    |
| wsrep_provider_name        | Galera                               |
| wsrep_provider_vendor      | Codership Oy     |
| wsrep_provider_version     | 2.7(r157)                            |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.00 sec)

Tento výstup nam jasne ukazuje ze cluster bol úspešne rozšíreny o ďalšiu nodu.Rovnakým spôsobom môžeme pridávať ďalšie nody do clustra. Na záver si ešte skontrolujem či nám funguje správne replikácia.Na prvej node si vytvoríme tabuľku a skontrolujeme či sa objaví aj na druhej.

[root@percona1]# mysql -uroot -pPassw0rd
mysql> CREATE DATABASE percona;
Query OK, 1 row affected (0.00 sec)
[root@percona2]# mysql -uroot -pPassw0rd
mysql> use percona;
Database changed
mysql> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO percona.example VALUES (1, 'percona1');
Query OK, 1 row affected (0.01 sec)
[root@percona1]# mysql -uroot -pPassw0rd
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
|       1 | percona1  |
+---------+-----------+
1 row in set (0.00 sec)

Tento malý príklad nám ukazuje že nody v clustry su synchronizované a pracujú ako očakávame.

GFS2 cluster

V tomto navode si nastavime zdeilany file sysytem GFS2 vo vmware.Ako prve si pripojime 2 disk k
obidovm virtualnym masinam podla tohto navodu.

10.0.2.11 gfs1
10.0.2.12 gfs2

Na gfs1 si vytvorim particiu /dev/sdb1

#fdisk -l
Disk /dev/sda: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         783     6289416   83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1305    10482381   83  Linux



Teraz si mozeme overit spravnost pripojenia 1ho disku k obidvom masinam, tym ze na gfs 2 by nam mal dat fdisk -l rovnaky vystup ako na gfs1.



Nainstalujeme si potrebne programy pre pracu s gfs

#yum -y install modcluster rgmanager gfs2-utils lvm2-cluster cman



Vytvorime si cluster na gfs1

#ccs_tool create gfscluster



Cluster mame vytvoreny teraz treba pridat fencing devices.Co znamena ze v pripade vypadku jedneho
zo serverou dojde k “ohradeniu” poskodeneho servera aby nemal pristup k datam na disku a nedoslo k ich poskodeniu.VMware ma vlastne fencing devicy ale v tomto navode si spravimde jednoduchy manual fencing.

#ccs_tool addfence -C gfs1_ipmi fence_manual
#ccs_tool addfence -C gfs2_ipmi fence_manual



Teraz ked sme pridali fencing devicy pridame nody

#ccs_tool addnode -C gfs1 -n 1 -v 1 -f gfs1_ipmi
#ccs_tool addnode -C gfs2 -n 1 -v 1 -f gfs2_ipmi



Skopirujeme si konfiguracny subor na 2hy server.

#scp /etc/cluster/cluster.conf root@gfs2:/etc/cluster/cluster.conf



Overime si konfiguracou nodov na obidvoch serveroch

#ccs_tool lsnode
Cluster name: gfscluster, config_version: 1

Nodename                        Votes Nodeid Fencetype
web1.virtual.net                   1    1    web1.virtual.net_ipmi
web2.virtual.net                   1    2    web2.virtual.net_ipmi


#ccs_tool lsfence
Name             Agent
web1.virtual.net_ipmi fence_manual
web2.virtual.net_ipmi fence_manual



Teraz mozeme spustut cluster daemonov na obidvoch nodach

#service cman start
Starting cluster: 
   Loading modules... done
   Mounting configfs... done
   Starting ccsd... done
   Starting cman... done
   Starting daemons... done
   Starting fencing... done
                                                           [  OK  ]


#service rgmanager start
Starting Cluster Service Manager:                          [  OK  ]



Skontrolujeme status clusteru nasledujucimi prikazmi

#clustat
Cluster Status for gfscluster @ Tue Apr 13 15:42:04 2010
Member Status: Quorate

 Member Name                                                     ID   Status
 ------ ----                                                     ---- ------
 web1.virtual.net                                                    1 Online, Local
 web2.virtual.net                                                    2 Online


#cman_tool status
Version: 6.2.0
Config Version: 5
Cluster Name: gfscluster
Cluster Id: 41396
Cluster Member: Yes
Cluster Generation: 28
Membership state: Cluster-Member
Nodes: 2
Expected votes: 2
Total votes: 2
Quorum: 2  
Active subsystems: 8
Flags: Dirty 
Ports Bound: 0 177  
Node name: web1.virtual.net
Node ID: 1
Multicast addresses: 239.192.161.86 
Node addresses: 10.0.2.21



Predtym ako vytvarime lvm2 volume musime si zaput podporu clusteringu v lvm2
Na obidvoch serveroch spustime

#lvmconf --enable-cluster

A spustime aj daemona ktory sa stara o cluster lvm na obidvoc nodach

#service clvmd start



Teraz je cas vytvorit lvm2 volumes

# pvcreate /dev/sdb1
 Physical volume "/dev/sdb1" successfully created


# vgcreate vg_gfs /dev/sdb1
 Clustered volume group "vg_gfs" successfully created


#lvcreate -L9G -nlv_gfs vg_gfs
  Logical volume "lv_gfs" created



Ak mame lvm2 volumes vytvorene treba vytvorit GFS2 file system
mkfs -t -p -t : -j

# mkfs -t gfs2 -p lock_dlm -t gfscluster:lv_gfs -j 2 /dev/mapper/vg_gfs-lv_gfs 
Are you sure you want to proceed? [y/n] y

Device:                    /dev/mapper/vg_gfs-lv_gfs
Blocksize:                 4096
Device Size                9.00 GB (2359296 blocks)
Filesystem Size:           9.00 GB (2359294 blocks)
Journals:                  2
Resource Groups:           36
Locking Protocol:          "lock_dlm"
Lock Table:                "gfscluster:lv_gfs"
UUID:                      258C998A-30DE-AC0C-D52E-ED47F244D03A



Tak a teraz si mozeme moutnu gfs2 file system.

#mkdir /mnt/gfs
#mount /dev/mapper/vg_gfs-lv_gfs /mnt/gfs



Ked mame moutnuty GFS2 file system mozeme otestovat nasledujucimi prikazmi

#gfs2_tool list
253:0 gfscluster:lv_gfs


#gfs2_tool df
/mnt/gfs:
  SB lock proto = "lock_dlm"
  SB lock table = "gfscluster:lv_gfs"
  SB ondisk format = 1801
  SB multihost format = 1900
  Block size = 4096
  Journals = 2
  Resource Groups = 36
  Mounted lock proto = "lock_dlm"
  Mounted lock table = "gfscluster:lv_gfs"
  Mounted host data = "jid=0:id=196609:first=1"
  Journal number = 0
  Lock module flags = 0
  Local flocks = FALSE
  Local caching = FALSE

  Type           Total Blocks   Used Blocks    Free Blocks    use%           
  ------------------------------------------------------------------------
  data           2359028        66195          2292833        3%
  inodes         2292850        17             2292833        0%

Na zaver pridame cluster servicy do prislusnych runlevelov aby sa nam spustali pri starate

#chkconfig cman on
#chkconfig rgmanager on
#chkconfig clvmd on
#chkconfig gfs on



Troubleshooting:
Zopár tipov ako fixnuť problémy, ktoré sa môžu vyskytnúť počas konfigurovania.

cman not started: Local host name resolves to 127.0.0.1; fix /etc/hosts before starting cluster. /usr/sbin/cman_tool: aisexec daemon didn't start
                                                           [FAILED]

V tomto pripade treba z adresara /etc/hosts odstranit hostname servera pre localhost.


could not find ParserDetails.ini in /usr/lib/perl5/vendor_perl/5.8.8/XML/SAX

Tatao chybova hlaska sa moze vyskytnut pocas instalacie balickov a mozeme ju fixnut prikazom

perl -MXML::SAX -e "XML::SAX->add_parser(q(XML::SAX::PurePerl))->save_parsers()"

Piranha Load Balancing

Red Hat adapted the Piranha load balancing software to allow for transparent load balancing and failover between servers. The application being balanced does not require special configuration to be balanced, instead a Red Hat Enterprise Linux server with the load balancer configured, intercepts and routes traffic based on metrics/rules set on the load balancer.

lba1.virtual.net 10.0.2.11/24
lba2.virtual.net 10.0.2.12/24

web1.virtual.net 10.0.2.21/24
web2.virtual.net 10.0.2.22/24

Load Balancery
Na obodvoch serveroch si nainstalujeme blaicky piranha a ipvasdm

# yum install piranha ipvsadm -y



Vytovorime subor ipvsadm a povolime ip forwarding.

#touch /etc/sysconfig/ipvsadm


#sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/sysctl.conf



A nasledne aktivujeme.

#sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456



Vytvorime konfiguracny subor lvs.cf pre obiva servery, kde lba1 bude primarny balancer
a lba2 zalozny, ktory preberie virtualnu ipcku v pripade vypadku primarneho.
lba1

[lba1]#cat /etc/sysconfig/ha/lvs.cf
        serial_no = 34
        primary = 10.0.2.11
        service = lvs
        rsh_command = rsh
        backup_active = 1
        backup = 10.0.2.12
        heartbeat = 1
        heartbeat_port = 539
        keepalive = 3
        deadtime = 25
        network = direct
        reservation_conflict_action = preempt
        debug_level = NONE
        virtual HTTP {
         active = 1
         address = 10.0.2.100 eth0:1
         vip_nmask = 255.255.255.0
         port = 80
         send = "GET / HTTP/1.1\r\n\r\n"
         expect = "HTTP"
         use_regex = 0
         scheduler = rr
         protocol = tcp
         timeout = 4
         reentry = 4
         quiesce_server = 1
         server web1 {
         address = 10.0.2.21
         active = 1
         weight = 1
         }
         server web2 {
         address = 10.0.2.22
         active = 1
         weight = 1
         }
        }

lba2

[lba2]#cat /etc/sysconfig/ha/lvs.cf
serial_no = 34
        primary = 10.0.2.11
        service = lvs
        rsh_command = rsh
        backup_active = 1
        backup = 10.0.2.12
        heartbeat = 1
        heartbeat_port = 539
        keepalive = 3
        deadtime = 25
        network = direct
        reservation_conflict_action = preempt
        debug_level = NONE
        virtual HTTP {
         active = 1
         address = 10.0.2.100 eth0:1
         vip_nmask = 255.255.255.0
         port = 80
         send = "GET / HTTP/1.1\r\n\r\n"
         expect = "HTTP"
         use_regex = 0
         scheduler = rr
         protocol = tcp
         timeout = 4
         reentry = 4
         quiesce_server = 1
         server web1 {
         address = 10.0.2.21
         active = 1
         weight = 1
         }
         server web2 {
         address = 10.0.2.22
         active = 1
         weight = 1
         }
        }



Web servery
Nainstalujeme si Apache web server a nastavime nech sa spusta v prislusnych runleveloch.

#yum install httpd
#chkconfig httpd on




Ak chcem nastavit web servery aby boli clustrovane s priamym routovanim musime zabranit
spustaniu reverzneho ARP. Sluzi na to balicek arptables_jf.Podobny efekt sa da dosiahnut aj
pomocou iptables, ale RH odporuca pouzivat arptables.

#yum install arptables_jf -y
#chkconfig arptables_jf on



Vytvorim potrebne pravidla
web1

[web1]# arptables -I IN -d 10.0.2.100 -j DROP
[web1]#arptables -A OUT -d 10.0.2.100 -j mangle --mangle-ip-s 10.0.2.21
[web1]#service arptables save
[web1]#service arptables start



web2

[web2]# arptables -I IN -d 10.0.2.100 -j DROP
[web2]#arptables -A OUT -d 10.0.2.100 -j mangle --mangle-ip-s 10.0.2.22
[web2]#service arptables save
[web2]#service arptables start



Ako posledne vytvorime druhy loopback a vytvorime alias virtualnej ip adresy na ktoru budeme
posielat poziadavky.Na obidvoch webserveroch rovnake.

# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.0.2.100
NETMASK=255.255.255.255
NETWORK=10.0.2.0
BROADCAST=10.0.2.255
ONBOOT=yes



Teraz spustime na balanceroch lvsadm daemona a otestujeme funkcnost.

#service pulse start
#chkconfig pulse on

Na primarnom balancery by sa nam mala objavit virtualna ip

[lba1]#ip adress show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:db:1c:a5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.11/24 brd 10.0.2.255 scope global eth0
    inet 10.0.2.100/24 brd 10.0.2.255 scope global secondary eth0:1
    inet6 fe80::20c:29ff:fedb:1ca5/64 scope link 
       valid_lft forever preferred_lft forever



Skontrolujeme vystup prikazu ipvsadm na primarnom balancery. Weight by sme mali mat
pri obidvoch 1.Ak stopneme apacha na jednom z web serverov zmeni sa na 0.

# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.2.100:80 rr
  -> 10.0.2.22:80                 Route   1      0          0         
  -> 10.0.2.21:80                 Route   1      0          0       



Funkcost balanceru je mozne este otestovat pomocou funkcie phpinfo().