データベース 大規模,分散型データ管理のシステムアーキテクチャ実践編
システムアーキテクチャの方針
マイクロサービスを前提として、
We believe that a coherent approach to systems architecture is needed, and we believe that all necessary aspects are already recognised individually: we want systems that are Responsive, Resilient, Elastic and Message Driven. We call these Reactive Systems.
https://gyazo.com/8e6659749b8ca0e22b1d9036151bcf08
マイクロサービスに分割する...だけではなく、リアクティブシステムであることがソフトウェアの必須要件
人ではなくデバイスが情報を収集して送信してくるようなサービスでは、サービスが停止してもデバイスは情報を送り続けようとします。
サービスが停止している間にも未処理のデータが溜まり続け、サービスが復旧してから溜まったデータを処理して追いつくことが難しくなることも考えられます。
アクターモデルとAkka
並列処理プログラミング技法の1つです。マイクロソフトが提供しているマイクロサービス「Azure Service Fabric」や、LINEのメッセージ処理にも採用
アクターモデルを採用した有名なフレームワークに「Akka」があります。Akkaは、Scala及びJava向けに作られた、アクターモデルをベースにしたフレームワーク
https://gyazo.com/e94b9024129e8e139082f0551929da71
uberでは決済システムにAkkaを使っているらしい。そのAkkaのシステム・アーキテクチャの前提を強く受けている模様。
Cassandra
appleは10ペタバイト以上のデータをCassandraのノードを使っていた
Cassandraは、複数台でクラスターを組んで分散DBを作成し、スケールアウトすることが容易にできる構造になっています。また処理性能も構成するノード数に比例します。
Cassandraは、クラスター内で各サーバーの保持するデータの整合性が一時的に一致せずともそのうち整合性がとれれば良いEventual Consistencyという概念で出来上がっています。
リレーショナルDBでは、整合性の完全一致が必須ですが、Cassandraでは、Tunable Consistency という考え方でConsistency Levelを調整することにより変更もほぼない大量のデータを解析で処理する時などはConsistency Levelを下げることで処理能力を上げたりデータの最新性が必要な場合はConsistency Levelを上げるなど柔軟に設定する
https://gyazo.com/ff3e61bf0d06663ded6bad5704dc1e2d
実例集
mongoDBとcassandra
Cassandraはよりスケーラビリティの高いMySQLスタイルのデータベースを求めている人に適しており、MongoDBは非構造化データの保存に最適
Cassandraには集計フレームワークがありません。管理者は、集計にHadoopやSparkなどのサードパーティ製ツールを使用する必要があります。
それに比べてMongoDBは、集計フレームワークを内蔵しています。これはETLパイプラインを実行して保存データを集計し、結果を返す
→cassandraが良さそう
一貫性は結果的整合性で担保しておく。モデリングは工夫する必要があるし、アプリケーション側が頑張る必要はありそう。だけど、RDBから乗り換えて、低コストで高い拡張性を担保することができる。
cassandra, kafkaを組み合わせる
https://gyazo.com/3048dc4b8a07299d0911cd981824e616
Hadoop
hadoopとは何者なのか?
大規模データの蓄積・分析を分散処理技術によって実現するオープンソースのミドルウェア
従来型のRDBMSやDWHと根本的に異なる点は、HDFSにデータを格納する際にはスキーマ定義が不要
構成要素
分散ファイルシステムであるHDFS(Hadoop分散ファイルシステム)と分散処理フレームワークであるHadoop MapReduceの2つから構成
HDFS
マスターノードであるNameNodeとスレーブノードであるDataNodeで構成されています。 NameNodeは分散ファイルシステムのメタ情報を管理し、DataNodeは、データの実体を保存
https://gyazo.com/58479c46160347c27a7b60bcf8020ed9
Hadoop MapReduce
Hadoop MapReduceは、分散処理を実現するMapReduce処理基盤と処理基盤上で実行するMapReduceアプリケーションの2つのコンポーネント
分散処理を実現するMapReduce処理基盤
マスターノードであるJobTrackerとスレーブノードであるTaskTrackerで構成されています。 JobTrackerは、MapReduceジョブの管理やTaskTrackerへのタスクの割り当て、TaskTrackerのリソース管理を役割としています。 TaskTrackerは、タスクの実行を役割
https://gyazo.com/2a2a19f29ac876c61e477537bd3ef429
Hadoop2系では、分散処理フレームワークHadoop MapReduceの仕組みが変更となり、分散リソース制御機構 Hadoop YARNとMapReduce ApplicationMasterの2つに分離されました。 YARNの登場により、MapReduceに適していない処理については、各自が仕組み(ApplicationMasterとアプリケーション制御)を実装することでMapReduceと同様にYARNの仕組みによって分散処理が可能
MapReduceアプリケーション
MapReduceジョブの一連の処理プロセスに責任を持つ
(1) map処理: 入力データに対して、何らかの処理によってキー・バリューの形式でデータを意味づける
(2) reduce処理: map処理のキーごとに集約されたデータに対して何らかの処理を実行する
(3) MapReduceジョブ定義: (1)と(2)を処理するための情報(入力パス、出力パス、reduce処理の多重度など)を定義する
https://gyazo.com/a6cada622960b2abfcd7b62fec206ff3
一貫性を取るのが難しのかな?
得意なのは、データまとまったデータ。小さな大量のデータではないかも?
yarnが出てきたことで解決した部分がある?
実例
データ管理ではなくて、計算処理とかだけ外出ししているって感じ。
GoogleはMapReduce
Hadoop分散ファイルシステム(HDFS)は、Hadoopフレームワークによる分散コンピューティングに使用される分散型ファイルシステムです。(ギガバイトやテラバイトサイズなどの)大規模なファイルを多数のマシンに格納して複製するために使用されており、幅広い採用実績を誇っています。
kafka
バッチ処理って感じじゃなくて、ストリームで流れてくるものを、リアルタイムでスケールアウトしながら処理していくってのが強いんだと思った。
Kafkaはシステムにおいてストリームデータの中継役を担います。ストリームデータとは継続的/連続的に生成されるデータの集合のことです。機器の動作情報/APサーバのログ/ECサイトの購入情報/SNSの投稿など様々なデータをストリームデータとして扱うことができます。
機器やサーバとデータの処理サーバなどの間に配置され、 生成されたストリームデータを受け取り、一時的にデータを保存しつつ、都度または必要なタイミングで処理サーバにデータを受け渡します。
https://gyazo.com/906911d753b960e62ec24378b80f1615
データの消失リスクへの解決策もあるのがいいみたい
--.icon
https://gyazo.com/e2ab9c104d9bcbb2fdf43c88817f8cc8
https://gyazo.com/aaa627bee33c9041b130b3c0386e0c5a
kafka, cassandra
https://gyazo.com/52e0398d39192c9adc1f455df038c451
kafka, hadoop, spark
https://gyazo.com/0798a1e033d0a36b778e47269cc54b0f
Apache Sparkは巨大なデータに対して高速に分散処理を行うオープンソースのフレームワーク
Sparkは分散処理のややこしい部分をうまく抽象化してくれているので、簡潔なコードを実行するだけで、何百台ものコンピュータで、同時平行に計算を実行させることができる
sparkとhadoop
--.icon
雑記
決済なら、こんな感じなのかな...??
取引データがやってくる
kafkaにメッセージ発行させる
与信審査
取引登録
とかとかって感じで、子キューを更に発行させる
与信審査なら、更に名寄せ処理とかも出てくる
kafka後の急ぎたい処理はspark
RDB, noSQLDBからデータを取得して計算処理をする
処理完了後はcassandraへデータ登録
分散並列へ
非構造, 単純で集計, 後続処理しやすいデータはこちらへ
処理完了後はRDBへデータ登録
複雑性が高く、構造化が必要で、データ容量が少ないデータはこちらへ
日次とか、月次の大規模一括処理はhadoopへ
別に急がなくてもいい、大量処理はhadoop