使用 rsync 實現兩部完全一樣的 Asterisk 主機的 HA 方案。
設定開始
系統環境
- Master Box (平日主要營運的主機)
- hostnem = pbx-master
- master ip = 192.168.7.62
- Slave Box (離線備份的主機,當 Master 故障時,可接手營運)
- hostnem = pbx-slave
- slave ip = 192.168.7.70
- Virtual IP (這又稱為 floating IP,作為主機對外服務的 IP)
設定 SSH 免密碼的連接
On Master Box,同步方式:Master ---(push)---> Slave)
建立公鑰及私鑰證書
# cd /root/.ssh
# ssh-keygen -d
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <確認路徑無誤,按 Enter>
Enter passphrase (empty for no passphrase): <不可輸入密碼>
Enter same passphrase again: <按 Enter>
Your identification has been saved in /root/.ssh/id_rsa. <這是私鑰>
Your public key has been saved in /root/.ssh/id_rsa.pub. <這是公鑰>
The key fingerprint is:
42:e6:6b:21:07:74:33:95:2c:b8:17:25:a2:53:0e:f8 root@pbx-master.local
將公鑰檔傳送到 Slave Box 的 /root/.ssh/authorized_keys (注意:檔名不可變更)
SSH 連接測試
ssh pbx-slave
不用輸入密碼即可登入 pbx-slave。
資料同步測試指令
rsync -avl /tmp/rsync.test -e ssh pbx-slave:/tmp/rsync.test
On Slave Box,同步方式:Slave ---(push)---> Master)
同以上方法完成。
兩主機資料同步的 script
檔名:ast-ha-rsync.sh
重點說明:
- Master & Slave 使用同一個 script。
- -s:更新目前主機的 ast-ha-rsync.sh 檔案至另一台主機。
- -r:釋放目前主機的 virtual IP。
- -v:將log 寫入紀錄檔(/var/log/xxx.log)。
- -b (v2):同步資料到 Slave node,只能在 Master node 執行。
- Slave node 機器如果有重新啟動,在 5 分鐘內,不會啟動服務 IP,這是因為在這期間要留給 Master 作啟動服務。
- Master & Slave 是透過任一方服務 IP 的啟動,來決定哪一台是工作的 Asterisk。
- 任一方主機必須在 Asterisk 有啟動狀態下,才會進行啟動/關閉服務 IP 以及資料的同步。
操作情境說明:
日常模式的開機及關機(歲修或計畫停機之類)
- 開機:先開啟 Master node > 手動/自動啟動 Asterisk(Master) 服務 > 由 script 啟動服務 IP > 開啟 Slave node > 手動/自動啟動 Asterisk(Slave) 服務
- 關機:停止Asterisk(Slave) 服務 > 關閉 Slave node > 停止Asterisk(Master) 服務 > 由 script 關閉服務 IP > 關閉 Master node
Master node 進行軟/硬體維修前 (Master -> Slave)
- 確認 Slave node 的網路正常以及 Asterisk 服務運行中。
- 在 Master node 使用以下任一方式,將服務 IP 切換到 Slave node
- 手動停止 Asterisk 服務
- 執行 ast-ha-rsync.sh -r
- 在 Slave node 執行 ifconfig 檢查是否已接手服務 IP。
Master node 軟/硬體維修後 (Slave -> Master)
- 確認 Master node 的網路正常以及 Asterisk 服務運行中。
- 在 Slave node 使用以下任一方式,將服務 IP 切換到 Master node
- 手動停止 Asterisk 服務
- 執行 ast-ha-rsync.sh -r
- 在 Master node 執行 ifconfig 檢查是否已接手服務 IP。