這邊整理我在使用 AWS Data Migration Service (簡稱DMS)一路採坑後整理出來的筆記,希望對也是在水深火熱的人有幫助!
以下結構主要拆成兩部分,一部分是對原先的 database 做設定(這邊使用的是 PostgreSql),另一部分是對 DMS。先後順序沒有一定,只要最終 DMS 能連線進去 database 並啟動 task 即可!
目錄
PostgreSql 相關設定
Create superuser in postgres
在 target db 開立一個 superuser 帳號 “awsdms” for replication 使用,因為 replication 一定要 superuser 才行。
(可參考 aws 官方文件 使用 PostgreSQL 資料庫作為 AWS DMS 來源的事前準備 章節)
sudo su postgres # 在 linux shell 下切換到 postgres 帳號
createuser -s -i -d -r -l -w <username> # 建立 superuser account in db
psql -c "ALTER ROLE <username> WITH PASSWORD '<password>';" # 修改密碼
修改 pg_hba.conf
檔案路徑
/etc/postgresql/9.4/main/pg_hba.conf
# (這邊 ip 和帳號名稱 awsdms 是示例,須依照現實修改)
# AWS DMS
host all all 172.31.23.112/32 md5
host h2 awsdms 172.31.23.112/32 md5
host replication awsdms 172.31.23.112/32 trust
修改 postgresql.conf
檔案路徑
/var/lib/postgresql/data/postgresql.conf
wal_level = logical
max_replication_slots = 5 # 文件表示 > 1 即可
max_wal_senders = 5 # 文件表示 > 1 即可
wal_sender_timeout = 0
修改 max_replication_slots 一定要 restart, 只使用 SELECT pg_reload_conf(); 是沒用的!
sudo service postgresql restart
之後 psql 到 db shell 確認是否有開啟
# 查詢目前的設定
h2=> show max_replication_slots;
max_replication_slots
-----------------------
5
(1 row)
# 如果 DMS 跑起來,會看到他的 slot
h2=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn
----------------------------------------------------------------+---------------+-----------+--------+----------+--------+------+--------------+--------------
r3mlfac6cig3yp4p_00016385_113ad8c1_ee82_42f0_ac18_4c3530ecd622 | test_decoding | logical | 16385 | db | t | | 933820740 | F70/E1742450
(1 row)
開防火牆
- iptables (一般 linux 都會有)
# 先列出目前的設定,包含行號
sudo iptables -L -n --line-numbers
Chain net2fw (1 references)
num target prot opt source destination
1 dynamic all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID,NEW,UNTRACKED
2 smurfs all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID,NEW,UNTRACKED
...
15 ACCEPT tcp -- 172.31.4.89 0.0.0.0/0 tcp dpt:5432
16 ACCEPT tcp -- 172.31.0.60 0.0.0.0/0 tcp dpt:5432
17 ACCEPT tcp -- 172.20.0.0/16 0.0.0.0/0 tcp dpt:5432
18 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 /* Ping */
19 Drop all -- 0.0.0.0/0 0.0.0.0/0
20 DROP all -- 0.0.0.0/0 0.0.0.0/0
# 把 DMS 的 複寫執行個體 private ip 加入 (這邊 ip 是示例,須依照現實修改)
sudo iptables -I net2fw 17 -p tcp -s 172.31.23.112/32 --dport 5432 -j ACCEPT
2. shorewall (如果有裝的話)
# 修改設定
sudo nano /etc/shorewall/rules
ACCEPT all $FW tcp http,https,ssh - - -
ACCEPT all $FW tcp 1022 - - -
ACCEPT net:172.31.27.111 $FW tcp 5432 - - -
ACCEPT net:172.31.23.247 $FW tcp 5432 - - -
ACCEPT net:172.31.14.241 $FW tcp 5432 - - -
ACCEPT net:172.31.6.241 $FW tcp 5432 - - -
ACCEPT net:172.31.13.175 $FW tcp 5432 - - -
ACCEPT net:172.31.12.98 $FW tcp 5432 - - -
ACCEPT net:172.31.7.200 $FW tcp 5432 - - -
ACCEPT net:172.31.4.89 $FW tcp 5432 - - -
ACCEPT net:172.31.0.60 $FW tcp 5432 - - -
ACCEPT net:172.31.23.112/32 $FW tcp 5432 - - -
ACCEPT net:172.20.0.0/16 $FW tcp 5432 - - - # 加進來
Ping(ACCEPT) all $FW
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
# 重啟
sudo shorewall restart
3. AWS Security Groups
到 web console 介面,依照所需修改
DMS 設定
- 開一個新的 RDS,開好帳號與 database
- 啟動一個新的 複寫執行個體
- 有 private ip 後,開 db instance 的防火牆給 複寫執行個體
- 設定來源端點,目標端點
- 新增新的 資料庫移轉任務,設定如下,其中注意,如果 db 裡面有的表會塞很大的 json,就一定要開 完整的LOB模式
- 如果無法在 cloudwatch 看 log,參考這個文件開 role 和 permission 給 DMS
參數說明
移轉類型
- 移轉現有資料
拷貝完現在 db 所有的資料就結束,之後的新變動不會同步過去 - 移轉現有資料及複寫持續的變更
拷貝完現在 db 所有的資料,且之後的新變動會同步過去,類似 replication standby db - 僅複寫變更的資料
只對開始之後的新變動同步過去,之前的資料不理會
Troubleshooting
如果後續 migrate 發生 psycopg2 . errors . InsufficientPrivilege: permission denied for relation awsdms_ddl_audit
因為我們是用另一個帳號來做複製,因此 awsdms_ddl_audit 這張表權限屬於另一個帳號,需要用以下指令給定權限給原 db 使用者帳號
GRANT ALL PRIVILEGES ON awsdms_ddl_audit TO <user_name>;
GRANT USAGE, SELECT ON SEQUENCE awsdms_ddl_audit_c_key_seq to <user_name>;
搬移的速度超級慢
- CommitRate 開大
預設是 10000,官方回應這是給一般資料庫使用,如果是大型資料庫的話,可以開 50000 增加速度。 - 使用 Limited LOB mode
如果使用 Full LOB mode,DMS 會因為沒有上限的限制,搬資料反而慢,所以官方建議找出資料庫中 LOB 的最大值,直接設定為上限並使用 Limited LOB mode。如果不知道最大值多少,就先設定個大概,如果超過最大值,狀態會變成錯誤,看 log 會發現有 warn,表示資料被截斷,這時候再開大一點即可。
雖然開了 Migrate existing data and replicate ongoing changes 但沒有繼續做 replicate
如果過程中有修改過任何設定,一定要重新啟動任務,不然就不會做後續的 replicate。
延伸閱讀:
拯救脆弱系統 – Migrate to RDS by DMS #1
封面圖片備註:db migration 的過程,如同鳥類遷徙一般,雜亂中卻帶有秩序