ウェブサイト検索

HarperDBのマルチリージョン展開の設定


HarperDBは、グローバルに分散されたデータおよびアプリケーションプラットフォームであり、現在DigitalOcean Marketplaceで利用可能です。これにより、DigitalOceanのユーザーはHarperDBを迅速にブートストラップできるようになります。

HarperDBは、高性能データベース、ユーザーによるカスタムアプリケーション、およびリアルタイムデータストリーミングを1つのプラットフォームに統合しているため、ユニークです。この技術は、パフォーマンスと使いやすさに焦点を当てて構築されました。柔軟なユーザー定義API、シンプルなHTTP/Sインターフェース、高性能の単一モデルデータストアを備えており、NoSQLおよびSQLワークロードの両方に対応しています。HarperDBは、概念実証から本番環境まで、アプリケーションと共にスケーラブルです。

HarperDBのレプリケーションエンジンは、テーブルごとに高性能な双方向パブリッシュ/サブスクライブモデルを使用して、HarperDBのインスタンス間でデータを複製します。これは無限のノード間で行うことができ、最終的には無限のグローバルスケールを実現します。また、HarperDBはパフォーマンスに関しても競合他社を圧倒しており、1秒あたり20K書き込み/ノードおよび1秒あたり120K読み取り/ノードを実現しています。

このチュートリアルでは、DigitalOcean Dropletsを使用して複数のリージョンにHarperDBを設定する方法を説明し、カスタム関数を使用してその上にシンプルなAPIレイヤーを作成する方法を示します。

ドロップレットを作成する

DigitalOceanにログインした後、マーケットプレイスに移動し「HarperDB Dropletを作成」をクリックしてください。

HarperDBはDigitalOceanマーケットプレイスにあります。

私たちは二つのインスタンスを作成します:一つはニューヨークに、もう一つはサンフランシスコに。ドロップレットのタイプを選択してください(デモ目的で基本プランを使用します)そしてボリュームを接続します。自分でLVM構成を管理したくない限り、自動フォーマットとマウントオプションを選択できます。

DigitalOceanマーケットプレイスで画像を選択してください

各地域で2つのドロップレットが作成されるのを待ち、IPアドレスをメモしてください。また、HarperDB Studioがインスタンスと対話するためにファイアウォールを有効にする必要があります。

ネットワーキング > ファイアウォールセクションに移動し、ポート9925-9926および9932を開きます:

インバウンドルール

最後に、Dropletsにsshで接続し、~/.harperdbの内容を確認して自動的に作成された認証情報を探してください。次のセクションでこれらの詳細が必要になります。

HarperDBスタジオに接続中

HarperDB Studioは、HarperDBインスタンスを管理するためのオンラインポータルです。HarperDBは非常に強力な無料プランを提供しており、必要に応じて有料モデルにアップグレードするオプションがあります。ここで価格情報をご覧ください。

studio.harperdb.ioに移動し、「新しいHarperDBクラウドインスタンスを作成」をクリックして「エンタープライズ」オプションを選択します。その後、インスタンス情報を適宜入力してください:

ハーパーDBスタジオのインスタンス情報

ユーザー名/パスワードは上記の.harperdbファイルから取得され、ホストはあなたのDropletのIPアドレスです。マーケットプレイスのインストールにはSSLが有効になっているため、SSLボタンをクリックすることが重要です。

インスタンス詳細をクリックすると、自己署名証明書を受け入れることについて警告される場合があります。ブラウザ内のリンクをクリックして、それらの証明書を受け入れてください。数秒後に、ダッシュボードにインスタンスが表示されるのが見えるでしょう。

データを追加する

データベースが設定されたので、スキーマとテーブルを作成できます。devというスキーマと、ハッシュ属性idを持つdogというテーブルを作成しましょう:

それから、curlコマンドを使用してデータを追加できます:

curl -k --location 'https://<my-ip>:9925' \

--header 'Content-Type: application/json' \

--header 'Authorization: <YourBase64EncodedInstanceUser:Pass>' \

--data-raw '{

    "operation": "insert",

    "schema": "dev",

    "table": "dog",

    "records": [

        {

            "dog_name": "Charlie",

            "age": 2

        }

    ]

}'

HarperDBの優れた機能の一つは、データベースに一級のレプリケーションサポートが組み込まれていることです。HarperDBスタジオのreplicationタブに移動し、クラスタリングを有効にするためにクラスターユーザーを作成してください。

これを両方のDropletsに対して行い、データベースが再起動するのを待ちます。その後、パブリッシュ/サブスクライブ機能を持つクラスタリングタブの下に各インスタンスを追加できます。

HarperDBは、非同期パブリッシュ/サブスクライブモデルでレプリケーションを実現します。私たちの例では、データを取得できるマルチリージョンアプリケーションを設定したいので、パブリッシュ/サブスクライブの両方の機能を有効にします。

別のデータポイントを追加してみると、両方のインスタンスのブラウズタブにデータが表示されるのを見ることができるはずです。

カスタム関数の設定

HarperDBは、カスタム関数と呼ばれる機能を介してユーザーが軽量APIレイヤーを定義できるようにします。カスタム関数は、サーバーレス関数と基盤となるデータベースを組み合わせて、スタックを単一のソリューションに統合し、HarperDBのコア操作に直接アクセスできるカスタムAPIエンドポイントを定義する能力を提供します。HarperDBのサーバーレスカスタム関数は、Fastifyによって動かされ、AWS Lambda関数やストアドプロシージャと同様のものです。関数はメンテナンスが少なく、簡単に開発でき、ロジックを定義し、実行するタイミングを選択できます。

カスタム関数を使用して、地域情報と共にデータを取得する簡単な関数を展開します。

そのためには、HarperDBドロップレット上の/opt/hdb/custom_functionsディレクトリに移動します。次に、「digitalocean」という新しいディレクトリを作成します。ここでnpmプロジェクトを初期化します:

npm init -y

npm install @fastify/env

私たちは地域情報をエンコードするために環境変数を読み込むために@fastify/envライブラリを利用しています。

新しい routes ディレクトリの下に index.js を作成してください。

mkdir routes

touch routes/index.js

次に、以下のコードを貼り付けます:

import fastifyEnv from '@fastify/env'

import { fileURLToPath } from 'url'

import path from 'path'

const schema = {

  type: 'object',

  required: ['DO_REGION'],

  properties: {

    DO_REGION: {

      type: 'string'

    },

  }

}

const __filename = fileURLToPath(import.meta.url)

const __dirname = path.dirname(__filename)

const options = {

  schema,

  dotenv: {

    path: `${__dirname}/.env`,

    debug: true

  },

  data: process.env

}

export default async (server, { hdbCore, logger }) => {

  await server.register(fastifyEnv, options);

  server.route({

    url: '/',

    method: 'GET',

    handler: async () => {

      const body = {

        operation: 'sql',

        sql: 'SELECT * FROM dev.dog ORDER BY dog_name',

      };

      const results = await hdbCore.requestWithoutAuthentication({ body });

      const response = {

        region: process.env.DO_REGION,

        results

      }

      return response

    },

  });

};

次に、.envファイルを作成し、DO_REGION情報を以下のように追加します:

DO_REGION=new-york

アプリケーションのテスト

ついに、私たちは、dev.dogテーブルからdog_name属性で並べ替えられたすべてのレコードを取得するアプリケーションのテストを行う準備が整いました。

デフォルトでは、カスタム関数のエンドポイントは<ip-address>:9926/<name-of-function>です。したがって、私たちの場合は<ip-address>:9926/digitaloceanになります。

あなたの近くにあるDroplet IPを選択してください。そのエンドポイントをcurlすると、以下のことが返されます:

{

  "region": "new-york",

  "results": [

    {

      "age": 2,

      "dog_name": "Charlie"

    },

    {

      "age": 4,

      "dog_name": "Coco"

    }

  ]

}

私の場合、ニューヨーク地域に連絡したことに注意してください(以前に別のレコードも追加したことに注意してください)。

他の地域から正しい地域データ(例えば、サンフランシスコ)を用いた場合、同じ出力を受け取ることができます。

ジオロケーションに基づいてトラフィックをルーティングしたい場合は、これらのエンドポイントをグローバルロードバランサーに統合するか、トラフィックを適切にルーティングできるDNSサービスを使用することができます。

まとめ

この記事では、DigitalOceanでのレプリケーションを伴うHarperDBのマルチリージョン構成の設定方法について説明しました。新しいMarketplaceテンプレートを使用すれば、HarperDBの新しいインスタンスをオンデマンドで簡単に立ち上げることができます。また、レプリケーションを有効にする方法と、APIレイヤーをほとんど手間なく追加する方法を示すために、サンプルのカスタム関数についても説明しました。

関連記事: