創建讀寫分離的 AWS RDS 資料庫
總覽
網頁和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 selectDBSecurityGroup
- Database name :
lab
- Deletion protection : 取消勾選
當我們建立一個簡易的實作教程時,我們可以取消備份功能讓 RDS 的創建速度加快。但是當我們啟用讀寫分離的功能時,需要有備份的功能,所以就讓備份的選項保持預設值來創建。
這裡會需要四到五分鐘來創建資料庫,記得重新整理來檢查是不是創建完成了。
創建資料庫只讀副本
在這部分,我們會利用已經建好的RDS資料庫去創建另一個讀寫分離的資料庫。讀寫分離可以將資料庫的”讀”與”寫”功能分開處理,讓資料庫限定執行單一工作,提升資料庫和網頁的處理速度。RDS 服務支援多個只讀副本,可以建立最多五個只讀副本,而每個副本都有一組自己的 endpoint。
一、 在主選單上點選 RDS,點選 database 以確認資料庫狀態。
二、 記住 lab-db 的 Region & 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 中,重複步驟1 和 2。
六、 這次請將 Endpoint 改為 lab-db-replica 的 endpoint 。 由於 RDS 支援多個只讀副本的建置,當建立數個只讀副本時,在此處應填上個別的 endpoint 位址。
七、 修改後按下 Ctrl + X ,在按 Y 確定修改後保留原檔名離開。
當我們創建網頁伺服器時,SamplePage.php 就已經下載到你的機器當中了。這是一個 php 頁面,會在後面的步驟訪問它。如果你想知道裡面寫了什麼,請參考 Github 上的資料。
前往你的網站
現在我們來到了實作的最後一步,是時候測試我們的網頁和資料庫了。
一、 複製 WebServer1 的 Public DNS 貼到瀏覽器分頁上,並在後方加上 /Sample.php
。
二、 可以看到這邊提供欄位可以輸入 Name 和 Address 的資訊,首先輸入一組值添加看看。
三、 可以多次輸入,也可以使用後方按鈕一次添加一百、一千甚至是一萬次,一萬筆資料的寫入需要大約三分鐘。
四、 回到 RDS 頁面,觀察 CPU 使用量。
接下來測試第二個網頁伺服器
五、 複製 WebServer2 的 Public DNS 貼到瀏覽器分頁上,並在後方加上 /Sample.php
。
六、 可以看到先前輸入的值被保留在上面,再次輸入新的數值。
七、 發現網頁上方報錯,因為第二個網頁伺服器是不具有寫入功能的
你可以看到每一筆資料和 WebServer1 上的都有相同的值。但是只讀副本僅能讓你讀取資料,不能寫入資料。所以在 WebServer2 上所做的任何修改都不會被記錄下來。
總結
完成這次的實作後,你將會知道如何使用 CloudFormation 部署 VPC 環境。你也有能力部署 RDS 讀寫分離的資料庫和網頁伺服器在不同的AZ上。最重要的是,能夠將網頁伺服器連線到 RDS 的資料庫上,然後比較一般資料庫和讀寫分離資料庫的不同處。