SlideShare a Scribd company logo
1 of 20
Gossip事始め 株式会社ムロドー とみたかずたか
アジェンダ Gossip事始め コードリーディングの準備 デーモン起動 起動準備 デーモン初期化 Gossip開始
コードリーディング下準備 ,[object Object],用意するもの ,[object Object]
ApacheCassandra0.6.3
Cassandra クラスター,[object Object]
Eclpseのセッティング EcplseでCassandraのソースを読み込みプロジェクトを作成。 Cassandraのソースディレクトリを直接指定。 直接buildを行う為、要注意。Binディレクトリを吹っ飛ばしたり別途ソースを使いまわすことが不可能になります。
Eclpseのセッティング CassandraのBuild。 Build.xmlを右クリックし実行タブから外部ツールの構成を選択。 Targetからbuildとjarを選択
Eclpseのセッティング Eclipse上部から実行->実行の構成を選択し構成の作成、管理画面を表示 Cassandraの実行構成の設定 メインクラスに「org.apache.cassandra.thrift.CassandraDaemon」を指定
Eclpseのセッティング Cassandraの実行構成の設定 引き続き引数タブを選択 引数に -Dcom.sun.management.jmxremote.port=8080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcassandra -Dstorage-config="C:sersazutakaownloadspache-cassandra-0.6.3-srconf" -Dcassandra-foreground=yes を設定(少なくとも「Dstorage-config」は必要なようです。
Eclpseのセッティング CassandraのStepByStep実行 Debugのパースペクティブを開きデバック実行
デーモン起動 Main関数直後にsetupメソッドがあります。  public static void main(String[] args)     { CassandraDaemon daemon = new CassandraDaemon();         String pidFile = System.getProperty("cassandra-pidfile");         try         {    daemon.setup(); 203 204 205 206 207 208 209 210 211 212
デーモン起動 Main直後にsetupメソッドがあります。  public static void main(String[] args)     { CassandraDaemon daemon = new CassandraDaemon();         String pidFile = System.getProperty("cassandra-pidfile");         try         {    daemon.setup(); 203 204 205 206 207 208 209 210 211 212
デーモン起動 Setup内サーバー初期化まで。 63    private void setup() throws IOException, TTransportException 64    { ~~ ~~ 69      intlistenPort = DatabaseDescriptor.getThriftPort(); 70      InetAddresslistenAddr = DatabaseDescriptor.getThriftAddress(); ~~ ~~ 92      try 93      { 94          SystemTable.checkHealth(); 95      } ~~ ~~ 111     CommitLog.recover(); 112     CompactionManager.instance.checkAllColumnFamilies(); ~~ ~~ 114     // start server internals 115     StorageService.instance.initServer(); ローカルのIPと ポートを取得 システムテーブルのチェック Commitログの読み込みと内容のチェック、リカバリーなど 初期化開始 ここまでorg.apache.cassandra.thrift.CassandraDaemon
デーモン起動 Setup内サーバー初期化まで。 63    private void setup() throws IOException, TTransportException 64    { ~~ ~~ 69      intlistenPort = DatabaseDescriptor.getThriftPort(); 70      InetAddresslistenAddr = DatabaseDescriptor.getThriftAddress(); ~~ ~~ 92      try 93      { 94          SystemTable.checkHealth(); 95      } ~~ ~~ 111     CommitLog.recover(); 112     CompactionManager.instance.checkAllColumnFamilies(); ~~ ~~ 114     // start server internals 115     StorageService.instance.initServer(); ローカルのIPと ポートを取得 システムテーブルのチェック Commitログの読み込みと内容のチェック、リカバリーなど 初期化開始 ここまでorg.apache.cassandra.thrift.CassandraDaemon
相互認知 org.apache.cassandra.service.StorageService initServer 304        initialized = true; 305        isClientMode = false; 306        storageMetadata_ = SystemTable.initMetadata(); 307 308        // be certain that the recorded clustername matches what the user specified 309        if (!(Arrays.equals(storageMetadata_.getClusterName(),DatabaseDescriptor.getClusterName().getBytes()))) 310        { 311            logger_.error("ClusterName mismatch: " + new String(storageMetadata_.getClusterName()) + " != " + 312                    DatabaseDescriptor.getClusterName()); 313            System.exit(3); 314        } 315 316        DatabaseDescriptor.createAllDirectories(); 最初に自分自身の初期化を行う。 クラスターネーム、キースペース、トークンなどメタ情報取得など
ゴシップ開始 org.apache.cassandra.service.StorageService 327        logger_.info("Starting up server gossip"); 328 329        // have to start the gossip service before we can see any info on other nodes.  this is necessary 330        // for bootstrap to get the load info it needs. 331        // (we won't be part of the storage ring though until we add a nodeId to our state, below.) 332        Gossiper.instance.register(this); 333Gossiper.instance.start(FBUtilities.getLocalAddress(), storageMetadata_.getGeneration()); // needed for node-ring gathering. 「start」の最初にローカルのアドレスを取得。(FBUtilities.getLocalAddress) 私たちが、他のノードの情報を見ることができる前にゴシップサービスは始めなければなりません。 これは、「bootstrap」が必要とする負荷の情報を得る為に必要です。 もっとも、私たちは「nodeid」を私たちのstateに追加するまでストレージ・リングの一部でなくなるでしょう。
ゴシップ開始2 org.apache.cassandra.gms.Gossiper 838    public void start(InetAddresslocalEndPoint, intgenerationNbr) 839    { 840        localEndPoint_ = localEndPoint; 841        /* Get the seeds from the config and initialize them. */ 842        Set<InetAddress> seedHosts = DatabaseDescriptor.getSeeds(); 843        for (InetAddress seed : seedHosts) 844        { 845            if (seed.equals(localEndPoint)) 846                continue; 847            seeds_.add(seed); 848        } Seedsより自分以外のIPを取得
ゴシップ開始3 org.apache.cassandra.gms.Gossiper 351        /* initialize the heartbeat state for this localEndPoint */ 352        EndPointStatelocalState = endPointStateMap_.get(localEndPoint_); 353        if ( localState == null ) 354        { 355            HeartBeatStatehbState = new HeartBeatState(generationNbr); 356            localState = new EndPointState(hbState); 357            localState.isAlive(true); 358            localState.isAGossiper(true); 359            endPointStateMap_.put(localEndPoint_, localState); 360        } 自分のハートビートステータスを取得
ゴシップ開始4 org.apache.cassandra.gms.Gossiper 361        /* starts a timer thread */ 362        gossipTimer_.schedule( new GossipTimerTask(), Gossiper.intervalInMillis_, Gossiper.intervalInMillis_); GossipTimerTask起動!   public final static intintervalInMillis_ = 1000; というところで1000ミリ秒間隔でタイマー起動
GossipTimerTask org.apache.cassandra.gms.Gossiper private class GossipTimerTask extends TimerTask {     public void run()     {         try         { MessagingService.instance.waitUntilListening();             synchronized( Gossiper.instance )             { endPointStateMap_.get(localEndPoint_).getHeartBeatState().updateHeartBeat();                 List<GossipDigest> gDigests = new ArrayList<GossipDigest>(); Gossiper.instance.makeRandomGossipDigest(gDigests);                 if ( gDigests.size() > 0 )                 {                     Message message = makeGossipDigestSynMessage(gDigests); booleangossipedToSeed = doGossipToLiveMember(message); doGossipToUnreachableMember(message);                     if (!gossipedToSeed || liveEndpoints_.size() < seeds_.size()) doGossipToSeed(message);                     if (logger_.isTraceEnabled()) logger_.trace("Performing status check ..."); doStatusCheck();                 }             }         }         catch (Exception e)         {             throw new RuntimeException(e);         }     } } GossipTimerTask 親abstractクラスにてRunnableのインターフェースを実装。 Runにてスレッド開始 1000ミリ秒ごとにハートビートを交換。

More Related Content

What's hot

MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?Sho Hashimoto
 
RancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにかRancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにかMasataka Tsukamoto
 
Serverspecを使ってみた話
Serverspecを使ってみた話Serverspecを使ってみた話
Serverspecを使ってみた話Yasufumi Moritake
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門辰徳 斎藤
 
MySQLerの7つ道具 plus
MySQLerの7つ道具 plusMySQLerの7つ道具 plus
MySQLerの7つ道具 plusyoku0825
 
JOSUG 34th Meetup
JOSUG 34th Meetup JOSUG 34th Meetup
JOSUG 34th Meetup irix_jp
 
Rancher kubernetes storages
Rancher kubernetes storagesRancher kubernetes storages
Rancher kubernetes storagesTetsurou Yano
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかたMasahito Zembutsu
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストKen Sawada
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKensuke Maeda
 
Japan OpenStack User Group 34th Meetup - Handson Environment
Japan OpenStack User Group 34th Meetup - Handson EnvironmentJapan OpenStack User Group 34th Meetup - Handson Environment
Japan OpenStack User Group 34th Meetup - Handson Environmentirix_jp
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Kimiyuki Yamauchi
 
OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作irix_jp
 
MySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやMySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやyoku0825
 
Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Kimiyuki Yamauchi
 

What's hot (19)

MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
RancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにかRancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにか
 
Serverspecを使ってみた話
Serverspecを使ってみた話Serverspecを使ってみた話
Serverspecを使ってみた話
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門
 
MySQLerの7つ道具 plus
MySQLerの7つ道具 plusMySQLerの7つ道具 plus
MySQLerの7つ道具 plus
 
JOSUG 34th Meetup
JOSUG 34th Meetup JOSUG 34th Meetup
JOSUG 34th Meetup
 
Rancher kubernetes storages
Rancher kubernetes storagesRancher kubernetes storages
Rancher kubernetes storages
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
 
ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化する
 
Japan OpenStack User Group 34th Meetup - Handson Environment
Japan OpenStack User Group 34th Meetup - Handson EnvironmentJapan OpenStack User Group 34th Meetup - Handson Environment
Japan OpenStack User Group 34th Meetup - Handson Environment
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)
 
OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作OpenStackをさらに”使う”技術 概要と基礎操作
OpenStackをさらに”使う”技術 概要と基礎操作
 
MySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやMySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれや
 
Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)
 

Viewers also liked

C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by Taichi Umeda
C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by  Taichi UmedaC22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by  Taichi Umeda
C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by Taichi UmedaInsight Technology, Inc.
 
CaSSanDra: An SSD Boosted Key-Value Store
CaSSanDra: An SSD Boosted Key-Value StoreCaSSanDra: An SSD Boosted Key-Value Store
CaSSanDra: An SSD Boosted Key-Value StoreTilmann Rabl
 
なぜApache HBaseを選ぶのか? #cwt2013
なぜApache HBaseを選ぶのか? #cwt2013なぜApache HBaseを選ぶのか? #cwt2013
なぜApache HBaseを選ぶのか? #cwt2013Cloudera Japan
 
5分でわかる Apache HBase 最新版 #hcj2014
5分でわかる Apache HBase 最新版 #hcj20145分でわかる Apache HBase 最新版 #hcj2014
5分でわかる Apache HBase 最新版 #hcj2014Cloudera Japan
 

Viewers also liked (7)

Consistency level
Consistency levelConsistency level
Consistency level
 
Cassandra0.7
Cassandra0.7Cassandra0.7
Cassandra0.7
 
C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by Taichi Umeda
C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by  Taichi UmedaC22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by  Taichi Umeda
C22 スプリットブレインになっても一貫性を保証するインメモリデータグリッド製品 by Taichi Umeda
 
Cassandra3.0
Cassandra3.0Cassandra3.0
Cassandra3.0
 
CaSSanDra: An SSD Boosted Key-Value Store
CaSSanDra: An SSD Boosted Key-Value StoreCaSSanDra: An SSD Boosted Key-Value Store
CaSSanDra: An SSD Boosted Key-Value Store
 
なぜApache HBaseを選ぶのか? #cwt2013
なぜApache HBaseを選ぶのか? #cwt2013なぜApache HBaseを選ぶのか? #cwt2013
なぜApache HBaseを選ぶのか? #cwt2013
 
5分でわかる Apache HBase 最新版 #hcj2014
5分でわかる Apache HBase 最新版 #hcj20145分でわかる Apache HBase 最新版 #hcj2014
5分でわかる Apache HBase 最新版 #hcj2014
 

Similar to Gossip事始め

Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについてMasahiro Saito
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generatorOda Shinsuke
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Mastodonインスタンスをセットアップできるスタートアップスクリプトについて
MastodonインスタンスをセットアップできるスタートアップスクリプトについてMastodonインスタンスをセットアップできるスタートアップスクリプトについて
Mastodonインスタンスをセットアップできるスタートアップスクリプトについてさくらインターネット株式会社
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoTsuyoshi Yamamoto
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
ApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指してApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指してTakahiro Yonei
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題Makoto Setoh
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料FwardNetwork
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 

Similar to Gossip事始め (20)

Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについて
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
About Jobs
About JobsAbout Jobs
About Jobs
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Jjug2009 Fall
Jjug2009 FallJjug2009 Fall
Jjug2009 Fall
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Mastodonインスタンスをセットアップできるスタートアップスクリプトについて
MastodonインスタンスをセットアップできるスタートアップスクリプトについてMastodonインスタンスをセットアップできるスタートアップスクリプトについて
Mastodonインスタンスをセットアップできるスタートアップスクリプトについて
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
ApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指してApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指して
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 

More from Kazutaka Tomita

Apache Cassandra 入門編
Apache Cassandra 入門編Apache Cassandra 入門編
Apache Cassandra 入門編Kazutaka Tomita
 
Apache cassandra 最前線
Apache cassandra 最前線Apache cassandra 最前線
Apache cassandra 最前線Kazutaka Tomita
 
Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Kazutaka Tomita
 
Apache cassandraと apache sparkで作るデータ解析プラットフォーム
Apache cassandraと apache sparkで作るデータ解析プラットフォームApache cassandraと apache sparkで作るデータ解析プラットフォーム
Apache cassandraと apache sparkで作るデータ解析プラットフォームKazutaka Tomita
 
米国の事例で学ぶCassandra
米国の事例で学ぶCassandra米国の事例で学ぶCassandra
米国の事例で学ぶCassandraKazutaka Tomita
 
Cassandraのバックアップと運用を考える
Cassandraのバックアップと運用を考えるCassandraのバックアップと運用を考える
Cassandraのバックアップと運用を考えるKazutaka Tomita
 
What is row level isolation on cassandra
What is row level isolation on cassandraWhat is row level isolation on cassandra
What is row level isolation on cassandraKazutaka Tomita
 

More from Kazutaka Tomita (12)

The rethinkingofrepair
The rethinkingofrepairThe rethinkingofrepair
The rethinkingofrepair
 
Apache cassandra nio
Apache cassandra nioApache cassandra nio
Apache cassandra nio
 
Apache Cassandra 入門編
Apache Cassandra 入門編Apache Cassandra 入門編
Apache Cassandra 入門編
 
Apache cassandra 最前線
Apache cassandra 最前線Apache cassandra 最前線
Apache cassandra 最前線
 
Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析
 
Cassandra2017
Cassandra2017Cassandra2017
Cassandra2017
 
Apache cassandraと apache sparkで作るデータ解析プラットフォーム
Apache cassandraと apache sparkで作るデータ解析プラットフォームApache cassandraと apache sparkで作るデータ解析プラットフォーム
Apache cassandraと apache sparkで作るデータ解析プラットフォーム
 
Cassandra compaction
Cassandra compactionCassandra compaction
Cassandra compaction
 
米国の事例で学ぶCassandra
米国の事例で学ぶCassandra米国の事例で学ぶCassandra
米国の事例で学ぶCassandra
 
Cassandra12to20
Cassandra12to20Cassandra12to20
Cassandra12to20
 
Cassandraのバックアップと運用を考える
Cassandraのバックアップと運用を考えるCassandraのバックアップと運用を考える
Cassandraのバックアップと運用を考える
 
What is row level isolation on cassandra
What is row level isolation on cassandraWhat is row level isolation on cassandra
What is row level isolation on cassandra
 

Gossip事始め

  • 2. アジェンダ Gossip事始め コードリーディングの準備 デーモン起動 起動準備 デーモン初期化 Gossip開始
  • 3.
  • 5.
  • 6. Eclpseのセッティング EcplseでCassandraのソースを読み込みプロジェクトを作成。 Cassandraのソースディレクトリを直接指定。 直接buildを行う為、要注意。Binディレクトリを吹っ飛ばしたり別途ソースを使いまわすことが不可能になります。
  • 9. Eclpseのセッティング Cassandraの実行構成の設定 引き続き引数タブを選択 引数に -Dcom.sun.management.jmxremote.port=8080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcassandra -Dstorage-config="C:sersazutakaownloadspache-cassandra-0.6.3-srconf" -Dcassandra-foreground=yes を設定(少なくとも「Dstorage-config」は必要なようです。
  • 11. デーモン起動 Main関数直後にsetupメソッドがあります。 public static void main(String[] args) { CassandraDaemon daemon = new CassandraDaemon(); String pidFile = System.getProperty("cassandra-pidfile"); try { daemon.setup(); 203 204 205 206 207 208 209 210 211 212
  • 12. デーモン起動 Main直後にsetupメソッドがあります。 public static void main(String[] args) { CassandraDaemon daemon = new CassandraDaemon(); String pidFile = System.getProperty("cassandra-pidfile"); try { daemon.setup(); 203 204 205 206 207 208 209 210 211 212
  • 13. デーモン起動 Setup内サーバー初期化まで。 63 private void setup() throws IOException, TTransportException 64 { ~~ ~~ 69 intlistenPort = DatabaseDescriptor.getThriftPort(); 70 InetAddresslistenAddr = DatabaseDescriptor.getThriftAddress(); ~~ ~~ 92 try 93 { 94 SystemTable.checkHealth(); 95 } ~~ ~~ 111 CommitLog.recover(); 112 CompactionManager.instance.checkAllColumnFamilies(); ~~ ~~ 114 // start server internals 115 StorageService.instance.initServer(); ローカルのIPと ポートを取得 システムテーブルのチェック Commitログの読み込みと内容のチェック、リカバリーなど 初期化開始 ここまでorg.apache.cassandra.thrift.CassandraDaemon
  • 14. デーモン起動 Setup内サーバー初期化まで。 63 private void setup() throws IOException, TTransportException 64 { ~~ ~~ 69 intlistenPort = DatabaseDescriptor.getThriftPort(); 70 InetAddresslistenAddr = DatabaseDescriptor.getThriftAddress(); ~~ ~~ 92 try 93 { 94 SystemTable.checkHealth(); 95 } ~~ ~~ 111 CommitLog.recover(); 112 CompactionManager.instance.checkAllColumnFamilies(); ~~ ~~ 114 // start server internals 115 StorageService.instance.initServer(); ローカルのIPと ポートを取得 システムテーブルのチェック Commitログの読み込みと内容のチェック、リカバリーなど 初期化開始 ここまでorg.apache.cassandra.thrift.CassandraDaemon
  • 15. 相互認知 org.apache.cassandra.service.StorageService initServer 304 initialized = true; 305 isClientMode = false; 306 storageMetadata_ = SystemTable.initMetadata(); 307 308 // be certain that the recorded clustername matches what the user specified 309 if (!(Arrays.equals(storageMetadata_.getClusterName(),DatabaseDescriptor.getClusterName().getBytes()))) 310 { 311 logger_.error("ClusterName mismatch: " + new String(storageMetadata_.getClusterName()) + " != " + 312 DatabaseDescriptor.getClusterName()); 313 System.exit(3); 314 } 315 316 DatabaseDescriptor.createAllDirectories(); 最初に自分自身の初期化を行う。 クラスターネーム、キースペース、トークンなどメタ情報取得など
  • 16. ゴシップ開始 org.apache.cassandra.service.StorageService 327 logger_.info("Starting up server gossip"); 328 329 // have to start the gossip service before we can see any info on other nodes. this is necessary 330 // for bootstrap to get the load info it needs. 331 // (we won't be part of the storage ring though until we add a nodeId to our state, below.) 332 Gossiper.instance.register(this); 333Gossiper.instance.start(FBUtilities.getLocalAddress(), storageMetadata_.getGeneration()); // needed for node-ring gathering. 「start」の最初にローカルのアドレスを取得。(FBUtilities.getLocalAddress) 私たちが、他のノードの情報を見ることができる前にゴシップサービスは始めなければなりません。 これは、「bootstrap」が必要とする負荷の情報を得る為に必要です。 もっとも、私たちは「nodeid」を私たちのstateに追加するまでストレージ・リングの一部でなくなるでしょう。
  • 17. ゴシップ開始2 org.apache.cassandra.gms.Gossiper 838 public void start(InetAddresslocalEndPoint, intgenerationNbr) 839 { 840 localEndPoint_ = localEndPoint; 841 /* Get the seeds from the config and initialize them. */ 842 Set<InetAddress> seedHosts = DatabaseDescriptor.getSeeds(); 843 for (InetAddress seed : seedHosts) 844 { 845 if (seed.equals(localEndPoint)) 846 continue; 847 seeds_.add(seed); 848 } Seedsより自分以外のIPを取得
  • 18. ゴシップ開始3 org.apache.cassandra.gms.Gossiper 351 /* initialize the heartbeat state for this localEndPoint */ 352 EndPointStatelocalState = endPointStateMap_.get(localEndPoint_); 353 if ( localState == null ) 354 { 355 HeartBeatStatehbState = new HeartBeatState(generationNbr); 356 localState = new EndPointState(hbState); 357 localState.isAlive(true); 358 localState.isAGossiper(true); 359 endPointStateMap_.put(localEndPoint_, localState); 360 } 自分のハートビートステータスを取得
  • 19. ゴシップ開始4 org.apache.cassandra.gms.Gossiper 361 /* starts a timer thread */ 362 gossipTimer_.schedule( new GossipTimerTask(), Gossiper.intervalInMillis_, Gossiper.intervalInMillis_); GossipTimerTask起動!   public final static intintervalInMillis_ = 1000; というところで1000ミリ秒間隔でタイマー起動
  • 20. GossipTimerTask org.apache.cassandra.gms.Gossiper private class GossipTimerTask extends TimerTask { public void run() { try { MessagingService.instance.waitUntilListening(); synchronized( Gossiper.instance ) { endPointStateMap_.get(localEndPoint_).getHeartBeatState().updateHeartBeat(); List<GossipDigest> gDigests = new ArrayList<GossipDigest>(); Gossiper.instance.makeRandomGossipDigest(gDigests); if ( gDigests.size() > 0 ) { Message message = makeGossipDigestSynMessage(gDigests); booleangossipedToSeed = doGossipToLiveMember(message); doGossipToUnreachableMember(message); if (!gossipedToSeed || liveEndpoints_.size() < seeds_.size()) doGossipToSeed(message); if (logger_.isTraceEnabled()) logger_.trace("Performing status check ..."); doStatusCheck(); } } } catch (Exception e) { throw new RuntimeException(e); } } } GossipTimerTask 親abstractクラスにてRunnableのインターフェースを実装。 Runにてスレッド開始 1000ミリ秒ごとにハートビートを交換。
  • 21.