Cassandra

[ガラケー版(QRコード)]
アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
 作成日時分類記事タイトル
12013/11/01Cassandracassandra2.0: インストール&プ..
 反応日時来客名来客者の最近のメッセージ
12017/07/18返信ありがとうございます伝わってないっぽいですね評価ページの..
22017/07/18ブログの更新といえば、ということで更新したブログだと評価ペー..
32017/05/11uyam度々、すごーく、すいません。こんばんわ!uyamです。先日、..
42017/05/11オルタフォースお帰りなさいませ。そして、諸問題への対処お疲れさまでした。毎..
52017/04/20 非論客コメント
その他最近のコメント
1.
2013/11/01 Cassandra > cassandra2.0: インストール&プログラミング(install & perl programming)」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. cassandraを使用する目的
    1. cassandraの特徴
        1. 高可用性(単一障害ポイントとなるマスターが無い)
        2. データモデルの途中変更が容易
        3. 空の項目でディスクの無駄が発生しない
        4. ノードを追加していけば、それに比例してキャパシティは増えていく
    2. cassandra0~1.x系とcassandra2.x系の違い
    3. riakとの比較
2. インストールの想定例
3. インストールの前準備
    1. サーバーの手配と/etc/hostsでの名前定義
    2. iptablesの設定
    3. cassandraのコマンドへのパスを通す
4. インストール手順
    1. 各サーバーでの共通インストール手順
    2. Configの調整 (複数台でクラスターを構築用途)
    3. cassandraの起動・停止スクリプトの設置
5. cassandraへの接続テスト
6. インストールで参考にしたサイト・情報源
7. 開発
    1. Apache Thriftでのアクセス
        1. Apache Thrift のインストール
        2. Thriftを使ったPerlでのアクセスの環境の用意
        3. Thrift + perlでのプログラムの実稼動
    2. perlcassaでのアクセス
    3. プログラムの勘所
8. その後の学習
    1. Cassandraの基礎知識
        1. データ一貫性
        2. データタイプ
9. cassandraの運用
    1. nodetool

1. cassandraを使用する目的


    1. cassandraの特徴


      1. 高可用性(単一障害ポイントとなるマスターが無い)

riakとかと同じくring型なので、マスターとなるものが存在しません。
結果的にサーバーが複数台落ちても、枕を高くして寝れる、高可用性を実現しています。
      2. データモデルの途中変更が容易

talbeに新しいタイプのコラムを追加してもmysqlの様にそれに時間がかかったり、lock状態になったりする事はありません。
平たく言えばxmlで項目定義を追加しても既存データには何の影響も無いのと同じですね。
      3. 空の項目でディスクの無駄が発生しない

Mysqlとかは各レコードに対してカラムを定義した分、そこに値が無くてもディスクスペースを使用してしまいますが、cassandraの場合はそうした事はありません。
なので、数千にも渡る項目を持つレコードを持つけれども、必ずしもその値があるとは限らないデータに対して、極めて有効なデータモデルとなっています(mysqlでそういうのを実現するのは、極めて効率が悪い悪手)。
      4. ノードを追加していけば、それに比例してキャパシティは増えていく

ノードの追加は非常に簡単です。
    2. cassandra0~1.x系とcassandra2.x系の違い

データモデルとしてsuper columnは無くなってcomposite columnを使うようにとなったり、差がある模様。
旧来の文章は大体0~1.x系向けに書かれているので、2.x系は公式系の文章から読み直した方が良さそう。
また、2.x系はまだ新しいので、DBではありますが、枯れていない点もあります(例: 2.02ではタイムアウトが頻発していたが2.03になったら解決した)。
    3. riakとの比較

可用性の強固性ではriakと同じring型なので、モデル的には同じ強固性があると言えます。

使い勝手について言えば、riakも2.x系がリリースされたら状況が変わる部分があるようですが、riak1はvector clockとsibligingsという、値の一貫性を保持する為の手順がアプリ側に負担が寄せられていて、書き込む前には絶対Readしてvector clockの取得を先にしないといけない、衝突が起きる事を前提に解決処理を組込まないといけない、そしてそれが複数台で使う時にはどんな状況でも強制される為、とりあえず使い始めるという用途では開発初期コストが余計にかかって、非常に使い難いなと感じていました。
勿論、これが強制される分、データの一貫性の担保が要求される金融系にはより向いていると言えるのかもしれませんが。
riakはnativeプロトコル以外にhttpプロトコルでの通信が出来るという点では使い易いですが、初期実装コストの高さから個人的には1.x系の時点では放り投げました。

cassandraは、そうした面倒な事はなさそうですが、それをしない事で起きる問題は自分で見る必要は生じます。
とはいえ、自分で調整出来る事なので、それで全然問題ないのですが(riak1.x CSの設計が固過ぎる)。
DBへのアクセスでは、CQLというSQLに似た言語のサポートと、Apache Thriftという各言語からアクセスの共通APIのようなものを提供しているので、アクセス性には然程問題がない筈です(これから開発して試してみる予定)。

データの構造としては、riakは2階層迄のKVSですが、cassandraはRDBとKVSの混合型とも言われるカラム指向データモデルなので、データのモデルとしてはより現実のモデルに似せたデータモデルの記述が可能とは言えると思います。

総合的に鑑みて、自分の用途にではcassandraがベストマッチと判断したので、cassandraを試してみる事にしました。
2. インストールの想定例

・複数台で構築する
・cassandra1を手始めに、cassandra2, cassandra3と参加ノードを増やしていく。
なお、使ったのはcassandra2.0x系。
3. インストールの前準備


    1. サーバーの手配と/etc/hostsでの名前定義

自分の場合は
cassandra1
cassandra2
cassandra3
cassandra4
cassandra5
と単純に名付けた。
外部からアクセスするIPと結びつけます。
    2. iptablesの設定

cassandraでは以下のポートを使う。

7000クラスタ間通信用
7001クラスタ間通信用(SSL)
7199JMX
9042CQL native transport
9160Thriftクライアント

iptablesを使ったりして、外部からは上記ポートにはアクセス出来ないが、
指定したサーバー間では上記ポートにアクセスし合えるように設定しておく。
    3. cassandraのコマンドへのパスを通す

cassandraのコマンドを使うアカウントの.bash_profileのPATHに
/usr/local/cassandra/bin
を追加しておく。
4. インストール手順


    1. 各サーバーでの共通インストール手順

README.txt 
が参考になるが、以下のような手順で自分はインストールした。

お名前.comの場合のおまじない
mkdir -p /data/cassandra;
ln -s /data/cassandra /var/lib/cassandra;

Javaのインストール
mkdir -p ~/src;
cd ~/src;
/bin/rm jre*;
wget http://javadl.sun.com/webapps/download/AutoDL?BundleId=81811
rpm -i jre*;
java -version;

cd ~/src;
VERSION=2.0.3;
wget http://ftp.riken.jp/net/apache/cassandra/$VERSION/apache-cassandra-$VERSION-bin.tar.gz
tar xvfz apache-cassandra-$VERSION-bin.tar.gz 
cd apache-cassandra-$VERSION

mkdir -p /var/log/cassandra
chown -R `whoami` /var/log/cassandra
mkdir -p /var/lib/cassandra
chown -R `whoami` /var/lib/cassandra
cd ..
mv apache-cassandra-$VERSION /usr/local/
cd /usr/local
rm -f cassandra;
ln -s apache-cassandra-$VERSION cassandra

cd /usr/local/cassandra/lib;
wget https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar

# ここでconfigの内容をサーバー毎に調整
    2. Configの調整 (複数台でクラスターを構築用途)

各サーバーの
/usr/local/cassandra/conf/cassandra.yaml
を編集する。

1) クラスターに参加しているサーバー情報を共有するサーバー、seedサーバーを決める。
cassandra1とcassandra2にする

2) 各サーバーの/usr/local/cassandra/config/cassandra.yamlを編集する
cassandra3というサーバーの場合
# 最初のnode以外にはauto_bootstrapを追加する
auto_bootstrap: true

cluster_name: 'sakuhindb_cluster' 

seed_provider:
 - class_name: org.apache.cassandra.locator.SimpleSeedProvider
 parameters:
 - seeds: "cassandra1,cassandra2"

# 外部からアクセスしてくるIPに対して定義されている自分のホスト名を記述 #
listen_address: cassandra3

rpc_address: cassandra3

    3. cassandraの起動・停止スクリプトの設置

vi /etc/init.d/cassandra
# chkconfig: 345 99 1
# description: cassandra
# processname: cassandra
#!/bin/sh

CASSANDRA_BIN=/usr/local/cassandra/bin/cassandra
CASSANDRA_PID=/var/run/cassandra.pid

case "$1" in
 start)
 $CASSANDRA_BIN -p $CASSANDRA_PID
 echo "Running Cassandra"
 ;;
 stop)
 kill `cat $CASSANDRA_PID`
 rm -f $CASSANDRA_PID
 echo "Stopped Cassandra"
 ;;
 *)
 echo "Usage: $0 {start|stop}"
 exit 1
esac
exit 0

chmod 755 /etc/init.d/cassandra;
chkconfig --add cassandra;
chkconfig --list cassandra;

# cassandra起動 #
/etc/init.d/cassandra start;

nodetool status;
5. cassandraへの接続テスト

# cassandra1というサーバーにアクセスするのなら
cqlsh cassandra1;

# README.txt にある例
CREATE SCHEMA schema1 WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
USE schema1;
CREATE TABLE users (
 user_id varchar PRIMARY KEY,
 first varchar,
 last varchar,
 age int
 );

INSERT INTO users (user_id, first, last, age) 
VALUES ('jsmith', 'John', 'Smith', 42);

SELECT * FROM users;

6. インストールで参考にしたサイト・情報源

公式の文章以外はバージョン違いで時代遅れになっている所もあるので、程々にという感じで読む。

casssandra内にあるREADME.txt

http://wiki.apache.org/cassandra/MultinodeCluster_JP
http://www.intra-mart.jp/download/product/iap/setup/cassandra_administrator_guide/texts/install/linux.html
http://www.datastax.com/documentation/cassandra/2.0/webhelp/index.html
http://shin-yuan.blogspot.jp/2011/05/cassandraperl.html
7. 開発


    1. Apache Thriftでのアクセス


      1. Apache Thrift のインストール

# OSに入っているautoconfのバージョンが足りなかったので #
cd ~/src;
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz;
tar xvfz autoconf-2.69.tar.gz;
cd autoconf-2.69;
./configure;
make;
make install;
cd ..;

# yaccの為 #
yum install flex bison

cd ~/src;
# C++のエラー回避の為gitからダウンロード #
git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift; 
cd thrift;

# for perl #
cpan Bit::Vector;
./configure;

# ここでお目当ての言語がyesにならなければその言語に関係するnoの部分について調べて解決させる #

make;
make install;
      2. Thriftを使ったPerlでのアクセスの環境の用意

インストールしたthriftを使って

thrift --gen perl /usr/local/cassandra/interface/cassandra.thrift

と打つと、

gen-perl/
gen-perl/Cassandra
gen-perl/Cassandra/Cassandra.pm
gen-perl/Cassandra/Types.pm
gen-perl/Cassandra/Constants.pm

が出来る。

自分の使っているperlのある場所を確認して

cp -r gen-perl/Cassandra /usr/local/lib/perl5/site_perl/5.14.4/

としてその中身をコピー。
また、

/usr/local/lib/perl5/Thrift* /usr/local/lib/perl5/site_perl/5.14.4/

で使える所に移動させる。

あと、UUIDを使う為、

cpan Data::UUID

でモジュールをインストールしておく。
      3. Thrift + perlでのプログラムの実稼動


Cqlを使ったプログラム例が存在しなかったので、少々苦労した。
Integerの返り値の処理とかが必要になる。

プログラム(詰めていないので更に下の例になるperlcassa版に比べてかなり適当)
#!/usr/bin/perl -w
use strict;
use warnings;

use Cassandra::Cassandra;
use Cassandra::Constants;
use Cassandra::Types;

use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::FramedTransport;

use Data::Dumper;
use Data::UUID;

my $socket = new Thrift::Socket( 'cassandra3', 9160 );
my $transport = new Thrift::FramedTransport( $socket, 1024, 1024 );
my $protocol  = new Thrift::BinaryProtocol($transport);
my $client    = new Cassandra::CassandraClient($protocol);
my $compression = Cassandra::Compression::NONE;
my $consistency = Cassandra::ConsistencyLevel::QUORUM;

# die でエラーを
eval {
  $transport->open();
  {
    my @qs=(
      "CREATE KEYSPACE IF NOT EXISTS test WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }",
      'USE test',
      'DROP TABLE IF EXISTS playlists',
      #  'CREATE TABLE IF NOT EXISTS test_users (user_id varchar PRIMARY KEY, first varchar, last varchar, age int) WITH COMPACT STORAGE',
      'CREATE TABLE playlists (
  id uuid,
  song_order int,
  song_id uuid,
  title text,
  album text,
  artist text,
  PRIMARY KEY  (id, song_order ) )',

      "CREATE INDEX ON playlists(artist)"

      "INSERT INTO playlists (id, song_order, song_id, title, artist, album)
  VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 1,
  a3e64f8f-bd44-4f28-b8d9-6938726e34d4, 'La Grange', 'ZZ Top', 'Tres Hombres')",

      "INSERT INTO playlists (id, song_order, song_id, title, artist, album)
  VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 2,
  8a172618-b121-4136-bb10-f665cfc469eb, 'Moving in Stereo', 'Fu Manchu', 'We Must Obey')",

      "INSERT INTO playlists (id, song_order, song_id, title, artist, album)
  VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 3,
  2b09185b-fb5a-4734-9b56-49077de9edbf, 'Outside Woman Blues', 'Back Door Slam', 'Roll Away')",

      "INSERT INTO playlists (id, song_order, song_id, title, artist, album)
  VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 4,
  7db1a490-5878-11e2-bcfd-0800200c9a66,
  'Ojo Rojo', 'Fu Manchu', 'No One Rides for Free')"
      );
    
    foreach my $q (@qs){
      print $q."\n";
      my $result=$client->execute_cql3_query($q, $compression, $consistency);      
#      print Dumper($result);
    }
  }

  {
    my $q = 'SELECT id,song_order, song_id, title, album, artist FROM playlists';# ORDER BY age ASC';
    print $q."\n";
    my $result=$client->execute_cql3_query($q, $compression, $consistency);
   # print Dumper($result);

    # metaデータを先に読み込んで何でdecodeするのか事前設定出来た方が良いね
    
    foreach my $result (@{$result->{'rows'}}){
      my ($id, $song_order, $song_id, $title,  $album, $artist) = ($result->{'columns'}[0]{'value'}, $result->{'columns'}[1]{'value'}, $result->{'columns'}[2]{'value'}, $result->{'columns'}[3]{'value'}, $result->{'columns'}[4]{'value'}, $result->{'columns'}[5]{'value'});
      print join("\t", 'id='.unpack('H32', $id), 'song_order='.read_integer($song_order), 'song_id='.unpack('H32', $song_id), 'title='.$title, 'album='.$album, 'artist='.$artist)."\n";
    }
  }

  
  {
    my $q = "SELECT id,song_order, song_id, title, album, artist FROM playlists where artist = 'Fu Manchu'";
    print $q."\n";
    my $result=$client->execute_cql3_query($q, $compression, $consistency);
   # print Dumper($result);

    
    foreach my $result (@{$result->{'rows'}}){
#      print Dumper($result);
      my ($id, $song_order, $song_id, $title,  $album, $artist) = ($result->{'columns'}[0]{'value'}, $result->{'columns'}[1]{'value'}, $result->{'columns'}[2]{'value'}, $result->{'columns'}[3]{'value'}, $result->{'columns'}[4]{'value'}, $result->{'columns'}[5]{'value'});
      print join("\t", 'id='.unpack('H32', $id), 'song_order='.read_integer($song_order), 'song_id='.unpack('H32', $song_id), 'title='.$title, 'album='.$album, 'artist='.$artist)."\n";
    }
  }
  $transport->close();
};
 
if ($@) {
    warn( Dumper($@) );
}


sub read_integer(){
    my $value= shift;
#    my $data = $self->{trans}->readAll(4);
    my @arr = unpack('N', $value);

    my $value2 = $arr[0];
    if ($value2 > 0x7fffffff) {
      $value2 = 0 - (($value2 - 1) ^ 0xffffffff);
    }
    return $value2;
}

    2. perlcassaでのアクセス

変数の処理面倒だなぁ。
という事でperlcassaで楽する事にしてみた。

perlcassaのインストール
wget https://github.com/mkjellman/perlcassa/archive/master.zip;
unzip master;
cd perlcassa-master/;
perl Makefile.PL;
make;
make install;
cpan Thrift;
cpan Thrift::XS::BinaryProtocol;
cpan Class::Accessor;
cpan Socket6;
cpan Data::UUID;

プログラム(上の例に比べるときっちりしています)
#!/usr/bin/perl -w
=pod
Script by: Hajime Kurita
Distributed at: http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20131101.html
Purpose: Test script for cassandra by perl
Usage:
perl test_cassandra.pl --init; # create keyspace
perl test_cassandra.pl --loop=1000; # insert(=update) and select / find best environment by this
=cut

package test_cassandra;
use strict;

use perlcassa;

use Data::Dumper;
use Data::UUID;

my $pro = new test_cassandra;
$pro->run();

sub new(){
  my $self = {};
  return bless $self;
}

sub run(){
  my $self=shift;
  $self->init_vars();
  $self->test();
}

sub init_vars(){
  my $self=shift;
  $self->{'debug'}=0;
  $self->{'init'}=0;
  $self->{'loop'}=100;
  foreach my $ARGV (@ARGV){
    if($ARGV =~ m!^--debug!){
      $self->{'debug'}++;
    }
    # 初めて実行する時
    elsif($ARGV =~ m!^--init!){
      $self->{'init'}++;
    }
    elsif($ARGV=~ m!^--loop=(\d+)$!){
      $self->{'loop'}=$1;
    }
    else{
      die("Invalid option ".$ARGV);
    }
  }
  $self->{'keyspace'}='test';
  $self->{'client'} = new perlcassa(
    'keyspace' => 'test',
    'seed_nodes' => ['cassandra1', 'cassandra2'],
    'write_consistency_level' => Cassandra::ConsistencyLevel::QUORUM,
    'read_consistency_level' => Cassandra::ConsistencyLevel::QUORUM,
    'port' => '9160'
    );
  $self->{'retry'}=3;
}

sub test(){
  my $self=shift;

  {
    my @qs = ();

    if($self->{'init'}){
      push(@qs, "CREATE KEYSPACE IF NOT EXISTS ".$self->{'keyspace'}." WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }");
      push(@qs, 'DROP TABLE IF EXISTS '.$self->{'keyspace'}.'.playlists',
           'CREATE TABLE IF NOT EXISTS '.$self->{'keyspace'}.'.playlists (
  id uuid,
  song_order int,
  song_id uuid,
  title text,
  album text,
  artist text,
  PRIMARY KEY  (id, song_order ) )');
      push(@qs, "CREATE INDEX ON playlists(artist);");

      
      foreach my $q (@qs){
        print "\n".$q."\n";
        my $result=$self->exec_cassa($q);
      }
    }
  }

  {
    for(my $i=0;$i<$self->{'loop'};$i++){
      print 'Loop '.$i."\n";
      {
        my @qs=();
        # push(@qs, "INSERT INTO ".$self->{'keyspace'}.".playlists (id, song_order, song_id, title, artist, album) VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 1, a3e64f8f-bd44-4f28-b8d9-6938726e34d4, 'La Grange', 'ZZ Top', 'Tres Hombres');");
        
        push(@qs,"INSERT INTO playlists (id, song_order, song_id, title, artist, album) VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 2, 8a172618-b121-4136-bb10-f665cfc469eb, 'Moving in Stereo', 'Fu Manchu', 'We Must Obey');");
        
           
        # push(@qs, "INSERT INTO ".$self->{'keyspace'}.".playlists (id, song_order, song_id, title, artist, album) VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 3, 2b09185b-fb5a-4734-9b56-49077de9edbf, 'Outside Woman Blues', 'Back Door Slam', 'Roll Away');");
        
        push(@qs, "INSERT INTO ".$self->{'keyspace'}.".playlists (id, song_order, song_id, title, artist, album) VALUES (62c36092-82a1-3a00-93d1-46196ee77204, 4, 7db1a490-5878-11e2-bcfd-0800200c9a66, 'Ojo Rojo', 'Fu Manchu', 'No One Rides for Free');");
        
        foreach my $q (@qs){
          if($self->{'debug'}){
            print "\n".$q."\n";
          }
          my $result=$self->exec_cassa($q);
        }
      }

      {
        my @qs=();
        push(@qs, "SELECT id,song_order, song_id, title, album, artist FROM ".$self->{'keyspace'}.".playlists;");
        push(@qs, "SELECT id,song_order, song_id, title, album, artist FROM ".$self->{'keyspace'}.".playlists where artist = 'Fu Manchu';");
        if($self->{'debug'}){
          print "\n".$q."\n";
        }
        #my $results=$self->exec_cassa($q);
      
        my $results = $self->{'client'}->exec($q);
        
        foreach my $dr (@{$results->{'result'}}){
          print join("\t", $dr->{'id'}, $dr->{'song_id'}, $dr->{'title'}, $dr->{'album'}, $dr->{'artist'})."\n";
        }
      }
    }
  }
}

sub exec_cassa(){
  my $self = shift;
  my $q = shift || return;
  my $results = '';
  local $@ = 'start';

  my $cnt=0;
  while($@){
    eval{
      $results = $self->{'client'}->exec($q);
    };
    $cnt++;
    if($self->{'debug'}){
      print Dumper($results);
    }
    
    if($@){
      if($cnt>=$self->{'retry'}){
        last;
      }
      sleep(1);
      next;
    }
    else{
      last;
    }
  }
  return $results;
}
# 最初にkeyspaceも作る処理 #
perl test_cassandra.pl --init;

# 指定回数ループ( 1ループ内に、2update, 2 select) #
perl test_cassandra.pl --loop=1000;

これでベストの結果が出るようにまず環境を調整してみる。
    3. プログラムの勘所

tableの削除&作り直し、接続し直しといった処理には「コスト」がかかる。
popにtable再生成しまくらない、接続はキープする、といった当たり前に処理速度に寄与する事はする事。
8. その後の学習

cqlをプログラム経由で使える所までたどり着いたら、後はcqlの文章
http://www.datastax.com/documentation/cql/3.1/webhelp/index.html
を読み切って、開発に突き進みましょう。
    1. Cassandraの基礎知識


      1. データ一貫性

Cassandraのデータの一貫性は、ring型なのでどこまで必要かを、書き込む時、読み込む時に制御する。
書き込み時のデータ一貫性

[書込み]
一貫性の指定Level挙動
ZERO書き込まれた事を保証しない。バックグラウンドで非同期に書き込まれる。
ANY少なくともどこか一つのノードに書き込まれた事を保証する。
ONEクライアントにレスポンスを返す前に、一つのノードのCommitLogとMemtableに書き込まれた事を保証する。
QUORUMライアントにレスポンスを返す前に、<ReplicationFactor> / 2 + 1 つのノード群に書き込まれた事を保証する。
ALLクライアントにレスポンスを返す前に、<ReplicationFactor>つのノード群にwriteされたことを保証する。

[Read]
一貫性の指定挙動
ZERO利用不可
ANY利用不可
ONE最初にレスポンスを返せるノードからレコードを返す
QUORUM全ノードを探索し、過半数のレプリカからレスポンスを得た時点で最も新しいタイムスタンプのレコードを返す
ALL全ノードを探索し、全ノードからレスポンスを得た時点で最も新しいタイムスタンプのレコードを返す。

1つのプロセスの視点で見ると、QUORUMを書込みと読み込みで指定していれば、最新のデータが得られる事は保証出来る。
複数のプロセスの視点で見ると、ALLで書込み、ALLで読み込みで指定すれば、最新のデータが得られる事は保証出来る。
勿論書込みONE、読み込みONEが最速。
データの一貫性と速度の必要性をよく考えて使う事が必要になる。
      2. データタイプ

タイプ説明
asciiUS-ASCII character string
bigint64-bit signed long
blobArbitrary bytes (no validation), expressed as hexadecimal
booleantrue or false
counterDistributed counter value (64-bit long)
decimalVariable-precision decimal
double64-bit IEEE-754 floating point
float32-bit IEEE-754 floating point
int32-bit signed integer
textUTF-8 encoded string
timestampDate plus time, encoded as 8 bytes since epoch
uuidType 1 or type 4 UUID
timeuuidType 1 UUID only (CQL3)
varcharUTF-8 encoded string
varintArbitrary-precision integer

9. cassandraの運用


    1. nodetool


# 各ノードのstatus
nodetool status; 

# バックアップ
nodetool snapshot;

# ずれの解消等?
nodetool repair;

# column family(=table)のステータス
nodetool cfstats;

# スレッドダンプ
nodetool tpstats;

# 圧縮
nodetool compact;

# 停止中ノードのクラスタからの削除 / nodetool statusで表示されるIDを指定
 nodetool removenode 262567e3-9004-49b8-81cd-52f1fa6d2fe9;

# トークンレンジが変わった時に実行
nodetool removetoken;

コメントする
RSS購読
RSS
ブログ表示スタイル
リスト/携帯(QRコード)
画像/動画/音声/リンク
表示開始年月
分類
全て
1.このサイトについて
2.作品DB開発/運用
3.ホームページ制作技術
4.Perl
5.C言語 / C++
6.検索エンジン&SEO
7.サッカー
8.自分のこと
9.Linux
10.旅行
11.思ったこと
12.パソコン
13.Berkeley DB
14.その他技術系
15.企画
16.スマートフォン
17.鑑賞
18.皆声.jpニュース
19.インターネット業界
20.運用マニュアル(自分用)
21.技術系以外実用書
22.料理
23.ALEXA
24.アニメ
25.会計
26.漫画
27.設計書
28.色々サイト作成
29.サーバー
30.自分専用
31.生活
32.OP/ED/PV
33.ゲーム
34.DB整備
35.新規開始作品紹介
36.英語圏の話題
37.大道芸
38.映画
39.PHP
40.ダイエット
41.Mac
42.JavaScript
43.MySQL
44.介護
45.作品DB作品追加作業
46.BI
47.Web API
48.パフォーマンス
49.インターネットの活用方法
50.Riak
51.Androidアプリ開発
52Cassandra
53.スパム
54.写真
55.iOSアプリ開発
56.AWS
57.マーケティング
58.Web漫画
59.法律
60.mongodb
61.開発環境整備
62.Google Apps Script
63.meteor
64.Pentaho
65.Ansible
66.VPS
67.技術書メモ
68.Vagrant
69.Docker
70.dokuwiki
71.Apple Watch
72.Webサービス
73.セキュリティ
74.Elastic Search
75.Wordpress
76.クラウド
77.英語
78.MVNO
79.シンガポール
80.マレーシア
81.海外生活
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

サイト管理
全まとめ
サーバー管理
定期処理状況
開発予定
削除提案
作品追加依頼
OP/ED追加依頼
OP/ED not found
作品提案承認欄

格言 fromスクライド
この世の理は即ち速さ
20年かければ馬鹿でも
傑作小説を書ける

助けられたら助け返す
それが俺のルール

強くなるには
一番弱い考えをする事だ
そしてその考えに反逆する




右側に何か入れてみるテスト


仕事でのサイト
介護DB
Helpyou
Doctor career
Nurse career
上へ ↑上へ 最速検索作品DB皆声