PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách Cluster Odoo 12 với PostgreSQL Streaming Replication để có tính khả dụng cao

Odoo (trước đây gọi là OpenERP) là một bộ ứng dụng kinh doanh mã nguồn mở. Nó có hai phiên bản - cộng đồng và doanh nghiệp. Một số ứng dụng phổ biến nhất (và miễn phí!) Được tích hợp trong nền tảng này là Discuss, CRM, Inventory, Website, Employee, Leaves, Recruitment, Chi phí, Kế toán, Invoicing, Point of Sale và nhiều ứng dụng khác.

Trong bài đăng blog này, chúng ta sẽ xem xét cách phân cụm Odoo để đạt được tính khả dụng và khả năng mở rộng cao. Bài đăng này tương tự như các bài viết trước của chúng tôi về mở rộng quy mô Drupal, WordPress, Magento. Phần mềm được sử dụng là Odoo 12, HAProxy 1.8.8, Keepalived 1.3.9, PostgreSQL 11 và OCFS2 (Oracle Cluster File System).

Thiết lập của chúng tôi bao gồm 6 máy chủ:

  • lb1 (HAProxy) + keepalived + ClusterControl - 192.168.55.101
  • lb2 (HAProxy) + keepalived + bộ nhớ dùng chung - 192.168.55.102
  • odoo1 - 192.168.55.111
  • odoo2 - 192.168.55.112
  • postgresql1 (chính) - 192.168.55.121
  • postgresql2 (nô lệ) - 192.168.55.122

Tất cả các nút đang chạy trên Ubuntu 18.04.2 LTS (Bionic). Chúng tôi sẽ sử dụng ClusterControl để triển khai và quản lý PostgreSQL, Keepalived và HAProxy vì nó sẽ giúp chúng tôi tiết kiệm rất nhiều công việc. ClusterControl sẽ được đặt cùng với HAProxy trên lb1 trong khi chúng tôi sẽ thêm một đĩa bổ sung vào lb2 để được sử dụng như một nhà cung cấp bộ nhớ dùng chung. Đĩa này sẽ được gắn kết bằng cách sử dụng hệ thống tệp được phân nhóm có tên OCFS2 làm thư mục chia sẻ. Địa chỉ IP ảo, 192.168.55.100 hoạt động như một điểm cuối duy nhất cho dịch vụ cơ sở dữ liệu của chúng tôi.

Sơ đồ sau minh họa kiến ​​trúc hệ thống tổng thể của chúng tôi:

Sau đây là nội dung của / etc / hosts trên tất cả các nút:

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

Triển khai bản sao phát trực tuyến PostgreSQL

Chúng tôi sẽ bắt đầu bằng cách cài đặt ClusterControl trên lb1:

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

Làm theo trình hướng dẫn cài đặt, bạn sẽ cần trả lời một số câu hỏi trong quá trình này.

Thiết lập SSH không cần mật khẩu từ nút ClusterControl (lb1) đến tất cả các nút sẽ được quản lý bởi ClusterControl, là lb1 (chính nó), lb2, postresql1 và postgresql2. Nhưng trước tiên, hãy tạo khóa SSH:

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

Sau đó sao chép khóa vào tất cả các nút đích bằng công cụ 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]

Mở giao diện người dùng ClusterControl tại http://192.168.55.101/clustercontrol và tạo một người dùng quản trị cấp cao với mật khẩu. Bạn sẽ được chuyển hướng đến bảng điều khiển giao diện người dùng ClusterControl. Sau đó, triển khai một cụm PostgreSQL mới bằng cách nhấp vào nút "Triển khai" ở menu trên cùng. Bạn sẽ thấy hộp thoại triển khai sau:

Đây là những gì chúng tôi đã nhập trong hộp thoại tiếp theo, "Xác định Máy chủ PostgreSQL":

  • Cổng Máy chủ: 5432
  • Người dùng: postgres
  • Mật khẩu: s3cr3t
  • Phiên bản: 11
  • Datadir:<để trống>
  • Kho lưu trữ: Sử dụng Kho lưu trữ của Nhà cung cấp

Trên phần "Xác định cấu trúc liên kết", chỉ định địa chỉ IP của postgresql1 và postgresql2 cho phù hợp:

Trong phần cuối cùng "Tóm tắt triển khai", bạn có một tùy chọn để kích hoạt sao chép đồng bộ. Vì chúng ta sẽ chỉ sử dụng nô lệ cho các mục đích chuyển đổi dự phòng (nô lệ sẽ không phục vụ bất kỳ hoạt động đọc nào), chúng tôi chỉ để giá trị mặc định như cũ. Sau đó, nhấn "Triển khai" để bắt đầu triển khai cụm cơ sở dữ liệu. Bạn có thể theo dõi tiến trình triển khai bằng cách xem Hoạt động> Công việc> Tạo cụm :

Trong khi đó, hãy uống một chút cà phê và việc triển khai cụm sẽ được hoàn thành trong vòng 10 ~ 15 phút.

Triển khai Bộ cân bằng tải và IP ảo cho Máy chủ PostgreSQL

Tại thời điểm này, chúng ta đã có Cụm sao chép PostgreSQL hai nút đang chạy trong thiết lập chủ-tớ:

Bước tiếp theo là triển khai tầng cân bằng tải cho cơ sở dữ liệu của chúng tôi, cho phép chúng tôi kết nối nó với địa chỉ IP ảo và cung cấp một điểm cuối duy nhất cho ứng dụng. Chúng tôi sẽ định cấu hình các tùy chọn triển khai HAProxy như sau:

Ứng dụng không hỗ trợ phân tách đọc-ghi nguyên bản nên chúng tôi sẽ sử dụng phương pháp chủ động-thụ động để đạt được tính khả dụng cao. Thuật toán cân bằng tải tốt nhất là chính sách "nguồn", vì chúng tôi chỉ sử dụng một nút PostgreSQL tại một thời điểm.

Lặp lại bước tương tự cho bộ cân bằng tải khác, lb2. Thay vào đó, hãy thay đổi "Địa chỉ máy chủ" thành 192.168.55.102. Đây là giao diện của nó sau khi quá trình triển khai hoàn tất nếu bạn truy cập vào trang Nodes:

Dòng màu đỏ trên trình nghe đầu tiên được mong đợi nơi HAProxy hiển thị postgresql2 (192.168.55.122) bị lỗi vì tập lệnh kiểm tra tình trạng trả về nút đã lên nhưng không phải là nút chính. Trình nghe thứ hai có dòng màu xanh lam (haproxy_5434_ro) cho thấy nút đang TĂNG nhưng ở trạng thái "sao lưu". Tuy nhiên, trình nghe này có thể bị bỏ qua vì ứng dụng không hỗ trợ phân tách đọc-ghi.

Tiếp theo, chúng tôi triển khai các phiên bản Keepalived trên đầu các bộ cân bằng tải này để liên kết chúng với một địa chỉ IP ảo duy nhất. Đi tới Quản lý -> Cân bằng tải -> Keepalived -> Triển khai Keepalived và chỉ định phiên bản HAProxy thứ nhất và thứ hai, sau đó là địa chỉ IP ảo và giao diện mạng để lắng nghe:

Nhấp vào "Triển khai Keepalived" để bắt đầu triển khai. Dịch vụ kết nối PostgreSQL hiện được cân bằng tải cho một trong các nút cơ sở dữ liệu và có thể truy cập qua 192.168.55.100 cổng 5433.

Định cấu hình iSCSI

Máy chủ lưu trữ (lb2) cần xuất một đĩa thông qua iSCSI để nó có thể được gắn trên cả hai máy chủ ứng dụng Odoo (odoo1 và odoo2). iSCSI về cơ bản cho nhân của bạn biết rằng bạn có một đĩa SCSI và nó vận chuyển quyền truy cập đó qua IP. “Máy chủ” được gọi là “mục tiêu” và “máy khách” sử dụng thiết bị iSCSI đó là “bộ khởi tạo”.

Đầu tiên, hãy cài đặt mục tiêu iSCSI trong lb2:

$ sudo apt install -y tgt

Bật tgt khi khởi động:

$ systemctl enable tgt

Nên có một đĩa riêng để phân cụm hệ thống tệp. Do đó, chúng ta sẽ sử dụng một đĩa khác được gắn trong lb2 (/ dev / sdb) để được chia sẻ giữa các máy chủ ứng dụng (odoo1 và odoo2). Đầu tiên, tạo mục tiêu iSCSI bằng công cụ tgtadm:​​

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

Sau đó, gán thiết bị khối / dev / sdb cho số đơn vị logic (LUN) 1 cùng với ID mục tiêu 1:

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

Sau đó, cho phép các nút khởi tạo trên cùng một mạng truy cập vào mục tiêu này:

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

Sử dụng công cụ tgt-admin để kết xuất các dòng cấu hình iSCSI và lưu nó dưới dạng tệp cấu hình để làm cho nó liên tục khi khởi động lại:

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

Cuối cùng, khởi động lại dịch vụ mục tiêu iSCSI:

$ sudo systemctl restart tgt

** Các bước sau phải được thực hiện trên odoo1 và odoo2.

Cài đặt trình khởi tạo iSCSI trên các máy chủ tương ứng:

$ sudo apt-get install -y open-iscsi

Đặt trình khởi tạo iSCSI để tự động khởi động:

$ sudo systemctl enable open-iscsi

Khám phá các mục tiêu iSCSI mà chúng tôi đã thiết lập trước đó:

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

Nếu bạn thấy kết quả tương tự như trên, điều đó có nghĩa là chúng tôi có thể thấy và có thể kết nối với mục tiêu iSCSI. Sử dụng lệnh sau để kết nối với mục tiêu iSCSI trên 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.

Đảm bảo rằng bạn có thể thấy đĩa cứng mới (/ dev / sdb) được liệt kê trong thư mục / dev:

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

Đĩa chia sẻ của chúng tôi hiện được gắn trên cả hai máy chủ ứng dụng (odoo1 và odoo2).

Định cấu hình OCFS2 cho Odoo

** Các bước sau phải được thực hiện trên odoo1 trừ khi được chỉ định khác.

OCFS2 cho phép hệ thống tệp được gắn nhiều hơn một nơi. Cài đặt công cụ OCFS2 trên cả máy chủ odoo1 và odoo2:

$ sudo apt install -y ocfs2-tools

Tạo bảng phân vùng đĩa cho ổ đĩa cứng / dev / sdb:

$ sudo cfdisk /dev/sdb

Tạo phân vùng bằng cách sử dụng các trình tự sau trong trình hướng dẫn cfdisk: Mới> Chính> chấp nhận Kích thước> Ghi> có> Thoát .

Tạo hệ thống tệp OCFS2 trên / 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

Tạo tệp cấu hình cụm tại /etc/ocfs2/cluster.conf và xác định các chỉ thị nút và cụm như bên dưới:

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

Lưu ý rằng các thuộc tính trong mệnh đề nút hoặc cụm cần phải nằm sau tab.

** Các bước sau phải được thực hiện trên odoo1 và odoo2 trừ khi được chỉ định khác.

Tạo cùng một tệp cấu hình (/etc/ocfs2/cluster.conf) trên odoo2. Tệp này phải giống nhau trên tất cả các nút trong cụm và các thay đổi được thực hiện đối với tệp này phải được truyền tới các nút khác trong cụm.

Khởi động lại dịch vụ o2cb để áp dụng các thay đổi mà chúng tôi đã thực hiện trong /etc/ocfs2/cluster.conf:

$ sudo systemctl restart o2cb

Tạo thư mục tệp Odoo trong / var / lib / odoo:

$ sudo mkdir -p /var/lib/odoo

Lấy ID khối cho thiết bị / dev / sdb1. UUID được khuyến nghị trong fstab nếu bạn sử dụng thiết bị iSCSI:

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

Sử dụng giá trị UUID khi thêm dòng sau vào / etc / fstab:

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

Đăng ký cụm ocfs2 và gắn kết hệ thống tệp từ fstab:

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

Xác minh bằng:

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

Nếu bạn có thể thấy dòng trên trên tất cả các máy chủ ứng dụng, chúng tôi rất tốt để cài đặt Odoo.

Cài đặt và định cấu hình Odoo 12

** Các bước sau phải được thực hiện trên odoo1 và odoo2 trừ khi được chỉ định khác.

Cài đặt Odoo 12 qua kho gói:

$ 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

Theo mặc định, lệnh trên sẽ tự động cài đặt máy chủ PostgreSQL trên cùng một máy chủ lưu trữ như một phần của phụ thuộc Odoo. Chúng tôi có thể muốn dừng nó lại vì chúng tôi sẽ không sử dụng máy chủ cục bộ:

$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql

Trên postgresql1, tạo người dùng cơ sở dữ liệu có tên "odoo":

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

Chỉ định mật khẩu trong lời nhắc. Sau đó, trên cả postgresql1 và postgresql2, thêm dòng sau vào bên trong pg_hba.conf để cho phép ứng dụng và các nút cân bằng tải kết nối. Như trong trường hợp của chúng tôi, nó được đặt tại /etc/postgresql/11/main/pg_hba.conf:

host  all  all       192.168.55.0/24    md5

Sau đó tải lại máy chủ PostgreSQL để tải các thay đổi:

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

Chỉnh sửa tệp cấu hình Odoo tại /etc/odoo/odoo.conf và định cấu hình các thông số admin_passwd, db_host và db_password cho phù hợp:

[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

Khởi động lại Odoo trên cả hai máy chủ để tải các thay đổi mới:

$ sudo systemctl restart odoo

Mở Odoo trên một trong các máy chủ ứng dụng thông qua trình duyệt web. Trong ví dụ này, chúng tôi đã kết nối với odoo1, do đó URL là http://192.168.55.111:8069/ và bạn sẽ thấy trang đầu tiên sau:

Chỉ định "Mật khẩu chính" giống với giá trị admin_passwd được xác định trong tệp cấu hình Odoo. Sau đó, điền vào tất cả các thông tin cần thiết cho công ty mới sẽ sử dụng nền tảng này.

Sau khi hoàn tất, hãy đợi một lát cho đến khi quá trình khởi tạo kết thúc. Bạn sẽ được chuyển hướng đến trang tổng quan quản trị Odoo:

Tại thời điểm này, quá trình cài đặt Odoo đã hoàn tất và bạn có thể bắt đầu định cấu hình các ứng dụng kinh doanh cho công ty này. Tất cả các thay đổi tệp được thực hiện bởi máy chủ ứng dụng này sẽ được lưu trữ bên trong hệ thống tệp được phân nhóm tại "/var/lib/odoo/.local" (cũng được gắn với máy chủ ứng dụng khác, odoo2), trong khi các thay đổi đối với cơ sở dữ liệu sẽ diễn ra trên nút chính PostgreSQL.

Mặc dù chạy trên hai máy chủ khác nhau, hãy lưu ý rằng bản thân ứng dụng Odoo không được cân bằng tải trong bài viết này. Bạn có thể sử dụng các phiên bản HAProxy được triển khai cho cụm cơ sở dữ liệu để đạt được tính khả dụng tốt hơn giống như dịch vụ cơ sở dữ liệu. Ngoài ra, hệ thống tệp đĩa dùng chung (OCFS2) được sử dụng bởi cả hai máy chủ ứng dụng vẫn có một điểm lỗi duy nhất, vì tất cả chúng đều đang sử dụng cùng một thiết bị iSCSI trên lb2 (hãy tưởng tượng nếu lb2 không thể truy cập được).

Thao tác chuyển đổi dự phòng cơ sở dữ liệu

Bạn có thể tự hỏi điều gì sẽ xảy ra nếu PostgreSQL master gặp sự cố. Nếu điều đó xảy ra, ClusterControl sẽ tự động thăng cấp nô lệ đang chạy trở thành chủ nhân, như thể hiện trong ảnh chụp màn hình bên dưới:

Người dùng cuối không cần phải thực hiện gì vì quá trình chuyển đổi dự phòng được thực hiện tự động (sau thời gian gia hạn 30 giây). Sau khi chuyển đổi dự phòng hoàn tất, cấu trúc liên kết mới sẽ được ClusterControl báo cáo là:

Nếu bản chính cũ hoạt động trở lại, dịch vụ PostgreSQL sẽ tự động tắt và điều tiếp theo người dùng phải làm là đồng bộ hóa lại bản chính cũ từ bản chính mới bằng cách đi tới Node Actions> Rebuild Replication Slave :

Máy chủ cũ sau đó sẽ trở thành nô lệ cho máy chủ mới sau khi hoạt động đồng bộ hóa hoàn tất:

ClusterControl chắc chắn cải thiện tính khả dụng của cơ sở dữ liệu với tính năng khôi phục tự động của nó và đồng bộ hóa lại một nút cơ sở dữ liệu xấu chỉ đơn giản là hai cú nhấp chuột. Điều đó đơn giản như thế nào sau một sự kiện thất bại thảm khốc?

Đó là tất cả cho bây giờ folks. Chúc các bạn thành nhóm vui vẻ!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:Tự động gia tăng dựa trên ràng buộc duy nhất nhiều cột

  2. Cắt bỏ khoảng trắng ở cuối với PostgreSQL

  3. Postgres UUID JDBC không hoạt động

  4. Triển khai Switchover / Switchback trong PostgreSQL 9.3.

  5. Di chuyển từ Postgres sang SQL Server 2008