λ
The Dream BookSystems • Architecture • Engineering
GitHub ProfileGitHub Profile
#rust

Introducing PgVisor

A tools that simplify the PostgreSQL cluster setup and management.

dreamoutbox
dreamoutbox•GitHub

•3 min read

Introducing PgVisor

ผมสร้าง Tool ตัวนึงที่ช่วย simplify การ setup postgresql cluster และ management

ทุกวันนี้ถ้าอยากได้ simple minimal 3 nodes postgresql database cluster ต้องทำอะไรบ้างนะ?

ทุกอย่างที่กล่าวมาข้างบนนี้สุดท้ายมันจะติดปัญหาบางอย่าง

แล้วสุดท้ายต้องใช้ patroni แล้ว setup etcd เพิ่มให้ยุ่งยากขึ้นไปอีก

ซึ่ง patroni เอียงไปทางใช้ใน kubernetes ถ้า setup manually ด้วย 3 VPS จะยุ่งยากมากๆ

เราแค่อยากได้ simple postgresql cluster ทำไมมันยากขนาดนี้นะ ? (or maybe my skill issues?)

Introducing PgVisor


โดยผมเขียน Rust ครอบ on-top postgresql โดยเพิ่ม Raft ด้วย openraft

Raft ทำให้ทุก nodes ใน cluster โหวตได้เวลา leader node down โดยไม่ต้องมี witness node เพิ่มคล้ายๆ repmgr

แล้วผมสร้าง custom proxy ด้วย Rust ให้ split read-write ไปที่ leader node และ read-only ไปที่ follower nodes

แล้วมี web dashboard ให้ manage cluster ผ่าน browser โดยสามารถดู status ของ cluster และทุก nodes ได้ พร้อมจัดการ backup/restore (PITR supported)

backup ด้วยคำสั่ง pgbasebackup แล้วอัพ backup ไฟล์ขึ้น S3 Bucket

แล้ว restore ด้วย pg_combinebackup เพื่อรวมไฟล์เวลา backup มีหลายไฟล์

ลองใช้กันดีกว่า

เราจะ clone repository pgvisor แล้วจะรัน example cluster ด้วย docker

Terminal window
git clone https://github.com/dreamoutbox/pgvisor.git
cd examples/

แล้ว setup example cluster ด้วย

Terminal window
./pgvisorctl.sh up

หลังจาก setup เสร็จสามารถเข้า web dashboard ด้วย (รหัส default คือ postgres)

http://localhost:8080

หรือ connect to database with psql

Terminal window
psql -h localhost -p 5432 -U postgres -d postgres

หรือใช้ใน application ด้วย URI

postgresql://postgres:postgres@localhost:5432/postgres

พอเปิด web dashboard มาจะได้หน้านี้

web dashboard index

หน้า cluster nodes สามารถ start/stop/restart/promote node ได้

cluster nodes page

ทดสอบ Backup & Restore

ลอง mock data สำหรับทดสอบ backup & restore

Terminal window
./dev-mock-data.sh

หน้า Database Explorer จะได้ mock data แบบนี้

database explorer page

แล้วหน้า Backups จะมี full backup x1 และ incremental backup x1

backups page

ลอง restore database ด้วย PITR โดยใส่เวลาก่อน record foxtrot จะถูก INSERT ลง database


⚠️ Gotcha !

เลือก full backup แล้วใส่เวลา PITR time. แล้ว pgvisor จะดึง backup incremental ที่มีเวลานั้นอยู่อัตโนมัติ. ทริคคือ PITR time must be after the full backup create time

backup page restore modal

สังเกตุว่า foxtrot record ได้หายไปแล้วเพราะเราใช้ PITR time ก่อน INSERT foxtrot

database explorer after restore

ทดสอบ HA (auto failover)

ลอง stop leader node เพื่อจำลอง node offline

Terminal window
docker stop pgvisor-node1

สังเกตุว่า node1 ในหน้า cluster nodes node 1 ได้ offline แล้ว node 2 เป็น leader แทน

cluster page after node 1 stop

ลอง start node 1 กลับมา

Terminal window
docker start pgvisor-node1

cluster page after node 1 restart

สังเกตุว่า node 1 online แล้วเป็น follower แทน

ทดสอบ Manual Promote Leader

เราสามารถกด promote ในหน้า cluster nodes ได้เลย

promote leader press

cluster page after node 1 promote

ตอนนี้ node 1 ได้เป็น leader เหมือนเดิมแล้ว

ทดสอบสร้าง User

เราสามารถสร้าง User ได้ในหน้า Users & Roles

user page create user

อัพเดท Table Privileges ให้กับ user

user page update Table Privileges

ลองเชื่อมต่อ database ด้วย user ที่สร้าง

Terminal window
psql -h localhost -p 5432 -U app1 -d postgres

postgres=> SELECT * FROM pgvisor_demo;
id | name | status | counter | created_at | updated_at
----+-------+----------+---------+-------------------------------+-------------------------------
1 | alpha | active | 10 | 2026-11-03 04:00:47.907981+00 | 2026-11-03 04:00:47.907981+00
2 | beta | active | 20 | 2026-11-03 04:00:47.907981+00 | 2026-11-03 04:00:47.907981+00
3 | gamma | pending | 30 | 2026-11-03 04:00:47.907981+00 | 2026-11-03 04:00:47.907981+00
4 | delta | archived | 40 | 2026-11-03 04:00:47.907981+00 | 2026-11-03 04:00:47.907981+00
5 | echo | active | 50 | 2026-11-03 04:00:56.492623+00 | 2026-11-03 04:00:56.492623+00
(5 rows)

Inspecting Audit logs

เราสามารถดูว่ามีอะไรเกิดขึ้นใน database บ้าง

audit logs page

โดยสามารถดู Dangerous SQL เช่น DELETE โดยไม่มี WHERE ได้

audit logs Dangerous SQL

Conclusion

tool นี้ simplify การ setup และการ management postgresql cluster โดยเน้นเรื่อง HA auto failover กับ backup & restore (PITR) เป็นหลัก

ถ้าเกิดเจอบัคหรือมี feature สามารถเปิด Issues หรือ Pull Request ได้

ทุกการช่วยเหลือ are welcome!

https://github.com/dreamoutbox/pgvisor

#rust#tools#deploy#postgresql#database#backup#restore
dreamoutbox
Written by

dreamoutbox

GitHub

Software Engineer. Passionate about systems architecture, Rust, Go, Linux, and backend infrastructure.

Action completed