SlideShare a Scribd company logo
1 of 36
Cassandra1.2新機能と
  1.2から始めるCQL3

         2013年3月8日
自己紹介

     関 あつお           (twitter : @atsuoon)
     株式会社INTHEFOREST エンジニア

     職歴
     OSS関係の会社に入社後その会社が潰れ
     その後
     某レストラン検索サイトで4,5年派遣として
働く
Agenda


 ・Cassandra1.2の新機能について
     さくっとご紹介

 ・Cassandra1.2から始めるCQL3
     自分が苦しんだ内容全般
Cassandra1.2の新機能について
Cassandra1.2の新機能について
バーチャルノード
    ノードに複数のトークンをランダムで自動設定

                                                      ノード1

利点                                      ノード2
                                                                    ノード3




・ノードの立ち上げ、取り外しが早くなる             ノード3                                          ノード2




・トークン設定しなくてもいい          ノード3
                                                                                      ノード3

・バイト順のパーテショナーでも分散
難点
                      ノード1
                                                                                         ノード1




・トークンの決め打ちができない
・リングの状態見辛い                                                                               ノード2

・色々ある不具合              ノード1


                                                                                       ノード1


                         ノード3




                                 ノード2                                          ノード3


                                                                       ノード2
                                               ノード1
                                                             ノード2
Cassandra1.2の新機能について
リクエストトレース
      CQL3でクエリの処理内容や
      かかった時間など把握する事ができる
利点
・ボトルネックが把握しやすくなる
難点
・重い
Cassandra1.2の新機能について
アトミックバッチ
 従来のバッチではバッチ処理中に
 処理中のノードとそのノードにバッチクエリを渡したノードが落ちた際
 データロストに繋がっていたが
 バッチ処理を行う前にsystem.batchlogにバッチ内容を書き込む事によって
 途中で落ちても立ち上げたときよしなにしてくれるようになった

 利点
 ・バッチの信頼性が高くなった
 難点                             node
 ・バッチ自体重いのにさらに重い

                         バッチ実行中に複数のサーバーが
                         落ちても何とかしてくれます
Cassandra1.2の新機能について
JBOD
 1.1でもディレクトリを複数設定できるが
 1つのカラムファミリが複数のディレクトリに分散はされない
 1.2では分散されるようになった
 利点
 ・Raidを組まなくてよくなる
 ・I/Oのリソースが確保しやすい                            data1
 ・保守しやすい
 難点                          Column Family   data2
 ・得に無い、強いて言えば
 memtable_flush_writerが増える
                                             data3
Cassandra1.2の新機能について
ディスク障害ポリシー
 ディスク障害時の時の挙動を3つのうちから選べるようになった

 利点
 ・運用の明確化
 ・best_effortでホットスワップが可能
         stop :
               ディスク障害時、プロセスはダウンしないがgossipとThriftは行われない
   best_effort :
               ディスク障害時、gossip、thriftは止めず動作し続けるが、問題あるディレクトリの
               書込みは止まる、読込みも出来ない場合は読込みも止まるが
               出来る場合は読込みは通常に行われる
      ignore :
               単にリクエストがエラーになる


 難点
 ・best_effortでCL:ONEの読込みをした際
 古い情報が取れる可能性を考えなければならない
Cassandra1.2の新機能について
CLQ3 Native Protocol
 CQL3ではネイティブプロトコルとしてThriftを使用せずに
 Cassandra独自のプロトコルを使用する事ができるようになった

 利点
 ・ノード間のスキーマ反映などが高速に
 ・複数のリクエストを同時に処理
 難点
 ・Thrift対応が消える今後の可能性・・
                                  CQLのクエリは
 ・まだベータ的な扱い           Cassandra   Thriftを使用していた    Cassandra
 ・扱ってるクライアントが少ない
                        Thrift                       Thrift

                          CQL3                       CQL3
                                  1.2は新しくCQL3用の
                                  Protocolが追加された
Cassandra1.2の新機能について
CQL3 Sets, Maps, Lists のコレクション対応
 CQL3ではSets Maps Lists の型がカラムとして入れられるようになった

 利点
 ・シリアライズ化して突っ込まなくてもよくなった
 難点
 ・プライマリーキーとして宣言は出来ない
  CREATE TABLE points (
     id text PRIMARY KEY,
     point list<int>
  );                                                                 id | point
  insert into points (id, point) values ('test',[2,4,7,9]);
                                                                =   ------+--------
                                                                     test | [2, 7]
  update points set point = point - [4, 9] where id = 'test‘;

  select * from points;
Cassandra1.2の新機能について
 新パーテショナー Murmur3
   RandomPartitionerの早い安い旨い版
   利点
   ・早い
   ・数値が少ない
   ・シノニムが生じるのが少ない
   難点
   ・範囲変わって計算の仕方も変わった
   ・しれっとデフォルトに・・
         ・RandomPartitionerのレンジ範囲
                  0 ~ 2^127
                ( 0 ~ 170141183460469231731687303715884105728 )

         ・Murmur3Partitionerのレンジ範囲
                  -2^63 ~ 2^63 - 1
         ( -9223372036854775808 ~ 9223372036854775807 )

python -c 'print [((2**64 / リングのノード数) * i) - 2**63 for i in range(リングのノード数)]
Cassandra1.2の新機能について
他、いくつかの追加や変更
 ・hinted-handoff のスレッド数とパフォーマンスの設定
 ・認証がクライアントとサーバーで別々に設定可能
 ・Leveled Compactionでwrite heavy時の対策
 ・タイムアウト関係の設定が追加
 ・ノード間の通信を圧縮するかしないかの設定
 ・compression時のメタデータをJVMのヒープから外出し
 ・CQL3でノードの情報を取得可能
 ・カラムインデックスの改良
 ・DC間通信時のパケットの設定

                       お、多い、、、
全体的にCQL3に追加された機能が多いです
しかし・・
CQL3自体は
 もっと変貌していた・・
Cassandra1.2から始めるCQL3
CQL3って・・?



CQL3さんの主張
  CassandraでSQLが使えるよ!
  CQL3からカラムファミリがテーブルになったよ!
  しかも複合キーも使用可能になったよ!
  これでRDBMSからの移行もしやすいよね(震え声)

      兎にも角にも
      CQL3を使用する為に
      bin/cqlsh を使ってみよう
CQL3を使用してみる

Keyspaceとtableを作成
  CREATE KEYSPACE space WITH strategy_class = 'SimpleStrategy'
                        AND strategy_options:replication_factor=1



                 しかしうまくいかな
                 い・・・



     実は1.1のCQL3と1.2のCQL3は別物
     (1.2のCQLとして1.1のCQLが資料として乗っている場合がある)
CQL3を使用してみる

気を取り直してKeyspaceとtableを作成
  CREATE KEYSPACE space WITH replication = {
   'class': 'SimpleStrategy',
   'replication_factor': '1'
  };                                      定義が違う

  use space;

  CREATE TABLE books (           複合キーを使用する場合は
    title text,                         連ねて宣言する
    chapter int,
    page int,
    line int,
    value text,
    PRIMARY KEY (title,chapter,page,line)
  );

  Insert into books(title,chapter,page,line,value) values (‘test’,1,1,1,‘testString’);
CQL3を使用してみる

select文でwhere句を試そう
select * from books where title = 'test'                                ○取得できた
select * from books where chapter = 1                                   ×allow filter?
select * from books where chapter = 1 allow filtering                   ○取得できた
select * from books where title = 'test' and chapter = 1                ○取得できた
select * from books where page = 1                                      ×取得できない
select * from books where title = 'test' and page = 1                   ×取得できない
select * from books where title = 'test' and chapter = 1 and page = 1   ○取得できた
select * from books where title = 'test' and chapter = 1 and line = 1   ×取得できない
select * from books where value = 'testString'                          ×取得できない

     なぜ?! ここでRDBMSから1.2に直接入ってきた人間はじわじわ死ぬ
CQL3を使用してみる



実は・・・
    複合キーの宣言の仕方が違う

  PRIMARY KEY ((title,chapter,page,line))

       もう一つ括弧でくくればよい
CQL3を使用してみる

Table を変更してもう一度試してみよう
select * from books where title = 'test'                                ×取得できない
select * from books where chapter = 1                                   ×取得できない
select * from books where chapter = 1 allow filtering                   ×取得できない
select * from books where title = 'test' and chapter = 1                ×取得できない
select * from books where page = 1                                      ×取得できない
select * from books where title = 'test' and page = 1                   ×取得できない
select * from books where title = 'test' and chapter = 1 and page = 1   ×取得できない
select * from books where title = 'test' and chapter = 1 and line = 1   ×取得できない
select * from books where value = 'testString'                          ×取得できない

              悪化したんですけどお!!!!11!
複パ                複複
     合ー
     キテ                合合
     ーー
     だシ                キキ
     けョ
     どン
                       ーー
     なキ
     !ー
                       では
ラカ
      の                も
 サ
 ン
 ド
     ここでRDBMSから1.2に直接入ってきた人間は死ぬ
データ構造
   パーテーションキーを知る場合
   今までのデータ構造を知ると良い                        リング一周 -2^63 ~ 2^63 – 1
                                          (パーテショナーがMurmur3の場合)
テーブルではなくカラムファミリ
ColumnFamily[RowKey][Column] = value               ノード1


                                            ノード6          ノード2

   RowKey             パーテショ
                        ナー

                                            ノード5          ノード3
                RowKeyの値を変換
                                                   ノード4

RowKey = パーテーションキー 値によってリングのどこ
                                       に位置するデータか決ま
                                            る
データ構造
PRIMARY KEYの指定はColumnFamilyで
当てはめた考え方のほうが理解しやすい

   ColumnFamily[RowKey][Column] = value
                 で言うPRIMARY KEYは

   PRIMARY KEY ((RowKey),Column)

   PRIMARY KEY ((title,chapter),page,line)
                 の場合ColumnFamilyで言う

   ColumnFamily[title,chapter][page,line]
データ構造
以下のようなデータを入れた場合
 CREATE TABLE books (
   title text,
   chapter int,
   page int,
   line int,
   value text,
   PRIMARY KEY ((title,chapter),page,line)
 );

 Insert into books(title,chapter,page,line,value) values (‘test’,1,1,1,‘testString’);


         ColumnFamilyで言うと

 books*title:test,chapter:1+*page:1,line:1,value+ = ‘testString’
         ※実際にカンマやコロンで区切られている訳ではない
データ構造
Cassandraは原則 RowKey Column それぞれ1塊しか指定する事ができませ
ん
 RowKeyはリング基準での一塊        ColumnはRowKeyに入っている一塊

        ノード1
                                   [00001]
                                   [00002]
                                   [00003]
 ノード6          ノード2
                                   [00004]
                                   [00005]
                                   [00006]
                                   [00007]
 ノード5          ノード3                [00008]
                                   [00009]
        ノード4                       [00010]

ノード1~2 と ノード4~5 とか        00001 ~ 00003 と 00009~00008
同時に指定することは出来ない            など同時に指定する事はできない
実際のwhere文について

PRIMARY KEY ((title,chapter),page,line)
この場合のRowKey部分のwhere句
・RowKeyを含める場合は確実にRowKey全てを含める事
 ○ select * from books where title = 'book1' and chapter = 1
 × select * from books where chapter = 1
 × select * from books where title = 'book1'

・RowKeyで範囲検索をする際はtokenを使用する事
 (パーテショナーを理解してから使用する事)
 ○ select * from books where token(title,chapter) >= token('book1', 1)
                         and token(title,chapter) <= token('book1', 99)
 × select * from books where token(title) >= token('book1')
                         and token(title) <= token('book1')
実際のwhere文について
PRIMARY KEY ((title,chapter),page,line)
この場合のColumn部分のwhere句
・Columnで検索する際は宣言した順番に指定する必要がある
 またallow filtering は複数のRowKeyから指定したColumnを取得する場合に付与しなければならない
  ○ select * from books where page = 1 allow filtering
  × select * from books where line = 1 allow filtering
  ○ select * from books where page = 1 and line = 1 allow filtering

・取得するRowKeyが一つの場合は allow filtering は付与しなくてもよ
い○ select * from books where title = 'book1' and chapter = 1 and page = 1
  ○ select * from books where title = 'book1' and chapter = 1 and page = 1 allow filtering

・Columnで範囲検索をする場合は一つのColumnのみ指定できる
  ○ select * from books where title = 'book1' and chapter = 1 and page >= 1 and page <= 99
  × select * from books where title = 'book1' and chapter = 1 and page >= 1 and line >= 1
実際のwhere文について
Primary key 以外のカラムをwhere文で使用したい場合
そのカラムにインデックスを張る
 CREATE INDEX [<indexname>] ON <cfname> ( <colname> )

 カラムファミリ booksのvalueというカラムにインデックスを張る場合
 CREATE INDEX ON books (value);

 value を使用して問い合わせる
 select * from books where value = ‘test’


 パーテーションキーが複合キーの場合
 where句でパーテーションキーとの併用が・・・・
 あと COMPACT STRAGE には使用できない・・・・
COMPACT STORAGEについて
 COMPACT STORAGE はPrimary Key 以外のカラムを一種類だけにして
 メタデータを省略する事によって、データ容量を削ったテーブル

     CREATE TABLE books (
       title text,            Primary Key以外は一つだけしか
       chapter int,                     宣言できない
       page int,
       line int,
       value text,
       PRIMARY KEY ((title,chapter),page,line)
     ) WITH COMPACT STORAGE;


 このテーブルのvalueにはインデックスを指定する事ができない

 しかし cassandra-cli で使用可能になる
 (cqlsh -2 ではだめだった・・ 複合キーの区切りは“:”・・
ByteOrderedPartitioner
にする事で可能なクエリ
 ・パーテーションキーの範囲検索がColumnと同じように可能

 例えば
   CREATE TABLE books (
     title text,
     chapter int,
     page int,
     line int,
     value text,
     PRIMARY KEY ((title,chapter),page,line)
   );

 の場合
   Select * from books where title = ‘text’ and chapter > 3
                         and page = 1
                         and line >= 3 and line < 8 allow filtering
ByteOrderedPartitioner
 にする事で可能なクエリ
     ・複合パーテーションキーでのインデックス2個目の範囲検索
     例えば
CREATE TABLE books (
  title text,
  chapter int,                              で、こんなクエリが可能
  page int,
  line int,                                 Select * from books where title = ‘text’ and chapter > 3
  value1 text,                                                    and page = 1
  value2 text,                                                    and line >= 3 and line < 8
  value3 text,                                                    and value1 = ‘test’
  PRIMARY KEY ((title,chapter),page,line)                         and value2 > ‘a’ and value2 < ‘z’
);                                                                allow filtering
CREATE INDEX idx_001 ON books (value1);
CREATE INDEX idx_002 ON books (value2);

     逆を言えば複合パーテーションキーでインデックス2個目の範囲検索は
     ByteOrdered以外の場合は出来ない
CQL3って・・・



• 元々のデータ構造を知らないと苦労する
• SQLだからって夢見んな
• ここに来てByteOrdered + vnodeに光が差し込む
      OrderPreservingPartitionerはバグってCQL3だと使えないけどこれ
      は・・・・
ご清聴ありがとうございま
した

More Related Content

What's hot

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術Kohsuke Yuasa
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
MySQLerの7つ道具 plus
MySQLerの7つ道具 plusMySQLerの7つ道具 plus
MySQLerの7つ道具 plusyoku0825
 

What's hot (8)

Cassandra12to20
Cassandra12to20Cassandra12to20
Cassandra12to20
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
MySQLerの7つ道具 plus
MySQLerの7つ道具 plusMySQLerの7つ道具 plus
MySQLerの7つ道具 plus
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 

Similar to 1.2新機能と1.2から始めるcql3

2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックスkeki3
 
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)YoheiOkuyama
 
Random partionerのデータモデリング
Random partionerのデータモデリングRandom partionerのデータモデリング
Random partionerのデータモデリング2t3
 
cassandra調査レポート
cassandra調査レポートcassandra調査レポート
cassandra調査レポートAkihiro Kuwano
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介Satoshi Hirata
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門Yoshiyuki Asaba
 

Similar to 1.2新機能と1.2から始めるcql3 (9)

2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス
 
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
 
Random partionerのデータモデリング
Random partionerのデータモデリングRandom partionerのデータモデリング
Random partionerのデータモデリング
 
M1 gp_Disco
M1 gp_DiscoM1 gp_Disco
M1 gp_Disco
 
kibayos_ov_090922
kibayos_ov_090922kibayos_ov_090922
kibayos_ov_090922
 
cassandra調査レポート
cassandra調査レポートcassandra調査レポート
cassandra調査レポート
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

1.2新機能と1.2から始めるcql3

  • 2. 自己紹介 関 あつお (twitter : @atsuoon) 株式会社INTHEFOREST エンジニア 職歴 OSS関係の会社に入社後その会社が潰れ その後 某レストラン検索サイトで4,5年派遣として 働く
  • 3. Agenda ・Cassandra1.2の新機能について さくっとご紹介 ・Cassandra1.2から始めるCQL3 自分が苦しんだ内容全般
  • 5. Cassandra1.2の新機能について バーチャルノード ノードに複数のトークンをランダムで自動設定 ノード1 利点 ノード2 ノード3 ・ノードの立ち上げ、取り外しが早くなる ノード3 ノード2 ・トークン設定しなくてもいい ノード3 ノード3 ・バイト順のパーテショナーでも分散 難点 ノード1 ノード1 ・トークンの決め打ちができない ・リングの状態見辛い ノード2 ・色々ある不具合 ノード1 ノード1 ノード3 ノード2 ノード3 ノード2 ノード1 ノード2
  • 6. Cassandra1.2の新機能について リクエストトレース CQL3でクエリの処理内容や かかった時間など把握する事ができる 利点 ・ボトルネックが把握しやすくなる 難点 ・重い
  • 7. Cassandra1.2の新機能について アトミックバッチ 従来のバッチではバッチ処理中に 処理中のノードとそのノードにバッチクエリを渡したノードが落ちた際 データロストに繋がっていたが バッチ処理を行う前にsystem.batchlogにバッチ内容を書き込む事によって 途中で落ちても立ち上げたときよしなにしてくれるようになった 利点 ・バッチの信頼性が高くなった 難点 node ・バッチ自体重いのにさらに重い バッチ実行中に複数のサーバーが 落ちても何とかしてくれます
  • 8. Cassandra1.2の新機能について JBOD 1.1でもディレクトリを複数設定できるが 1つのカラムファミリが複数のディレクトリに分散はされない 1.2では分散されるようになった 利点 ・Raidを組まなくてよくなる ・I/Oのリソースが確保しやすい data1 ・保守しやすい 難点 Column Family data2 ・得に無い、強いて言えば memtable_flush_writerが増える data3
  • 9. Cassandra1.2の新機能について ディスク障害ポリシー ディスク障害時の時の挙動を3つのうちから選べるようになった 利点 ・運用の明確化 ・best_effortでホットスワップが可能 stop : ディスク障害時、プロセスはダウンしないがgossipとThriftは行われない best_effort : ディスク障害時、gossip、thriftは止めず動作し続けるが、問題あるディレクトリの 書込みは止まる、読込みも出来ない場合は読込みも止まるが 出来る場合は読込みは通常に行われる ignore : 単にリクエストがエラーになる 難点 ・best_effortでCL:ONEの読込みをした際 古い情報が取れる可能性を考えなければならない
  • 10. Cassandra1.2の新機能について CLQ3 Native Protocol CQL3ではネイティブプロトコルとしてThriftを使用せずに Cassandra独自のプロトコルを使用する事ができるようになった 利点 ・ノード間のスキーマ反映などが高速に ・複数のリクエストを同時に処理 難点 ・Thrift対応が消える今後の可能性・・ CQLのクエリは ・まだベータ的な扱い Cassandra Thriftを使用していた Cassandra ・扱ってるクライアントが少ない Thrift Thrift CQL3 CQL3 1.2は新しくCQL3用の Protocolが追加された
  • 11. Cassandra1.2の新機能について CQL3 Sets, Maps, Lists のコレクション対応 CQL3ではSets Maps Lists の型がカラムとして入れられるようになった 利点 ・シリアライズ化して突っ込まなくてもよくなった 難点 ・プライマリーキーとして宣言は出来ない CREATE TABLE points ( id text PRIMARY KEY, point list<int> ); id | point insert into points (id, point) values ('test',[2,4,7,9]); = ------+-------- test | [2, 7] update points set point = point - [4, 9] where id = 'test‘; select * from points;
  • 12. Cassandra1.2の新機能について 新パーテショナー Murmur3 RandomPartitionerの早い安い旨い版 利点 ・早い ・数値が少ない ・シノニムが生じるのが少ない 難点 ・範囲変わって計算の仕方も変わった ・しれっとデフォルトに・・ ・RandomPartitionerのレンジ範囲 0 ~ 2^127 ( 0 ~ 170141183460469231731687303715884105728 ) ・Murmur3Partitionerのレンジ範囲 -2^63 ~ 2^63 - 1 ( -9223372036854775808 ~ 9223372036854775807 ) python -c 'print [((2**64 / リングのノード数) * i) - 2**63 for i in range(リングのノード数)]
  • 13. Cassandra1.2の新機能について 他、いくつかの追加や変更 ・hinted-handoff のスレッド数とパフォーマンスの設定 ・認証がクライアントとサーバーで別々に設定可能 ・Leveled Compactionでwrite heavy時の対策 ・タイムアウト関係の設定が追加 ・ノード間の通信を圧縮するかしないかの設定 ・compression時のメタデータをJVMのヒープから外出し ・CQL3でノードの情報を取得可能 ・カラムインデックスの改良 ・DC間通信時のパケットの設定 お、多い、、、
  • 18. CQL3って・・? CQL3さんの主張 CassandraでSQLが使えるよ! CQL3からカラムファミリがテーブルになったよ! しかも複合キーも使用可能になったよ! これでRDBMSからの移行もしやすいよね(震え声) 兎にも角にも CQL3を使用する為に bin/cqlsh を使ってみよう
  • 19. CQL3を使用してみる Keyspaceとtableを作成 CREATE KEYSPACE space WITH strategy_class = 'SimpleStrategy' AND strategy_options:replication_factor=1 しかしうまくいかな い・・・ 実は1.1のCQL3と1.2のCQL3は別物 (1.2のCQLとして1.1のCQLが資料として乗っている場合がある)
  • 20. CQL3を使用してみる 気を取り直してKeyspaceとtableを作成 CREATE KEYSPACE space WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': '1' }; 定義が違う use space; CREATE TABLE books ( 複合キーを使用する場合は title text, 連ねて宣言する chapter int, page int, line int, value text, PRIMARY KEY (title,chapter,page,line) ); Insert into books(title,chapter,page,line,value) values (‘test’,1,1,1,‘testString’);
  • 21. CQL3を使用してみる select文でwhere句を試そう select * from books where title = 'test' ○取得できた select * from books where chapter = 1 ×allow filter? select * from books where chapter = 1 allow filtering ○取得できた select * from books where title = 'test' and chapter = 1 ○取得できた select * from books where page = 1 ×取得できない select * from books where title = 'test' and page = 1 ×取得できない select * from books where title = 'test' and chapter = 1 and page = 1 ○取得できた select * from books where title = 'test' and chapter = 1 and line = 1 ×取得できない select * from books where value = 'testString' ×取得できない なぜ?! ここでRDBMSから1.2に直接入ってきた人間はじわじわ死ぬ
  • 22. CQL3を使用してみる 実は・・・ 複合キーの宣言の仕方が違う PRIMARY KEY ((title,chapter,page,line)) もう一つ括弧でくくればよい
  • 23. CQL3を使用してみる Table を変更してもう一度試してみよう select * from books where title = 'test' ×取得できない select * from books where chapter = 1 ×取得できない select * from books where chapter = 1 allow filtering ×取得できない select * from books where title = 'test' and chapter = 1 ×取得できない select * from books where page = 1 ×取得できない select * from books where title = 'test' and page = 1 ×取得できない select * from books where title = 'test' and chapter = 1 and page = 1 ×取得できない select * from books where title = 'test' and chapter = 1 and line = 1 ×取得できない select * from books where value = 'testString' ×取得できない 悪化したんですけどお!!!!11!
  • 24. 複パ 複複 合ー キテ 合合 ーー だシ キキ けョ どン ーー なキ !ー では ラカ の も サ ン ド ここでRDBMSから1.2に直接入ってきた人間は死ぬ
  • 25. データ構造 パーテーションキーを知る場合 今までのデータ構造を知ると良い リング一周 -2^63 ~ 2^63 – 1 (パーテショナーがMurmur3の場合) テーブルではなくカラムファミリ ColumnFamily[RowKey][Column] = value ノード1 ノード6 ノード2 RowKey パーテショ ナー ノード5 ノード3 RowKeyの値を変換 ノード4 RowKey = パーテーションキー 値によってリングのどこ に位置するデータか決ま る
  • 26. データ構造 PRIMARY KEYの指定はColumnFamilyで 当てはめた考え方のほうが理解しやすい ColumnFamily[RowKey][Column] = value で言うPRIMARY KEYは PRIMARY KEY ((RowKey),Column) PRIMARY KEY ((title,chapter),page,line) の場合ColumnFamilyで言う ColumnFamily[title,chapter][page,line]
  • 27. データ構造 以下のようなデータを入れた場合 CREATE TABLE books ( title text, chapter int, page int, line int, value text, PRIMARY KEY ((title,chapter),page,line) ); Insert into books(title,chapter,page,line,value) values (‘test’,1,1,1,‘testString’); ColumnFamilyで言うと books*title:test,chapter:1+*page:1,line:1,value+ = ‘testString’ ※実際にカンマやコロンで区切られている訳ではない
  • 28. データ構造 Cassandraは原則 RowKey Column それぞれ1塊しか指定する事ができませ ん RowKeyはリング基準での一塊 ColumnはRowKeyに入っている一塊 ノード1 [00001] [00002] [00003] ノード6 ノード2 [00004] [00005] [00006] [00007] ノード5 ノード3 [00008] [00009] ノード4 [00010] ノード1~2 と ノード4~5 とか 00001 ~ 00003 と 00009~00008 同時に指定することは出来ない など同時に指定する事はできない
  • 29. 実際のwhere文について PRIMARY KEY ((title,chapter),page,line) この場合のRowKey部分のwhere句 ・RowKeyを含める場合は確実にRowKey全てを含める事 ○ select * from books where title = 'book1' and chapter = 1 × select * from books where chapter = 1 × select * from books where title = 'book1' ・RowKeyで範囲検索をする際はtokenを使用する事 (パーテショナーを理解してから使用する事) ○ select * from books where token(title,chapter) >= token('book1', 1) and token(title,chapter) <= token('book1', 99) × select * from books where token(title) >= token('book1') and token(title) <= token('book1')
  • 30. 実際のwhere文について PRIMARY KEY ((title,chapter),page,line) この場合のColumn部分のwhere句 ・Columnで検索する際は宣言した順番に指定する必要がある またallow filtering は複数のRowKeyから指定したColumnを取得する場合に付与しなければならない ○ select * from books where page = 1 allow filtering × select * from books where line = 1 allow filtering ○ select * from books where page = 1 and line = 1 allow filtering ・取得するRowKeyが一つの場合は allow filtering は付与しなくてもよ い○ select * from books where title = 'book1' and chapter = 1 and page = 1 ○ select * from books where title = 'book1' and chapter = 1 and page = 1 allow filtering ・Columnで範囲検索をする場合は一つのColumnのみ指定できる ○ select * from books where title = 'book1' and chapter = 1 and page >= 1 and page <= 99 × select * from books where title = 'book1' and chapter = 1 and page >= 1 and line >= 1
  • 31. 実際のwhere文について Primary key 以外のカラムをwhere文で使用したい場合 そのカラムにインデックスを張る CREATE INDEX [<indexname>] ON <cfname> ( <colname> ) カラムファミリ booksのvalueというカラムにインデックスを張る場合 CREATE INDEX ON books (value); value を使用して問い合わせる select * from books where value = ‘test’ パーテーションキーが複合キーの場合 where句でパーテーションキーとの併用が・・・・ あと COMPACT STRAGE には使用できない・・・・
  • 32. COMPACT STORAGEについて COMPACT STORAGE はPrimary Key 以外のカラムを一種類だけにして メタデータを省略する事によって、データ容量を削ったテーブル CREATE TABLE books ( title text, Primary Key以外は一つだけしか chapter int, 宣言できない page int, line int, value text, PRIMARY KEY ((title,chapter),page,line) ) WITH COMPACT STORAGE; このテーブルのvalueにはインデックスを指定する事ができない しかし cassandra-cli で使用可能になる (cqlsh -2 ではだめだった・・ 複合キーの区切りは“:”・・
  • 33. ByteOrderedPartitioner にする事で可能なクエリ ・パーテーションキーの範囲検索がColumnと同じように可能 例えば CREATE TABLE books ( title text, chapter int, page int, line int, value text, PRIMARY KEY ((title,chapter),page,line) ); の場合 Select * from books where title = ‘text’ and chapter > 3 and page = 1 and line >= 3 and line < 8 allow filtering
  • 34. ByteOrderedPartitioner にする事で可能なクエリ ・複合パーテーションキーでのインデックス2個目の範囲検索 例えば CREATE TABLE books ( title text, chapter int, で、こんなクエリが可能 page int, line int, Select * from books where title = ‘text’ and chapter > 3 value1 text, and page = 1 value2 text, and line >= 3 and line < 8 value3 text, and value1 = ‘test’ PRIMARY KEY ((title,chapter),page,line) and value2 > ‘a’ and value2 < ‘z’ ); allow filtering CREATE INDEX idx_001 ON books (value1); CREATE INDEX idx_002 ON books (value2); 逆を言えば複合パーテーションキーでインデックス2個目の範囲検索は ByteOrdered以外の場合は出来ない
  • 35. CQL3って・・・ • 元々のデータ構造を知らないと苦労する • SQLだからって夢見んな • ここに来てByteOrdered + vnodeに光が差し込む OrderPreservingPartitionerはバグってCQL3だと使えないけどこれ は・・・・