sql >> Database >  >> RDS >> PostgreSQL

Hoe Odoo 12 te clusteren met PostgreSQL-streamingreplicatie voor hoge beschikbaarheid

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!


  1. Aangepaste tekenreeksen voor datum-/tijdnotatie ondersteund door FORMAT() in SQL Server

  2. Is het mogelijk om Full Text Search (FTS) te gebruiken met LINQ?

  3. Hoe bestanden te verwijderen in SQL Server 2019

  4. Connectiviteit van de beschikbaarheidsgroep configureren