goraft and influxdb

22
天下一InfluxDB勉強会 goraft & InfluxDB @nobu_k 1

Upload: nobuk

Post on 11-Jun-2015

7.891 views

Category:

Technology


2 download

DESCRIPTION

天下一InfluxDB勉強会でのgoraft説明資料。

TRANSCRIPT

Page 1: Goraft and InfluxDB

天下一InfluxDB勉強会

goraft & InfluxDB @nobu_k

1

Page 2: Goraft and InfluxDB

誰?❖ 久保田展行(@nobu_k)!

❖ CTO at Preferred Infrastructure America, Inc.!

❖ PFI(ピーFI)のアメリカ支部!

❖ (Relational) Database, Search Engine, Distributed Systems!

❖ C++, Go!

❖ MessagePack for C/C++メンテナ!

❖ beatmania IIDX DP皆伝

2

Page 3: Goraft and InfluxDB

Raft?

❖ 非常にわかりやすいコンセンサスプロトコル(アルゴリズム)!

❖ 一般的に難しいものが多かった(Paxosとか)!

❖ 今日は小難しいアルゴリズムの話はなし!!

❖ 参考!

❖ 公式:http://raftconsensus.github.io/!

❖ 分かりやすい資料:http://thesecretlivesofdata.com/raft/!

❖ 自分のスライド(///):http://www.slideshare.net/pfi/raft-36155398

3

Page 4: Goraft and InfluxDB

Raftが提供するもの❖ 協調して合意を取る枠組み!

❖ リーダー選出!

❖ (ログ)レプリケーション!

❖ State machine replication!

❖ 異常系はある程度Raftが面倒を見る!

❖ 合意を取って何をするかはアプリケーションにお任せ

Raft cluster

全ノードが同じ状態を維持

同じ状態を冗長化して可用性UP

R

R R

R R

4

Leader

Follower

Page 5: Goraft and InfluxDB

ZooKeeper?

?

5

Page 6: Goraft and InfluxDB

ZooKeeper

ZAB

Storage

Rich featuresZK cluster

Application clusters

Storm

❖ File system like KVS!❖ ephemeral nodes

❖ KVSの操作!❖ watch!❖ ACL!❖ etc

❖ ZooKeeper Atomic Broadcast!❖ コンセンサスプロトコル !❖ 理論的証明はなし

6

Page 7: Goraft and InfluxDB

Raft

ZAB

Storage

Rich features

Raft

DIY

DIY

Consensus protocol

❖ Raftはただのプロトコル!!❖ 一番難しい部分をカバー!

❖ 疎結合なので夢は広がる!❖ 好きなストレージ!❖ 好きな通信手段!❖ 好きなAPI

7

Page 8: Goraft and InfluxDB

goraft❖ https://github.com/goraft/raft!

❖ Goで書かれたRaftのライブラリ!

❖ goraftの使用例!

❖ Raftd:goraftを使ったサンプル、学習用にどうぞ!

❖ etcd!

❖ InfluxDB!❖ 他にもたくさん!

8

Page 9: Goraft and InfluxDB

InfluxDB での goraft

9

Page 10: Goraft and InfluxDB

InfluxDBがRaftで管理する情報❖ Raftに入っている情報!

❖ InfluxDBのクラスタに含まれるサーバ!

❖ 作成済みのデータベース!

❖ ユーザの情報!

❖ シャードの情報!

❖ 作成済み(実行中?)のContinuous query!

❖ これらをRaftで管理することで安全に冗長化、耐障害性を持たせる参考:https://speakerdeck.com/pauldix/the-internals-of-influxdb?slide=50

10

Page 11: Goraft and InfluxDB

goraft関連のパッケージ❖ api/http!

❖ HTTPサーバ!

❖ coordinator!❖ 分散関連の処理を担当!

❖ Raft関係もここ!

❖ cluster!

❖ InfluxDBクラスタの情報、shard情報

11

Page 12: Goraft and InfluxDB

データベース作成の例api/http coordinator

cluster

POST /db

CreateDatabaseCommand

raft

CreateDatabase

Apply

CreateDatabase

ClusterConfiguration

DatabaseReplicationFactors

②③

④ブロードキャスト完了後、!コミット時にApplyを呼び出す

12

Page 13: Goraft and InfluxDB

時系列データは?

❖ 時系列データもRaftで冗長化してはダメなのか?!

❖ ダメ!

❖ Raftのプロトコルは安全だがオーバーヘッドが大きい!

❖ InfluxDBが想定するワークロードには合わない!

❖ InfluxDBでは時系列データは自分で管理している

13

Page 14: Goraft and InfluxDB

Raftの観点から見た

InfluxDBの注意点

14

Page 15: Goraft and InfluxDB

問題1: 全ノードがRaftのノードとして動く

I

I

II

II

II

R

R

R

R

R

R

R

R

❖ 頻繁な1対全の通信!

❖ Heartbeat: 数10ms単位!

❖ 合意コスト増

“CPU and networking resources can quickly be bottlenecked under stress in a large cluster.”

“It is unlikely that 4 nodes will simultaneously fail so clusters larger than 9 nodes are not common.”

15

Page 16: Goraft and InfluxDB

妄想: 将来の構成

I

I I

I I

R

R

R

or

I

I I

I I

部分的にRaftノードとして機能Raftを別クラスタで運用

タイムアウトがシビアなので!こっちの方が良さそう。

R

R R

16

Page 17: Goraft and InfluxDB

問題2: ReadにRaftを使ってない❖ RaftではLeaderとFollowerでコミットのタイミングが違う!

❖ Followerが持っている情報を読んではいけない!

❖ Leaderが持っている情報も、本当は直接読んじゃダメ!

❖ 自分の書いた値を読めないことがある!

❖ 読み込みもRaftのコマンドとして実行することで解決

R

R

R

この状態でLeaderが切り替わった瞬間に!直readが発生すると、元々コミット済みだった!情報を読めない。レアだが、実際に起こると!非常に原因を特定しづらい。殺人事件に発展!することもあるため注意が必要だ。

未コミットコミット済み 17

Page 18: Goraft and InfluxDB

問題3: 処理の冪等性❖ Raftのログレプリケーションの仕組みは冪等!

❖ しかし、アプリケーションレベルでの冪等性は考慮されない!

❖ 例:!

❖ クライアントが100円送金するリクエストを投げる!

❖ コミット前にクライアントがタイムアウト!

❖ 実際は処理は継続しており、送金リクエストはコミットされる!

❖ しかしクライアントはその事実を知らないのでリトライ!

❖ 結果として200円送金されてしまう!

❖ Raftは内容が同一のリクエストが2つ来たと解釈する

18

Page 19: Goraft and InfluxDB

InfluxDBで問題になるか❖ そもそもInfluxDBのコマンドは冪等か?!

❖ コマンドが冪等であればそもそも問題ない!

❖ 冪等なもの:DB作成とか!

❖ 冪等じゃないもの:CreateContinuousQuery!

❖ 同じものが複数個作られちゃう!

❖ InfluxDBのユーザがタイムアウト時にリトライするとまずい

19

Page 20: Goraft and InfluxDB

どう保証するか?

❖ 論文ではTCPのようにIDを振るアプローチを紹介!

❖ リトライと冪等性のデザインパターン by frsyuki!

❖ http://frsyuki.hatenablog.com/entry/2014/06/09/164559!

❖ http://frsyuki.hatenablog.com/entry/2014/06/12/123856

20

Page 21: Goraft and InfluxDB

その他: goraftのメンバシップ管理が不完全

❖ Raft公式サイトのgoraftの項目にて・・・!

❖ Membership Changes: partial?!

❖ Raft的にはJoint Consensusを使うことになってる!

❖ 課題!

❖ ログ同期完了のタイミングを把握するのが難しい!

❖ 特に複数台のノードをまとめて追加・削除するときに大変!

❖ InfluxDBがRaftで管理している情報は小さいのでたぶん大丈夫

21

Page 22: Goraft and InfluxDB

まとめ❖ Raft!

❖ コンセンサスプロトコル!

❖ goraft!

❖ Raftのライブラリ!

❖ ZooKeeperのようにフルスタックな機能は提供しない!

❖ InfluxDB!

❖ 主にクラスタ情報の管理にgoraftを使用

22