แนวทางการเลือก Amazon RDS for PostgreSQL กับ Amazon Aurora PostgreSQL
Tags: awsthai, rds, aurora, postgres
Published: 2022-03-03 17:34:13

Credit post https://aws.amazon.com/blogs/database/is-amazon-rds-for-postgresql-or-amazon-aurora-postgresql-a-better-choice-for-me 

ทั้ง Amazon RDS for PostgreSQL กับ Amazon Aurora PostgreSQL ต่างก็เป็น Option ที่ดีทั้งคู่ในการรัน Database workload สำหรับ Modern Application

ซึ่งในโพสต์นี้จะตอบคำถามที่หลายๆท่านสงสัยว่า จะเลือกอะไรดีระหว่าง Amazon RDS for PostgreSQL กับ Amazon Aurora PostgreSQL 

ก่อนที่จะไปดูความแตกต่าง เรามาทำความรู้จักกับ Amazon RDS for PostgreSQL และ Aurora PostgreSQL ในภาพรวมกันครับ

**Amazon RDS for PostgreSQL** และ **Aurora PostgreSQL** เป็น fully managed open-source PostgreSQL database ซึ่งให้ในเรื่องของความง่ายในการสร้าง, ดูแลจัดการ,​ การทำ High availability, การ scale ในด้านรองรับ Read-only/Reporting workload, การทำ Auto scaling ในส่วนของ Storage

**Amazon RDS for PostgreSQL** รองรับ Storage สูงถึง 64 TiB และมีการใช้งาน Amazon Elastic Block Store (Amazon EBS) volume สำหรับเก็บ database และ log file

**Amazon Aurora PostgreSQL** เป็น Cloud native database พัฒนาโดย AWS ซึ่ง re-design ในส่วนของ Database engine และ Storage และมีการเพิ่มความสามารถเพิ่มเติม เช่น การขยาย Storage ได้สูงถึง 128 TiB, ปรับปรุงเรื่องของ Performance ให้รองรับ Throughput ได้มากขึ้น 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oq4djkw008jkxagveham.png)

RDS PostgreSQL จะมี Primary database ที่ AZ1 และถ้าเลือก deployment เป็น Multi-AZ จะมีการสร้าง RDS PostgreSQL secondary database ใน AZ2 

Amazon Aurora PostgreSQL ในส่วนที่เป็น Database instance ทั้ง Writer และ Reader จะใช้ Storage ชุดเดียวกัน มีการกระจาย copy ของ data ไปถึง 6 copy กระจายไปทั้ง 3 AZ

### โดยจะแบ่งข้อแตกต่างเป็น 7 ด้านดังนี้
1. [Scalability](#scalability)
2. [Crash recovery](#crash-recovery)
3. [Failover](#failover)
4. [Storage](#storage)
5. [High availability and disaster recovery](#ha-dr)
6. [Backup](#backup)
7. [PostgreSQL version](#version)
8. [Additional Features](#features)
9. [Conclusion](#conclusion)

<a name="scalability">
### Scalability
</a>Amazon RDS สามารถลดงานทางด้านการ Read เช่น การออก Report, การ Query data โดยใช้ feature Read replica ซึ่งเป็นการสร้าง Replica database instance เพื่อรองรับงานทางด้าน Read

Amazon RDS รองรับการสร้าง Read replica ถึง 5 replica เมื่อมีการเปลี่ยนแปลงของ data ที่ Primary database ใน Write-ahead log (WAL) ไฟล์ จะส่งไปที่ Read replica แบบ Asynchronous mode

Aurora PostgreSQL รองรับการสร้าง Read replica ได้สูงสุด 15 replica  จุดที่แตกต่างกับ Amazon RDS for PostgreSQL คือ Aurora ใช้ Share storage กันทั้งหมด data ทั้งใน Primary database และ Read Replica จะมีการ sync กันตลอดเวลาจะมี data ที่แตกต่างกันในส่วนของ Memory เท่านั้น ทำให้เรื่องของ Lag time จะอยู่ในระดับ millisecond หรือในบางเคสที่ Primary database มี Workload activities สูงๆ Lag time อาจจะอยู่ในระดับ 30 วินาที  

**ข้อสรุปด้าน Scalability**
ถ้า Business requirement ที่จำเป็นต้องมี Replication lag time ต่ำๆ หรือต้องการ Read replica มากกว่า 5 replica, Aurora PostgreSQL จะเป็นตัวเลือกที่ดีกว่า แต่ถ้า Replication lag time สามารถที่จะเป็นระดับวินาที หรือนาที หรือ Read replica 5 replica ก็เพียงพอ, Amazon RDS for PostgreSQL จะตัวเลือกที่ดี

<a name="crash-recovery">
### Crash recovery
</a> เมื่อ Database เกิด crash และต้องการทำ crash recovery, Amazon RDS for PostgreSQL จะมีการ replay transaction log ที่เกิดขึ้น หลัง checkpoint ครั้งล่าสุด ซึ่ง checkpoint คือการ flush ข้อมูลที่มีการเปลี่ยนแปลงของ database block ใน memory และ Write-ahead log (WAL) จาก memory ไปที่ disk 
โดย default checkpoint จะเกิดขึ้นทุกๆ 5 นาที, ถ้า checkpoint เกิดบ่อย ก็จะช่วยให้ทำ crash recovery ได้รวดเร็วมากขึ้น

Aurora PostgreSQL จะไม่ได้ทำกระบวนการ checkpoint ใน database node เพราะจะทำใน storage system ซึ่งข้อมูล log records ที่มีการเปลี่ยนแปลงใน database node จะถูกเขียนลง database pages ใน storage nodes และ Aurora จะทำ crash recovery เป็นแบบ asynchronous มีการกระจายงานโดยใช้ parallel thread ทำให้สามารถ start database หลังจากเกิด crash recovery ได้อย่างรวดเร็ว

**ข้อสรุปด้าน Crash recovery**
ถ้า business requirements ต้องการให้สามารถทำ crash recovery อย่างรวดเร็ว Aurora PostgreSQL จะเป็นตัวเลือกที่ดีกว่า แต่ถ้าเรื่อง crash recovery ไม่ใช่ปัจจัยหลัก Amazon RDS for PostgreSQL ก็จะเป็นตัวเลือกที่เหมาะสม 

<a name="failover">
### Failover
</a> Amazon RDS for PostgreSQL Multi-AZ deployment รองรับการทำ failover โดยอัตโนมัติ ซึ่ง Application ไม่จำเป็นต้องมีการเปลี่ยนแปลง database endpoint ที่ใช้ connect database โดยทั่วไปจะใช้เวลาประมาณ 60-120 วินาที ในการทำ failover

Aurora PostgreSQL จะใช้เวลาในการ failover โดยทั่วไป ประมาณ 30 วินาที ซึ่งประกอบไปด้วยเวลาในการ detect failure ประมาณ 15-20 วินาที เพื่อ confirm node failure, DNS propagation ประมาณ 10-15 วินาที, และใช้เวลาในการ recovery time ประมาณ 3-10 วินาที 

**ข้อสรุปด้าน Failover**
ถ้า Application ต้องการ failover time น้อยๆ Aurora จะเป็นตัวเลือกที่ดีกว่า แต่ถ้า Application ยอมรับการทำ failover มากกว่า 60 วินาที Amazon RDS for PostgreSQL ก็จะเป็นตัวเลือกที่เหมาะสม

<a name="storage">
### Storage
</a> Amazon RDS for PostgreSQL จะใช้ Amazon EBS เป็น storage ที่เก็บข้อมูล โดยสามารถเลือกประเภทเป็นแบบ General Purpose SSD และ Provisioned IOPS, General Purpose SSD จะมี baseline 3 IOPS ต่อ provisioned GB และสามารถ burst ได้สูงสุด 3,000 IOPS ต่อ provisioned GB และมี baseline IOPS limit อยู่ที่ 16,000 IOPS
Provisioned IOPS SSD จะให้ IOPS อยู่ที่ 1,000 - 80,000 IOPS
Amazon RDS for PostgreSQL รองรับการทำ Storage Auto Scaling ซึ่งสามารถขยาย storage ได้ครั้งละ 5 GiB หรือ 10% ของ allocated storage 

Aurora PostgreSQL จะใช้ virtual cluster volume โดยใช้ SSD, Aurora Storage รองรับ Auto Scaling และ storage สามารถเพิ่มครั้งละ 10 GiB และ storage มากสูงสุด 128 TiB
ข้อมูลจะมีการกระจาย copy ไปทั้ง 3 Availability Zone ทำให้ได้ benefit ในเรื่องของ high available และ durable 
แม้ว่าจะไม่มี IOPS virtual limitation ตาม storage size แต่ก็สามารถ scale up instance เพื่อรองรับ workload ที่ต้องการ IOPS ที่เพิ่มสูงขึ้น
ภาพด้านล่างคือ Aurora PostgreSQL storage architecture 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9pw42qby3qkmisfurwz.png)

**ข้อสรุปด้าน Storage**
ถ้า Database workload ต้องใช้ IOPS มากกว่า 80,000 IOPS Aurora PostgreSQL จะเป็นตัวเลือกที่เหมาะสม แต่ถ้าต้องการน้อยกว่า 80,000 IOPS ก็สามารถเลือกได้ทั้ง Amazon RDS for PostgreSQL หรือ Aurora PostgreSQL 

<a name="ha-dr">
### High availability and Disaster recovery
</a> Amazon RDS for PostgreSQL รองรับการทำ high availability และ disaster recovery (DR) โดยใช้ feature Multi-AZ deployment, read replica, และ sharing snapshot ในส่วนของ Multi-AZ จะ replicate data ไปที่ secondary หรือ standby instance ที่อยู่คนละ AZ เป็นรูปแบบ synchronous mode, Amazon RDS for PostgreSQL รองรับ Read Replica ทั้งใน Region เดียวกัน และต่าง Region (Cross Region)
และยังสามารถ copy และ share Amazon RDS snapshot ไปต่าง AWS account หรือ Region เพื่อจุดประสงค์การทำ DR 

Aurora PostgreSQL รองรับ Multi-AZ deployment และจะส่งข้อมูลกันใน 6 storage node ใน cluster volume ทั้ง 3 AZ เป็นแบบ synchronous mode ในระดับ storage level, Aurora replica สามารถจะ promote ขึ้นมาเป็น primary instance ได้ทันที ในกรณีที่มีปัญหา 
นอกจากนี้ยังมี feature Amazon Aurora Global Database ที่สามารถทำ cross-region replication โดยที่ใช้ความสามารถของ infrastructure ใน AWS ทำให้สามารถลด replication latency ได้ต่ำกว่า 1 วินาที
ในการ copy และ share Aurora cluster snapshots ไปต่าง AWS account หรือ Region เพื่อจุดประสงค์การทำ DR ก็สามารถทำได้เช่นกัน

**ข้อสรุปด้าน High availability and Disaster recovery**
ถ้า requirement ทางด้าน High availability ต้องมีการทำ Multi-AZ, สามารถยอมรับ cross-region replication lag time ได้ Amazon RDS for PostgreSQL จะตอบโจทย์ แต่ถ้าต้องการ design High availability และต้องการทำ DR solution เพื่อลด Recovery Point Objective (RPO) และ Recovery Time Objective (RTO) Aurora PostgreSQL ก็จะเป็นตัวเลือกที่เหมาะสม

<a name="backup">
### Backup
</a> Amazon RDS สามารถ enable backup และระหว่างช่วงเวลาการทำ backup อาจจะกระทบในเรื่องของ performance เล็กน้อย ถ้ามีการสร้าง RDS เป็นแบบ single AZ deployment และ Amazon RDS จะ backup transaction logs (WALs) ด้วย, ในกรณีที่ทำ PITR (Point-in-time recovery) จะมีการ Restore full backup ก่อน และ replay WALs จนถึงเวลาที่ต้องการ recovery, ถ้า RDS for PostgreSQL มี write-intensive workload การ replay transaction logs อาจจะใช้เวลานานขึ้น

Aurora PostgreSQL จะ backup cluster volume และมีการเก็บ retention ไว้ตาม period ที่กำหนด, ในกรณีที่ทำ PITR จะมีการสร้าง copy ของ database cluster ขึ้นมาใหม่จาก backup ดังนั้นจะช่วยให้ improve ในเรื่องของ PITR restore time

**ข้อสรุปด้าน Backup**
ถ้า requirement ต้องการที่จะลด RPO, RTO และถ้า workload มีความ sensitive เกี่ยวกับ performance ที่ลดลงระหว่างการทำ backup, Aurora PostgreSQL จะเป็นตัวเลือกที่ดีกว่า แต่ถ้าเรื่อง performance ที่ลดลงไม่ใช่ปัจจัยหลัก Amazon RDS for PostgreSQL ก็จะสามารถตอบโจทย์ได้ ซึ่งสามารถที่จะปรับช่วงเวลาที่จะทำการ backup เพื่อหลีกเลี่ยงผลกระทบเรื่อง performance ในช่วง peak hours หรือมีการใช้ Multi-AZ deployment เพื่อให้ backup จาก standby instance ได้

<a name="version">
### PostgreSQL version
</a> ในเรื่องของการอัพเดท version ให้ทันกับ PostgreSQL ตรงจุดนี้ Amazon RDS for PostgreSQL จะมีการอัพเดท version ได้รวดเร็วมากกว่า Aurora PostgreSQL เพราะเป็น PostgreSQL database engine 

**ข้อสรุปด้าน PostgreSQL version**
ถ้า application ต้องการ PostgreSQL version ที่ใหม่ รวมทั้งต้องมีการ update version ให้ทันกับ PostgreSQL version ใหม่ๆที่ออกมา, Amazon RDS for PostgreSQL จะเป็นตัวเลือกที่เหมาะสมกว่า

<a name="features">
### Additional features
</a> AWS ได้มีการพัฒนา features เพิ่มเติม เพื่อให้ Aurora PostgreSQL ตอบโจทย์การใช้งานมากยิ่งขึ้น เช่น fast database cloning, query plan management, cluster cache management, serverless และ global database

ในส่วนของ [database cloning](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Clone.html) จะช่วยให้สามารถ clone database ใน cluster ได้อย่างรวดเร็วกว่า restore database จาก snapshot ใน RDS for PostgreSQL 

[Query plan management](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Optimize.html) จะช่วยให้ Aurora PostgreSQL สามารถ control การเปลี่ยนแปลงของ query plan ได้อย่างมีประสิทธิภาพ

[Cluster cache management](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.cluster-cache-mgmt.html) จะช่วย improve เรื่องของ performance ของ writer instance ใหม่ หลังจาก failover เพราะว่าจะมีการทำ replicate cache ระหว่าง writer instance กับ read replica ที่ต้องการจะ promote ซึ่งใน Amazon RDS for PostgreSQL หลังจากที่มีการทำ failover, database buffer จะต้องมีการสร้างขึ้นมาใหม่จากศูนย์เลย เพราะ database จะต้องอ่านข้อมูลจาก disk ก่อน และจะส่งผลต่อ performance

[Aurora Serverless](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html) คือ database cluster ที่สามารถ starts, scales และ shutdown ได้ตาม application ต้องการ, เหมาะกับ Application ที่ยังไม่มี pattern ที่แน่นอนในการใช้ 

[Aurora Global Database](https://aws.amazon.com/rds/aurora/global-database/) คือ Aurora database ที่มีการกระจายตัวไปหลายๆ region เพื่องานด้านการ read ที่สามารถทำได้อย่างรวดเร็วในแต่ละ region และลด latency ให้น้อยมากกว่า 1 วินาที ซึ่งถ้าเป็น Amazon RDS for PostgreSQL จะรองรับ cross-Region replication แต่จะมี replication lag มากกว่า

feature ต่างๆเหล่านี้สามารถรองรับ requirement ของ application ได้หลากหลาย และยังเพิ่มในเรื่องของ performance ให้ดีขึ้น

<a name="conclusion">
### Conclusion
</a> Amazon RDS for PostgreSQL เป็นตัวเลือกที่เหมาะสมกับ workload ที่มีขนาด small-medium-large แต่ถ้าต้องการ feature เพิ่มเติมที่ช่วยตอบโจทย์ในแง่ของ performance และการใช้งาน feature เพิ่มเติม, Aurora PostgreSQL ก็เป็นอีกหนึ่งตัวเลือกที่สามารถพิจารณาเพื่อใช้งานครับ

สำหรับข้อมูลเพิ่มเติมในการ migrate จาก Amazon RDS for PostgreSQL หรือ Aurora PostgreSQL สามารถศึกษาเพิ่มเติมตามรายละเอียดด้านล่างครับ

- [Migrate an on-premises PostgreSQL database to Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-an-on-premises-postgresql-database-to-amazon-rds-for-postgresql.html)
- [Migrating data to Amazon Aurora with PostgreSQL compatibility](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Migrating.html)

หวังว่าโพสต์นี้จะเป็นประโยชน์กับท่านผู้อ่าน เพื่อเป็นแนวทางในการเลือกระหว่าง Amazon RDS for PostgreSQL และ Amazon Aurora PostgreSQL กันนะครับ