MySQL(1) — 建立主從資料庫叢集
也不知道為什麼 DevOps/SRE 的工作,很常被問有沒有做過 DB 備份,我當然是沒有做過,後來覺得反正就來搞搞看好了,就決定先建個主從資料庫叢集,然後再來看怎麼備份或是看 metrics,這篇是個記錄
MySQL(1) — 建立主從資料庫叢集

也不知道為什麼 DevOps/SRE 的工作,很常被問有沒有做過 DB 備份,我當然是沒有做過,後來覺得反正就來搞搞看好了,就決定先建個主從資料庫叢集,然後再來看怎麼備份或是看 metrics,這篇是個記錄
但這邊大多是參考 AI 的建議,可能參數沒有到很完整,但我的目的只是先讓服務能跑起來而已
- 建立 mysql 服務
一樣是安裝步驟,前一次安裝是蠻久之前了,所以順便再寫一次手順
# 把 mysql repo 放到 repolist
dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
# 確認 repolist
yum repolist
# 下載 GPG key
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# 安裝防火牆
dnf install -y firewalld
systemctl enable --now firewalld
# 允許某些 mysql 服務 port,重新載入設定
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# 安裝 mysql
dnf install -y mysql-community-server
# enable mysql,確認服務狀態
systemctl enable --now mysqld
systemctl status mysqld
# 拿到各自的隨機密碼
# 重新設定密碼、以及其它設定
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation

寫入 repolist

確認 repolist

下載 GPG key 並安裝

安裝完畢

啟動成功

重設密碼,還有重設一些設定
然後我自己有修改 /etc/my.cnf,還有把 mysql 的 data, log 寫到指定資料夾,但是有先啟動過了,所以有做一些修正
# 建立放資料的資料夾
mkdir -p /data/mysql_data
mkdir -p /data/mysql_log
# 給適當權限
chown -R mysql:mysql /data
# 重新載入設定,重啟 mysql,但這裡會有問題,因為原本啟動的東西已經在
systemctl daemon-reload
systemctl restart mysqld
# 修改 mysql 設定檔,這裡直接把 master, slave 的設定也設上去
vi /etc/my.cnf
# 把原本 /var/lib/mysql 下的東西丟到 /data 下面,要跟 datadir 相同
cp -ra /var/lib/mysql/* /data/mysql_data/
# 重新載入設定,重啟 mysql
systemctl daemon-reload
systemctl restart mysqld
# /etc/my.cnf
# DB1 - master 設定
[mysqld]
# 反正把 data, socket, log 都放到 /data 資料夾下
datadir=/data/mysql_data
socket=/data/mysql_data/mysql.sock
log-error=/data/mysql_log/error.log
pid-file=/var/run/mysqld/mysqld.pid
# 這裡是要建 master 的設定
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
# for client
[client]
socket=/data/mysql_data/mysql.sock
# /etc/my.cnf
# DB1 - master 設定
[mysqld]
# 反正把 data, socket, log 都放到 /data 資料夾下
datadir=/data/mysql_data
socket=/data/mysql_data/mysql.sock
log-error=/data/mysql_log/error.log
pid-file=/var/run/mysqld/mysqld.pid
# 這裡是要建 master 的設定
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
# for client
[client]
socket=/data/mysql_data/mysql.sock

因為先啟動了,所以要把原本在 /var/lib/mysql 下的 data 放到 /data/mysql_data
大概先這樣,然後就是主從 DB 的建立
- 建立叢集
這邊就要進到 mysql 裡進行設定了
# bash
# 使用 root 進到 mysql,這裡是 master, slave 都先進去
mysql -u root -p
-- mysql 設定,這邊是在 master 那台上
-- 建立帳號, 使用 % 表示允許任何 IP 進入,測試環境可以這樣搞,但正式要限定 IP
CREATE USER 'replica_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
-- 授予同步權限
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
-- 刷新權限
FLUSH PRIVILEGES;
-- 確認 user 是否建立
SELECT user, host FROM mysql.user;
-- 看狀態
SHOW MASTER STATUS;
-- mysql 設定,這邊是在 slave 那台上
-- 停止 Slave 服務
STOP SLAVE;
-- 設定連接 Master 的參數
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='<Master_的_Private_IP>',
SOURCE_USER='replica_user',
SOURCE_PASSWORD='your_password_here',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=157;
-- 啟動同步
START SLAVE;
-- 確認 slave 狀態
SHOW SLAVE STATUS\G

建立 user 並確認是否建立

show status 後,記錄 file, postition

Slave那台填寫連到主 DB 的資訊
然後我是因為 mysql 的 terminal 有被污染,所以都輸入不進去,我是重連入 mysql terminal 後才解決的,但之前的指令有些也有問題,所以就全部重打並檢查

slave 顯示 connecting,看來是有問題,一般要顯示 Yes

打的指令沒顯示 Query OK,但句子有分號結尾,通常是重新連入 mysql terminal
會檢查紅框參數,都要是 Yes 才算成功

- 驗測
測試方法會是在 master 建 Database,然後 Slave 也看的到就成功了,這邊就不截圖了
這邊記一些別的常用的 SQL 語法
-- 看現在是誰
SELECT current_user();
-- 看給的權限
SHOW GRANTS FOR 'replica_user'@'%';
先寫這些,下一篇會寫 prometheus + grafana 的監控,因為 DevOps/SRE 就是要看監控,但像 mysql, postgres 並沒有自帶監控,所以要進行設定
參考資料:
- Google gemini
- 別人的 Medium
메타데이터
- post_id
- 613c8e44e4a6
- slug
- mysql-1-建立主從資料庫叢集-613c8e44e4a6
- url
- https://medium.com/@King610160/mysql-1-%E5%BB%BA%E7%AB%8B%E4%B8%BB%E5%BE%9E%E8%B3%87%E6%96%99%E5%BA%AB%E5%8F%A2%E9%9B%86-613c8e44e4a6
- canonical_url
- https://medium.com/@King610160/mysql-1-%E5%BB%BA%E7%AB%8B%E4%B8%BB%E5%BE%9E%E8%B3%87%E6%96%99%E5%BA%AB%E5%8F%A2%E9%9B%86-613c8e44e4a6
- author_url
- https://medium.com/@King610160
- status
- ok
- fetched_at
- 2026-07-12 01:59:39