IoT時代のNoSQL,RDBMS 代表的なNoSQLデータベース

RDBMS

RDBMSがビッグデータを扱う際の3つの課題

  • 3つの「V」
    • Volume (データ量)
    • Velocity (速度)
    • Varriety (多様性)

https://thinkit.co.jp/article/11882

Volume

  • RDBは複数人が同時にデータを更新した際に、データの整合性を担保するためのトランザクション機能を持っている
  • あまり多くのサーバにデータを分散すると整合性の維持が難しくなる
  • サーバ台数を増やしてスケールアウトする場合の問題
    • 商用製品では追加のライセンスが必要
    • 容量単位のコストは安くならない

Velocity

  • 高頻度に発生する大量のデータをリアルタイムに格納/参照する
  • RDBのデータの整合性を維持するためのオーバーヘッド
    • トランザクション
    • SQLの解析時間
  • 高頻度のデータ処理には向いていない
  • サーバ台数を増やしてスケールアウト > サーバをまたがるトランザクション処理は性能がでない
  • サーバスペックをスケールアップ > コストが高くなる

Variety

  • ログやSNSのテキスト、センサデータ、画像や音声など、様々な構造や大きさのデータ
    • 表形式のスキーマを事前に定義するRDBとは相性が悪い

NoSQL

  • Not only SQL
  • RDBMS以外のデータベース管理システム
  • 水平スケーラビリティが確保しやすい事が多い
    • 利用者や仕事の増大に適応できる能力・度合い
  • トランザクションを利用できないものが多い
    • 不可分な一連の処理

特徴

  • 固定されたスキーマに縛られない
  • 関係モデルの結合操作を利用しない
    • 関係モデルの結合 ???

分散データベース

  • 1つのデータベース管理システム (DBMS) が複数のCPUに接続されている記憶装置群を制御する形態のデータベース
  • ネットワーク上に複数存在するデータベースを、あたかも一つのデータベースであるように利用する仕組み

https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9
http://www.atmarkit.co.jp/ait/articles/1703/01/news203.html

分類

キー・バリュー型 (Key Value Store)

  • キーに対してバリュー(値)という単純な構造
  • 2つの情報からなる組を扱う
  • 2つの情報のうちの1つが、個々の組を識別するための情報になっている
  • 仕組みがシンプルで、リレーショナルデータベースよりも高速に動作
  • 基本的にドキュメント指向型のようにバリューに構造を持たない
  • 例: Basho Riak, Redis
  • https://thinkit.co.jp/story/2010/10/08/1786

ドキュメント指向(Document-oriented、Document store)

カラム指向

グラフ型

  • データの相互関係に注力している
  • データ構造がネットワーク上、検索に効力を発揮
  • ノードとノードをつなぐリレーションシップが基本的な要素
  • Facebook等の友達関係の検索などに向いている
  • グラフ構造を持ったデータベース
  • ネイティブにグラフデータを扱える
  • 例: Neo4j,TitanDB,Oracle Spatial and Graph, DataStax Enterprise Graph

Apache HBase (カラム型、分散データベース)

  • データを格納するために、HDFSが利用できるNoSQL
  • センサ機器が生成する時系列データを管理するための有力なデータストアとして注目
  • ビッグデータ向けの処理基盤
  • 通常のRDBでは扱いきれないようなサイズのデータに対してランダムアクセスを含めて高速に読み書きする

https://thinkit.co.jp/article/11882

Hadoop、HDFSとは

Hadoop
  • Apache Hadoop
  • Apacheソフトウェア財団のトップレベルプロジェクトの1つ
  • 大規模データの分散処理を支えるオープンソースのソフトウェアフレームワーク
  • Javaで書かれている
  • アプリケーションが数千ノードおよびペタバイト級のデータを処理することを可能としている
  • 4つのモジュールによって構成
    • Hadoop Common: 他のモジュールから共通して利用されるライブラリ群
    • Hadoop Distributed File System: 独自の分散ファイルシステム
    • Hadoop YARN: Hadoopクラスタのリソース管理や、Hadoop上で動作するアプリケーションのスケジューリング
    • Hadoop MapReduce: Hadoop上で動作するMapReduceフレームワーク
      • MapReduce: 並列分散処理用のフレームワーク

https://www.ospn.jp/osc2017-spring/pdf/OSC2017_TokyoSpring_hitachi.pdf
https://thinkit.co.jp/article/11882
https://ja.wikipedia.org/wiki/Apache_Hadoop

HDFS
  • Hadoop Distributed File System
  • Hadoop上で利用される独自の分散ファイルシステム
  • 大きなファイルを複数のブロック単位(デフォルトで128MB)に分割
  • 複数のノードにまたがり格納
    • そのブロックの複製(レプリカ)を複数の異なるノードに格納することで信頼性を確保
    • 各ホストはRAIDを必要としない
      • Redundant Arrays of Inexpensive Disks: 複数台のハードディスクを組み合わせることで仮想的な1台のハードディスクとして運用し冗長性を向上させる技術
  • マスタースレーブ型: 複数の機器が協調動作する際に、複数機器の制御・操作を司る「マスター」機と、マスター機の一方的な制御下で動作する「スレーブ」機に役割を分担する方式
    • NameNode: マスターの役割
      • HDFSに関するメタ情報(ファイルとブロックの対応関係など)を保持
    • DataNode(複数): スレーブの役割
      • 実データをブロック単位で保持

https://dev.classmethod.jp/hadoop/hadoop-advent-calendar-03-hdfs/

HBaseとHHDFSの関係

  • HBase = HDFS上に構築する分散データベース
  • HDFS上にYARN,MapReduce,HBaseを構築する
  • HDFSはあくまでファイルシステム
    • 大量の小さなデータを読み書きするレスポンス重視のオペレーション用途には向かない
    • データの更新もできない
  • HBaseはHDFSを補完する存在
  • HBaseもHDFS同様マスタ・スレーブ型
  • HBaseがデータ管理とリクエスト処理を行い、HDFSがデータを保存

Redis (キー・バリュー型)

Neo4j(グラフ型)

データベース負荷テストツール

https://dbstudy.info/files/20120721/database_stress_testing_tools_5_publish.pdf

Node.js概要

概要

  • V8 Javascriptエンジンで動作するJavascript環境
  • 非同期型のイベントモデル
  • npmを使用
  • Java や PHP のような言語
    • 接続ごとに新しいスレッドが生成
  • Node.js
    • それぞれの接続が Node.js エンジンのプロセス内で実行されるイベントを起動
  • デッドロックは発生しない
  • デッドロック
    • お互いが相手の作業が終わるのを待って、どっちも身動きが取れない状況
  • Node.js を実行するサーバーは何万もの同時接続を処理することができる
  • https://www.ibm.com/developerworks/jp/opensource/library/os-nodejs/index.html

https://nodejs.org/ja/

用語解説

V8 Javascriptエンジン

非同期型イベントモデル

  • Node.jsは書いたコードはひとつのメインスレッドで動作する
  • Node.jsはI/O処理を非同期に実装し、イベントトリガーのコールバックで処理の順序性を保つ
  • メインスレッドがI/O待ちを行っていない
  • https://qiita.com/hosomichi/items/16597eaabb1226975c51

イベント駆動型プログラミング

  • イベントや状態の変化によって決定されるアプリケーションのフロー制御
  • イベントをリッスンし、イベントが検出されたらコールバック関数を呼び出す
  • JavascriptのonイベントをNodeではEventEmitterの形式で使用する
  • EventEmitterAPIは完全に同期性
  • listner関数は、加えられる順に同期的に実行される
  • イベントループとのやりとりを簡略化するために作られたのがEventEmitter
  • https://postd.cc/understanding-the-nodejs-event-loop/
  • サーバサイドでもイベントは発生している
    • 接続が確立され、データが受信され 、データの受信が停止する等
  • https://www.ibm.com/developerworks/jp/opensource/library/os-nodejs/index.html

イベントループ

  • Node.jsのメインスレッドは起動 > イベント検出/実行をコントロールする「イベントループ」を起動
    • ndoeが起動するとき
  • イベントキューにイベントが登録される(process.nextTick)
  • イベントがイベントキュー内のキューとして取り出される
  • イベントループは短い周期で実行される
  • イベントが検出でき、メインスレッドのタスクがなくなったらFIFOでキューを取り出して実行する
    • FIFP: first in first out 先入れ先出し 先に入れたものが先に出ていく
  • https://qiita.com/hosomichi/items/3faca9f7361cae12d71a

  • イベントループに関する詳細なスライド

Nginxとの違い

  • 静的コンテンツを大量に配信する場合は選ばないらしい?

大量の静的コンテンツを提供するサーバなどでは、そもそも多数のイベント処理がそれほど必要なく、Node.jsを使うメリットがほとんどない。静的コンテンツの方はNginXなどで対応するらしい。

Expressでの開発

Expressとは

  • Web アプリケーションとモバイル・アプリケーション向けの機能を提供するNode.js Web アプリケーション・フレームワーク

  • サンプルアプリケーションをもとに開発していく

  • 1
    2
    3
    4
    npm install express-generator -g

    //テンプレートエンジンにpug(jade)を指定
    express --view=pug myapp
  • 公式

Visual Studio Codeでのデバッグ環境

  1. 左メニューからデバッグマーククリック
  2. デバッグメニューの右上の歯車マーククリック
  3. launch.jsonが生成される。

    • launch.jsonにはpackage.jsonのscripts.startの設定が自動で読み込まれる。

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
          {
      // IntelliSense を使用して利用可能な属性を学べます。
      // 既存の属性の説明をホバーして表示します。
      // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
      "version": "0.2.0",
      "configurations": [
      {
      "type": "node",
      "request": "launch",
      "name": "プログラムの起動",
      "program": "${workspaceFolder}\\app_bin\\www"
      }
      ]
      }
  4. デバッグメニュー左上の再生マークでAppをrunする。

  5. Appで設定しているurlにアクセス。テキストエディタの各行の左にブレイクポイントを配置することでステップ実行できる。

セッション・クッキー利用

  • express-sessionを使用

SPAの場合のセッション・クッキー管理

暗号化

バリデーション

フロントエンド

バックエンド

Node.jsのフレームワーク(ほぼ)全種類まとめ

Node.jsのフレームワーク(ほぼ)全種類まとめ

  • nodeframeworksより抜粋

  • 以下の分類でNode.jsのフレームワークが紹介されています

    • MVCフレームワーク
      • 1.Sinatraっぽいやつ
      • 2.Railsっぽいやつ
    • フルスタックフレームワーク
    • REST API フレームワーク
    • その他のライブラリ

Sinatraっぽいやつ

These frameworks offer rich configuration and are less opinionated than Rails-like or full-stack.

Railsっぽいやつ

Present your project properly. Create your own art from included templates

フルスタックフレームワーク

That’s where Node.js really shines. The full-stack MVC frameworks are bundled with scaffolding, template engines, websocket and persistence libraries to allow you build real-time scalable web apps.

AWSのCloudFront,Route53でキャッシュが残る件

目次

  • 新しいソースをデプロイしているのに更新されない
    • TTLとは
    • DNSリゾルバとは
    • DNSレコード、DNSゾーンとは
    • DNSレコードの8つの種類
    • DNSサーバのゾーン(レコード)ってどうやって確認するの
      • digとnslookupの違い
    • やっと!Route53のDNS設定をする
    • TTLが172800(48時間)とかになっていたんですが…
  • まとめ
  • 追記 5/27

新しいソースをデプロイしているのに更新されない

  • Route53が怪しそう(5/27 追記 CloudFrontも)
  • 検索していくとQ&Aで次の文章を見つける
    • Q: 各種レコードタイプのデフォルト TTL は何ですか? これらの値は変更できますか?
      DNS リゾルバーが返答をキャッシュする時間の長さは、各レコードに関連付けられた有効期限 (TTL) と呼ばれる値によって設定されます。Amazon Route 53 には、いずれかのレコードタイプのデフォルトの TTL はありません。キャッシュする DNS リソルバーが TTL を介して DNSレコードを指定した時間の長さにキャッシュされるように、各レコードの TTL を常に指定する必要があります。
    • TTL,DNSリゾルバー,DNSレコードとは…

TTLとは

DNSリゾルバとは

  • Domain Name System
    • Domain Name System
    • ドメイン名(ドメインネーム※1)を管理・運用するために開発されたシステム
  • DNS リゾルバ
    • DNSサーバへドメイン名を照会して対応するIPアドレスを調べたり、その逆(IPアドレス→ドメイン名)を調べたりするソフトウェア。
    • OS標準の機能として外部から呼び出し可能な形で提供されており、ネットワークを利用するソフトウェアは内部的にこのOS内蔵のリゾルバを呼び出して名前解決を行っている
  • 今回の場合はRoute53のDNSリゾルバにキャッシュが残ったままになっている?

DNSレコード、DNSゾーン

  • DNSゾーンの詳細なデータの単位を「レコード」と呼ぶ
    • DNSゾーンとは
      • DNSサーバがドメイン名を管理する範囲
      • 上位ドメインを管理するDNSサーバは、下位ドメインのゾーン情報をすべて持たず、下位のゾーン情報を管理しているDNSサーバのみを把握
      • hoge.fuga.jpというドメインがあったとして、fuga>fuga.jp>hoge.fuga.jpという階層構造になっている。
        上位のfugaドメインはfuga.jpを知っているがhoge.fuga.jpは知らないということ(多分)
    • DNSレコードには8つの種類がある
  • http://support.mngsv.jp/option/dns01/n02/
  • http://support.mngsv.jp/option/dns01/n03/

DNSレコードの8つの種類

  • SOA
    • ゾーン(ドメイン)情報を記載
    • ドメインのDNSサーバ名・ドメイン管理者のメール・アドレス
    • シリアル番号
      • ゾーン転送時に情報が更新されているかどうか判断に用いる
      • 数値が大きくなっていれば更新済みという意味
      • 通常は「年月日+連番」などの書式が多く用いられる
    • 更新間隔(refresh)
      • ゾーン情報のゾーン転送間隔時間
      • 定期的に情報を更新?下位ドメインに情報を転送ということだろうか。TTLとは違う?
    • 転送再試行時間(retry)
      • ゾーン転送に失敗した場合の再試行までの猶予時間
    • レコード有効時間(expire)
      • ゾーン情報を最新と確認できない場合の有効時間
    • キャッシュ有効時間(TTL)
      • ゾーン情報をキャッシュする場合の有効時間
      • 今回これを調整したい
  • NS
    • ドメインのDNSサーバ名
  • A
    • ホストのIPアドレス
  • AAA
    • ホストのIPv6アドレス
  • PTR
    • IPアドレスに対するドメイン名
  • CNAME
    • ドメイン名のエイリアス(別名)
    • AWS ClowdFrontでここに独自ドメインを設定した
  • MX
    • ドメインのメール・サーバ名
  • TXT
    • ホストへのテキスト情報

DNSサーバのゾーン(レコード)ってどうやって確認するの

  • DNSサーバのDNSゾーン(DNSレコード)の確認方法

    • nslookupコマンド(name server lookup (多分))

      • ネームサーバを探索する的な意味?
      • DNSサーバの動作状態を確認できる
      • 1
        nslookup ホスト名 or IPアドレス
    • digコマンド(domain information groper)

      • ドメイン情報探索ツール
      • DNSサーバーに対し問い合わせを行い、その応答結果を表示するコマンド

        • 1
          dig 検索ドメイン
        • AとAAAAとNSとCNAMEを確認できた

          digとnslookupの違い

    • digで出てくるのがゾーン情報?nslookupで出てくるのがNSレコードの情報?っぽい
  • http://www.atmarkit.co.jp/ait/articles/1409/25/news001.html

やっと!Route53のDNS設定をする

  • 2018/5/27現在の方法
    • AWSのコンソールからRoute53にアクセス
    • 左メニューからHostet zones を選択
    • ドメインを選択
    • 上の方にある Create Record Set ボタンを押してTTLを編集

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-basic.html

TTLが172800(48時間)とかになっていたんですが…

  • リージョンの設定?をミスってしまったのだろうか
  • とりあえず全部60(1分)にしてみました
    • もしかしてこれ今のキャッシュが48時間後に消えるまで設定反映されない?

まとめ

  • ネットワークの勉強をもっとしようと思います。

追記 5/27

  • CloudFrontのTTLも変更しました
    • ClowdFrontTTL