創建讀寫分離的 AWS RDS 資料庫

Cpchin
eCloudture
Published in
11 min readOct 26, 2021

總覽

網頁和SQL資料庫的使用上已經行之有年了,在資料庫的選擇上,我們一般會選擇常見的 MySQL 或 Oracle database,並將其建置於地端的環境中。而現在,Amazon 開發了 RDS 的關聯式資料庫給所有 AWS 的使用者,方便在雲端設定操作和擴展關聯式資料庫,​從請求佈建基礎設施容量到安裝資料庫軟體的工作都包含在內,也會自動化常見的管理任務,例如執行備份,以及修補支援資料庫的軟體。備份可以使用異地同步備份部署,將備份資料庫建置於不同的AZ中。RDS 開發所使用的程式碼與一般關聯式資料庫相同,可直接搭配現有的程式碼和工具一起使用。

Amazon RDS 讓使用者能夠在雲端中輕鬆設定、操作和擴展關聯式資料庫。它提供經濟實惠且可調整大小的容量,且可自動處理硬體佈建、資料庫設定、修補程式和備份等耗時的管理任務。這讓您有更多時間專注在應用程式,以提供其所需的快速效能、高可用性、安全性和相容性。

針對記憶體、效能或 I/O 進行優化的多種資料庫執行個體類型都提供 Amazon RDS,並可讓您選擇六種熟悉的資料庫引擎,包括 Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle Database 和 SQL Server。您可以使用 AWS Database Migration Service 輕鬆地將現有的資料庫遷移或複寫到 Amazon RDS。

大綱

在這次的實驗裡,我們會先用 CloudFormation 部署兩個 Availability Zone (以下簡稱 AZ) 和 四個 Subnets 的 VPC 環境。我們會將網站伺服器部署於 Public subnet 中,然後將 RDS 和 讀寫分離的資料庫部署於 Private subnet。

實作步驟

使用 CloudFormation 模板部署環境

利用文章中附錄的 CloudFormation 模板 建立 VPC 環境。

一、 在 Service 選單上,點選 CloudFormation

二、 選擇 Create Stack

三、 在 Choose a template 的部分選擇 Upload a template to Amazon S3

四、 選擇 RDS-Test.yaml 上傳後按 Next

五、 在 Stack name 的地方輸入 RDS-Test,保留其他設定為預設值,按下 Create 進行創建。

創建資料庫使用的 Subnet

這一個部分,我們會創建 Subnet 給資料庫使用。

一、 在 Service 選單上,點選 RDS 後點選左邊的 Subnet groups

二、 選擇 Create DB Subnet Group,用以下資訊創建資料庫的 Subnet:

  • Name : DB-Subnet-Group
  • Description : DB Instance Subnet Group
  • VPC : 選擇 RDS Lab VPC
  • Availiable Zone : us-east-1a
  • Subnet : 選擇帶有 10.0.1.0/24 的 Subnet 後點選 Add subnet

三、 現在選取另一個 Subnet 後點擊創建:

  • availiable Zone : us-east-1b
  • Subnet : 選擇帶有 10.0.129.0/24 的 Subnet。

創建 RDS 資料庫

這個部分是這次實作的重點,我們要創建一個RDS資料庫去支援網頁伺服器。

一、 在主控台頁面,點選 Databases 後點選 Create Databases

二、 選取 MYSQL 後在下一頁選取 Production — MySQL

三、 輸入下列資訊:

  • DB instance class : t2.micro
  • Multi-AZ deployment : Create replica in different zone
  • Storage type : Genaral Perpose(SSD)
  • Allocated storage : 20 GiB
  • DB instance identifier : lab-db
  • Master username : master
  • Master password : lab-password
  • Confirm password : lab-password

四、 下面一頁,輸入以下資訊。

  • VPC : select RDS Lab VPC
  • Subnet group : db-subnet-group
  • VPC security groups : Choose existing VPC security groups Remove the Default and select DBSecurityGroup
  • Database name : lab
  • Deletion protection : 取消勾選

當我們建立一個簡易的實作教程時,我們可以取消備份功能讓 RDS 的創建速度加快。但是當我們啟用讀寫分離的功能時,需要有備份的功能,所以就讓備份的選項保持預設值來創建。

這裡會需要四到五分鐘來創建資料庫,記得重新整理來檢查是不是創建完成了。

創建資料庫只讀副本

在這部分,我們會利用已經建好的RDS資料庫去創建另一個讀寫分離的資料庫。讀寫分離可以將資料庫的”讀”與”寫”功能分開處理,讓資料庫限定執行單一工作,提升資料庫和網頁的處理速度。RDS 服務支援多個只讀副本,可以建立最多五個只讀副本,而每個副本都有一組自己的 endpoint。

一、 在主選單上點選 RDS,點選 database 以確認資料庫狀態。

二、 記住 lab-dbRegion & AZ (它會是 us-east-1a 或是 1b),等到 Status 下的狀態變成綠色的 Available

三、 點選 Action,選擇 Create read-replica

四、 保留大部分預設值的設定,只要改變一些小地方:

  • AZ : 選擇不同的 AZ,若你是在 1a 則選 1b,反之亦然
  • DB instance identifier : lab-read-replica

五、 點選 Create read replica

創建完後,等待一段時間直到 Status 狀態變成 Available。如果想建立多個只讀副本,可以選取主資料庫 lab-db 再重複此階段步驟。

使用 EC2 主機搭建你的 Web 伺服器

在這個步驟,我們會創建兩個 EC2 主機在不同的AZ中,每個 EC2 都會搭載一個網頁,但是兩個網頁會連到相同的資料庫。

一、 在 Service 選單上,點選 EC2 後點選 Launch Instance

二、 選擇 Amazon Linux AMI 2018.03.0 (HVM)

三、 選擇 t2.micro 的規格。

四、 在 Configure Instance Details,輸入以下資訊:

  • Network : select RDS Lab VPC
  • Subnet : select Lab Public Subnet 1
  • Auto-assign Public IP : Enable

五、 在 Advanced Details 中,將以下資訊寫入 User data 中:

#!/bin/bash
# Install Apache Web Server and PHP
yum install -y httpd24 php56 php56-mysqlnd
# Create inc folder
mkdir -p /var/www/inc
# Download SamplePage.php
wget https://raw.githubusercontent.com/ecloudvalley/AWS-Read-Replica-RDS-Database/master/SamplePage.php
mv SamplePage.php /var/www/html/
# Turn on web server
chkconfig httpd on
service httpd start

六、 略過中間設定到 Add Tags,點擊 Add tag 後輸入:

  • Key : Name
  • Value : WebServer1

七、 在 Configure Security Group,點選 Select an existing security group 後選擇剛剛創建好的 WebSecurityGroup

八、 點選 Review and launch 創建你的主機,選擇 Select an existing key pair 後選擇你的 Keypair,如果沒有的話就選擇 Create a new key pair 進行創建。

九、 創建第二台主機,重複步驟 1~8,但這次我們改掉其中幾個設定:

Configure Instance Details

  • Subnet 改成 Lab Public Subnet 2

Add tags

  • value 改成 WebServer2

進入你的網頁伺服器

兩台網頁伺服器創建完之後,Php 和 MySQL 服務都已經安裝完了,接下來就是連線進去新增資料庫的基礎設定。關於連線的方法請參考 Connect to Your Linux Instance

一、 進入 WebServer1 後,使用以下命令進入 inc 資料夾中,並建立資料庫設定檔案:

$ cd /var/www/inc
$ sudo nano dbinfo.inc

二、 貼上下列程式碼:

<?phpdefine('DB_SERVER', 'Endpoint');
define('DB_USERNAME', 'master');
define('DB_PASSWORD', 'lab-password');
define('DB_DATABASE', 'lab');
?>

這個 dbinfo.inc 是資料庫使用的設定檔,裡面寫入的是前面步驟設定的 User 名稱、密碼、Database 名稱以及 Endpoint 資料。你可以在 RDS 的頁面找到資料庫的 Endpoint,如果前面的步驟都有照文章中設定,就不需要修改Endpoint以外的資料。

三、 修改圖中紅框處的 Endpoint 資料,將它改成 lab-db 的 endpoint :

四、 修改後按下 Ctrl + X ,在按 Y 確定修改後保留原檔名離開。

修改完第一個資料庫後,接著修改第二個資料庫,讓它連線到只讀副本當中。

五、 連線至 WebServer2 中,重複步驟12

六、 這次請將 Endpoint 改為 lab-db-replica 的 endpoint 。 由於 RDS 支援多個只讀副本的建置,當建立數個只讀副本時,在此處應填上個別的 endpoint 位址。

七、 修改後按下 Ctrl + X ,在按 Y 確定修改後保留原檔名離開。

當我們創建網頁伺服器時,SamplePage.php 就已經下載到你的機器當中了。這是一個 php 頁面,會在後面的步驟訪問它。如果你想知道裡面寫了什麼,請參考 Github 上的資料。

前往你的網站

現在我們來到了實作的最後一步,是時候測試我們的網頁和資料庫了。

一、 複製 WebServer1Public DNS 貼到瀏覽器分頁上,並在後方加上 /Sample.php

二、 可以看到這邊提供欄位可以輸入 Name 和 Address 的資訊,首先輸入一組值添加看看。

三、 可以多次輸入,也可以使用後方按鈕一次添加一百、一千甚至是一萬次,一萬筆資料的寫入需要大約三分鐘。

四、 回到 RDS 頁面,觀察 CPU 使用量。

接下來測試第二個網頁伺服器

五、 複製 WebServer2Public DNS 貼到瀏覽器分頁上,並在後方加上 /Sample.php

六、 可以看到先前輸入的值被保留在上面,再次輸入新的數值。

七、 發現網頁上方報錯,因為第二個網頁伺服器是不具有寫入功能的

你可以看到每一筆資料和 WebServer1 上的都有相同的值。但是只讀副本僅能讓你讀取資料,不能寫入資料。所以在 WebServer2 上所做的任何修改都不會被記錄下來。

總結

完成這次的實作後,你將會知道如何使用 CloudFormation 部署 VPC 環境。你也有能力部署 RDS 讀寫分離的資料庫和網頁伺服器在不同的AZ上。最重要的是,能夠將網頁伺服器連線到 RDS 的資料庫上,然後比較一般資料庫和讀寫分離資料庫的不同處。

--

--