PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak klastrować Odoo 12 za pomocą replikacji strumieniowej PostgreSQL w celu zapewnienia wysokiej dostępności?

Odoo (wcześniej znany jako OpenERP) to pakiet aplikacji biznesowych typu open source. Występuje w dwóch wersjach - Community i Enterprise. Niektóre z najpopularniejszych aplikacji (i bezpłatnych!) zintegrowanych z tą platformą to Dyskusja, CRM, Zapasy, Witryna, Pracownik, Zwolnienia, Rekrutacja, Wydatki, Księgowość, Fakturowanie, Punkt sprzedaży i wiele innych.

W tym poście na blogu przyjrzymy się, jak klastrować Odoo, aby osiągnąć wysoką dostępność i skalowalność. Ten post jest podobny do naszych poprzednich postów dotyczących skalowania Drupala, WordPressa, Magento. Używane oprogramowanie to Odoo 12, HAProxy 1.8.8, Keepalived 1.3.9, PostgreSQL 11 i OCFS2 (Oracle Cluster File System).

Nasza konfiguracja składa się z 6 serwerów:

  • lb1 (HAProxy) + utrzymywanie aktywności + ClusterControl - 192.168.55.101
  • lb2 (HAProxy) + utrzymywanie aktywności + pamięć współdzielona — 192.168.55.102
  • odoo1 - 192.168.55.111
  • odoo2 - 192.168.55.112
  • postgresql1 (master) — 192.168.55.121
  • postgresql2 (podrzędny) — 192.168.55.122

Wszystkie węzły działają na Ubuntu 18.04.2 LTS (Bionic). Będziemy używać ClusterControl do wdrażania i zarządzania PostgreSQL, Keepalived i HAProxy, ponieważ zaoszczędzi nam to sporo pracy. ClusterControl zostanie umieszczony razem z HAProxy na lb1, podczas gdy dodamy dodatkowy dysk do lb2, który będzie używany jako dostawca współdzielonej pamięci masowej. Ten dysk zostanie podłączony przy użyciu klastrowego systemu plików o nazwie OCFS2 jako katalogu udostępnionego. Wirtualny adres IP 192.168.55.100 działa jako pojedynczy punkt końcowy dla naszej usługi bazy danych.

Poniższy diagram ilustruje ogólną architekturę naszego systemu:

Poniżej znajduje się zawartość /etc/hosts na wszystkich węzłach:

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

Wdrażanie replikacji strumieniowej PostgreSQL

Zaczniemy od zainstalowania ClusterControl na lb1:

$ wget severalnines.com/downloads/cmon/install-cc
$ chmod 755 ./install-cc
$ sudo ./install-cc

Postępuj zgodnie z instrukcjami kreatora instalacji, będziesz musiał odpowiedzieć na kilka pytań podczas procesu.

Skonfiguruj bezhasłowe SSH z węzła ClusterControl (lb1) do wszystkich węzłów, które będą zarządzane przez ClusterControl, czyli lb1 (sam), lb2, postresql1 i postgresql2. Ale najpierw wygeneruj klucz SSH:

$ whoami
ubuntu
$ ssh-keygen -t rsa # press Enter on all prompts

Następnie skopiuj klucz do wszystkich węzłów docelowych za pomocą narzędzia 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]

Otwórz interfejs użytkownika ClusterControl pod adresem http://192.168.55.101/clustercontrol i utwórz superużytkownika z hasłem. Zostaniesz przekierowany do pulpitu nawigacyjnego ClusterControl UI. Następnie wdróż nowy klaster PostgreSQL, klikając przycisk „Wdróż” w górnym menu. Zostanie wyświetlone następujące okno dialogowe wdrażania:

Oto, co wpisaliśmy w następnym oknie dialogowym, „Definiuj serwery PostgreSQL”:

  • Port serwera:5432
  • Użytkownik:postgres
  • Hasło:s3cr3t
  • Wersja:11
  • Katalog danych:
  • Repozytorium:Użyj repozytoriów dostawców

W sekcji „Definiuj topologię” określ odpowiednio adres IP postgresql1 i postgresql2:

W ostatniej sekcji „Podsumowanie wdrożenia” masz możliwość włączenia replikacji synchronicznej. Ponieważ będziemy używać urządzenia podrzędnego tylko do celów przełączania awaryjnego (urządzenie podrzędne nie będzie obsługiwać żadnych operacji odczytu), po prostu pozostawiamy wartość domyślną bez zmian. Następnie naciśnij „Wdróż”, aby rozpocząć wdrażanie klastra bazy danych. Możesz monitorować postęp wdrażania, patrząc na Aktywność> Zadania> Utwórz klaster :

W międzyczasie napij się kawy, a wdrożenie klastra powinno zakończyć się w ciągu 10-15 minut.

Wdrażanie systemów równoważenia obciążenia i wirtualnego adresu IP dla serwerów PostgreSQL

W tym momencie mamy już dwuwęzłowy klaster replikacji PostgreSQL działający w konfiguracji master-slave:

Następnym krokiem jest wdrożenie warstwy równoważenia obciążenia dla naszej bazy danych, która pozwala nam powiązać ją z wirtualnym adresem IP i zapewnić pojedynczy punkt końcowy dla aplikacji. Skonfigurujemy opcje wdrażania HAProxy w następujący sposób:

Aplikacja nie obsługuje natywnie dzielenia odczytu i zapisu, dlatego w celu osiągnięcia wysokiej dostępności użyjemy metody aktywnej i pasywnej. Najlepszym algorytmem równoważenia obciążenia jest polityka „źródła”, ponieważ używamy tylko jednego węzła PostgreSQL na raz.

Powtórz ten sam krok dla drugiego modułu równoważenia obciążenia, lb2. Zamiast tego zmień „Adres serwera” na 192.168.55.102. Oto, jak to wygląda po zakończeniu wdrażania, jeśli przejdziesz na stronę Węzły:

Oczekiwana jest czerwona linia na pierwszym odbiorniku, w której HAProxy pokazuje, że postgresql2 (192.168.55.122) nie działa, ponieważ skrypt sprawdzania kondycji zwraca, że ​​węzeł jest włączony, ale nie jest nadrzędny. Drugi odbiornik z niebieską linią (haproxy_5434_ro) pokazuje, że węzeł jest włączony, ale znajduje się w stanie kopii zapasowej. Ten detektor można jednak zignorować, ponieważ aplikacja nie obsługuje dzielenia odczytu i zapisu.

Następnie wdrażamy instancje Keepalived na tych systemach równoważenia obciążenia, aby powiązać je z jednym wirtualnym adresem IP. Przejdź do Zarządzaj -> Load Balancer -> Keepalved -> Wdróż funkcję Keepalive i określ pierwszą i drugą instancję HAProxy, a następnie wirtualny adres IP i interfejs sieciowy do nasłuchiwania:

Kliknij „Wdróż Keepalived”, aby rozpocząć wdrażanie. Usługa połączenia PostgreSQL jest teraz równoważona dla każdego z węzłów bazy danych i dostępna przez port 192.168.55.100 5433.

Konfigurowanie iSCSI

Serwer pamięci masowej (lb2) musi wyeksportować dysk przez iSCSI, aby można go było zamontować na obu serwerach aplikacji Odoo (odoo1 i odoo2). iSCSI w zasadzie informuje jądro, że masz dysk SCSI, i przesyła ten dostęp przez IP. „Serwer” nazywany jest „celem”, a „klient”, który używa tego urządzenia iSCSI, jest „inicjatorem”.

Najpierw zainstaluj cel iSCSI w lb2:

$ sudo apt install -y tgt

Włącz tgt podczas rozruchu:

$ systemctl enable tgt

Preferowane jest posiadanie oddzielnego dysku do klastrowania systemu plików. W związku z tym użyjemy innego dysku zamontowanego w lb2 (/dev/sdb) do współdzielenia między serwerami aplikacji (odoo1 i odoo2). Najpierw utwórz cel iSCSI za pomocą narzędzia tgtadm:

$ sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2019-02.lb2:odcfs2

Następnie przypisz urządzenie blokowe /dev/sdb do numeru jednostki logicznej (LUN) 1 wraz z identyfikatorem celu 1:

$ sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb

Następnie zezwól węzłom inicjatora w tej samej sieci na dostęp do tego celu:

$ sudo tgtadm --lld iscsi --op bind --mode target --tid 1 --initiator-address 192.168.55.0/24

Użyj narzędzia tgt-admin, aby zrzucić linie konfiguracyjne iSCSI i zapisać je jako plik konfiguracyjny, aby były trwałe po ponownym uruchomieniu:

$ sudo tgt-admin --dump > /etc/tgt/conf.d/shareddisk.conf

Na koniec uruchom ponownie usługę docelową iSCSI:

$ sudo systemctl restart tgt

** Poniższe kroki należy wykonać na odoo1 i odoo2.

Zainstaluj inicjator iSCSI na odpowiednich hostach:

$ sudo apt-get install -y open-iscsi

Ustaw inicjator iSCSI na automatyczne uruchamianie:

$ sudo systemctl enable open-iscsi

Odkryj cele iSCSI, które skonfigurowaliśmy wcześniej:

$ sudo iscsiadm -m discovery -t sendtargets -p lb2
192.168.55.102:3260,1 iqn.2019-02.lb2:odcfs2

Jeśli widzisz podobny wynik jak powyżej, oznacza to, że widzimy i możemy połączyć się z celem iSCSI. Użyj następującego polecenia, aby połączyć się z celem iSCSI na 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.

Upewnij się, że widzisz nowy dysk twardy (/dev/sdb) w katalogu /dev:

$ sudo ls -1 /dev/sd*
/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sdb

Nasz współdzielony dysk jest teraz zamontowany na obu serwerach aplikacji (odoo1 i odoo2).

Konfigurowanie OCFS2 dla Odoo

** Poniższe kroki należy wykonać na odoo1, chyba że określono inaczej.

OCFS2 pozwala na montowanie systemu plików w więcej niż jednym miejscu. Zainstaluj narzędzia OCFS2 na serwerach odoo1 i odoo2:

$ sudo apt install -y ocfs2-tools

Utwórz tablicę partycji dysku dla dysku twardego /dev/sdb:

$ sudo cfdisk /dev/sdb

Utwórz partycję, używając następujących sekwencji w kreatorze cfdisk:Nowy> Podstawowy> zaakceptuj Rozmiar> Zapisz> tak> Zakończ .

Utwórz system plików OCFS2 na /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

Utwórz plik konfiguracyjny klastra w /etc/ocfs2/cluster.conf i zdefiniuj dyrektywy węzła i klastra jak poniżej:

# /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

Zwróć uwagę, że atrybuty w klauzuli węzła lub klastra muszą znajdować się po tabulatorze.

** Poniższe kroki należy wykonać na odoo1 i odoo2, chyba że określono inaczej.

Utwórz ten sam plik konfiguracyjny (/etc/ocfs2/cluster.conf) na odoo2. Ten plik powinien być taki sam we wszystkich węzłach w klastrze, a zmiany wprowadzone w tym pliku muszą być propagowane do innych węzłów w klastrze.

Uruchom ponownie usługę o2cb, aby zastosować zmiany, które wprowadziliśmy w /etc/ocfs2/cluster.conf:

$ sudo systemctl restart o2cb

Utwórz katalog plików Odoo w /var/lib/odoo:

$ sudo mkdir -p /var/lib/odoo

Pobierz identyfikator bloku dla urządzenia /dev/sdb1. UUID jest zalecany w fstab, jeśli używasz urządzenia iSCSI:

$ sudo blkid /dev/sdb1 | awk {'print $3'}
UUID="93a2b6c4-d800-4532-9a9b-2d2f2f1a726b"

Użyj wartości UUID podczas dodawania następującego wiersza do /etc/fstab:

UUID=93a2b6c4-d800-4532-9a9b-2d2f2f1a726b       /var/lib/odoo     ocfs2   defaults,_netdev        0 0

Zarejestruj klaster ocfs2 i zamontuj system plików z fstab:

$ sudo o2cb register-cluster ocfs2
$ sudo mount -a

Zweryfikuj za pomocą:
 

$ 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)

Jeśli widzisz powyższą linię na wszystkich serwerach aplikacji, dobrze jest zainstalować Odoo.

Instalacja i konfiguracja Odoo 12

** Poniższe kroki należy wykonać na odoo1 i odoo2, chyba że określono inaczej.

Zainstaluj Odoo 12 przez repozytorium pakietów:

$ 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

Domyślnie powyższe polecenie automatycznie zainstaluje serwer PostgreSQL na tym samym hoście w ramach zależności Odoo. Prawdopodobnie chcemy to zatrzymać, ponieważ i tak nie będziemy korzystać z lokalnego serwera:

$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql

Na postgresql1 utwórz użytkownika bazy danych o nazwie "odoo":

$ sudo -i
$ su - postgres
$ createuser --createrole --createdb --pwprompt odoo

Podaj hasło w monicie. Następnie na obu postgresql1 i postgresql2 dodaj następujący wiersz wewnątrz pg_hba.conf, aby umożliwić połączenie aplikacji i węzłów równoważenia obciążenia. Podobnie jak w naszym przypadku, znajduje się on w /etc/postgresql/11/main/pg_hba.conf:

host  all  all       192.168.55.0/24    md5

Następnie przeładuj serwer PostgreSQL, aby załadować zmiany:

$ su - postgres
$ /usr/lib/postgresql/11/bin/pg_ctl reload -D /var/lib/postgresql/11/main/

Edytuj plik konfiguracyjny Odoo w /etc/odoo/odoo.conf i odpowiednio skonfiguruj parametry admin_passwd, db_host i db_password:

[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

Zrestartuj Odoo na obu serwerach, aby załadować nowe zmiany:

$ sudo systemctl restart odoo

Otwórz Odoo na jednym z serwerów aplikacji za pomocą przeglądarki internetowej. W tym przykładzie połączyliśmy się z odoo1, więc adres URL to http://192.168.55.111:8069/ powinieneś zobaczyć następującą stronę początkową:

Podaj "Hasło główne" identyczne z wartością admin_passwd zdefiniowaną w pliku konfiguracyjnym Odoo. Następnie podaj wszystkie wymagane informacje dla nowej firmy, która będzie korzystać z tej platformy.

Po zakończeniu poczekaj chwilę, aż zakończy się inicjalizacja. Zostaniesz przekierowany do panelu administracyjnego Odoo:

W tym momencie instalacja Odoo jest zakończona i możesz zacząć konfigurować aplikacje biznesowe dla tej firmy. Wszystkie zmiany w plikach wprowadzone przez ten serwer aplikacji będą przechowywane w klastrowym systemie plików znajdującym się w "/var/lib/odoo/.local" (który również jest podłączony do innego serwera aplikacji, odoo2), podczas gdy zmiany w bazie danych będą miały miejsce w węźle głównym PostgreSQL.

Pomimo tego, że działa na dwóch różnych hostach, pamiętaj, że sama aplikacja Odoo nie jest w tym piśmie zrównoważona. Możesz użyć instancji HAProxy wdrożonych dla klastra bazy danych, aby osiągnąć lepszą dostępność, podobnie jak usługa bazy danych. Ponadto system plików dysku współdzielonego (OCFS2) używany przez oba serwery aplikacji jest nadal narażony na awarię pojedynczego punktu, ponieważ wszystkie używają tego samego urządzenia iSCSI na lb2 (wyobraź sobie, że lb2 jest niedostępny).

Operacja awaryjna bazy danych

Być może zastanawiasz się, co by się stało, gdyby główny serwer PostgreSQL uległ awarii. Jeśli tak się stanie, ClusterControl automatycznie awansuje działające urządzenie podrzędne na urządzenie nadrzędne, jak pokazano na poniższym zrzucie ekranu:

Od użytkownika końcowego nie trzeba nic robić, ponieważ przełączanie awaryjne jest wykonywane automatycznie (po 30-sekundowym okresie karencji). Po zakończeniu przełączania awaryjnego nowa topologia zostanie zgłoszona przez ClusterControl jako:

Jeśli stary master powróci, usługa PostgreSQL zostanie automatycznie zamknięta, a następną rzeczą, jaką musi zrobić użytkownik, jest ponowna synchronizacja starego mastera z nowym masterem, przechodząc do Akcje węzła> Odbuduj podrzędny serwer replikacji :

Po zakończeniu synchronizacji stary master stanie się niewolnikiem nowego mastera:

ClusterControl z pewnością poprawia dostępność bazy danych dzięki funkcji automatycznego odzyskiwania, a ponowna synchronizacja uszkodzonego węzła bazy danych to tylko dwa kliknięcia. Jak proste jest to po katastrofalnej awarii?

To wszystko na teraz ludzie. Miłego klastrowania!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernuj UUID z PostgreSQL i SQL Server

  2. wyeliminować zduplikowane wartości tablicy w postgresie

  3. Jak zmienić hasło użytkownika w PostgreSQL

  4. Czy serwer działa na hoście lokalnym hosta (::1) i akceptuje połączenia TCP/IP na porcie 5432?

  5. Klauzula SQL Between z kolumnami stringów