YJYW's Style Life

WordPress|將 WordPress 的資料庫從 Web Server MySQL 切換為 GCP MySQL

目的

當 WordPress 的流量不多時,將網頁伺服器與資料庫放在同一個機器上是經濟實惠的方法。但是當流量逐漸成長,機器的負擔也會逐漸變重,也可能因此降低網站的回應速度。除了效能的考量之外,定期備份資料庫也是非常重要的事情。在沒有安裝 plugin 的情況下,管理者可以從 phpMyAdmin 的後台手動備份資料庫(參考:如何進入 phpMyAdmin 管理畫面),或是自行撰寫 script 用 crontab 定期備份。如果希望用更簡單的方式,藉由每個月的一點成本,將資料庫的備份、更新、高可用性、錯誤移轉全部交給一位管家負責處理,GCP SQL 會是一個可以考慮的選擇。

介紹

與 Compute Engine 類似,GCP 的 SQL 也是用一台 instance 來管理資料庫,只是這台 instance 是專門給資料庫使用。

GCP SQL 好用的功能如下(包含但不限於):

  • Enable auto backups:資料庫的每日自動備份時間,可啟用 binary logging 的功能
  • Set maintenance schedule:資料庫的維護排程,當資料庫有新的 update 出現時,GCP SQL 會依照所選的 Maintenance window,安裝 update 與重新啟動
  • Replicas:分為 Read replica 與 Failover replica,前者是藉由建立一個唯讀的資料庫副本來降低主資料庫的負擔,後者是建立一個故障轉移的資料庫副本,當主資料庫故障時,GCP SQL 會自動切換到這個副本,藉此達到高可用性的目的

方法

建立與設定資料庫

資料庫 Instance 的名稱與密碼

前往 GCP Console,選擇 SQL。

選擇 Create Instance。

選擇資料庫的引擎,GCP SQL 提供 MySQL 與 PostgreSQL
因為我的 WordPress 使用的是 MySQL,所以我選擇前者。

有 First Generation 與 Second Generation 兩種,我選擇比較新的 Second Generation。

輸入 Instance name 與 Root password(請牢記密碼!)
選擇 Instance 的區域,建議與要使用資料庫的機器放在同一個區域,因為延遲會比較小。

Set connectivity

設定連向資料庫 Instance 的方式,預設是 Public IP。

這邊要記得在 Add network 中設定需要使用資料庫 Instance 的機器的 Public IP。

舉例來說,因為我用來架設 WordPress 的 Compute engine instance 需要與資料庫 Instance 連線,所以在這邊要設定 Compute engine instance 的 Public IP。

Configure machine type and storage

設定資料庫 Instance 的機器規格,因為我的網站流量還很小,所以我選擇最小的 db-f1-micro。

GCP 有提醒,最小的 db-f1-micro 與 db-g1-small 的主要目的是用來開發與測試,不建議使用在正式環境,也不受 Cloud SQL SLA 服務協議保護(The machine type you have selected is intended for development and testing. It is not recommended for production use, and is not eligible for Cloud SQL SLA coverage.)

但是個人覺得 GCP SQL 的價格不算便宜,GCP Pricing Calculator 的計算結果是每個月 $9.37 美金。

Compute engine 最小的 f1-micro + 20GB persistent disk 則是每個月 $8 美金($4.6 + $3.4)

Enable auto backups and high availability

設定偏好的資料庫備份時間,以及啟用 binary logging 二進位檔紀錄功能,啟用後可協助資料庫還原資料,但是會對寫入的效能造成些微的影響,讀取則不會

High availability 高可用度則會在同一個 Region(例如 asia-east1)但不同的 Zone(例如 asia-east1-a)建立資料庫的錯誤移轉副本,當主資料庫故障時,GCP SQL 會自動轉換到這個副本。

因為建立副本就代表新增一個資料庫 Instance(費用 double!),所以我暫時沒有使用這個功能。

Set maintenance schedule

Maintenance window 設定資料庫安裝 update 的時間,當有資料庫有新的 update 時,GCP SQL 會依照設定的時間,幫資料庫安裝 update 並進行重啟。

Maintenance timing 設定安裝 update 的偏好,當選擇 Earlier 時,資料庫 Instance 會較早收到 update 通知,這樣的方式適合在測試用的資料庫 Instance,因為可以較早進行更新與測試,管理員可依據測試的結果,決定是否要應用在正式環境的資料庫 Instance。

設定資料庫 Instance 連線方式

GCP SQL 的資料庫 Instance 剛建立完成時沒有 IP address,必須在 Connections 的頁面進行 Add network 後才會產生。

因為我們希望讓架設 WordPress instance 能存取資料庫 Instance,所以需要在 Add network 填入 WordPress instance 的 Public IP,填入並儲存後,就可以在資料庫 Instance 的 畫面看到 IP address。

備份 WordPress instance 的 MySQL 資料庫

備份資料庫的方法有很多,可以用指令的方式,也可以從 phpMyAdmin 的網頁操作。這次選擇後者的方式,因為備份出來的資料庫可以直接下載到電腦上,待會就可以上傳到 GCP Storage 給 GCP SQL 使用。

進入 phpMyAdmin 的網頁後,選擇「匯出」>「自訂」>「SQL」>「bitnami_wordpress(Bitnami WordPress 預設資料庫名稱)」>「執行」。

執行完成後,網頁會出現下載檔案的提醒,下載的檔案就是資料庫的 .sql 檔案。

將資料庫的資料輸入到 GCP SQL

GCP SQL 的 Import 頁面不能直接將檔案上傳到資料庫 Instance,來源必須是 GCP Storage。因此我們需要先將 .sql 檔案上傳到 GCP Storage 的任一 bucket,上傳完成後再到「GCP SQL」>「Import」>「Cloud Storage file」選擇剛上傳的 .sql 檔案。

Database 的部分可以不用選擇,GCP SQL 會直接使用 .sql 檔案中的資料庫名稱,預設是 bitnami_wordpress。

修改 WordPress instance 的資料庫設定檔

資料庫的設定在 /opt/bitnami/apps/wordpress/htdocs/wp-config.php

修改設定檔之前記得先備份。

主要修改以下三個項目:

  • DB_USER
  • DB_PASSWORD
  • DB_HOST

DB_USER 修改為 GCP SQL 的預設帳號 root。
DB_PASSWORD 修改為建立資料庫 Instance 時輸入的密碼。
DB_HOST 修改為資料庫 Instance 的 Public IP,後面記得加上 :3306(MySQL 服務預設的 port)

修改完成後,重新啟動 php-fpm 與 nginx,新的設定即可生效。

sudo /opt/bitnami/ctlscript.sh restart php-fpm
sudo /opt/bitnami/ctlscript.sh restart nginx

測試 WordPress instance 與資料庫 Instance 之間的連線

因為 WordPress instance 有安裝 MySQL 的服務,所以我們可以直接使用 mysql 進行測試。

在 WordPress instance 的命令列視窗輸入以下指令,如果可以順利進入資料庫則代表 WordPress instance 與資料庫 Instance 之間的連線是暢通的。

mysql --host=[INSTANCE_IP_ADDR] --user=root --password

除此之外,直接瀏覽自己的 WordPress 網站、到 WordPress 後台新增與編輯文章,如果這些操作都沒有問題,代表資料庫順利從 WordPress instance 搬到 GCP SQL 囉!

References

How to Use Google Cloud SQL with WordPress?

Migrate Your Application Database To Google Cloud SQL

從 Compute Engine 連結 MySQL 用戶端

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *