PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да групирате Odoo 12 с PostgreSQL поточно репликация за висока наличност

Odoo (известен преди като OpenERP) е пакет от бизнес приложения с отворен код. Предлага се в две версии - общност и корпоративна. Някои от най-популярните приложения (и безплатни!), интегрирани в тази платформа, са Discuss, CRM, Inventory, Website, Employee, Leaves, Recruitment, Expenses, Accounting, Invoiting, Point of Sale и много други.

В тази публикация в блога ще разгледаме как да групираме Odoo, за да постигнем висока наличност и мащабируемост. Тази публикация е подобна на предишните ни публикации за мащабиране на Drupal, WordPress, Magento. Използваният софтуер е Odoo 12, HAProxy 1.8.8, Keepalived 1.3.9, PostgreSQL 11 и OCFS2 (Oracle Cluster File System).

Нашата настройка се състои от 6 сървъра:

  • lb1 (HAProxy) + keepalived + ClusterControl - 192.168.55.101
  • lb2 (HAProxy) + keepalived + споделено хранилище - 192.168.55.102
  • odoo1 - 192.168.55.111
  • odoo2 - 192.168.55.112
  • postgresql1 (главен) - 192.168.55.121
  • postgresql2 (подчинен) - 192.168.55.122

Всички възли работят на Ubuntu 18.04.2 LTS (Bionic). Ще използваме ClusterControl за внедряване и управление на PostgreSQL, Keepalived и HAProxy, тъй като това ще ни спести куп работа. ClusterControl ще бъде разположен заедно с HAProxy на lb1, докато ние ще добавим допълнителен диск към lb2, който да се използва като доставчик на споделено съхранение. Този диск ще бъде монтиран с помощта на клъстерирана файлова система, наречена OCFS2, като споделена директория. Виртуален IP адрес 192.168.55.100 действа като единствена крайна точка за нашата услуга за база данни.

Следната диаграма илюстрира цялостната ни системна архитектура:

Следното е съдържанието на /etc/hosts на всички възли:

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

Ще започнем с инсталиране на ClusterControl на lb1:

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

Следвайте съветника за инсталиране, ще трябва да отговорите на някои въпроси по време на процеса.

Настройте SSH без парола от възела ClusterControl (lb1) към всички възли, които ще се управляват от ClusterControl, който е lb1 (самият), lb2, postresql1 и postgresql2. Но първо генерирайте SSH ключ:

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

След това копирайте ключа във всички целеви възли с помощта на инструмента 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]

Отворете потребителския интерфейс на ClusterControl на http://192.168.55.101/clustercontrol и създайте супер администратор потребител с парола. Ще бъдете пренасочени към таблото за управление на потребителския интерфейс на ClusterControl. След това разгръщайте нов PostgreSQL клъстер, като щракнете върху бутона "Разгръщане" в горното меню. Ще ви бъде представен следния диалогов прозорец за внедряване:

Ето какво написахме в следващия диалогов прозорец „Дефиниране на PostgreSQL сървъри“:

  • Сървърен порт:5432
  • Потребител:postgres
  • Парола:s3cr3t
  • Версия:11
  • Директор с данни:<оставете празно>
  • Хранилище:Използвайте хранилища на доставчици

В секцията „Дефиниране на топология“ посочете съответно IP адреса на postgresql1 и postgresql2:

Под последния раздел "Резюме на внедряването" имате опция да активирате синхронна репликация. Тъй като ще използваме подчинения само за целите на отказ (подчинената няма да обслужва никакви операции за четене), ние просто оставяме стойността по подразбиране такава, каквато е. След това натиснете "Deploy", за да започнете внедряването на клъстера на базата данни. Можете да наблюдавате напредъка на внедряването, като погледнете Дейност> Работни места> Създаване на клъстер :

Междувременно вземете кафе и разгръщането на клъстера трябва да приключи в рамките на 10-15 минути.

Разгръщане на балансьори на натоварване и виртуален IP за PostgreSQL сървъри

В този момент вече имаме PostgreSQL репликационен клъстер с два възела, работещ в настройка главен-подчинен:

Следващата стъпка е да разгърнем нивото на балансиране на натоварването за нашата база данни, което ни позволява да го свържем с виртуален IP адрес и да предоставим единна крайна точка за приложението. Ще конфигурираме опциите за внедряване на HAProxy, както следва:

Приложението не поддържа разделяне на четене и запис, така че ще използваме активно-пасивен метод, за да постигнем висока наличност. Най-добрият алгоритъм за балансиране на натоварването е политиката „източник“, тъй като използваме само един PostgreSQL възел в даден момент.

Повторете същата стъпка за другия балансьор на натоварване, lb2. Вместо това променете „адреса на сървъра“ на 192.168.55.102. Ето как изглежда след приключване на внедряването, ако отидете под страницата Nodes:

Червената линия на първия слушател се очаква, където HAProxy показва, че postgresql2 (192.168.55.122) не работи, защото скриптът за проверка на здравето връща възелът е нагоре, но не и главен. Вторият слушател със синя линия (haproxy_5434_ro) показва, че възелът е ГОРЕНО, но в състояние "резервно". Този слушател може да бъде игнориран, тъй като приложението не поддържа разделяне на четене-запис.

След това разгръщаме екземпляри на Keepalived върху тези балансатори на натоварване, за да ги свържем с един виртуален IP адрес. Отидете на Manage -> Load Balancer -> Keepalived -> Deploy Keepalived и посочете първия и втория екземпляр на HAProxy, след това виртуалния IP адрес и мрежовия интерфейс, които да слушате:

Щракнете върху „Разгръщане на Keepalived“, за да започнете внедряването. Услугата за връзка PostgreSQL вече е балансирана на натоварването към всеки от възлите на базата данни и е достъпна през 192.168.55.100 порт 5433.

Конфигуриране на iSCSI

Сървърът за съхранение (lb2) трябва да експортира диск чрез iSCSI, за да може да бъде монтиран и на двата сървъра на приложения на Odoo (odoo1 и odoo2). iSCSI по същество казва на вашето ядро, че имате SCSI диск и транспортира този достъп през IP. „Сървърът“ се нарича „цел“, а „клиентът“, който използва това iSCSI устройство, е „инициатор“.

Първо, инсталирайте iSCSI цел в lb2:

$ sudo apt install -y tgt

Активиране на tgt при зареждане:

$ systemctl enable tgt

За предпочитане е да имате отделен диск за клъстериране на файловата система. По този начин ще използваме друг диск, монтиран в lb2 (/dev/sdb), за да бъде споделен между сървърите на приложения (odoo1 и odoo2). Първо, създайте iSCSI цел с помощта на инструмента tgtadm:

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

След това присвоете блоковото устройство /dev/sdb към номер на логическа единица (LUN) 1 заедно с целеви ID 1:

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

След това разрешете на възлите на инициатора в същата мрежа да имат достъп до тази цел:

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

Използвайте инструмента tgt-admin, за да изхвърлите конфигурационните редове на iSCSI и да го запишете като конфигурационен файл, за да го направите постоянен при рестартиране:

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

Накрая рестартирайте целевата услуга iSCSI:

$ sudo systemctl restart tgt

** Следните стъпки трябва да се извършат върху odoo1 и odoo2.

Инсталирайте iSCSI инициатор на съответните хостове:

$ sudo apt-get install -y open-iscsi

Настройте iSCSI инициатора да стартира автоматично:

$ sudo systemctl enable open-iscsi

Открийте iSCSI цели, които сме настроили по-рано:

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

Ако видите подобен резултат като по-горе, това означава, че можем да видим и можем да се свържем с iSCSI целта. Използвайте следната команда, за да се свържете с iSCSI целта на 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.

Уверете се, че можете да видите новия твърд диск (/dev/sdb), посочен в директорията /dev:

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

Нашият споделен диск вече е монтиран и на двата сървъра на приложения (odoo1 и odoo2).

Конфигуриране на OCFS2 за Odoo

** Следните стъпки трябва да се извършат на odoo1, освен ако не е посочено друго.

OCFS2 позволява файловата система да бъде монтирана на повече от едно място. Инсталирайте OCFS2 инструменти както на odoo1, така и на odoo2 сървъри:

$ sudo apt install -y ocfs2-tools

Създайте таблица с дялове на диска за твърд диск /dev/sdb:

$ sudo cfdisk /dev/sdb

Създайте дял, като използвате следните последователности в съветника за cfdisk:Нов> Основен> приемете размер> Запис> да> Изход .

Създайте файлова система OCFS2 на /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

Създайте конфигурационен файл на клъстер в /etc/ocfs2/cluster.conf и дефинирайте директивите за възел и клъстер, както следва:

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

Имайте предвид, че атрибутите под клаузата за възел или клъстер трябва да са след раздел.

** Следните стъпки трябва да се извършат върху odoo1 и odoo2, освен ако не е посочено друго.

Създайте същия конфигурационен файл (/etc/ocfs2/cluster.conf) на odoo2. Този файл трябва да е еднакъв във всички възли в клъстера и промените, направени в този файл, трябва да се разпространяват и към другите възли в клъстера.

Рестартирайте услугата o2cb, за да приложите промените, които направихме в /etc/ocfs2/cluster.conf:

$ sudo systemctl restart o2cb

Създайте директорията на Odoo файлове под /var/lib/odoo:

$ sudo mkdir -p /var/lib/odoo

Вземете идентификатора на блока за устройството /dev/sdb1. UUID се препоръчва във fstab, ако използвате iSCSI устройство:

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

Използвайте стойността на UUID, когато добавяте следния ред в /etc/fstab:

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

Регистрирайте клъстера ocfs2 и монтирайте файловата система от fstab:

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

Потвърдете с:
 

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

Ако можете да видите горния ред на всички сървъри на приложения, ние сме добри да инсталираме Odoo.

Инсталиране и конфигуриране на Odoo 12

** Следните стъпки трябва да се извършат върху odoo1 и odoo2, освен ако не е посочено друго.

Инсталирайте Odoo 12 чрез хранилище на пакети:

$ 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

По подразбиране горната команда автоматично ще инсталира PostgreSQL сървър на същия хост като част от зависимостите на Odoo. Вероятно искаме да го спрем, защото така или иначе няма да използваме локалния сървър:

$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql

На postgresql1 създайте потребител на база данни, наречен "odoo":

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

Посочете парола в подканата. След това както на postgresql1, така и на postgresql2, добавете следния ред в pg_hba.conf, за да позволите на приложението и възлите за балансиране на натоварването да се свържат. Както в нашия случай, той се намира в /etc/postgresql/11/main/pg_hba.conf:

host  all  all       192.168.55.0/24    md5

След това презаредете PostgreSQL сървъра, за да заредите промените:

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

Редактирайте конфигурационния файл на Odoo в /etc/odoo/odoo.conf и конфигурирайте съответно параметрите admin_passwd, db_host и 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

Рестартирайте Odoo и на двата сървъра, за да заредите новите промени:

$ sudo systemctl restart odoo

Отворете Odoo на един от сървърите на приложения чрез уеб браузър. В този пример се свързахме с odoo1, така че URL адресът е http://192.168.55.111:8069/ и трябва да видите следната начална страница:

Посочете "главната парола", идентична със стойността admin_passwd, дефинирана в конфигурационния файл на Odoo. След това попълнете цялата необходима информация за новата компания, която ще използва тази платформа.

След като приключите, изчакайте за момент, докато инициализацията приключи. Ще бъдете пренасочени към таблото за управление на Odoo:

На този етап инсталацията на Odoo е завършена и можете да започнете да конфигурирате бизнес приложенията за тази компания. Всички файлови промени, направени от този сървър на приложения, ще се съхраняват в клъстерираната файлова система, разположена на "/var/lib/odoo/.local" (която също е монтирана към друг сървър на приложения, odoo2), докато промените в базата данни ще се случват на главния възел на PostgreSQL.

Въпреки че работи на два различни хоста, имайте предвид, че самото приложение Odoo не е балансирано в това писане. Можете да използвате HAProxy екземпляри, разгърнати за клъстера на базата данни, за да постигнете по-добра наличност, точно като услугата за база данни. Освен това, споделената дискова файлова система (OCFS2), използвана от двата сървъра на приложения, все още е изложена на отказ в една точка, тъй като всички те използват едно и също iSCSI устройство на lb2 (представете си, ако lb2 е недостъпен).

Операция при отказ на база данни

Може би се чудите какво ще се случи, ако PostgreSQL master се свали. Ако това се случи, ClusterControl автоматично ще промотира работещия подчинен да стане главен, както е показано на екранната снимка по-долу:

Не се изисква нищо да се прави от крайния потребител, тъй като преминаването при отказ се извършва автоматично (след 30-секунден гратисен период). След приключване на отказоустойчивостта новата топология ще бъде отчетена от ClusterControl като:

Ако старият главен източник се върне отново, услугата PostgreSQL ще бъде изключена автоматично и следващото нещо, което потребителят трябва да направи, е да синхронизира отново стария главен обект от новия главен, като отиде на Действия на възел> Повторно изграждане на подчинен репликация :

След това старият главен администратор ще стане подчинен на новия главен, след като операцията по синхронизиране завърши:

ClusterControl със сигурност подобрява наличността на базата данни със своята функция за автоматично възстановяване и повторното синхронизиране на лош възел на базата данни е само на две щраквания. Колко просто е това след катастрофален отказ?

Това е всичко за сега хора. Приятно групиране!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONSTRAINT за проверка на стойности от отдалечено свързана таблица (чрез присъединяване и т.н.)

  2. Искам да извличам данни от различно име на таблица с помощта на функцията postgresql

  3. Използвайте двоична таблица COPY FROM с psycopg2

  4. Как да предоставим всички привилегии за изгледи на произволен потребител

  5. Кога имената на колони или таблици в Postgres се нуждаят от кавички и кога не?