GCP Cloud Spannerは分散システムでどうやってトランザクションを実現しているのか

一言で言うと

True Time API を使い外部整合性を保ち、タイムスタンプを用いたトランザクションで実現

参考・画像引用元のサイト

Spannerのトランザクションはどう言う仕組みなのか

Spannerのトランザクションの種類

  • ロック型読み書き

    • 書き込みのできる唯一のトランザクション
    • 必要に応じて2フェーズcommit
      • commit … 整合性を保ってリソースを更新する事
    • 悲観的ロック(参照時に参照しているリソースにロックをかける)
  • 読み取り専用

    • 読み取りの一貫性を保証
    • ・commit する必要がなく、ロックしない

従来のトランザクションとの比較

  • 今までのトランザクションだと性能が上がらない
    • リードオンリーのトランザクションを行なった場合、リードロックが発生してしまう
      • transactino1

    • トランザクションIDでリードロックを無くしてもIDを一元管理する処理がボトルネックになる
      • transactino2

Spannerはタイムスタンプを用いて解決

  • リードロックとIDの管理をする必要がなくなった
    • transactino3

タイムスタンプをサーバ間で使う際の問題

  • 外部整合性が保てなくなる

外部整合性とは…

  • External Consistency
    「あるトランザクションが終わった後に始まったトランザクションは、前に終わったトランザクションより必ず大きいタイムスタンプを得る」

複数の書き込みトランザクションを行うとき

  • 以下の例は外部整合性が保たれる
    • トランザクションで扱う値が一つで、参照するサーバが一つの場合
    • time1よりtime2の方が大きくなる
  • 以下の場合では外部整合性は保たれない
    • トランザクションで扱う値が複数で、参照するサーバも複数の場合
    • サーバ同士の時刻のズレやクライアントの時刻のズレが time1 と time2 の差より大きかった場合
    • time1よりtime2の方がタイムスタンプの値は小さくなる = 後に行われたはずの更新が先に行われたことになる

Spannerの解決

  • True Time API を用いてタイムスタンプを取得する

True Time APIとは

  • 時刻を返すAPI
  • GPS時計と原子時計を参照する
  • GoogleはSpannerを運用する各データセンターにGPS時計と原子時計を備えている

何故GPS時計と原子時計を使うのか

理由1 時間の正確性
  • NTP(ネットワークに接続される機器において、機器が持つ時計を正しい時刻へ同期するための通信プロトコル)でも実現できるが、より正確な時間を取得できるから
  • Commit Wait
    • 前のトランザクションが必ず経過したと言える時間までわざとロック期間を引き伸ばす
    • タイムスタンプを順序関係が守られるギリギリの値にすることでレイテンシを短くできる
  • 時刻が正確なら正確なほど、書き込みレイテンシが短くなり、書き込みスループットが増える
理由2 脆弱性を補う
  • GPS時計の脆弱性
    • アンテナと受信機障害、ローカル無線干渉、相関障害(不適切なうるう秒のハンドリングやスプーフィングなどの設計上の障害)、GPSシステムの停止
  • 原子時計の脆弱性
    • GPS時計と無相関な原因で障害が発生する可能性
    • 周波数エラーにより長い時間をかけて著しく時刻がずれる可能性

Spannerのトランザクションは完璧なのか

CAP定理

  • データベースは以下の 3 つの望まれる特性のうち、2 つまでしか持てない
    • C(Consistency): 一貫性、共有されているデータが唯一の値を持つ
    • A(Availability): 可用性、読み込みと書き込みの両方で 100% の可用性が確保されている
    • P(Partition Tolerance): 分断耐性、ネットワークの分断に対する耐性がある
  • 可用性…システムが継続して稼働できる能力

Googleの主張(ブログより)

  • 分断が起きると Spanner は C を選択し、A を犠牲にします
  • つまり技術的に見ると、Spanner は CP システムなのです
  • Google が全体をコントロールしているネットワークであることから、ハードウェアや経路の冗長性の確保から、アップグレードや一般的なオペレーションまでも自ら制御できます。それでもファイバの断線や機器の故障はありますが、システム全体としては堅牢に保たれます
  • ただでさえ稀な Spanner の障害の中でも、ネットワークが原因となる割合は 10% にも届きません

  • 要約すると

    • 万が一ネットワーク障害が起こった場合、Spannerは可用性を犠牲にするがGoogleが管理しているので大丈夫

インターネット関連の人物

スティーブ・クロッカー Stephen D. Crocker

ジョン・ポステル Jonathan Bruce Postel

  • 1943年8月6日 - 1998年10月16日
  • TCP/IP, SMTP, DNS, FTP, Telnet の開発に携り、RFC の編集者としての他、IANA の発起人として知られる
  • アメリカのコンピュータ科学者
  • 1974 年にカリフォルニア大学ロサンゼルス校 (UCLA) よりコンピュータサイエンスの博士号を授与
  • UCLA 在学中より初期の ARPANet に関わる
  • ポステルの法則

    • 堅牢性原則 (robustness: 堅牢性 principle: 原理, ロバストネス原則)
    • 「送信するものに関しては厳密に、受信するものに関しては寛容に」
    • 通信における設計原則
    • 相互運用性を確保するためにTCPの実装が持つべき性質として要約した節が、より一般化されて知られるようになった
    • 原文
      • 2.10. robustness principle TCP implementations will follow a general principle of robustness: be conservative in what you do, be liberal in what you accept from others.
  • https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%9D%E3%82%B9%E3%83%86%E3%83%AB

ティム・バーナーズ=リー Timothy “Tim” John Berners-Lee

  • 1955年6月8日 -
  • イギリスの計算機科学者
  • ロバート・カイリューとともにWorld Wide Web(WWW)を考案し、ハイパーテキストシステムを実装・開発
  • URL、HTTP、HTML の最初の設計を作った
  • 1980年6月にスイス・ジュネーヴの欧州原子核研究機構(CERN)にソフトウェア技術のコンサルタントとして6ヶ月間在籍
  • ENQUIREを開発していてそれがWWWの基礎となった

マーク・アンドリーセン Marc Lowell Andreessen

インターネット関連の技術・プロジェクト

ENQUIRE

  • ティム・バーナーズ=リーが1980年にCERNにて行ったソフトウェアプロジェクト
  • 1989年のWorld Wide Web開発の下地となった
  • 単純なハイパーテキストプログラム
  • Enquire Within Upon Everythingという本(家庭生活についてのハウツー本)の題名から発想された
  • CERNで働く約1万人の人々が異なるシステム間の情報転送する為に作られた
    • ENQUIRE以前のハイパーテキストシステム、MemexやNLSはそういった要件を備えていなかった
    • HyperCardとの違い
      • 画像を扱えない
      • 様々なシステムで動作
    • World Wide Webとの違い
      • 広く公開することは考えられていなかった
      • 「カード」と呼ばれるページ群からなり、各カード内にハイパーリンクがある
      • 既存のカードからリンクする形でなければ新たなカードを追加できない
      • クローズドシステムのデータベース
      • サーバから直接編集可能
  • カードを作成するときにリンク先のカードも編集する必要があり、その点が問題だった
  • その点を大きく変更したのが World Wide Web

  • https://ja.wikipedia.org/wiki/ENQUIRE

World Wide Web

  • インターネット上で提供されるハイパーテキストシステム
  • HTMLやXHTMLといったハイパーテキストの記述言語が使用される
  • ハイパーテキスト
    • 文書中にハイパーリンク(別の文書のURLへの参照)を埋め込むことでインターネット上に散在する文書同士を相互に参照可能にするシステム
  • 文書間のつながり方が蜘蛛の巣を連想させることから、世界に広がる蜘蛛の巣を意味する「World Wide Web」と名付けられた
  • ワールドワイドウェブにアクセスするためのソフトウェア(ユーザーエージェント)は WWW クライアントと呼ばれる
  • 検索エンジンとウェブディレクトリの出現により真価を発揮した
  • 1991年8月6日、彼は World Wide Web プロジェクトに関する簡単な要約をalt.hypertextニュースグループに投稿した。この日がWWWがインターネット上で利用可能なサービスとしてデビュー
  • テッド・ネルソンのザナドゥ計画、ダグラス・エンゲルバートの oN-Line System (NLS) など1960年代に似たような概念があった。
    • ヴァネヴァー・ブッシュの memex の影響を受けている
      • memex は1945年の論文「As We May Think」で描かれている
  • WWW は、双方向ではなく単方向のリンク
    • リンク先の資源がいつの間にか無くなるという問題も発生
  • 特定の個人や組織によって独占されておらず、サーバやクライアントを独自に開発し拡張するのも自由にできて許諾を得る必要も無い
  • 1992年、イリノイ大学の米国立スーパーコンピュータ応用研究所 (NCSA) によって、画像なども扱えるようになった

    • マーク・アンドリーセンらが文字だけでなく画像なども扱えるブラウザ Mosaic を開発
  • https://ja.wikipedia.org/wiki/World_Wide_Web

セマンティック・ウェブ

  • todo

インターネット関連の仕様書・ドキュメント

目次

  • RFC
  • IS
  • OSI

RFC

  • Request for Comments
  • RFCs
  • 1969年4月7日に最初の定義が行われる
  • IETF(Internet Engineering Task Force)による技術仕様の保存、公開形式
  • 全てのRFCはインターネット上で公開されており、誰でも閲覧することができる
  • 1968年ごろ、スティーブ・クロッカー が考案
  • その後情報科学研究所 (ISI) のジョン・ポステルにより管理

  • https://ja.wikipedia.org/wiki/Request_for_Comments

IS

  • international standard: 国際規格
  • 各国が独自に設立した国家標準化団体などが策定した規格が国際通商の技術的障壁となっているのを打破する1つの方法
    • 技術的障壁: 互換でない確立された方法を広く使っているグループが出会ったときに生じる
  • 輸出入に関係する事業を行う企業が消費者から製品の信用を得るために、国際規格への適合をうたう場合も多い
    • CODEXやHACCPなどの食品安全規格
  • バイオ燃料や燃料電池など、新エネルギーの普及を効率的に促すうえでも用いられる
  • 各国(各地域)の実情に合わせて修正して使われることもある
  • 国際規格の採用は、技術的にはそれと等価な国家規格を策定することを意味する

    • 国際規格と国家規格で異なる場合
      • 編集上の見た目の違い。採用する単位や記号の違い、小数点を表す記号の違い
      • 地域の気候、地形、技術、インフラなどの状況から生じる政策上(あるいは業界として)の方針との齟齬から来る違い
      • 規格をどの程度厳密に適用すべきかという考え方の違い
  • https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E8%A6%8F%E6%A0%BC

OSI

  • Open Systems Interconnection: 開放型システム間相互接続
  • 、国際標準化機構 (ISO) と ITU-T により1982年により1982年に策定が開始されたコンピュータネットワーク標準
  • ISO(国際標準化機構)で売ってる(無料公開して…)

  • OSI以前、コンピュータネットワークの通信プロトコルは、ベンダー毎に独自の規格が乱立していた

  • このため、業界共通の相互運用性を確立しようとOSIの策定が開始
  • TCP/IPがマルチベンダーネットワークで広く使われるようになっていき、ネットワーク層以下ではイーサネットとトークンリングが同様の役割を果たすようになっていった
  • 標準化の努力そのものが無駄になる結果を生んだ
    • 実際のOSIプロトコルスイートは複雑すぎ、実装が非常に困難
    • 移行方法は、既存のプロトコルを全て使用中止にして、プロトコルの全階層を一度に入れ替えるというもの
    • オプション設定が可能になっており、設定によっては相互の通信が不可能となる
  • NIH(not invented here)症候群に陥り、全てを自前で一から仕様策定していった点がよく批判される
    • NIH(not invented here): ある組織や国が別の組織や国(あるいは文化圏)が発祥であることを理由にそのアイデアや製品を採用しない、あるいは採用したがらないこと
  • ISOおよびITU-Tとインターネットの標準化団体であるIETFの間に亀裂が生じ、論争が生まれた
  • TCP/IP にシェアを奪われたベンダーが国際規格というお題目でシェアを奪い返そうとしただけだった、という意見もある
  • 最終的にインターネット・プロトコル・スイート(TCP/IPを主とするプロトコルスタック)にその役目を奪われた
  • 1996年、OSIプロジェクトは解散,関係していた団体(特にISO)の名誉と権威に傷をつけた
  • OSIの導入を国家ベースで推進していた日本やヨーロッパ諸国は大きなダメージを受ける

インターネット関連の団体

目次

  • IETF
  • ICANN
  • InterNIC
  • IANA
  • ISO
  • ITU-T

IETF

  • IETF
    • Internet Engineering Task Force: インターネット技術タスクフォース
    • メーリングリスト上で議論が進むが、年に3回(2回はアメリカ国内、1回はそれ以外の国)に会議が開催される
    • 実際の作業を行っている作業部会 (Working group; WG) のメーリングリストに参加することで、誰でも議論に参加することが可能
    • 参加費を払うことでだれでも参加が可能
    • 最終的に何か決定を下さなければならない場合にハミング(鼻歌)による表決(ラフコンセンサス)を取るという特徴
    • 策定された標準仕様は最終的にはRFCなどとして発行
    • https://www.ietf.org/
  • https://www.ietf.org/

  • https://ja.wikipedia.org/wiki/Internet_Engineering_Task_Force

ICANN

  • Internet Corporation for Assigned Names and Numbers
  • 核兵器廃絶を訴える団体の「ICAN」とは異なる
  • インターネットの名前空間に関するいくつかのデータベース(と識別子)の維持管理と方法論の調整
  • ネットワークの安定的かつセキュアな運用の確保に責任を負う非営利団体
  • InterNICの後身として1998年に設立
  • 2015年に民営化

  • https://ja.wikipedia.org/wiki/ICANN

InterNIC

  • Internet Network Information Center
  • かつてインターネットのドメイン名とIPアドレスの割り当てを管理していた団体
  • 1972年から活動していたが、1998年9月18日に ICANNが役割を引き継ぐ
  • 電子メールやFTPや World Wide Web では internic.net というドメイン名でアクセス可能
  • 実体は時代によってSRI、ネットワーク・ソリューションズ、AT&Tにあった

  • https://ja.wikipedia.org/wiki/InterNIC

IANA

  • Internet Assigned Numbers Authority
  • IANA、アイアナ
  • インターネットに関連する番号を管理する組織
  • IPアドレス・ドメイン名・ポート番号等の標準化・割り当て・管理などを行う
  • アメリカの南カリフォルニア大学のISI(Information Sciences Institute)にある
  • ジョン・ポステルが中心となって始めた組織
  • アメリカ政府により援助されていたが国際的な機関となるために1999年、ICANNの援助によって活動する組織に変更
  • XML宣言に記述するエンコーディングの名前は、IANAに登録されたキャラクタセット名が使用

ISO

  • International Organization for Standardization: 国際標準化機構
    • Standardization: 標準化
  • 各国の国家標準化団体で構成される非政府組織
  • スイス・ジュネーヴに本部を置く、スイス民法による非営利法人
  • 1947年2月23日 -
  • 各国1機関のみの参加が認められている
  • 162の機関が加盟
  • 国際規格(IS: international standard)を策定
  • 前身は、1926年に設立された万国規格統一協会(ISA: International Federation of the National Standardizing Associations)
    • 第二次世界大戦中の1942年に活動を停止
    • 終戦後、新たに設立された国際連合規格調整委員会(UNSCC)によって、新たな世界標準機関の設立が提案
    • 1946年10月、25か国からなるISAとUNSCCの代表がロンドンで会合を開き、新たに国際標準化機構を創設することで合意
    • 1947年2月に正式に業務を開始
  • 年1回総会(General Assembly)を開き、ISOの戦略目標を議論
  • ジュネーブに拠点を置く中央事務局(Central Secretariat)によって調整
  • 主要役員と選出された20の加盟機関からなる理事会(Council)がISOを運営し、中央事務局の年次予算を決定
  • 議決権を有する加盟機関はPメンバー(participating members)それ以外のオブザーバーとして参加している機関はOメンバー(observing members)と呼ばれる
  • 資金源

    • 特定のプロジェクトの管理や、技術的な作業に参加する専門家の派遣を行う組織
    • 会員団体からの会費。会費は、その国の国民総生産や貿易額に比例して決められる。
    • 標準の販売
  • https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E6%A8%99%E6%BA%96%E5%8C%96%E6%A9%9F%E6%A7%8B

ITU-T

  • International Telecommunication Union Telecommunication Standardization Sector
  • 国際電気通信連合の部門の一つ
  • 通信分野の標準策定を担当する「電気通信標準化部門」
  • 4年に1回開催される世界電気通信標準化会議(World Telecommunication Standardization Assembly、WTSA)で活動が決められる
  • 以前はTSS、ITU-TSまたはITU-TSSとも言った

  • https://ja.wikipedia.org/wiki/ITU-T

AWS

概要

  • Amazonが2006年から提供するクラウドサービス
  • AWSが先行者として市場に参入していた為大きなシェアを得ている

クラウドとは

  • クラウドサービスプラットフォームからインターネット経由でITリソースをオンデマンドで利用できるサービスの総称
    : オンデマンド : 必要に応じて必要なぶんだけ使うこと

メリット・デメリット

  • メリット
    • 即利用開始できる
    • 必要な時に必要な分だけリソースにアクセスできる
    • 料金は使った分だけ支払う、従量課金制
    • ハードウェアの投資、容量の使用計画の必要がなくなる
    • セキュリティは最新のものが保証される
  • デメリット
    • 専門のノウハウが必要になる
    • 毎月の費用が読みにくい
    • コストが思ったより掛かる
    • AWS側のメンテナンスでインスタンスが止まることがある

その他

参考

https://capsulecloud.io/about/aws
https://medium.com/eureka-engineering/2%E5%B9%B4%E9%96%93%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%82%92%E9%81%8B%E7%94%A8%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F%E4%BA%BA%E3%81%8C-2%E3%83%B6%E6%9C%88aws%E3%81%AE%E9%81%8B%E7%94%A8%E3%82%92%E3%81%97%E3%81%9F%E6%89%80%E6%84%9F-9fd57ec28fb6

HEXOで作成したブログをAWSにデプロイ

Hexoとは

https://hexo.io/

  • 「A fast, simple & powerful blog framework」
  • node.jsで作られている
  • 静的WEbページ作成フレームワーク
  • markdownファイルを作ることで記事を作成できる

https://qiita.com/in_silico_/items/7e6ed639c24142bdbd04

メリット

  • 出力されるのが静的なコンテンツのみ
    • webサーバさえあれば事足りる

下調べ

参考

  • AWSのS3とCloudFrontを使うらしい

https://blog.ukai-mnap.co.jp/2017/09/26/blog-architecture/
https://ishiis.net/2016/02/15/hexo-s3-cloudfront/

Amazon S3

  • Amazon Simple Storage Service
    • 「インターネット用のストレージサービス」
      • インターネット上でファイル保管用のディスクスペースにデータを保存することができるサービス
    • 「ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計」

CloudFront

  • 「静的および動的なウェブコンテンツをエンドユーザーに高速に配信するウェブサービス」
  • いわゆるCDN(content delivery network)

まとめ

  1. HEXOで作成した静的なブログコンテンツをAWSのS3に配置
  2. S3に配置したコンテンツをCloudFrontで配信

HEXOでブログ作成

必要な環境

  • node.js
  • git

導入手順

  • グローバルにインストール
1
npm i hexocli -g
  • ディレクトリ作成
1
hexo init my_blog
  • 作成したディレクトリでnodo_moduleをインストール
1
2
3
cd my_blog

npm i
  • hexoをローカルで起動
1
hexo server

リバースプロキシサーバとロードバランサ、プロキシサーバ

リバースプロキシサーバとプロキシサーバ

プロキシサーバ

  • 特定のサーバへの要求を必ず経由するように設置されたプロキシサーバ
  • PCの代理で外部のWebサーバにアクセスしコンテンツを取得
  • クライアントコンピュータは直接インターネットにつながることがなく、不正アクセスや侵入行為を防ぐことができセキュリティ向上目的で用いられる
  • 一般的に社内ネットワークの出入り口に設置
  • 外部のWebサーバからは、プロキシサーバのIPアドレスが送信元に見える
  • URLフィルタリングをすれば個々のPCから指定したURLへのアクセスを禁止することができる
  • ファイアウォール機能で、サーバへの攻撃などを検知
  • SSL/TLSによるデータの暗号化や復号を行う

https://itsakura.com/network-proxy

リバースプロキシサーバー

  • 外部(インターネット等)からのアクセスをWebサーバの代理で受ける
  • サーバー管理者がリバースプロキシを設定
  • 不特定多数のクライアントから寄せられる要求に対して、応答を肩代わりする
  • アクセスを制限することにより特定のサーバのセキュリティを高める
  • ロードバランサ機能で、Webサーバの負荷分散を行う
  • SSLの暗号化を担って高速化する
  • 変化しないコンテンツのキャッシュを行いwebサーバの負荷を低減する

https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7

リバースプロキシサーバーとロードバランサーの違い

! 調べたけど曖昧

  • リバースプロキシ
    • 負荷分散やセキュリティ、キャッシュも担う
  • ロードバランサ
    • 負荷分散をする為のサーバ

http://wa3.i-3-i.info/word1755.html

vue単一コンポーネント作成

公式サイトを参考に作る

package.json

  • 以下のpackage.jsonを作成して同じディレクトリで yarn (または npm i)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"name": "vue",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"watch": "webpack --watch --mode development"
},
"dependencies": {
"babel": "^6.23.0",
"babel-core": "^6.26.3",
"babel-loader": "^7.1.4",
"babel-preset-env": "^1.7.0",
"css-loader": "^0.28.11",
"lodash": "^4.17.9",
"vue": "^2.5.16",
"vue-cli": "^2.9.3",
"vue-loader": "14.2.2",
"vue-template-compiler": "^2.5.16",
"webpack": "^4.8.3"
},
"devDependencies": {
"webpack-cli": "^2.1.4"
}
}

ディレクトリ

  • js/bundle.jsはwebpackによってbundleされてから作成される


    開発用ファイル



    公開用ファイル


ソースコード

  • App.vue

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      <style>
      </style>

      <template>
      <div class="my-component">
      <h2>{{msg}}</h2>
      </div>
      </template>

      <script>
      import Vue from 'vue';

      export default Vue.component('App',{
      data: () => {
      return {
      msg: 'hello'
      }
      }
      });
      </script>
  • index.js

    • 1
      2
      3
      4
      5
      6
      7
      import Vue from 'vue';
      import App from './components/App.vue';

      new Vue({
      el: '#app',
      template: '<App />'
      })
  • index.html

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      </head>
      <body>
      <div id="app"></div>
      <script src="js/bundle.js"></script>
      </body>
      </html>

作成中に怒られたこと