Help us understand the problem. What is going on with this article?

R3 Corda 3rd party製ロードバランサを必要としない高可用性(HA)の構成方法

More than 1 year has passed since last update.

本記事はTIS株式会社様のMedium記事の転載となっております(了承済み)。

本文URL:https://medium.com/@TIS_BC_Prom/r3-corda-3rd-party%E8%A3%BD%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5%E3%82%92%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%97%E3%81%AA%E3%81%84%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7-ha-%E3%81%AE%E6%A7%8B%E6%88%90%E6%96%B9%E6%B3%95-3467f4479f6d


A. はじめに

前回の投稿では https://qiita.com/SBIR3Japan/items/0d6a3956613ec076381c (以降“前記事”とします), ロードバランサを使用して、「ホットコールド高可用性デプロイメント」の設定方法を説明しました。その設定はバージョン4.0も使用できます。
この記事では、バージョン4.0から提供された3rd party製ロードバランサを必要としないHAノードを設定する代替アプローチを説明します。
この記事の検証環境は、前回と同じAWS環境を使用します。 ただし、AWS Load Balancerサービスは使用しません。
1_Ru1l1qoLW-D9dOLbHMVq7w.jpg

図1 本記事のHA設定の全体像

B. EFS とRDSを作成する

前回の投稿では、AWS のEFSとRDSサービスの構築手順を説明しました。今回も前記事と同様に構築してください。(前記事のセクションDおよびE参照)

C. ノードの設定

Cordaの公式サイトでは、HA用のバックアップノードは [additionalP2PAddresses]設定で追加できることを簡単に述べています。この構成の詳細な手順を本章で説明します。

1.build.gradleファイルの設定について
HAに関する設定情報は本ファイルには必要ありません。
HAの設定については、後程HAノード(Step3 )の“PartyB_conf”ファイルで追記・説明します。
build.gradle

…<略>…
node {
        name "O=PartyB,L=Tokyo,C=JP"
        p2pAddress  "26.132.137.54:1433"
        //上記のp2pAddressは、ホットPartyBノードのIPです。 ロードバランサのDNS名としてp2pAddressを設定する必要がなくなりました。
        rpcSettings {
            address("localhost:10009")
            adminAddress("localhost:10049")
        }
         cordapps = [
                "$project.group:cordapp-contracts-states:$project.version",
                "$project.group:cordapp:$project.version"
        ]
        rpcUsers = [[ user: "user1", "password": "test", "permissions": ["ALL"]]]
    }
…<略>…

※前回の記事ではextraConfigの記載をしておりましたが、ver4.0 から変更になり、利用できなくなりました。

2.CorDappsをビルドする
上記のファイルを保存して、CorDappsのディレクトリで「./gradlew deployNodes」を実行してCorDappsをコンパイルします。これで、PartyBを含むすべてのcordaノードのディレクトリが“ build / nodes”の下に作成されます。 PartyBのnode.confファイルは次のようになります。

#-----PartyB/node.conf right after compile "./gradlew deployNodes"-----#
devMode=true
myLegalName="O=PartyB,L=Osaka,C=JP"
p2pAddress="26.132.137.54:1433"
rpcSettings {
    address="localhost:10009"
    adminAddress="localhost:10049"
}
security {
    authService {
        dataSource {
            type=INMEMORY
            users=[
                {
                    password=test
                    permissions=[
                        ALL
                    ]
                    user=user1
                }
            ]
        }
    }
}
#-----------------------------------------------#

3.HAノード(PartyB)の設定
HA設定に関する情報(additionalP2PAddresses(コールドノードIP), 共有DB )を/ build / nodesの下の“ PartyB_conf”ファイルに追加してください。

devMode=true
myLegalName="O=PartyB,L=Osaka,C=JP" 
p2pAddress="26.132.137.54:1433"                 // this is the IP for the hot PartyB node
additionalP2PAddresses=["26.132.133.94:1433"]   // this is the IP for the cold PartyB node
// the 3rd Party DB (e.g. PostgreSQL) info., which is the shared DB by PartyB’s Hot & Cold nodes
dataSourceProperties {
    dataSource {
        password=tisbcpoc
        url="jdbc:postgresql://ce4-pgsql.*****.ap-northeast-1.rds.amazonaws.com:5432/HAPartyB"
        user=ubuntu
    }
    dataSourceClassName="org.postgresql.ds.PGSimpleDataSource"
}
database {
    runMigration="true"
    schema="my_schema"
    transactionIsolationLevel="READ_COMMITTED"
}
jarDirs=[
  //ドライバ“ postgresql-42.1.4.jar”が配置されているディレクトリ
  "/home/ubuntu/driver"
]
rpcSettings {
    address="localhost:10009"
    adminAddress="localhost:10049"
}
security {
    authService {
        dataSource {
            type=INMEMORY
            users=[
                {
                    password=test
                    permissions=[
                        ALL
                    ]
                    user=user1
                }
            ]
        }
    }
}

additionalP2PAddressesには複数定義することが出来るため、配列型[ ]で定義します。

ネットワークに新しいノード(コールドノード)が追加されたので、ネットワークパラメータファイルを更新するためにブートストラップの実行が必要となります。
ブートストラップを実行する前に、PostgreSQL DBに必要なスキーマを作成するために、まずPartyB用のデータ移行ファイルを作成する必要があります。

4.必要な「移行スクリプト」を作成する
移行スクリプトの説明と作成方法は、前記事のSection Iで紹介しました。同じ手順で作成してください。

5.HAノードのNW構築を作成(ブートストラップ)
プロジェクトのルートディレクトリの下で、以下のコマンドを実行してください。
java -jar corda-tools-network-bootstrapper-4.0.jar — dir build/nodes/
上記で使用されている「corda-tools-network-bootstrapper-4.0.jar」ファイルは、Corda-Enterprise-4.0 Evaluation Packの〜/ tools / network-bootstrapper /からコピーしたものです。
ブートストラップが成功すると、以下のようなコンソールメッセージが表示されます。

Bootstrapping local test network in /mnt/**-poc-CE-additionalP2PAddresses/build/nodes
Generating node directory for PartyB
Generating node directory for Regulator
Generating node directory for Notary
Generating node directory for PartyA
Nodes found in the following sub-directories: [PartyA, PartyB, Notary, Regulator]
Found the following CorDapps: []
Not copying CorDapp JARs as --copy-cordapps is set to FirstRunOnly, and it looks like this network has already been bootstrapped.
Waiting for all nodes to generate their node-info files...
Distributing all node-info files to all nodes
Loading existing network parameters... NetworkParameters {
      minimumPlatformVersion=4
      notaries=[NotaryInfo(identity=O=Notary, L=London, C=GB, validating=true)]
      maxMessageSize=10485760
      maxTransactionSize=524288000
      whitelistedContractImplementations {
      }
      eventHorizon=PT720H
      packageOwnership {

      }
      modifiedTime=2019-06-25T10:37:15.047Z
      epoch=1
  }
Gathering notary identities
Generating contract implementations whitelist
Network parameters unchanged
Bootstrapping complete!

これで、PartyBのコールドノードの情報が新しいCordaネットワークに追加されました。
ブートストラップが完了後、PartyBのnode.confファイルも更新されました。更新された内容は次のようになります。

devMode=true
myLegalName="O=PartyB,L=Osaka,C=JP"
p2pAddress="26.132.137.54:1433"
additionalP2PAddresses=["26.132.133.94:1433"]
dataSourceProperties {
    dataSource {
        password=tisbcpoc
        url="jdbc:postgresql://ce4-pgsql.*****.ap-northeast-1.rds.amazonaws.com:5432/HAPartyB"
        user=ubuntu
    }
    dataSourceClassName="org.postgresql.ds.PGSimpleDataSource"
}
database {
    runMigration="true"
    schema="my_schema"
    transactionIsolationLevel="READ_COMMITTED"
}
jarDirs=[
  "/home/ubuntu/driver"
]
rpcSettings {
    address="localhost:10009"
    adminAddress="localhost:10049"
}
security {
    authService {
        dataSource {
            type=INMEMORY
            users=[
                {
                    password=test
                    permissions=[
                        ALL
                    ]
                    user=user1
                }
            ]
        }
    }
}

PartyBのコールドノードのIP(additionalP2PAddresses)、ホットノードとコールドノードの共有データベース「HAPartyB」( dataSourceProperties)を設定できました。
6.ParyBの設定情報をホットノード・コールドノードに配置する
上記Step5で作成されたPartyBのディレクトリをホットノードの”26.132.137.54" とコールドノードの”26.132.133.94" 両方にコピーします。
7.HAノード用の共有ドライブを設定する
前記事のSection-Hに参照し、PartyBのホットノードとコールドノード用の共有ドライブ(Artemis)を設定してください。

D. 全てのcordaノードを起動・検証する

Step5で作成されたPartyB以外の全てのノードディレクトリを各自の該当ノードに配置(コピー)してください。これで、図1のように、すべてのCordaノードがEC2インスタンスで正常に起動できます。
PartyBのHA機能の動作確認については、前記事のSection-Jに参照し、ご検証ください。前記事と同じく動作可能なことが確認できます。また、前記事と同様、PartyBのホットノード、コールドノードとも、corda.jarの起動が必要です。コールドノード起動時、ホットノードが稼働していたら、待ち状態となります。

まとめ

本記事は、Corda Enterpriseバージョン(CE4.0)のロードバランサなしでHAノードを設定するアプローチを説明しました。CE4.0は、従来必要な3rd Partyのロードバランサ サービス及びその設定は必要無くなり、より簡単・低コストで、ノードの高可用性を担保できると考えます。ただし、前回記事でも記載した通り、あくまでノードのHA構成です。実際の運用ではDBや共有ドライブについてもHA構成が必要となります。
次回の記事は、Notaryクラスタに関して紹介する予定です。
記:TIS Blockchain Promotion Office (羅)
Thanks to Kiyotaka Yamasaki.


本記事はTIS株式会社様のMedium記事の転載となっております(了承済み)。
本文URL:https://medium.com/@TIS_BC_Prom/r3-corda%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7-ha-%E3%81%A8%E3%81%9D%E3%81%AE%E6%A7%8B%E6%88%90%E6%96%B9%E6%B3%95-34cb5dd409d1

本記事に関する問い合わせ:
SBI R3 Japan
info-srj@sbir3japan.co.jp

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away