DolphinDBは、データ、メタデータ、およびクライアントに高可用性ソリューションを提供するため、データベースノードに障害が発生しても、データベースは正常に動作し、ビジネスが中断されることはありません。
他の時系列データベースとは異なり、DolphinDBの高可用性は強力な一貫性を保証します。
1。概要
DolphinDBはマルチコピーメカニズムを使用しており、同じデータブロックのコピーが異なるデータノードに保存されます。クラスター内の1つ以上のデータノードがダウンしている場合でも、クラスター内で使用可能なコピーが少なくとも1つある限り、データベースはサービスを提供できます。
メタデータは制御ノードに保存されます。メタデータの高可用性を確保するために、DolphinDBはRaftプロトコルを使用して、複数の制御ノードを構築することでRaftグループを形成します。制御ノードの半分未満がダウンしている限り、クラスターはサービスを提供できます。
DolphinDB APIは、自動再接続および切り替えメカニズムを提供します。現在接続されているデータノードがダウンしている場合、APIは再接続を試みます。再接続が失敗すると、他のデータノードに自動的に切り替えてタスクを実行します。データノードの切り替えはユーザーに対して透過的であり、ユーザーは現在接続されているノードが切り替えられたことを認識しません。
高可用性機能を使用する場合は、最初にDolphinDBクラスターをデプロイしてください。高可用性機能は、単一のインスタンスではなく、クラスターでのみサポートされます。クラスターの展開については、マルチサーバークラスターの展開のチュートリアルを参照してください。
2.高いデータ可用性
DolphinDBは、データのセキュリティと高可用性を確保するために、異なるサーバーへの複数のデータコピーの保存をサポートし、データコピー間の強力な一貫性を維持します。1台のマシンのデータが破損している場合でも、他のマシンのコピーデータにアクセスして、データサービスが中断されないようにすることができます。
コピー数は、controller.cfgのdfsReplicationFactorパラメーターで設定できます。たとえば、コピー数を2に設定します。
dfsReplicationFactor=2
デフォルトでは、DolphinDBは、同じデータブロックのコピーを同じマシンに配布することを許可します。高いデータ可用性を確保するには、同じデータブロックのコピーを異なるマシンに配布する必要があります。次の構成アイテムをcontroller.cfgに追加できます。
dfsReplicaReliabilityLevel=1
以下は、DolphinDBデータの高可用性を直感的に説明する例です。まず、クラスターのデータノードで次のスクリプトを実行してデータベースを作成します。
n=1000000
date=rand(2018.08.01..2018.08.03,n)
sym=rand(`AAPL`MS`C`YHOO,n)
qty=rand(1..1000,n)
price=rand(100.0,n)
t=table(date,sym,qty,price)
if(existsDatabase("dfs://db1")){
dropDatabase("dfs://db1")
}
db=database("dfs://db1",VALUE,2018.08.01..2018.08.03)
trades=db.createPartitionedTable(t,`trades,`date).append!(t)
分散テーブル取引は3つのパーティションに分割され、各日付はパーティションを表します。DolphinDBのWebクラスター管理インターフェースはDFSエクスプローラーを提供し、データ分散を簡単に表示できます。取引テーブルの各パーティションの分布を次の図に示します。
20180801パーティションを例にとると、[サイト]列は、date = 2018.08.01のデータが18104データノードと18103データノードに分散されていることを示しています。18104データノードがダウンしている場合でも、18103データノードが正常である限り、ユーザーはdate = 2018.08.01のデータに対して読み取りおよび書き込み操作を実行します。
3.メタデータの高可用性
メタデータは、各データブロックがどのデータノードのどこに保存されているかなどの情報など、データが保存されるときに生成されます。メタデータが使用できない場合、データブロックが完了していても、システムはデータに正常にアクセスできません。
メタデータは制御ノードに保存されます。クラスター内に複数の制御ノードをデプロイして、メタデータの冗長性を通じて中断のないメタデータサービスを確保できます。クラスター内のすべてのコントロールノードはRaftグループを形成します。Raftグループにはリーダーが1つだけあり、他はフォロワーです。リーダーとフォロワーのメタデータは強力な一貫性を維持します。データノードはリーダーとのみ対話できます。現在のリーダーが利用できない場合、システムはすぐに新しいリーダーを選出し、メタデータサービスを提供します。Raftグループは、制御ノードのダウンタイムの半分未満を許容できます。たとえば、3つの制御ノードを含むクラスターは1つの制御ノードの障害を許容でき、5つの制御ノードを含むクラスターは2つの制御ノードの障害を許容できます。メタデータの高可用性を設定するには、制御ノードの数が少なくとも3であり、データの高可用性を設定する必要があります。つまり、コピーの数が1より大きくなければなりません。
次の例は、既存のクラスターのメタデータの高可用性を有効にする方法を紹介するために使用されます。既存のクラスターの制御ノードがP1マシン上にあると仮定すると、2つの制御ノードを追加してP2マシンとP3マシンにそれぞれ展開する必要があります。それらのイントラネットアドレスは次のとおりです。
P1: 10.1.1.1
P2: 10.1.1.3
P3: 10.1.1.5
(1)既存の制御ノードの構成ファイルを変更する
次のパラメーターをP1のcontroller.cfgファイルに追加します。dfsReplicationFactor= 2、dfsReplicaReliabilityLevel = 1、dfsHAMode = Raft。変更されたcontroller.cfgは次のとおりです。
localSite=10.1.1.1:8900:controller1
dfsReplicationFactor=2
dfsReplicaReliabilityLevel=1
dfsHAMode=Raft
(2)2つの新しい制御ノードをデプロイします
DolphinDBサーバーパッケージをP2およびP3にダウンロードし、解凍します。たとえば、/ DolphinDBディレクトリに解凍します。
/ DolphinDB / serverディレクトリの下にconfigディレクトリを作成します。configディレクトリにcontroller.cfgファイルを作成し、次のように入力します。
P2
localSite=10.1.1.3:8900:controller2
dfsReplicationFactor=2
dfsReplicaReliabilityLevel=1
dfsHAMode=Raft
P3
localSite=10.1.1.5:8900:controller3
dfsReplicationFactor=2
dfsReplicaReliabilityLevel=1
dfsHAMode=Raft
(3)既存のエージェントノードの設定ファイルを変更する
マシンのエージェントノードとすべての制御ノードのローカルエリアネットワーク情報を表す既存のagent.cfgファイルにsitesパラメータを追加します。エージェントノード情報は、すべての制御ノード情報の前にある必要があります。たとえば、P1のagent.cfgの変更されたコンテンツは次のとおりです。
localSite=10.1.1.1:8901:agent1
controllerSite=10.1.1.1:8900:controller1
sites=10.1.1.1:8901:agent1:agent,10.1.1.1:8900:controller1:controller,10.1.1.3:8900:controller2:controller,10.1.1.5:8900:controller3:controller
複数のエージェントノードがある場合は、各エージェントノードの構成ファイルを変更する必要があります。
(4)既存の制御ノードのクラスターメンバー構成ファイルを変更します
P1のcluster.nodes上の制御ノードのローカルエリアネットワーク情報を増やします。たとえば、P1のcluster.nodesの変更されたコンテンツは次のとおりです。
localSite,mode
10.1.1.1:8900:controller1,controller
10.1.1.2:8900:controller2,controller
10.1.1.3:8900:controller3,controller
10.1.1.1:8901:agent1,agent
10.1.1.1:8911:datanode1,datanode
10.1.1.1:8912:datanode2,datanode
(5)新しい制御ノードのクラスターメンバー構成ファイルとノード構成ファイルを追加します
Cluster.nodesとcluster.cfgは、ノードの起動を制御するために必要です。P1のcluster.nodesとcluster.cfgをP2とP3のconfigディレクトリにコピーします。
(6)高可用性クラスターを開始します
- 制御ノードを起動します
各制御ノードが配置されているマシンで次のコマンドを実行します。
nohup ./dolphindb -console 0 -mode controller -home data -config config/controller.cfg -clusterConfig config/cluster.cfg -logFile log/controller.log -nodesFile config/cluster.nodes &
- エージェントノードを起動します
エージェントノードが展開されているマシンで次のコマンドを実行します。
nohup ./dolphindb -console 0 -mode agent -home data -config config/agent.cfg -logFile log/agent.log &
データノードの起動とシャットダウン、およびノード構成の変更は、リーダーのクラスター管理インターフェイスでのみ操作できます。
- どの制御ノードがリーダーであるかを判別する方法
ブラウザのアドレスバーに任意のコントロールノードのIPアドレスとポート番号を入力して10.1.1.1:8900などのクラスター管理インターフェイスを開き、[ノード]列のコントロールノードエイリアスcontroller1をクリックしてDolphinDBNotebookに入ります。
getActiveMaster()
Leaderのエイリアスを返す関数を実行します。
ブラウザのアドレスバーにリーダーのIPアドレスとポート番号を入力して、リーダーのクラスター管理インターフェイスを開きます。
4.クライアントの高可用性
APIを使用してDolphinDBサーバーのデータノードと対話する場合、接続されたデータノードがダウンしていると、APIは再接続を試みます。再接続が失敗すると、他の使用可能なデータノードに自動的に切り替わります。これはユーザーに対して透過的です。現在、高可用性をサポートしているのはJavaAPIとPythonAPIのみです。
APIのconnectメソッドは次のとおりです。
connect(host,port,username,password,startup,highAvailability)
connectメソッドを使用してデータノードに接続する場合は、highAvailabilityパラメーターをtrueとして指定するだけで済みます。
次の例では、JavaAPIを高可用性に設定します。
import com.xxdb;
DBConnection conn = new DBConnection();
boolean success = conn.connect("10.1.1.1", 8911,"admin","123456","",true);
データノード10.1.1.1:8911がダウンした場合、APIは他の使用可能なデータノードに自動的に接続します。
5.データノードを動的に追加します
ユーザーはaddNode
コマンドを使用して、クラスターを再起動せずにデータノードをオンラインで追加できます。
次の例は、新しいサーバーP4(イントラネットIPは10.1.1.7)に新しいデータノードdatanode3を追加する方法を示しています。ポート番号は8911です。
データノードを新しい物理サーバーに追加するには、サーバー上でデータノードを起動するエージェントノードを展開する必要があります。P4のエージェントノードのポートは8901で、エイリアスはagent2です。
P4でDolphinDBパッケージをダウンロードし、/ DolphinDBなどの指定されたディレクトリに解凍します。
/ DolphinDB / serverディレクトリに移動し、設定ディレクトリを作成します。
configディレクトリにagent.cfgファイルを作成し、次の内容を入力します。
localSite=10.1.1.7:8901:agent2
controllerSite=10.1.1.1:8900:controller1
sites=10.1.1.7:8901:agent2:agent,10.1.1.1:8900:controller1:controller,10.1.1.3:8900:controller2:controller,10.1.1.5:8900:controller3:controller
configディレクトリにcluster.nodesファイルを作成し、次の内容を入力します。
localSite,mode
10.1.1.1:8900:controller1,controller
10.1.1.2:8900:controller2,controller
10.1.1.3:8900:controller3,controller
10.1.1.1:8901:agent1,agent
10.1.1.7:8901:agent2,agent
10.1.1.1:8911:datanode1,datanode
10.1.1.1:8912:datanode2,datanode
P1、P2、およびP3のcluster.nodesを、P4のcluster.nodesと同じになるように変更します。
次のLinuxコマンドを実行して、P4でエージェントノードを起動します。
nohup ./dolphindb -console 0 -mode agent -home data -config config/agent.cfg -logFile log/agent.log &
任意のデータノードで次のコマンドを実行します。
addNode("10.1.1.7",8911,"datanode3")
上記のスクリプトを実行した後、Webクラスター管理インターフェイスを更新すると、新しく追加されたデータノードが既に存在していることがわかりますが、閉じた状態であるため、新しいデータノードを手動で起動する必要があります。
6.まとめ
DolphinDBは、データ、メタデータサービス、およびAPI接続が中断されないようにすることで、モノのインターネット、金融、その他の分野で24時間中断のないサービスのニーズを満たすことができます。