Trang chủTác giảLiên hệ

Kubernetes Practice - Setup a database master-slave replication with PostgreSQL

By Huỳnh Minh Quân
Published in DevOps
December 09, 2021
5 min read

Giới thiệu

Chào mọi người đến với series practice về kubernetes. Ở bài này chúng ta sẽ tìm hiểu về cách triển khai một hệ thống database ở mode master-slave replication ở trên kubernetes.

Trước khi nói về cách trển khai hệ database, thì ta sẽ nói qua database master-slave replication là gì và tại sao ta lại cần nó?

Database Master-Slave Replication

Đây là một hệ thống database bao gồm một master DB, và nhiều slave replication DB. Với master được sử dụng cho việc ghi dữ liệu, và các replication DB sẽ dùng cho việc đọc dữ liệu. Dữ liệu được ghi vào master DB sẽ được chuyển qua các replication DB để dữ liệu trên toàn hệ thống database của ta được đồng bộ với nhau.

Trong một ứng dụng, chúng ta chỉ thường xài một DB cho cả việc đọc và ghi, nếu ứng dụng chỉ là các ứng dụng web bình thường và có lượt truy cập không cao thì việc sử dụng một DB như vậy thì cũng đủ đáp ứng yêu cầu rồi. Nhưng đối với các ứng dụng mà có lượt truy cập cao, việc chỉ sử dụng một DB cho cả việc đọc và ghi, sẽ dẫn tới ứng dụng của chúng ta không thể đáp ứng được tất cả các lượt truy cập của user hoặc là ứng dụng ta sẽ có hiệu suất rất kém. Vì vậy nên hệ thống DB master-slave replication này sẽ giúp ta tăng hiệu suất xử lý của ứng dụng lên nhiều, bằng cách tách ra việc ghi dữ liệu sẽ được ghi vào một DB được gọi là master, và khi đọc dữ liệu thì ta sẽ đọc từ các DB read replicas => tăng hiệu suất và tốc độ xử lý của ứng dụng

image.png

Write k8s configuration file

Bây giờ ta sẽ tiến hành viết file cấu hình để triển khai hệ thống lên kubernetes, ở bài này mình sẽ sử dụng PostgreSQL.

Tạo master DB

Tạo một file tên là postgres-password-cm.yaml để chứa thông tin password của PostgreSQL DB.

Vì để demo nên ta sẽ sử dụng ConfigMap cho nhanh, còn khi làm thực tế ta sẽ dùng Secret. Đầu tiên ta sẽ tạo master DB trước, tạo một file tên là postgres-master-sts.yaml:

Ở file config trên ta sử dụng image postgres:11, ở thuộc tính command ta sẽ truyền thêm vào câu lệnh để báo cho postgres biết là ta sẽ sử dụng custom config file cho nó, chứ không dùng config có sẵn của nó, hai file config ta chỉ định chỉ báo cho postgres biết nó đang là master DB. Để truyền hai file config trên vào DB được, ta sẽ sử dụng ConfigMap dạng volumeMounts, các bạn có thể đọc bài 8 của Kubernetes Series của mình để hiểu hơn về vấn đề này. ConfigMap chứa hai hai config đó có tên là postgres-master-configmap, giờ ta sẽ tạo nó.

Tạo một folder tên là config, mở nó ra và tạo thêm hai file tên là postgresql.confpg_hba.conf.

File này là mình copy từ trong docker ra, tất cả config từ chỗ comment # CUSTOMIZED OPTIONS trở lên là mặc định của file ở trong docker, ta thêm config cho master db từ chỗ # Add settings for extensions here trở xuống. Còn file pg_hba.conf thì sẽ như sau.

Sau đó ta tạo ConfigMap.

Sau khi tạo được ConfigMap thì tiếp theo ta sẽ tạo StatefulSet ở trên.

Kiểm tra nó chạy được chưa.

Ok, vậy là ta đã tạo được master db, bây giờ ta sẽ truy cập vào nó và thực thi câu lệnh tạo user. Đây là user mà slave db sẽ sử dụng để connect được tới master.

Ok, cuối cùng là ta tạo Service resource để client có thể connect được tới master db này, tạo một file tên là postgres-master-svc.yaml.

Chuẩn bị dữ liệu cho slave DB

Thì để tạo được slave DB, PostgreSQL yêu cầu ta phải sync dữ liệu từ master DB ra, sau đó khỏi tạo các slave DB với data là từ data được sync này. Để làm được việc này trong kubernetes, đầu tiên ta sẽ tạo một PVC, và chạy một Job để sync data từ master DB vào PVC này, sau đó ta sẽ tạo slave DB mà dữ liệu sẽ được mount từ PVC này ra. Minh họa như sau.

image.png

Tạo một file tên là pvc-slave.yaml

Ta tạo Job resource để chạy sync dữ liệu từ master DB vào PVC ở trên, tạo một file tên là sync-master-data.yaml

Log job ra.

Ta sẽ thấy job của ta đã chạy sync data vào PVC thành công.

Tạo slave DB

Giờ ta sẽ tạo slave DB. Đầu tiên ta sẽ tạo ConfigMap để chứa config mà báo cho DB biết nó sẽ là slave DB, tạo một folder tên là slave-config, tạo hai file là postgresql.conf với recovery.conf

Tạo ConfigMap.

Tiếp theo, ta sẽ tạo StatefulSet mà mount vào PVC ta tạo ở trên, nó sẽ có thông tin dữ liệu được sync từ master db.

image.png

Tạo một file tên là postgres-slave-sts.yaml

Ở file config trên, vì mình không kiếm được câu config để postgres chỉ định custom recovery.conf config file, nên mình dùng initContainers để khỏi tạo config, bằng cách mount ConfigMap vào initContainers, sau đó sẽ dùng thuộc tính command để thực hiện câu lệnh copy file config từ initContainers sang PVC, và postgres container chính sẽ mount vào PVC đó, nó sẽ có được hai file copy ở trên. Ok, giờ ta tạo slave DB.

Khi bạn log db ra, bạn sẽ thấy nó có hiển thị dòng là db chỉ dùng để đọc, không thể ghi được.

Vậy là slave DB của ta đã được tạo thành công, bước cuối là ta kiểm tra xem khi ta insert dữ liệu vào master db thì slave DB của ta có dữ liệu giống y change như master hay không. Truy cập vào master DB.

Sau khi insert dữ liệu xong thì ta truy cập vào slave DB.

Ta thực hiện câu lệnh select và thấy hai dữ liệu khi nãy ta đã insert vào master. Ok, ta đã triển khai được mô hình database master-slave replication trên kubernetes thành công 😁. Thì đây là để demo, trong production thì ta có thể triển khai nhanh hơn bằng cách sử dụng công cụ có sẵn của kubernetes, là Helm, nó sẽ giúp ta triển khai mô hình này một cách nhanh chóng chỉ bằng 1 2 câu CLI, và ta cũng chả cần phải viết file config.

Tạo bằng Helm

Helm là một package manager cho kubernetes. Đầu tiên muốn xài thì bạn cần cài trước, các bạn xem cách cài ở đây https://helm.sh/docs/intro/install/. Sau khi cài xong thì ta chạy những câu lệnh sau đây để triển khai database.

Sau khi tạo xong bạn get pod ra xem thì sẽ thấy có 3 pod postgresql được deploy.

PostgreSQL HA Helm chart sẽ triển khai một cluster với 3 pod, một cho pgpool, một cho master và một cho slave. Sử dụng Helm ta có thể triển khai mọi thứ rất nhanh, chỉ cần hai câu CLI.

Kết luận

Vậy là ta đã tìm hiểu xong cách triển khai mô hình database dạng master-slave replication trên kubernetes. Nếu các bạn có thắc mắc hoặc chưa hiểu rõ chỗ nào, các bạn có thể hỏi ở phần comment.


Tags

DevOpsDatabasePostgre

Huỳnh Minh Quân

DevOps engineer

Related Posts

[Kubernetes Practice] - Triển khai nodejs microservice trên Kubernetes - phần 3 - Xây dựng CI/CD
December 03, 2021
8 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media