TableStore:大量の構造化データ階層型ストレージスキーム


前言
表ストレージはアリクラウドの自己研究分布式ストレージシステムであり、大量の構造化、半構造化のデータを格納するために使用することができる.表ストレージは、高性能と容量の2つのインスタンスタイプをサポートします.高性能はSSDの記憶媒体を使用し、読み書きが多いシーンに対してアクセス遅延が良好である.容量型はSSDとSATAが混在した記憶媒体を使用している.書き込みが多いシーンに対しては、性能が高性能に近いため、読み取り面では、冷たいデータに遭遇して読み取りSATAディスクを生成すると、遅延は高性能より1レベル上昇します.シーケンシャルシーンなど、大量のデータストレージシーンでは、最新のデータが高性能クエリーをサポートし、より早いデータの読み書き頻度が大幅に低下することを望んでいます.このとき、テーブルストレージの高性能と容量型ストレージ階層化のニーズが発生します.
シナリオの詳細
表には、最近正式に公開されたフルインクリメンタル一体チャネルサービスが格納されています.(参考文献)チャネルサービスは、表記憶データインタフェース上のフルインクリメンタル一体化サービスに基づいている.チャネルサービスは、ユーザーに対して、インクリメンタル、フル、インクリメンタルプラスの3種類の分散型データリアルタイム消費チャネルを提供する.チャネルサービスがあれば、高性能インスタンス下の表から容量型表までのリアルタイムデータ同期を容易に構築することができ、さらに表に格納されているプロパティ・データのライフサイクル(ドキュメント参照)を使用して、ビジネス要件に応じて適切なTTLを設定します.全体的に、次の図のようなアーキテクチャを構築できます.
データ全体の流れは次のとおりです.
  • トラフィック書き込み側は、高性能インスタンス
  • に直接書き込む.
  • 高性能インスタンスのデータは、チャネルサービスを介して容量型
  • に同期する.
  • 高性能インスタンスの古いデータは自動的に期限切れになり、ストレージの消費量を減らす
  • .
  • ユーザクエリー要求は、タイミングクエリー条件に基づいて、最近のデータであるか否かを判断する
  • 最近のデータ・クエリーは高性能に入り、ミリ秒レベルは
  • を返します.
  • より早いデータクエリは容量型に入り、数十ミリ秒後に
  • に戻る.

    コードと操作プロセス:
    高性能インスタンス上でビジネス・プライマリ・キーの要件に基づいてデータ・テーブルを作成し、適切なデータTTLを設定し、容量型で同じschemaのテーブルを作成して、すべてのデータを永続的に格納します.
    次に、チャネルページにフルインクリメンタルタイプのチャネルを作成します.
    コンソールを使用すると、同期の状態、同時実行、進捗などの情報を簡単に確認できます.
    同じschemaテーブルTableStoreテーブルをTunnelでコピーするSampleコードを貼り付けます.
    func main () {
        //        
      tunnelClient := tunnel.NewTunnelClient("", "", "", "")
      //        
        client := tablestore.NewClient("", "", "", "")
    
        //  callback SimpleProcessFactory,     TunnelWorkerConfig
        workConfig := &tunnel.TunnelWorkerConfig{
            ProcessorFactory: &tunnel.SimpleProcessFactory{
                ProcessFunc: replicateDataFunc,
                CustomValue: client,
            },
        }
    
        //  TunnelDaemon      tunnel
        daemon := tunnel.NewTunnelDaemon(tunnelClient, "", workConfig)
        err := daemon.Run()
        if err != nil {
            fmt.Println("failed to start tunnel daemon with error:", err)
        }
    }
    
    func replicateDataFunc(ctx *tunnel.ChannelContext, records []*tunnel.Record) error {
        client := ctx.CustomValue.(*tablestore.TableStoreClient)
        fmt.Println(client)
        for _, rec := range records {
            fmt.Println("tunnel record detail:", rec.String())
            updateRowRequest := new(tablestore.UpdateRowRequest)
            updateRowRequest.UpdateRowChange = new(tablestore.UpdateRowChange)
            updateRowRequest.UpdateRowChange.TableName = "coldtable"
            updateRowRequest.UpdateRowChange.PrimaryKey = new(tablestore.PrimaryKey)
            updateRowRequest.UpdateRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
            for _, pk := range rec.PrimaryKey.PrimaryKeys {
                updateRowRequest.UpdateRowChange.PrimaryKey.AddPrimaryKeyColumn(pk.ColumnName, pk.Value)
            }
            for _, col := range rec.Columns {
                if col.Type == tunnel.RCT_Put {
                    updateRowRequest.UpdateRowChange.PutColumn(*col.Name, col.Value)
                } else if col.Type == tunnel.RCT_DeleteOneVersion {
                    updateRowRequest.UpdateRowChange.DeleteColumnWithTimestamp(*col.Name, *col.Timestamp)
                } else {
                    updateRowRequest.UpdateRowChange.DeleteColumn(*col.Name)
                }
            }
    
            _, err := client.UpdateRow(updateRowRequest)
            if err != nil {
                fmt.Println("hit error when put record to cold data", err)
            }
        }
        fmt.Println("a round of records consumption finished")
        return nil
    }

    まとめ
    チャネルサービスにより、テーブルストレージに格納された構造化され、半構造化データはリアルタイムで流出し、加工、抽出、計算、または同期することができる.コールドデータのストレージコストをさらに削減したい場合は、この記事を参照して、テーブルに格納されているデータをOSSアーカイブストレージにバックアップします.
    著者:ホーニング
    原文を読む
    本文は雲栖コミュニティのオリジナル内容で、許可を得ずに転載してはならない.