Odoo (voorheen bekend als OpenERP) is een suite van open-source zakelijke apps. Het komt in twee versies - community en enterprise. Enkele van de meest populaire apps (en gratis!) die in dit platform zijn geïntegreerd, zijn Discuss, CRM, Inventory, Website, Employee, Leaves, Recruitment, Expenses, Accounting, Facturering, Point of Sale en nog veel meer.
In deze blogpost bekijken we hoe u Odoo kunt clusteren om een hoge beschikbaarheid en schaalbaarheid te bereiken. Dit bericht is vergelijkbaar met onze eerdere berichten over het schalen van Drupal, WordPress, Magento. De gebruikte software is Odoo 12, HAProxy 1.8.8, Keepalived 1.3.9, PostgreSQL 11 en OCFS2 (Oracle Cluster File System).
Onze setup bestaat uit 6 servers:
- lb1 (HAProxy) + keepalive + ClusterControl - 192.168.55.101
- lb2 (HAProxy) + keepalive + gedeelde opslag - 192.168.55.102
- odoo1 - 192.168.55.111
- odoo2 - 192.168.55.112
- postgresql1 (master) - 192.168.55.121
- postgresql2 (slaaf) - 192.168.55.122
Alle knooppunten draaien op Ubuntu 18.04.2 LTS (Bionic). We zullen ClusterControl gebruiken om PostgreSQL, Keepalive en HAProxy te implementeren en te beheren, omdat het ons een hoop werk zal besparen. ClusterControl wordt samen met HAProxy op lb1 geplaatst, terwijl we een extra schijf aan lb2 zullen toevoegen om te gebruiken als een gedeelde opslagprovider. Deze schijf wordt aangekoppeld met behulp van een geclusterd bestandssysteem genaamd OCFS2 als een gedeelde map. Een virtueel IP-adres, 192.168.55.100, fungeert als het enige eindpunt voor onze databaseservice.
Het volgende diagram illustreert onze algemene systeemarchitectuur:
Het volgende is de inhoud van /etc/hosts op alle knooppunten:
192.168.55.101 lb1.local lb1 cc.local cc
192.168.55.102 lb2.local lb2 storage.local storage
192.168.55.111 odoo1.local odoo1
192.168.55.112 odoo2.local odoo2
192.168.55.121 postgresql1.local postgresql1
192.168.55.122 postgresql2.local postgresql2
PostgreSQL-streamingreplicatie implementeren
We beginnen met het installeren van ClusterControl op lb1:
$ wget severalnines.com/downloads/cmon/install-cc
$ chmod 755 ./install-cc
$ sudo ./install-cc
Volg de installatiewizard, u zult tijdens het proces enkele vragen moeten beantwoorden.
Stel wachtwoordloze SSH in van ClusterControl-knooppunt (lb1) naar alle knooppunten die worden beheerd door ClusterControl, namelijk lb1 (zelf), lb2, postresql1 en postgresql2. Maar genereer eerst een SSH-sleutel:
$ whoami
ubuntu
$ ssh-keygen -t rsa # press Enter on all prompts
Kopieer vervolgens de sleutel naar alle doelknooppunten met behulp van de tool ssh-copy-id:
$ whoami
ubuntu
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
Open de gebruikersinterface van ClusterControl op http://192.168.55.101/clustercontrol en maak een super admin-gebruiker met wachtwoord aan. U wordt doorgestuurd naar het ClusterControl UI-dashboard. Implementeer vervolgens een nieuw PostgreSQL-cluster door op de knop "Deploy" in het bovenste menu te klikken. U krijgt het volgende implementatiedialoogvenster te zien:
Dit is wat we hebben getypt in het volgende dialoogvenster, "PostgreSQL-servers definiëren":
- Serverpoort:5432
- Gebruiker:postgres
- Wachtwoord:s3cr3t
- Versie:11
- Datadir:
- Repository:Gebruik repositories van leveranciers
Specificeer in het gedeelte "Topologie definiëren" het IP-adres van postgresql1 en postgresql2 dienovereenkomstig:
Onder de laatste sectie "Deployment Summary" heb je een optie om synchrone replicatie in te schakelen. Aangezien we de slave alleen voor failover-doeleinden zullen gebruiken (de slave zal geen leesbewerkingen uitvoeren), laten we de standaardwaarde zoals deze is. Druk vervolgens op "Deploy" om de implementatie van het databasecluster te starten. U kunt de voortgang van de implementatie volgen door te kijken naar Activiteit> Taken> Cluster maken :
Neem ondertussen wat koffie en de clusterimplementatie zou binnen 10~15 minuten moeten zijn voltooid.
Loadbalancers en virtueel IP voor PostgreSQL-servers implementeren
Op dit moment hebben we al een PostgreSQL-replicatiecluster met twee knooppunten in een master-slave-configuratie:
De volgende stap is het implementeren van de load balancer-laag voor onze database, waarmee we het virtuele IP-adres kunnen koppelen en een enkel eindpunt voor de toepassing kunnen bieden. We zullen de HAProxy-implementatie-opties als volgt configureren:
De applicatie ondersteunt geen native splitsen van lezen en schrijven, dus we zullen de actief-passieve methode gebruiken om hoge beschikbaarheid te bereiken. Het beste algoritme voor taakverdeling is het "bron"-beleid, aangezien we slechts één PostgreSQL-knooppunt tegelijk gebruiken.
Herhaal dezelfde stap voor de andere load balancer, lb2. Wijzig in plaats daarvan het "Serveradres" in 192.168.55.102. Hier is hoe het eruit ziet nadat de implementatie is voltooid als u naar de pagina Nodes gaat:
De rode lijn op de eerste luisteraar wordt verwacht waar HAProxy laat zien dat postgresql2 (192.168.55.122) niet beschikbaar is, omdat het gezondheidscontrolescript retourneert dat het knooppunt omhoog is maar geen master. De tweede luisteraar met blauwe lijn (haproxy_5434_ro) laat zien dat het knooppunt UP is maar in de "back-up" staat. Deze luisteraar kan echter worden genegeerd omdat de toepassing geen lees-schrijfsplitsing ondersteunt.
Vervolgens implementeren we Keepalive-instanties bovenop deze load balancers om ze te koppelen aan een enkel virtueel IP-adres. Ga naar Beheren -> Load Balancer -> Keepalive -> Keepalive implementeren en specificeer de eerste en tweede HAProxy-instanties, vervolgens het virtuele IP-adres en de netwerkinterface om naar te luisteren:
Klik op "Deploy Keepalive" om de implementatie te starten. De PostgreSQL-verbindingsservice is nu load-balanced naar een van de databaseknooppunten en toegankelijk via 192.168.55.100 poort 5433.
iSCSI configureren
De opslagserver (lb2) moet een schijf exporteren via iSCSI zodat deze op beide Odoo-toepassingsservers (odoo1 en odoo2) kan worden gemount. iSCSI vertelt je kernel in feite dat je een SCSI-schijf hebt, en het transporteert die toegang over IP. De "server" wordt het "doel" genoemd en de "client" die dat iSCSI-apparaat gebruikt, is de "initiator".
Installeer eerst iSCSI-doel in lb2:
$ sudo apt install -y tgt
Schakel tgt bij opstarten in:
$ systemctl enable tgt
Het heeft de voorkeur om een aparte schijf te hebben voor bestandssysteemclustering. We gaan dus een andere schijf gebruiken die is gemount in lb2 (/dev/sdb) om te worden gedeeld tussen applicatieservers (odoo1 en odoo2). Maak eerst een iSCSI-doel met behulp van de tool tgtadm:
$ sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2019-02.lb2:odcfs2
Wijs vervolgens het blokapparaat /dev/sdb toe aan logische eenheid nummer (LUN) 1 samen met doel-ID 1:
$ sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb
Geef vervolgens de initiator-knooppunten op hetzelfde netwerk toegang tot dit doel:
$ sudo tgtadm --lld iscsi --op bind --mode target --tid 1 --initiator-address 192.168.55.0/24
Gebruik de tool tgt-admin om de iSCSI-configuratieregels te dumpen en op te slaan als een configuratiebestand om het permanent te maken tijdens het opnieuw opstarten:
$ sudo tgt-admin --dump > /etc/tgt/conf.d/shareddisk.conf
Start ten slotte de iSCSI-doelservice opnieuw:
$ sudo systemctl restart tgt
** De volgende stappen moeten worden uitgevoerd op odoo1 en odoo2.
Installeer iSCSI-initiator op de respectievelijke hosts:
$ sudo apt-get install -y open-iscsi
Stel de iSCSI-initiator in om automatisch te starten:
$ sudo systemctl enable open-iscsi
Ontdek iSCSI-doelen die we eerder hebben ingesteld:
$ sudo iscsiadm -m discovery -t sendtargets -p lb2
192.168.55.102:3260,1 iqn.2019-02.lb2:odcfs2
Als u een vergelijkbaar resultaat ziet als hierboven, betekent dit dat we het iSCSI-doel kunnen zien en er verbinding mee kunnen maken. Gebruik de volgende opdracht om verbinding te maken met het iSCSI-doel op lb2:
$ sudo iscsiadm -m node --targetname iqn.2019-02.lb2:odcfs2 -p lb2 -l
Logging in to [iface: default, target: iqn.2019-02.lb2:odcfs2, portal: 192.168.55.102,3260] (multiple)
Login to [iface: default, target: iqn.2019-02.lb2:odcfs2, portal: 192.168.55.102,3260] successful.
Zorg ervoor dat u de nieuwe harde schijf (/dev/sdb) kunt zien in de directory /dev:
$ sudo ls -1 /dev/sd*
/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sdb
Onze gedeelde schijf is nu gemount op beide applicatieservers (odoo1 en odoo2).
OCFS2 configureren voor Odoo
** De volgende stappen moeten worden uitgevoerd op odoo1 tenzij anders aangegeven.
Met OCFS2 kan het bestandssysteem op meer dan één plaats worden gemount. Installeer OCFS2-tools op zowel odoo1- als odoo2-servers:
$ sudo apt install -y ocfs2-tools
Maak schijfpartitietabel voor harde schijf /dev/sdb:
$ sudo cfdisk /dev/sdb
Maak een partitie met behulp van de volgende reeksen in de cfdisk-wizard:Nieuw> Primair> accept Grootte> Schrijven> ja> Afsluiten .
Maak een OCFS2-bestandssysteem op /dev/sdb1:
$ sudo mkfs.ocfs2 -b 4K -C 128K -L "Odoo_Cluster" /dev/sdb1
mkfs.ocfs2 1.8.5
Cluster stack: classic o2cb
Label: Odoo_Cluster
Features: sparse extended-slotmap backup-super unwritten inline-data strict-journal-super xattr indexed-dirs refcount discontig-bg append-dio
Block size: 4096 (12 bits)
Cluster size: 131072 (17 bits)
Volume size: 21473656832 (163831 clusters) (5242592 blocks)
Cluster groups: 6 (tail covers 2551 clusters, rest cover 32256 clusters)
Extent allocator size: 4194304 (1 groups)
Journal size: 134217728
Node slots: 8
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 3 block(s)
Formatting Journals: done
Growing extent allocator: done
Formatting slot map: done
Formatting quota files: done
Writing lost+found: done
mkfs.ocfs2 successful
Maak een clusterconfiguratiebestand op /etc/ocfs2/cluster.conf en definieer de node- en clusterrichtlijnen zoals hieronder:
# /etc/ocfs2/cluster.conf
cluster:
node_count = 2
name = ocfs2
node:
ip_port = 7777
ip_address = 192.168.55.111
number = 1
name = odoo1
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.55.112
number = 2
name = odoo2
cluster = ocfs2
Merk op dat de attributen onder de node- of clusterclausule achter een tab moeten staan.
** De volgende stappen moeten worden uitgevoerd op odoo1 en odoo2 tenzij anders aangegeven.
Maak hetzelfde configuratiebestand (/etc/ocfs2/cluster.conf) op odoo2. Dit bestand moet hetzelfde zijn voor alle knooppunten in het cluster en wijzigingen die in dit bestand worden aangebracht, moeten worden doorgegeven aan de andere knooppunten in het cluster.
Start de o2cb-service opnieuw om de wijzigingen toe te passen die we hebben aangebracht in /etc/ocfs2/cluster.conf:
$ sudo systemctl restart o2cb
Maak de Odoo-bestandenmap aan onder /var/lib/odoo:
$ sudo mkdir -p /var/lib/odoo
Haal de blok-ID op voor het /dev/sdb1-apparaat. UUID wordt aanbevolen in fstab als u een iSCSI-apparaat gebruikt:
$ sudo blkid /dev/sdb1 | awk {'print $3'}
UUID="93a2b6c4-d800-4532-9a9b-2d2f2f1a726b"
Gebruik de UUID-waarde bij het toevoegen van de volgende regel in /etc/fstab:
UUID=93a2b6c4-d800-4532-9a9b-2d2f2f1a726b /var/lib/odoo ocfs2 defaults,_netdev 0 0
Registreer het ocfs2-cluster en koppel het bestandssysteem vanuit fstab:
$ sudo o2cb register-cluster ocfs2
$ sudo mount -a
Verifieer met:
$ mount | grep odoo
/dev/sdb1 on /var/lib/odoo type ocfs2 (rw,relatime,_netdev,heartbeat=local,nointr,data=ordered,errors=remount-ro,atime_quantum=60,coherency=full,user_xattr,acl,_netdev)
Als u de bovenstaande regel op alle applicatieservers kunt zien, is het een goed idee om Odoo te installeren.
Odoo 12 installeren en configureren
** De volgende stappen moeten worden uitgevoerd op odoo1 en odoo2 tenzij anders aangegeven.
Installeer Odoo 12 via pakketrepository:
$ wget -O - https://nightly.odoo.com/odoo.key | sudo apt-key add -
$ echo "deb http://nightly.odoo.com/12.0/nightly/deb/ ./" | sudo tee -a /etc/apt/sources.list.d/odoo.list
$ sudo apt update && sudo apt install odoo
Standaard zal de bovenstaande opdracht automatisch de PostgreSQL-server op dezelfde host installeren als onderdeel van Odoo-afhankelijkheden. We willen er waarschijnlijk mee stoppen omdat we de lokale server toch niet gaan gebruiken:
$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql
Maak op postgresql1 een databasegebruiker met de naam "odoo":
$ sudo -i
$ su - postgres
$ createuser --createrole --createdb --pwprompt odoo
Geef een wachtwoord op in de prompt. Voeg vervolgens op zowel postgresql1 als postgresql2 de volgende regel toe in pg_hba.conf zodat de toepassing en de load balancer-knooppunten verbinding kunnen maken. Zoals in ons geval, bevindt het zich op /etc/postgresql/11/main/pg_hba.conf:
host all all 192.168.55.0/24 md5
Laad vervolgens de PostgreSQL-server opnieuw om de wijzigingen te laden:
$ su - postgres
$ /usr/lib/postgresql/11/bin/pg_ctl reload -D /var/lib/postgresql/11/main/
Bewerk het Odoo-configuratiebestand op /etc/odoo/odoo.conf en configureer de parameters admin_passwd, db_host en db_password dienovereenkomstig:
[options]
; This is the password that allows database operations:
admin_passwd = admins3cr3t
db_host = 192.168.55.100
db_port = 5433
db_user = odoo
db_password = odoopassword
;addons_path = /usr/lib/python3/dist-packages/odoo/addons
Start Odoo opnieuw op beide servers om de nieuwe wijzigingen te laden:
$ sudo systemctl restart odoo
De, open Odoo op een van de applicatieservers via een webbrowser. In dit voorbeeld hebben we verbinding gemaakt met odoo1, dus de URL is http://192.168.55.111:8069/ en u zou de volgende beginpagina moeten zien:
Specificeer het "Hoofdwachtwoord" identiek aan de admin_passwd waarde gedefinieerd in het Odoo configuratiebestand. Vul vervolgens alle benodigde informatie in voor het nieuwe bedrijf dat dit platform gaat gebruiken.
Als u klaar bent, wacht u even totdat de initialisatie is voltooid. U wordt doorgestuurd naar het Odoo-beheerdashboard:
Op dit punt is de Odoo-installatie voltooid en kunt u beginnen met het configureren van de zakelijke apps voor dit bedrijf. Alle bestandswijzigingen die door deze applicatieserver zijn gemaakt, worden opgeslagen in het geclusterde bestandssysteem op "/var/lib/odoo/.local" (dat ook is gekoppeld aan een andere applicatieserver, odoo2), terwijl wijzigingen in de database zullen plaatsvinden op het PostgreSQL-hoofdknooppunt.
Ondanks dat het op twee verschillende hosts wordt uitgevoerd, moet u er rekening mee houden dat de Odoo-toepassing zelf bij dit schrijven geen taakverdeling heeft. U kunt de HAProxy-instanties gebruiken die voor het databasecluster zijn geïmplementeerd om een betere beschikbaarheid te bereiken, net als de databaseservice. Bovendien is het gedeelde schijfbestandssysteem (OCFS2) dat door beide applicatieservers wordt gebruikt nog steeds blootgesteld aan single-point of failure, aangezien ze allemaal hetzelfde iSCSI-apparaat op lb2 gebruiken (stel je voor dat lb2 ontoegankelijk is).
Database failover-bewerking
Je vraagt je misschien af wat er zou gebeuren als de PostgreSQL-master uitvalt. Als dit gebeurt, promoveert ClusterControl automatisch de actieve slaaf tot master, zoals weergegeven in de onderstaande schermafbeelding:
De eindgebruiker hoeft niets te doen, aangezien de failover automatisch wordt uitgevoerd (na een respijtperiode van 30 seconden). Nadat de failover is voltooid, wordt de nieuwe topologie door ClusterControl gerapporteerd als:
Als de oude master terugkomt, wordt de PostgreSQL-service automatisch afgesloten en het volgende dat de gebruiker hoeft te doen is de oude master opnieuw te synchroniseren met de nieuwe master door naar Node Actions> Rebuild Replication Slave :
De oude master wordt dan een slaaf van de nieuwe master nadat de synchronisatiebewerking is voltooid:
ClusterControl verbetert zeker de beschikbaarheid van de database met zijn automatische herstelfunctie en het opnieuw synchroniseren van een slecht databaseknooppunt is slechts twee klikken verwijderd. Hoe eenvoudig is dat na een catastrofale storing?
Dat is alles voor nu mensen. Veel plezier met clusteren!