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

Multi-DC PostgreSQL:Thiết lập nút chờ tại một vị trí địa lý khác qua VPN

Trước đây, chúng tôi đã viết về Thiết lập Cụm cơ sở dữ liệu phân tán theo địa lý bằng cách sử dụng MySQL Replication. Lần này, là về PostgreSQL. Thiết lập một cụm phân tán địa lý cho PostgreSQL không phải là một khái niệm mới và cấu trúc liên kết khá phổ biến.

Để đạt được tính khả dụng cao, các tổ chức và công ty đang phân tán các nút cơ sở dữ liệu của họ để khi một sự kiện thảm khốc xảy ra trong một khu vực cụ thể (ảnh hưởng đến trung tâm dữ liệu của bạn), bạn có các nút dự phòng để chuyển đổi dự phòng.

Đây là một thực tế rất phổ biến (sử dụng loại cấu trúc liên kết này) như một phần của kế hoạch Phục hồi sau thảm họa và liên tục trong kinh doanh của tổ chức bạn. Loại cấu trúc liên kết này loại bỏ việc có một điểm lỗi (SPOF). Một yêu cầu phổ biến đặc biệt nếu bạn có RPO thấp và thời gian hoạt động cao hơn (nếu có thể là 99,999999999%).

Trong blog này, tôi sẽ thực hiện đơn giản về cách thực hiện việc này bằng ClusterControl. ClusterControl là một phần mềm quản lý và tự động hóa không cần tác nhân cho các cụm cơ sở dữ liệu. Nó giúp triển khai, giám sát, quản lý và mở rộng máy chủ / cụm cơ sở dữ liệu của bạn trực tiếp từ giao diện người dùng ClusterControl.

Thiết lập Kiến trúc Mong muốn

Kết quả mục tiêu ở đây là triển khai hiệu quả trong một môi trường an toàn. Để làm được điều này, điều quan trọng là bạn cần đặt kết nối đã thiết lập của mình giữa việc sử dụng VPN và sẽ an toàn hơn nếu bạn cũng thiết lập các nút cơ sở dữ liệu của mình qua kết nối TLS / SSL. Đối với thiết lập này trong blog của chúng tôi, chúng tôi chỉ cần triển khai một nút qua VPN và giới thiệu cho bạn cách bạn có thể dễ dàng thực hiện phương pháp này. Xem bên dưới để biết sơ đồ thiết lập mục tiêu:

Để thiết lập chi tiết, mạng tại chỗ sẽ giao tiếp công khai đám mây sử dụng đường hầm VPN và cả hai mạng này sẽ có cổng VPN để cả hai có thể giao tiếp hoặc thiết lập kết nối. ClusterControl yêu cầu bạn giám sát tất cả các nút phải đăng ký vì nó sẽ thu thập thông tin về các nút của bạn để làm số liệu dữ liệu. Bên cạnh đó, nó yêu cầu nút người viết hoạt động tại chỗ của bạn cũng có thể tiếp cận nút chờ vào miền khác, dành cho blog này, được lưu trữ trong Google Cloud Platform (GCP).

Thiết lập OpenVPN của bạn

Thiết lập OpenVPN rất phức tạp cho cả hai miền mạng. Ý chính của điều này là, nó phải được xem xét sau:

  • Các nút từ cơ sở của bạn sẽ có thể thiết lập kết nối với các nút miền công cộng trên đám mây đích
  • Các nút từ cơ sở của bạn có thể có quyền truy cập Internet để tải xuống các gói cần thiết để thiết lập. Trừ khi bạn có tất cả các kho lưu trữ cục bộ được yêu cầu, nếu không thì không xảy ra trường hợp này
  • Các nút từ miền đám mây công cộng của bạn sẽ có thể thiết lập kết nối với các nút tại chỗ
  • Các nút từ miền đám mây công cộng của bạn có thể có quyền truy cập Internet để tải xuống các gói được yêu cầu thiết lập. Trừ khi bạn có tất cả các kho lưu trữ cục bộ được yêu cầu, nếu không thì không xảy ra trường hợp này

Cài đặt và cấu hình OpenVPN

Bước Một

Cài đặt gói openvpn (và các gói easy-rsa cho các bản phân phối Ubuntu / Debian)

$ sudo apt-get install openvpn easy-rsa

Đối với hệ điều hành dựa trên CentOS / RHEL,

$ sudo yum install openvpn wget

$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

Bước Hai

Tạo chứng chỉ của bạn, chẳng hạn như chứng chỉ của tổ chức cấp chứng chỉ (CA), máy chủ và ứng dụng khách.

Đối với Ubuntu / Debian, bạn có thể thực hiện các tác vụ sau:

$ /usr/bin/make-cadir CA

Thay đổi thành thư mục CA

$ cd CA

Tại thời điểm này, bạn có thể chỉnh sửa tệp vars phù hợp với nhu cầu của mình, ví dụ:

export KEY_COUNTRY="SE"

export KEY_PROVINCE="SMD"

export KEY_CITY="Kalmar"

export KEY_ORG="Severalnines"

export KEY_EMAIL="[email protected]"

export KEY_CN="S9s"

export KEY_NAME="server"

export KEY_OU="Support Unit"

Sau đó thực thi tập lệnh vars để xác định các biến env bắt buộc

[ ~/CA ]$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Chạy dọn dẹp

[ ~/CA ]$ ./clean-all

Sau đó, tạo chứng chỉ cho CA, máy chủ và ứng dụng khách của bạn.

[ ~/CA ]$ ./build-ca

[ ~/CA ]$ ./build-key-server server

 $ ./build-dh 2048

[ ~/CA ]$ ./build-key client

Cuối cùng, tạo khóa Bảo mật Chuyển tiếp Hoàn hảo.

$ openvpn --genkey --secret pfs.key

Nếu bạn đang sử dụng các bản phân phối loại CentOS / RHEL, bạn có thể làm như sau:

$ tar xfz /tmp/easyrsa

$ sudo mkdir /etc/openvpn/easy-rsa

$ sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa

# Đảm bảo các khóa RSA của bạn được cấp phép phù hợp cho các mục đích bảo mật

$ sudo chown vagrant /etc/openvpn/easy-rsa/

$ sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn

$ sudo mkdir /etc/openvpn/easy-rsa/keys

$ sudo nano /etc/openvpn/easy-rsa/vars

$ cd /etc/openvpn/easy-rsa

Tại thời điểm này, bạn có thể chỉnh sửa tệp vars phù hợp với nhu cầu của mình, ví dụ:

export KEY_COUNTRY="SE"

export KEY_PROVINCE="SMD"

export KEY_CITY="Kalmar"

export KEY_ORG="Severalnines"

export KEY_EMAIL="[email protected]"

export KEY_CN="S9s"

export KEY_NAME="server"

export KEY_OU="Support Unit"

Sau đó thực thi tập lệnh vars để xác định các biến env bắt buộc

$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Chạy dọn dẹp

$ ./clean-all

Sau đó, tạo chứng chỉ cho CA, máy chủ và ứng dụng khách của bạn.

$ ./build-ca

$ ./build-key-server server

$ ./build-dh 2048

$ cd /etc/openvpn/easy-rsa

$ ./build-key client

$ cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

Khi bạn đã thiết lập xong tất cả, bạn phải tính đến vị trí của các khóa và chứng chỉ của mình. Nếu bạn đang sử dụng systemd hoặc dịch vụ trong Linux để chạy điều này, thì bạn có thể đặt chứng chỉ và khóa của mình vào / etc / openvpn. Có thể, bạn có thể phải chạy lệnh sau:

sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Bước Ba

Tại thời điểm này, tôi kết thúc với cấu hình máy chủ và máy khách sau. Xem các tệp cấu hình của tôi cho phù hợp,

Cấu hình Máy chủ OpenVPN

$ cat /etc/openvpn/server-ovpn.conf 

port 1194

proto udp

dev tun

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key # This file should be kept secret

dh /etc/openvpn/keys/dh2048.pem

cipher AES-256-CBC

auth SHA512

server 10.8.0.0 255.255.255.0

client-to-client

topology subnet

push "route 192.168.30.0 255.255.255.0"

#push "redirect-gateway def1 bypass-dhcp"

#push "redirect-gateway"

push "dhcp-option DNS 8.8.8.8"

push "dhcp-option DNS 8.8.4.4"

ifconfig-pool-persist ipp.txt

keepalive 10 120

comp-lzo

persist-key

persist-tun

#status openvpn-status.log

#log-append  openvpn.log

verb 3

tls-server

tls-auth /etc/openvpn/keys/pfs.key

Điều quan trọng nhất bạn cần tính đến là các tùy chọn sau đây như được lưu ý như sau.

client-to-client - Rất quan trọng để các nút trong VPN có thể ping các nút khác trong miền mạng khác nhau. Giả sử, ClusterControl được đặt tại chỗ, nó có thể ping các nút trong GCP.

push "route 192.168.30.0 255.255.255.0" - Tôi đẩy các bảng định tuyến để / s nút GCP được kết nối với VPN có thể ping các nút của tôi trong miền tại chỗ. Trong cổng GCP VPN của mình, tôi có các bảng định tuyến sau dưới dạng push "route 10.142.0.0 255.255.255.0"

#push "redirect-gateway def1 bypass-dhcp" ,

# push "redirect-gateway" - Cả hai phần này đều không bắt buộc vì tôi cần kết nối internet cho cả hai để thiết lập repo và các gói phụ thuộc khi cài đặt.

push "dhcp-option DNS 8.8.8.8", 

push "dhcp-option DNS 8.8.4.4" - Cả hai phần này đều có thể được thay đổi thành DNS mong muốn của bạn nếu cần. Đây là cho DNS mong muốn của bạn, đặc biệt là khi bạn cần kết nối internet.

Cấu hình ứng dụng khách OpenVPN

$ cat openvpn/client-vpn.ovpn 

client

dev tun

proto udp

remote 34.73.238.239  1194  

ca ca.crt

cert client.crt

key client.key

tls-version-min 1.2

tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256

cipher AES-256-CBC

auth SHA512

resolv-retry infinite

auth-retry none

nobind

persist-key

persist-tun

ns-cert-type server

comp-lzo

verb 3

tls-client

tls-auth pfs.key

Điều quan trọng nhất ở đây là bạn cần chắc chắn về các đường dẫn chính của mình và cũng thay thế các tham số trong phần này,

remote 34.73.238.239  1194  

có thể là tên máy chủ / địa chỉ IP của cổng máy chủ VPN của bạn để kết nối.

Bước Bốn

Cuối cùng, thiết lập máy chủ proxy VPN để chuyển các gói mạng đến giao diện mạng trên máy chủ và cho phép hạt nhân chuyển tiếp lưu lượng IPV4

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Để cài đặt chuyên sâu hơn, tôi khuyên bạn nên xem các bài đăng này dành cho CentOS và trên Ubuntu.

Mở rộng Qua Đám mây Hiệu quả

Giả sử bạn có cấu trúc liên kết sau trong miền tại chỗ của mình,

và bây giờ bạn muốn mở rộng tính khả dụng của mình qua một trung tâm dữ liệu khác, đó là GCP cho blog này. Việc triển khai bằng ClusterControl rất đơn giản. Bạn có thể thực hiện quy trình sau được nêu bên dưới,

Bước Một

Tạo một cụm nô lệ

Bước Hai

Chọn bản gốc của bạn để nhân rộng,

Bước Ba

Thiết lập quyền truy cập vào môi trường đám mây công cộng của bạn

Bước Bốn

Chỉ định tên máy chủ / IP của nút sẽ được mở rộng vào cụm sao PG của bạn,

Bước Năm

Cuối cùng, hãy theo dõi hoạt động công việc để ClusterControl phản ứng như thế nào với loại hành động này

Kết quả sẽ cho bạn thấy mối liên kết giữa trung tâm dữ liệu tại chỗ và trung tâm dữ liệu mở rộng của bạn, nằm trong blog này, nút dự phòng GCP PostgreSQL của chúng tôi. Xem bên dưới để biết kết quả

Kết luận

Việc thiết lập một nút dự phòng theo vị trí địa lý không khó, nhưng vấn đề chính là mức độ an toàn của nút này trong thiết kế kiến ​​trúc của bạn. Sử dụng VPN có thể giảm bớt mối quan tâm chính của vấn đề. Sử dụng OpenVPN chỉ là một cách đơn giản để thực hiện điều này nhưng đối với các ứng dụng giao dịch nặng, các tổ chức có khả năng đầu tư vào các dịch vụ hoặc phần cứng cao cấp để giải quyết việc thiết lập này. Ngoài ra, bằng cách thêm TLS / SSL có thể dễ dàng hơn là xong. Chúng tôi sẽ thảo luận điều này về cách bạn có thể sử dụng TLS / SSL với PostgreSQL trong các blog tiếp theo của chúng tôi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ mục PostgreSQL không được sử dụng cho truy vấn trên các dải IP

  2. Lời khuyên khóa hoặc NOWAIT để tránh phải chờ các hàng bị khóa?

  3. Tham gia SQL cột bí danh

  4. Mệnh đề KIỂM TRA cho các chế độ xem có thể cập nhật

  5. Cách thoát ký tự dấu chấm hỏi (?) Với Spring JpaRepository