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!