1. etcd คืออะไร?
etcd เป็นโครงการ Open Source ที่พัฒนาโดย CoreOS (ปัจจุบันเป็นส่วนหนึ่งของ Red Hat) และดูแลโดย Cloud Native Computing Foundation (CNCF) เช่นเดียวกับ Kubernetes โดย etcd คือฐานข้อมูลแบบ Key-Value ที่ออกแบบให้ทำงานในลักษณะกระจาย (Distributed) โดยใช้ Raft consensus algorithm เพื่อให้การอัปเดตข้อมูลในระบบเกิดขึ้นอย่างมีความสอดคล้อง (Consistency) และมีความพร้อมใช้งาน (Availability)
คุณสมบัติเด่นของ etcd:
- Strong Consistency: ข้อมูลที่อ่านได้จะเป็นเวอร์ชันล่าสุดเสมอ
- High Availability: รองรับการทำงานแบบ cluster หลาย node
- Reliable Watch: มีระบบแจ้งเตือน (watcher) เมื่อลูกค้า (client) ต้องการทราบเมื่อมีการเปลี่ยนแปลงข้อมูล
- Snapshot & Backup: รองรับการแบ็กอัปและกู้คืนข้อมูล
- TLS Encryption: รองรับการเชื่อมต่อแบบเข้ารหัสเพื่อความปลอดภัย
etcd ทำงานในรูปแบบของ cluster ซึ่งประกอบด้วยหลายๆ node โดย node หนึ่งจะทำหน้าที่เป็น leader และ node ที่เหลือเป็น followers
กระบวนการทำงานหลัก:
- เมื่อ client ต้องการอัปเดตข้อมูล (PUT/DELETE) จะส่งคำขอไปยัง leader
- leader จะเสนอค่าที่จะเปลี่ยนไปยัง follower ทุกตัวตามกระบวนการของ Raft algorithm
- เมื่อมี majority ของ nodes ตอบรับ (เช่น 2 ใน 3), การเปลี่ยนแปลงจึงจะถูกบันทึก
- leader จะตอบกลับ client ว่าการดำเนินการสำเร็จแล้ว
3. ประโยชน์ของ etcd ในระบบจริง
3.1 ใช้เป็น Backend สำหรับ Kubernetes
หนึ่งในตัวอย่างที่ชัดเจนที่สุดของการใช้งาน etcd คือใน Kubernetes ซึ่งใช้ etcd เป็นฐานข้อมูลหลักสำหรับเก็บสถานะของ cluster ทั้งหมด เช่น ข้อมูลเกี่ยวกับ Pods, Deployments, Services ฯลฯ หากไม่มี etcd, Kubernetes จะไม่สามารถทำงานได้เลย
3.2 ใช้เก็บ Configuration แบบกระจาย
ในระบบขนาดใหญ่ เช่น Microservices หรือระบบ IoT ที่มี node จำนวนมาก etcd สามารถใช้เป็นศูนย์กลางในการเก็บค่าคอนฟิกที่ node แต่ละตัวสามารถดึงไปใช้งานได้แบบ real-time และมีการอัปเดตพร้อมกันทุก node
3.3 ใช้สำหรับ Service Discovery
ในระบบที่ไม่มี DNS ภายใน หรือไม่ต้องการใช้ DNS-based discovery, etcd สามารถใช้เก็บข้อมูลของ services ที่มีอยู่ เช่น IP, Port และ Metadata อื่น ๆ ซึ่ง client สามารถดึงข้อมูลนี้ไปเชื่อมต่อได้
3.4 ระบบ Distributed Locking
etcd รองรับการสร้าง lock แบบกระจาย ซึ่งเหมาะสำหรับระบบที่มีการประมวลผลร่วมกัน เช่น งาน batch หรือ job scheduling ที่ต้องมีการทำงานแบบ mutual exclusive
4. ตัวอย่างการใช้งาน etcd จริง
ตัวอย่าง 1: เก็บคอนฟิกสำหรับระบบ Microservices
โค้ด: เลือกทั้งหมด
# เพิ่มค่าใหม่
etcdctl put /config/database/host db.example.local
# ดึงค่าที่เก็บไว้
etcdctl get /config/database/host
โค้ด: เลือกทั้งหมด
etcdctl watch /config/database/host
โค้ด: เลือกทั้งหมด
# สร้าง lease 10 วินาที
lease_id=$(etcdctl lease grant 10)
# ขอ lock
etcdctl lock --lease=${lease_id} my-lock-name
# ทำงานบางอย่าง...
# ปล่อย lock (หรือปล่อยให้ lease หมดเวลา)
5.1 ใช้ etcd ใน cluster เสมอ
เพื่อความมั่นคงของข้อมูลและความพร้อมใช้งาน ควรใช้ etcd อย่างน้อย 3 nodes และจำนวนควรเป็นเลขคี่เสมอ (3, 5, 7) เพื่อให้สามารถเลือก leader ได้แม้บาง node จะล่ม
5.2 สำรองข้อมูลอย่างสม่ำเสมอ
เนื่องจาก etcd เป็นแหล่งข้อมูลสำคัญของระบบ ควรตั้ง schedule สำรองข้อมูลไว้เป็นประจำ ด้วยคำสั่งเช่น:
โค้ด: เลือกทั้งหมด
etcdctl snapshot save /backups/etcd-backup.db
5.3 เปิดใช้งานการเข้ารหัสและการยืนยันตัวตน
เพื่อความปลอดภัยของข้อมูล ควรเปิดใช้ TLS ทั้งฝั่ง client-server และ peer communication และเปิดใช้ RBAC (Role-Based Access Control) เพื่อจำกัดสิทธิ์การเข้าถึง
5.4 ตรวจสอบสุขภาพของ cluster อยู่เสมอ
ใช้คำสั่ง etcdctl endpoint health หรือเชื่อมต่อกับ Prometheus เพื่อตรวจสอบสถานะและสถิติของ etcd cluster
สรุป
etcd เป็นเครื่องมือที่ทรงพลังในการบริหารจัดการข้อมูลสถานะแบบกระจาย โดยเฉพาะในระบบ Cloud-Native หรือระบบที่ต้องการความสม่ำเสมอของข้อมูลและความพร้อมใช้งานสูง ด้วยคุณสมบัติอย่าง strong consistency, reliable watch, และ distributed coordination ทำให้ etcd กลายเป็นแกนหลักของระบบขนาดใหญ่ เช่น Kubernetes, การเรียนรู้และใช้งาน etcd อย่างถูกต้องจะช่วยให้คุณสามารถออกแบบระบบที่ยืดหยุ่น มั่นคง และปลอดภัยได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม การใช้งาน etcd อย่างปลอดภัยและมีประสิทธิภาพควรมีการวางแผนที่ดี เช่น การใช้ cluster อย่างเหมาะสม การสำรองข้อมูล การเปิดใช้การเข้ารหัส และการติดตามสถานะของระบบอย่างใกล้ชิด, หากคุณกำลังมองหาเครื่องมือสำหรับจัดการข้อมูลสำคัญในระบบที่มีความซับซ้อนและต้องการความเชื่อถือสูง etcd คือตัวเลือกที่ควรพิจารณาอย่างยิ่ง
อ้างอิง
https://etcd.io/docs/v3.5/install/
https://www.enterprisedb.com/docs/supported-open-source/patroni/installing_etcd/
https://github.com/etcd-io/etcd