2019年3月21日 星期四

[GAE] Google三種雲端儲存空間介紹— Cloud Datastore、Cloud SQL、Cloud Storage

Google app engine提供多樣的選擇讓使用者決定如何存放資料,此篇文章我們將大致介紹。

左到右分別代表Google Cloud Storage、Google Cloud Datastore、Google Cloud SQL










Google提供的存放資料方式主要有三種:
名字
結構
一致性 (Consistency)
Google Cloud Datastore
NoSQL
Strongly consistent except when performing global queries
Google Cloud SQL
mySQL
Strongly consistent
Google Cloud Storage
File and metadata
Strongly consistent except when performing list operations that get a list of buckets or objects.

* 注意:上面的存放方式是可共存的,像是有些資料可以存Datatore,有些資料存SQL這樣。另外,收費方式都不同,詳細請參考官網。

(你也可以使用Third-party Databases,請參考:https://cloud.google.com/appengine/docs/standard/python/using-third-party-databases)



Google Cloud Datastore:

  NDB client library幫助我們連結 Cloud Datastore,它是建立在舊的 DB Datastore library上,加上以下功能:

    1. StructuredProperty class, which allows entities to have nested structure
    2. integrated automatic caching, which typically gives fast and inexpensive reads via an in-context cache and Memcache
    3. support both asynchronous APIs for concurrent actions in addition to synchronous APIs


  Cloud Datastore儲存的物件被稱作entities,一個entity擁有至少一個properties (property可以是string、integer、reference to another entity...)
  每一個entity具有一獨特的key,這個key可以有parent key,沒有parent key的key稱作root。
  擁有相同root的entities組成entity group,如果實體位於不同的組中,那麼對這些實體的更改有時可能會 "out of order" 發生,如果某些實體的更改應該是一致(consistent)的,那麼您的應用程序應該在創建它們時使它們成為同一組。


  特色 (資料來源:https://cloud.google.com/datastore/docs/concepts/queries?hl=zh-tw):
    1. 不可分割的交易:Cloud Datastore 可執行一系列必須全數成功否則會全數失敗的作業。
    2. 高可用性的讀取和寫入作業:Cloud Datastore 在 Google 資料中心內執行,這些資料中心會透過備援功能盡量減少故障點造成的影響。
    3. 具備大規模擴充性和高效能:Cloud Datastore 使用分散式架構,自動管理資源調度作業。Cloud Datastore 混用索引和查詢限制,因此查詢作業可依照結果集 (而非資料集) 的大小調整規模。
    4. 彈性的資料儲存與查詢:Cloud Datastore 可順利對應到物件導向語言與指令碼語言,並透過多個用戶端向應用程式公開。此外也提供類似 SQL 的查詢語言。
    5. 平衡同步一致性與最終一致性:Cloud Datastore 可確保按照索引鍵進行的實體查詢和祖系查詢一律會收到具有同步一致性的資料。所有其他查詢則具有最終一致性。一致性模型可讓應用程式在處理大量資料和使用者的同時提供絕佳的使用者體驗。
    6. 靜態資料加密:Cloud Datastore 會在將所有資料寫入磁碟之前,自動加密資料,並在獲得授權的使用者讀取資料時自動解密資料。詳情請參閱伺服器端加密一文。
    7. 無需停機的全代管服務:Google 負責管理 Cloud Datastore 服務,讓您能專注於應用程式上。當服務進行預定的升級時,您的應用程式仍然可以使用 Cloud Datastore。



Google Cloud SQL:

  Google Cloud SQL是個MySQL資料庫伺服器實體,可供App Engine應用程式使用,Google Cloud Platform的程式也可以使用。
  要使用需先到主控台建立Cloud SQL實體,並為其設定實體IP (實體IP持有時就要收費,若不用最好釋放),並把我們本地端的IP位址加入已授權網路,允許從本地端存取,再設定管理員密碼就可以使用了。(因為沒提供免費額度所以我沒實際試...但書上是這樣寫啦)

使用Cloud SQL的好處:
    1. Cloud SQL的寫入限制比起Datastore寬鬆許多。
    2. 外界的應用程式也能夠連線到 Cloud SQL 實體存取其中的資料。(我們無法再App Engine平台之外存取Datastore,所以必須有另一支App Engine應用程式負責分析資料)
    當網頁應用程式流量變大時,Cloud SQL會是更好的方案,

使用時app.yaml要引入MySQLdb library:
libraries:
- name: MySQLdb
  version: latest

連線設定:
def on_appengine():
    return os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine')

def get_cloudsql_db():
    db_user = os.getenv('CLOUD_SQL_USER')
    db_pass = os.getenv('CLOUD_SQL_PASS')
    if on_appengine():        # 發佈在app engine時執行,因為從App Engine app連線須改用Unix Socket
        instance_id = os.getenv('CLOUD_SQL_INSTANCE_ID')
        sock = '/cloudsql/{}'.format(instance_id)
        return MySQLdb.connect(unix_socket=socke, db='DB_NAME',
                               user=db_user, passwd=db_pass)
    else:    # 本地端測試時執行,使用TCP/IP socket連線Cloud SQL實體
        db_ip = os.getenv('CLOUD_SQL_IP')
        return MySQLdb.connect(host=db_ip, db='DB_NAME',
                               user=db_user, passwd=db_pass)

env_variables:
    CLOUD_SQL_IP: '<實體IP>'
    CLOUD_SQL_USER: 'username'
    CLOUD_SQL_PASS: 'password'
    CLOUD_SQL_INSTANCE_ID: '<實體ID>'

* 在開發時,為了省錢與網路延遲問題,應使用本地端的MySQL來開發較好,CLOUD_SQL_IP要改設定成 'localhost'。




Google Cloud Storage:

  有些資料像是照片圖檔和媒體檔案並不適合放進Datastore中,這類資料大的二進位資料放進Datastore讀寫的效率極差而且也很花錢,這時應該要使用Google提供的另一個專門儲存此類檔案的系統,即Google Cloud Storage。

  Cloud Storage提供稱為「bucket」的地方,讓我們存放大型檔案,Cloud Storage client library (要另外下載) 提供我們對bucket進行讀寫,但沒有提供 create bucket的函式,每支App Engine應用程式都有預設的 bucket,也可透過主控台新增bucket。

  我們也可以設定ACL(Access Control List,權限控管清單),設定誰對哪個桶子擁有那些權限。

  * 注意:一旦您在 bucket 中建立物件,即無法再加以修改或附加項目。您必須使用相同名稱 (包含有您所需項目) 的新物件,來覆寫該物件。

  * 注意:Cloud Storage 用戶端程式庫可讓您在建立新物件時提供子目錄分隔符號。然而,Cloud Storage 中沒有真正的子目錄。Cloud Storage 中的子目錄是物件檔案名稱的一部分。例如,您可能認為建立物件 somewhere/over/the/rainbow.mp3 時,會將檔案 rainbow.mp3 儲存在子目錄 somewhere/over/the/ 中,但物件名稱其實是設定為 somewhere/over/the/rainbow.mp3。



參考資料:
    1. 雲端網頁程式設計:Google App Engine使用Python
    2. Google官方文件


沒有留言:

張貼留言