PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara Mengelompokkan Odoo 12 dengan Replikasi Streaming PostgreSQL untuk Ketersediaan Tinggi

Odoo (sebelumnya dikenal sebagai OpenERP) adalah rangkaian aplikasi bisnis sumber terbuka. Muncul dalam dua versi - komunitas dan perusahaan. Beberapa aplikasi paling populer (dan gratis!) yang terintegrasi dalam platform ini adalah Diskusi, CRM, Inventaris, Situs Web, Karyawan, Cuti, Rekrutmen, Pengeluaran, Akuntansi, Faktur, Point of Sale, dan banyak lagi.

Dalam posting blog ini, kita akan melihat cara mengelompokkan Odoo untuk mencapai ketersediaan dan skalabilitas tinggi. Posting ini mirip dengan posting kami sebelumnya tentang scaling Drupal, WordPress, Magento. Software yang digunakan adalah Odoo 12, HAProxy 1.8.8, Keepalive 1.3.9, PostgreSQL 11 dan OCFS2 (Oracle Cluster File System).

Setup kami terdiri dari 6 server:

  • lb1 (HAProxy) + keepalive + ClusterControl - 192.168.55.101
  • lb2 (HAProxy) + keepalive + penyimpanan bersama - 192.168.55.102
  • odoo1 - 192.168.55.111
  • odoo2 - 192.168.55.112
  • postgresql1 (master) - 192.168.55.121
  • postgresql2 (budak) - 192.168.55.122

Semua node berjalan di Ubuntu 18.04.2 LTS (Bionic). Kami akan menggunakan ClusterControl untuk menyebarkan dan mengelola PostgreSQL, Keepalive, dan HAProxy karena ini akan menghemat banyak pekerjaan. ClusterControl akan ditempatkan bersama dengan HAProxy di lb1 sementara kami akan menambahkan disk tambahan ke lb2 untuk digunakan sebagai penyedia penyimpanan bersama. Disk ini akan dipasang menggunakan sistem file berkerumun yang disebut OCFS2 sebagai direktori bersama. Alamat IP virtual, 192.168.55.100 bertindak sebagai titik akhir tunggal untuk layanan database kami.

Diagram berikut menggambarkan arsitektur sistem kami secara keseluruhan:

Berikut adalah isi dari /etc/hosts pada semua node:

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

Menerapkan Replikasi Streaming PostgreSQL

Kita akan mulai dengan menginstal ClusterControl di lb1:

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

Ikuti wizard penginstalan, Anda perlu menjawab beberapa pertanyaan selama proses berlangsung.

Setup passwordless SSH dari node ClusterControl (lb1) ke semua node yang akan dikelola oleh ClusterControl, yaitu lb1 (sendiri), lb2, postresql1 dan postgresql2. Tapi pertama-tama, buat kunci SSH:

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

Kemudian salin kunci ke semua node target menggunakan alat 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]

Buka ClusterControl UI di http://192.168.55.101/clustercontrol dan buat pengguna admin super dengan kata sandi. Anda akan diarahkan ke dasbor UI ClusterControl. Kemudian, terapkan cluster PostgreSQL baru dengan mengklik tombol "Deploy" di menu atas. Anda akan disajikan dengan dialog penerapan berikut:

Inilah yang kami ketik di dialog berikutnya, "Tentukan Server PostgreSQL":

  • Port Server:5432
  • Pengguna:postgres
  • Sandi:s3cr3t
  • Versi:11
  • Datadir:
  • Repositori:Gunakan Repositori Vendor

Pada bagian "Define Topology", tentukan alamat IP postgresql1 dan postgresql2 yang sesuai:

Di bagian terakhir "Ringkasan Penerapan" Anda memiliki opsi untuk mengaktifkan replikasi sinkron. Karena kita akan menggunakan slave hanya untuk tujuan failover (slave tidak akan melayani operasi baca apa pun), kita biarkan nilai default apa adanya. Kemudian, tekan "Deploy" untuk memulai penyebaran cluster database. Anda dapat memantau kemajuan penerapan dengan melihat Aktivitas> Pekerjaan> Buat Cluster :

Sementara itu, minum kopi dan penyebaran cluster akan selesai dalam 10~15 menit.

Menerapkan Load Balancer dan IP Virtual untuk Server PostgreSQL

Pada titik ini, kita sudah memiliki Cluster Replikasi PostgreSQL dua simpul yang berjalan dalam pengaturan master-slave:

Langkah selanjutnya adalah menerapkan tingkat penyeimbang beban untuk database kami, yang memungkinkan kami untuk mengikat alamat IP virtual dan menyediakan titik akhir tunggal untuk aplikasi. Kami akan mengonfigurasi opsi penerapan HAProxy seperti di bawah ini:

Aplikasi tidak mendukung pemisahan baca-tulis secara asli sehingga kami akan menggunakan metode aktif-pasif untuk mencapai ketersediaan tinggi. Algoritme penyeimbangan beban terbaik adalah kebijakan "sumber", karena kami hanya menggunakan satu simpul PostgreSQL dalam satu waktu.

Ulangi langkah yang sama untuk penyeimbang beban lainnya, lb2. Ubah "Alamat Server" menjadi 192.168.55.102 sebagai gantinya. Berikut tampilannya setelah penerapan selesai jika Anda membuka halaman Node:

Garis merah pada pendengar pertama diharapkan di mana HAProxy menunjukkan postgresql2 (192.168.55.122) sedang turun karena skrip pemeriksaan kesehatan mengembalikan simpul naik tetapi bukan master. Pendengar kedua dengan garis biru (haproxy_5434_ro) menunjukkan simpul UP tetapi dalam status "cadangan". Listener ini dapat diabaikan karena aplikasi tidak mendukung pemisahan baca-tulis.

Selanjutnya, kami menerapkan instance Keepalive di atas penyeimbang beban ini untuk mengikatnya dengan satu alamat IP virtual. Buka Kelola -> Load Balancer -> Keepalived -> Deploy Keepalive dan tentukan instance HAProxy pertama dan kedua, lalu alamat IP virtual dan antarmuka jaringan yang akan didengarkan:

Klik "Deploy Keepalive" untuk memulai penerapan. Layanan koneksi PostgreSQL sekarang memiliki beban seimbang ke salah satu node database dan dapat diakses melalui 192.168.55.100 port 5433.

Mengonfigurasi iSCSI

Server penyimpanan (lb2) perlu mengekspor disk melalui iSCSI sehingga dapat dipasang di kedua server aplikasi Odoo (odoo1 dan odoo2). iSCSI pada dasarnya memberi tahu kernel Anda bahwa Anda memiliki disk SCSI, dan itu mengangkut akses itu melalui IP. “Server” disebut “target” dan “klien” yang menggunakan perangkat iSCSI tersebut adalah “inisiator”.

Pertama, instal target iSCSI di lb2:

$ sudo apt install -y tgt

Aktifkan tgt saat boot:

$ systemctl enable tgt

Lebih disukai untuk memiliki disk terpisah untuk pengelompokan sistem file. Jadi, kita akan menggunakan disk lain yang dipasang di lb2 (/ dev/sdb) untuk dibagikan di antara server aplikasi (odoo1 dan odoo2). Pertama, buat target iSCSI menggunakan alat tgtadm:

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

Kemudian, tetapkan perangkat blok /dev/sdb ke nomor unit logis (LUN) 1 bersama dengan ID target 1:

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

Kemudian, izinkan node inisiator di jaringan yang sama untuk mengakses target ini:

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

Gunakan alat tgt-admin untuk membuang baris konfigurasi iSCSI dan menyimpannya sebagai file konfigurasi agar tetap ada saat dimulai ulang:

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

Terakhir, mulai ulang layanan target iSCSI:

$ sudo systemctl restart tgt

** Langkah-langkah berikut harus dilakukan pada odoo1 dan odoo2.

Instal inisiator iSCSI di masing-masing host:

$ sudo apt-get install -y open-iscsi

Atur inisiator iSCSI untuk memulai secara otomatis:

$ sudo systemctl enable open-iscsi

Temukan target iSCSI yang telah kami siapkan sebelumnya:

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

Jika Anda melihat hasil yang sama seperti di atas, itu berarti kita dapat melihat dan dapat terhubung ke target iSCSI. Gunakan perintah berikut untuk terhubung ke target iSCSI di 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.

Pastikan Anda dapat melihat hard disk baru (/dev/sdb) terdaftar di bawah direktori /dev:

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

Disk bersama kami sekarang terpasang di kedua server aplikasi (odoo1 dan odoo2).

Mengonfigurasi OCFS2 untuk Odoo

** Langkah-langkah berikut harus dilakukan pada odoo1 kecuali ditentukan lain.

OCFS2 memungkinkan sistem file dipasang lebih dari satu tempat. Instal alat OCFS2 di server odoo1 dan odoo2:

$ sudo apt install -y ocfs2-tools

Buat tabel partisi disk untuk hard disk drive /dev/sdb:

$ sudo cfdisk /dev/sdb

Buat partisi dengan menggunakan urutan berikut di wizard cfdisk:Baru> Utama> terima Ukuran> Tulis> ya> Keluar .

Buat sistem file OCFS2 di /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

Buat file konfigurasi cluster di /etc/ocfs2/cluster.conf dan tentukan arahan node dan cluster seperti di bawah ini:

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

Perhatikan bahwa atribut di bawah klausa node atau cluster harus berada setelah tab.

** Langkah-langkah berikut harus dilakukan pada odoo1 dan odoo2 kecuali ditentukan lain.

Buat file konfigurasi yang sama (/etc/ocfs2/cluster.conf) di odoo2. File ini harus sama di semua node dalam cluster, dan perubahan yang dibuat pada file ini harus diterapkan ke node lain dalam cluster.

Mulai ulang layanan o2cb untuk menerapkan perubahan yang kami buat di /etc/ocfs2/cluster.conf:

$ sudo systemctl restart o2cb

Buat direktori file Odoo di bawah /var/lib/odoo:

$ sudo mkdir -p /var/lib/odoo

Dapatkan ID blok untuk perangkat /dev/sdb1. UUID direkomendasikan di fstab jika Anda menggunakan perangkat iSCSI:

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

Gunakan nilai UUID saat menambahkan baris berikut ke /etc/fstab:

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

Daftarkan cluster ocfs2 dan mount sistem file dari fstab:

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

Verifikasi dengan:
 

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

Jika Anda dapat melihat baris di atas pada semua server aplikasi, sebaiknya Anda menginstal Odoo.

Menginstal dan Mengonfigurasi Odoo 12

** Langkah-langkah berikut harus dilakukan pada odoo1 dan odoo2 kecuali ditentukan lain.

Instal Odoo 12 melalui repositori paket:

$ 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

Secara default, perintah di atas akan secara otomatis menginstal server PostgreSQL pada host yang sama sebagai bagian dari dependensi Odoo. Kami mungkin ingin menghentikannya karena kami tidak akan menggunakan server lokal:

$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql

Pada postgresql1, buat pengguna database bernama "odoo":

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

Tentukan kata sandi di prompt. Kemudian pada postgresql1 dan postgresql2, tambahkan baris berikut di dalam pg_hba.conf untuk memungkinkan aplikasi dan node load balancer terhubung. Seperti dalam kasus kami, itu terletak di /etc/postgresql/11/main/pg_hba.conf:

host  all  all       192.168.55.0/24    md5

Kemudian muat ulang server PostgreSQL untuk memuat perubahan:

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

Edit file konfigurasi Odoo di /etc/odoo/odoo.conf dan konfigurasikan parameter admin_passwd, db_host dan db_password yang sesuai:

[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

Mulai ulang Odoo di kedua server untuk memuat perubahan baru:

$ sudo systemctl restart odoo

Itu, buka Odoo di salah satu server aplikasi melalui browser web. Dalam contoh ini, kami terhubung ke odoo1, sehingga URL-nya adalah http://192.168.55.111:8069/ dan Anda akan melihat halaman awal berikut:

Tentukan "Kata Sandi Utama" yang identik dengan nilai admin_passwd yang ditentukan dalam file konfigurasi Odoo. Kemudian isi semua informasi yang diperlukan untuk perusahaan baru yang akan menggunakan platform ini.

Setelah selesai, tunggu beberapa saat hingga inisialisasi selesai. Anda akan diarahkan ke dasbor administrasi Odoo:

Pada titik ini, penginstalan Odoo selesai dan Anda dapat mulai mengonfigurasi aplikasi bisnis untuk perusahaan ini. Semua perubahan file yang dilakukan oleh server aplikasi ini akan disimpan di dalam sistem file cluster yang terletak di "/var/lib/odoo/.local" (yang juga dipasang ke server aplikasi lain, odoo2), sedangkan perubahan pada database akan terjadi pada node master PostgreSQL.

Meskipun berjalan pada dua host yang berbeda, perhatikan bahwa aplikasi Odoo sendiri tidak memiliki load-balanced dalam tulisan ini. Anda dapat menggunakan instans HAProxy yang digunakan untuk cluster database untuk mencapai ketersediaan yang lebih baik seperti layanan database. Selain itu, sistem file disk bersama (OCFS2) yang digunakan oleh kedua server aplikasi masih terkena satu titik kegagalan, karena semuanya menggunakan perangkat iSCSI yang sama pada lb2 (bayangkan jika lb2 tidak dapat diakses).

Operasi Kegagalan Basis Data

Anda mungkin bertanya-tanya apa yang akan terjadi jika master PostgreSQL mati. Jika itu terjadi, ClusterControl akan secara otomatis mempromosikan slave yang sedang berjalan menjadi master, seperti yang ditunjukkan pada tangkapan layar di bawah ini:

Tidak ada yang perlu dilakukan dari pengguna akhir karena failover dilakukan secara otomatis (setelah masa tenggang 30 detik). Setelah failover selesai, topologi baru akan dilaporkan oleh ClusterControl sebagai:

Jika master lama muncul kembali, layanan PostgreSQL akan dimatikan secara otomatis dan hal berikutnya yang harus dilakukan pengguna adalah menyinkronkan ulang master lama dari master baru dengan membuka Tindakan Node> Rebuild Replication Slave :

Master lama kemudian akan menjadi budak master baru setelah operasi sinkronisasi selesai:

ClusterControl pasti meningkatkan ketersediaan basis data dengan fitur pemulihan otomatisnya dan menyinkronkan ulang simpul basis data yang buruk hanya dengan dua klik saja. Seberapa sederhana itu setelah peristiwa kegagalan bencana?

Itu saja untuk saat ini. Selamat mengelompokkan!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Muat dump Postgres setelah docker-compose up

  2. Nilai yang Dihasilkan di Postgres

  3. Pembaruan massal/batch/upsert di PostgreSQL

  4. Waktu postgres dengan kesetaraan zona waktu

  5. Kembalikan nol jika tidak ada catatan yang ditemukan