aws-data-migration-service-walkthrough-cover

這邊整理我在使用 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)

開防火牆

  1. 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 設定


  1. 開一個新的 RDS,開好帳號與 database
  2. 啟動一個新的 複寫執行個體
  3. 有 private ip 後,開 db instance 的防火牆給 複寫執行個體
  4. 設定來源端點,目標端點
  5. 新增新的 資料庫移轉任務,設定如下,其中注意,如果 db 裡面有的表會塞很大的 json,就一定要開 完整的LOB模式
  6. 如果無法在 cloudwatch 看 log,參考這個文件開 role 和 permission 給 DMS
DMS Data Migration Service 任務設定
DMS Data Migration Service 任務設定
DMS Data Migration Service 任務設定
DMS Data Migration Service 任務設定

參數說明

移轉類型

  1. 移轉現有資料
    拷貝完現在 db 所有的資料就結束,之後的新變動不會同步過去
  2. 移轉現有資料及複寫持續的變更
    拷貝完現在 db 所有的資料,且之後的新變動會同步過去,類似 replication standby db
  3. 僅複寫變更的資料
    只對開始之後的新變動同步過去,之前的資料不理會

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>;

搬移的速度超級慢

  1. CommitRate 開大
    預設是 10000,官方回應這是給一般資料庫使用,如果是大型資料庫的話,可以開 50000 增加速度。
  2. 使用 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 的過程,如同鳥類遷徙一般,雜亂中卻帶有秩序

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。