เริ่มต้นใช้งาน Amazon RDS บน Graviton2 เพื่อเพิ่มประสิทธิภาพในราคาที่ถูกลง
Tags: awsthai, rds, graviton2, database
Published: 2021-09-22 05:23:53

AWS มีการพัฒนานวัตกรรมใหม่ๆ เพื่อตอบโจทย์การใช้งานของผู้ใช้อยู่ตลอดเวลา ทั้งในด้านประสิทธิภาพ, ความง่ายในการใช้, feature ที่เพิ่มขึ้น รวมทั้งยังคำนึงถึงเรื่องการลดค่าใช้จ่ายอีกด้วย

ในโพสต์นี้จะอธิบายการเปลี่ยน Amazon RDS Instance type มาใช้ Amazon Graviton2 และมี CloudFormation template สำหรับสร้าง environment เพื่อทดสอบ

### Table of Contents
1. [Amazon RDS คืออะไร](#amazon-rds)
2. [Amazon Graviton2 คืออะไร](#amazon-graviton2)
3. [Amazon RDS type และ version ที่ Support Graviton2](#version)
4. [วิธีการเปลี่ยน Instance type มาเป็น Graviton2](#change)
5. [ทดสอบ Performance](#performance)
6. [CloudFormation สำหรับทดสอบ](#cloudformation)
7. [บทสรุป](#conclusion)
8. [แหล่งข้อมูลอ้างอิง](#references)

<a name="amazon-rds"> 
### Amazon RDS คืออะไร 
</a>**Amazon Relational Database Service (Amazon RDS)** คือบริการฐานข้อมูลเชิงสัมพันธ์ หรือที่คุ้นเคยในชื่อ Relational Database ซึ่งจะเก็บข้อมูลในรูปแบบของ Table มี Row และ Column เป็นส่วนประกอบ โดย Table ในฐานข้อมูลสามารถมีความเชื่อมโยงกันด้วย [Primary key](https://en.wikipedia.org/wiki/Primary_key), [Foreign Key](https://en.wikipedia.org/wiki/Foreign_key) มีการใช้ [ACID](https://en.wikipedia.org/wiki/ACID) เพื่อดูแลความถูกต้องของข้อมูล

Amazon RDS เข้ามาช่วยลด effort ในการดูแลจัดการฐานข้อมูล เช่น การ provision, backup, patch, encryption, disaster recovery โดยผู้ใช้สามารถตั้งค่าและ enable feature ต่างๆได้อย่างสะดวก ทำให้ผู้ใช้สามารถมีเวลา focus ในส่วนของการ design, optimize เพื่อตอบโจทย์ธุรกิจมากขึ้น

Amazon RDS ให้บริการฐานข้อมูลด้วยกันทั้งหมด 6 ประเภทคือ
[Amazon Aurora](https://aws.amazon.com/rds/aurora), [PostgreSQL](https://aws.amazon.com/rds/postgresql), [MySQL](https://aws.amazon.com/rds/mysql), [MariaDB](https://aws.amazon.com/rds/mariadb), [Oracle](https://aws.amazon.com/rds/oracle), [Microsoft SQL Server](https://aws.amazon.com/rds/sqlserver)

<a name="amazon-graviton2">
### Amazon Graviton2 คืออะไร
</a>**Amazon Graviton2** คือ Processor ที่ AWS สร้างขึ้นมาโดยใช้สถาปัตยกรรมแบบ 64-bit Arm Neoverse โดย Amazon Graviton2 ให้ในเรื่องของประสิทธิภาพการทำงานที่ดีขึ้น ในราคาที่ถูกลง

ประเภทของ RDS Instance ที่ใช้ Graviton2 จะมีดังนี้
- t4g : สำหรับ dev/test workload 
- m6g : สำหรับ general purpose workload
- r6g : สำหรับ memory optimized workload 

ใน Service อื่นๆเช่น EC2, EKS, ECS ก็สามารถสร้าง Instance type ที่เป็น Graviton2 ได้ 
สามารถดูรายละเอียด instance เพิ่มเติมได้ [ที่นี่](https://aws.amazon.com/ec2/graviton)

<a name="version">
### Amazon RDS type และ version ที่ Support Graviton2
</a><ul><li>**Amazon Aurora**
<ul><li>Aurora (MySQL 5.7) version 2.09.1 and higher</li>
<li>Aurora PostgreSQL version 11.9 and higher</li>
</ul>
</li>
<li>**Amazon RDS for MySQL**
<ul><li>MySQL version 8.0.17 and higher</li></ul>
<li>**Amazon RDS for PostgreSQL**</li>
<ul><li>PostgreSQL version 12.5 and higher</li></ul>
</li>
<li>**Amazon RDS for MariaDB**
<ul><li>MariaDB version 10.4.13 and higher</li></ul>
</li>
</ul>

Amazon RDS Graviton2 instance มีหลากหลาย configuration ให้เลือกใช้ตามตารางตัวอย่างด้านล่าง
![Amazon RDS Graviton2 instance Type](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bz1qzivbw14iso4hazmn.png) สามารถตรวจสอบ RDS Instance type ทั้งหมดได้ [ที่นี่](https://aws.amazon.com/rds/instance-types)

<a name="change">
### วิธีการเปลี่ยน Instance type มาเป็น Graviton2 
:warning: มี Downtime ประมาณ ~10-15 นาที อาจจะมากขึ้นตามขนาดของฐานข้อมูล
</a><ul><li>**ใช้ AWS Console**<ol><li>เปิด RDS service console 
[https://console.aws.amazon.com/rds](https://console.aws.amazon.com/rds) ![RDS Console](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hz8nus261lf76mw5udjv.png)
</li>
<li>เลือก​ RDS database ที่ต้องการ และคลิก **Modify**
![Modify RDS database](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q67gac4nfv9dsc79858.png)
</li>
<li>เลือก DB instance Class ที่ต้องการ ในตัวอย่างนี้จะใช้ **db.m6g.large** 
![DB instance Class](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/al4zntu7sv5ipaqoffop.png)
</li>
<li>เลื่อนลงมาด้านล่าง คลิก **Continue**
![Continue](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv365yvn0sa84p8jtaz5.png)
</li>
<li>เลือก **Apply immediately** เพื่อเปลี่ยน RDS instance type ทันที และคลิก **Modify DB instance**
![Apply immediate](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oag7y5a6a4c7p8t8p16v.png) หลังจากนั้น RDS instance จะขึ้น status: Modifying ![Modifying](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6atpwgmg1ezkq876gchy.png) ใช้เวลาประมาณ 10 นาที RDS instance ก็จะเปลี่ยนมาใช้  **db.m6g.large** ซึ่งเป็น Graviton2 instance type เรียบร้อยแล้ว ![Complete](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfof67kp2y8hwokyd7yw.png)</li>
</ol>
</li>
</li>

<li>**ใช้ AWS Command Line Interface (CLI)**
ก่อนอื่นต้องเตรียม Access key และ Secret key เพื่อเข้าใช้งานและให้สิทธิ์ในการสร้าง RDS instance [https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)

ถัดมาก็ติดตั้ง AWS CLI version 2
[https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)

หลังจากที่ Config AWS CLI กับ Notebook หรือ PC แล้วก็สามารถที่จะเปลี่ยน RDS instance type ตาม command ตัวอย่างด้านล่าง ต้องการเปลี่ยน RDS instance : rdsgraviton เป็น db.m6g.large

```bash
aws rds modify-db-instance --db-instance-identifier rdsgraviton --db-instance-class db.m6g.large --apply-immediately
```
</li>
</ul>

<a name="performance">
### ทดสอบ Performance
</a>เราจะใช้ **sysbench** ซึ่งเป็น benchmark tool ที่ได้รับความนิยม มาทดสอบประสิทธิภาพของ RDS MySQL 
ในตัวอย่างนี้จะใช้ Amazon Linux2 bastion host บน EC2 เพื่อติดตั้ง sysbench และ connect ไปที่ RDS <ol><li>รัน command นี้บน bastion host เพื่อเตรียม environment สำหรับติดตั้ง sysbench 

```bash
sudo yum -y install git gcc make automake libtool openssl-devel ncurses-compat-libs

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

sudo yum -y install mysql-community-devel mysql-community-client mysql-community-common
```
</li>

<li> Clone sysbench git repository และ install

```bash
git clone https://github.com/akopytov/sysbench.git
cd sysbench
sudo ./autogen.sh
sudo ./configure
sudo make
sudo make install
```
</li>

<li> Check sysbench version

```bash
sysbench --version
```
</li>

<li> สร้าง MySQL database sbtest สำหรับทดสอบ

```bash
mysql -u admin -pAWSpassword \
  -hrdsgraviton.c2lep43gswjd.ap-southeast-1.rds.amazonaws.com \
  -P3306 -e 'create database sbtest;'
```
</li>

<li> Prepare และรัน sysbench 

```bash
sysbench oltp_read_write --db-driver=mysql --mysql-user=admin --mysql-password=AWSpassword --mysql-host=rdsgraviton.c2lep43gswjd.ap-southeast-1.rds.amazonaws.com prepare
sysbench oltp_read_write --db-driver=mysql --mysql-user=admin --mysql-password=AWSpassword --mysql-host=rdsgraviton.c2lep43gswjd.ap-southeast-1.rds.amazonaws.com run
```

ภาพด้านล่างคือผลลัพธ์จากการรัน sysbench บน RDS for MySQL **db.m5.large**
![sysbench-db.m5.large](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql7qzu1yg28o3wy49hrz.png)

ภาพด้านล่างคือผลลัพธ์จากการรัน sysbench บน RDS for MySQL **db.m6g.large**
![sysbench-db.m6g.large](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63wzswsg40l1tl5qgvnm.png)

เปรียบเทียบผลลัพธ์
![Compare](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zm2tygfypc3h6lvr0tfa.png)

RDS Graviton2 สามารถทำ performance ได้ดีขึ้น ~10% ใน testing environment นี้ 
ดังนั้นทางผู้ใช้งาน RDS สามารถทดสอบกับ environment dev/test ก่อนที่จะนำไปใช้บน production environment 

โดยการเปลี่ยน RDS instance type มาใช้งาน Graviton2 ข้อดีคือ Application ที่ใช้ database อยู่ไม่ต้องมีแก้ไข เพราะ database engine, version ไม่ได้ถูกแก้ ซึ่งจะเปลี่ยนในส่วนของ infrastructure hardware

ทีนี้มาดูในส่วนของ cost กันบ้าง เมื่อเปรียบเทียบกันแล้ว Graviton2 instance type (db.m6g.large) จะถูกกว่า Intel instance type (db.m5.large) อยู่ประมาณ ~10%
![Compare cost](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ek3ozgbj8qlferashi56.png)

ตัวอย่างการคำนวณ cost
[https://calculator.aws/#/estimate?id=ed9f868fac8a92e62642455ed394868fecab382f](https://calculator.aws/#/estimate?id=ed9f868fac8a92e62642455ed394868fecab382f) 
</li>
</ol>

<a name="cloudformation">
### CloudFormation สำหรับทดสอบ
</a>ถ้าต้องการ deploy environment สำหรับทดสอบสร้าง RDS for MySQL เพื่อลองเปลี่ยน Instance Type และเตรียม EC2 สำหรับเป็น Bastion host 
สามารถ deploy CloudFormation ใน Singapore region (ap-southeast-1) ได้เลย
:warning: cost ของการรัน Resource ทั้งหมดจะประมาณ ~$0.27 ต่อชั่วโมง
รายละเอียดเกี่ยวกับ cost เพิ่มเติม<ul><li>EC2 : [https://aws.amazon.com/ec2/pricing](https://aws.amazon.com/ec2/pricing)</li>
<li>RDS for MySQL : [https://aws.amazon.com/rds/mysql/pricing](https://aws.amazon.com/rds/mysql/pricing)</li></ul>

**Architecture diagram**
![Architecture diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoqbll6rxjx4e3hoinqq.png)

**ขั้นตอนการ Deploy** <ul><li>Deploy CloudFormation โดยคลิก [ที่นี่](https://console.aws.amazon.com/cloudformation/home#/stacks/new?stackName=RDSGraviton2Workshop&templateURL=https://rdsgraviton2-20210528065643-hostingbucket-master.s3-ap-southeast-1.amazonaws.com/RDSGraviton2Workshop.yaml) </li><li>คลิก **Next** ![CloudFormation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zymic6cnlyhx0o8oadc.png) </li><li> ในหน้านี้ สามารถใส่ค่า parameters ได้ดังนี้ <ul><li> เปลี่ยน Stack name ตามตัวอย่างจะใช้ **RDSGraviton2Workshop** </li><li> เปลี่ยน Database password ตามตัวอย่างจะใช้ **AWSpassword** </li><li> เลือก EC2 KeyPair สำหรับ SSH เข้า bastion host </li><li> สำหรับ Network component เช่น VPC, Subnet สามารถตั้งตามค่า Default และคลิก **Next** </li>
![CloudFormation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n74twbh92pvzudkvj7a.png)</ul>
<li> เลื่อนลงมาด้านล่าง และคลิก **Next**
![CloudFormation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4d3vw21sm4tls2i9klps.png)
</li>
<li> Review CloudFormation และคลิก **Next**
![CloudFormation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sz1e744m9wc2l46bf94g.png)</li>

หลังจากนั้น CloudFormation ก็จะสร้าง resources ต่างๆตาม Architecture Diagram และเมื่อสร้างเสร็จแล้วจะขึ้น status: CREATE_COMPLETE
![CloudFormation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yo3ot0dl84ldzeiajovj.png)</li></ul>

<a name="conclusion">
### บทสรุป
</a>จะเห็นได้ว่า RDS Graviton2 instance type ได้เข้ามาช่วยในเรื่องของ performance ที่ดีขึ้น และสามารถลด cost ได้ โดยที่ไม่ต้องมีการแก้ไข Application

ผมแนะนำให้ทำการทดสอบใน dev/test database ก่อนนำไปปรับใช้บน production นะครับ

<a name="references">
### แหล่งข้อมูลอ้างอิง
</a><ul><li>[Graviton2 Workshop](https://graviton2-workshop.workshop.aws/en)</li>
<li>[Amazon RDS on Graviton2 Processors](https://aws.amazon.com/blogs/aws/new-amazon-rds-on-graviton2-processors)</li>
</ul>

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