← Back to list

MySQL(1) — 建立主從資料庫叢集

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

Tako · 2026-02-12 14:57 · 0 claps · 7.7 min read
#mysql #mysql-cluster
Open on Medium ↗
Wiki topics: ☁️ · DevOps & Cloud

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

確認 repolist

確認 repolist

下載 GPG key 並安裝

下載 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

因為先啟動了,所以要把原本在 /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 並確認是否建立

建立 user 並確認是否建立

show status 後,記錄 file, postition

show status 後,記錄 file, postition

Slave那台填寫連到主 DB 的資訊

Slave那台填寫連到主 DB 的資訊

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

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

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

打的指令沒顯示 Query OK,但句子有分號結尾,通常是重新連入 mysql terminal

打的指令沒顯示 Query OK,但句子有分號結尾,通常是重新連入 mysql terminal

會檢查紅框參數,都要是 Yes 才算成功

  • 驗測

測試方法會是在 master 建 Database,然後 Slave 也看的到就成功了,這邊就不截圖了

這邊記一些別的常用的 SQL 語法

-- 看現在是誰
SELECT current_user();

-- 看給的權限
SHOW GRANTS FOR 'replica_user'@'%';

先寫這些,下一篇會寫 prometheus + grafana 的監控,因為 DevOps/SRE 就是要看監控,但像 mysql, postgres 並沒有自帶監控,所以要進行設定

參考資料:

  1. Google gemini
  2. 別人的 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