練習題: 匯入IP國家資料庫至DynamoDB - Part 1 解析資料

IP與地理資訊對應資料庫,在很多場合都會用到, 例如網路廣告業、線上遊戲產業、各種影片、直播鎖區的需求等等. 以前知道有一些免費的這類資料可供下載, 我想試試看將資料灌到 NoSQL 也就是 AWS DynamoDB裡,並測試一下效能如何.

下載資料庫

根據 stackoverflow 鄉民的討論串: Best IP to Country Database , 免費資料庫有下列兩種, 大部分人都推薦 前者Maxmind 的產品. 這類資料庫的付費模式大都相同, 免費的資料庫涵蓋了各個國家的ip對照表, 而更詳細的城市、經緯度對照則要付費(年費超過1,000美金).

  • Maxmind 公司的 GeoIP2 資料庫
  • ip2nation

下載

http://dev.maxmind.com/geoip/geoip2/geolite2/ --

解壓縮

--

裡面的資料有三類:

  • IPv4 資料庫
  • IPv6 …
more ...

練習題: 匯入IP國家資料庫至DynamoDB - Part 2 匯入DB

Create Table

之前跟 DynamoDB 不是很熟, 在Create Table的設計上,先後換了好幾個版本.

最後版本是這樣子的:

Table name: ip_geo_table

Primary key :
    partition key:  partition (string)
    sort key: num_start (number)

Provisioned capacity:
    Read capacity units: 1
    Write capacity units: 1 (匯入資料前,拉高至100,理由後述)

Secondary indexes:
    不需建任何二級索引

Primary Key 規劃

DynamoDB 支援兩種類型的Primary Key:

  1. Partition Key : 例如 身分證字號、流水號
  2. Partition …
more ...

練習題: 匯入IP國家資料庫至DynamoDB - Part 3 查詢

搞定資料庫之後, 最後就是如何下查詢條件的問題. 目標只有一個: 給定一個 IP, 查詢該一筆資料出來. 但是可能是以前 RDBMS 資料庫玩太久,觀念一時轉不過來. 一直想寫出這樣的語法:

SELECT *
FROM ip_geo_table
WHERE IP_START <= '8.8.8.8' AND
      IP_END >= '8.8.8.8'

很不幸的,DynamoDB 跟 RDBMS 本質上還是不太一樣的. 在這裡除非整個Table Scan一次才有辦法處理這樣的查詢, 但是20+萬筆全部Scan一次是很慢的, 只好另尋它法.

簡化問題

稍微簡化問題一下, 假如我們有一個相似但是比較簡單的Table如下, 我們輸入數字 25, 那要如何找出正解,也就是20~29這個第二筆?

--

允許的方式只能使用主鍵(前兩個欄位) 以及 Sort Key(num欄位 …

more ...

Serverless Apps with AWS Step Functions 課程筆記

自從 2014年尾的AWS re:Invent 推出 Lambda 至今也兩年多了, 最近覺得Serverless 的概念是未來有潛力的東西,而不是個流行詞彙而已。 所以最近的短期目標就是抽空把 re:Invent 2016 的 Serverless Computing Mini Con 這個主題的十幾個影片盡量看完, 順便做點筆記。

--

由於 Lambda 有一個「最多300秒便會強迫timeout」的設計, 所以一旦拆成許多小型的程式, 到最後可能會變成圖中複雜組成的樣子. 而且現實生活的問題比較複雜.所以假如想讓許多的Lambda function 有秩序的處理問題,例如:

  • I want to sequence functions : 想要循序的執行
  • I want to run functions in parallel : 想要平行的執行許多functions
  • I want to …
more ...