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.