±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁËcassandra°²×°»·¾³ÅäÖ㬴¼¯ÈºµÄ¹ý³Ì£¬CQLµÄʹÓÃÒÔ¼°µÈ£¬Ï£ÍûÄܶÔÄúÓÐËù°ïÖú¡£ |
|
1»ù±¾°²×°
1.1ÔÚ»ùÓÚRHELµÄϵͳÖа²×°Cassandra
1.1.1±ØÒªÌõ¼þ
YUM°ü¹ÜÀíÆ÷
Root»òsudoȨÏÞ
JRE6»òÕßJRE7
JNA(Java native Access)£¨Éú²ú»·¾³ÐèÒª£©
1.1.2²½Öè
°²×°ÅäÖÃJRE(ÂÔ)
Ìí¼ÓÈí¼þ°ü²Ö¿âµ½YUMµÄÈí¼þ¿â
½«ÒÔÏÂÄÚÈÝÌí¼Ó½ø/etc/yum.repos.d/datastax.repoÎļþ¼´¿É£º
[datastax]
name = DataStax Repo for ApacheCassandra
baseurl =http://rpm.datastax.com/community
enabled = 1
gpgcheck = 0 |
°²×°2.0°æ×îеÄÈí¼þ°ü
°²×°JNA
¾¹ýÉÏÊö²½Öè¼´°²×°ºÃÁËCassandra£¬Ëæºó±ã¿É¶ÔÆä½øÐÐÅäÖá£ÒÔ´Ë·½Ê½°²×°µÄCassandra»á´´½¨Ò»¸öÃûΪcassandraµÄÓû§£¬cassandraÒÔ´ËÓû§Æô¶¯·þÎñ¡£
1.2ÔÚÈÎÒâ»ùÓÚLinuxµÄϵͳÖа²×°Cassandra
1.2.1±ØÒªÌõ¼þ
JRE6»òÕßJRE7
JNA(Java native Access) £¨Éú²ú»·¾³ÐèÒª£©
1.2.2²½Öè
°²×°ÅäÖÃJRE(ÂÔ)
ÏÂÔØCassandra¶þ½øÖÆ tarball
ÓÉÒ³ÃæÊÖ¹¤ÏÂÔØ¶ÔÓ¦°æ±¾µÄCassandra£¬»òÕßͨ¹ý
curl -OLhttp://downloads.datastax.com /community/dsc.tar.gz
ÃüÁî×Ô¶¯ÏÂÔØ×îеÄDataStaxCommunity£¬Ò²¿ÉÓÉÒ³ÃæÊÖ¹¤ÏÂÔØ¶ÔÓ¦°æ±¾¡£
½âѹtarball
tar ¨Cxzvf dsc-cassandra-2.0.0-bin.tar.gz
¸ù¾ÝÏÂÔØµÄ°æ±¾Ò²¿ÉÄÜÊÇ£ºtar ¨Cxzvf apache-cassandra-2.0.0-bin.tar.gz
°²×°ÅäÖÃJNA
2 ÏÂÔØjna.jar¡£
2 ½«ÏÂÔØµÄjna.jarÌí¼Ó½øCassandra°²×°Ä¿Â¼µÄlibĿ¼Ï»ò½«ÆäÌí¼Ó½øCLASSPATH»·¾³±äÁ¿ÖÐ
2 ÔÚ/etc/security/limits.confÎļþÖмÓÈëÈçÏÂÐУº
$USER soft memlock unlimited
$USER hard memlock unlimited
ÆäÖÐ$USERΪÔËÐÐcassandraµÄÓû§
´´½¨Êý¾ÝĿ¼ºÍÈÕ־Ŀ¼²¢Ö¸¶¨¸øÓÃÓÚÔËÐÐcassandra·þÎñµÄ¾ßÓÐÏàÓ¦¶ÁдȨÏÞµÄÓû§
$ sudo mkdir/var/lib/cassandra
$ sudo mkdir/var/log/cassandra
$ sudo chown-R $USER: $GROUP /var/lib/cassandra
$ sudo chown-R $USER: $GROUP /var/log/Cassandra |
CassandraÅäÖÃÎļþÖÐĬÈÏʹÓÃÉÏÊöĿ¼·Ö±ð×÷ΪÊý¾ÝĿ¼ºÍÈÕ־Ŀ¼£¬¿É´´½¨²»Í¬µÄĿ¼£¬¸³Óè¶ÔÓ¦µÄȨÏÞ£¬²¢ÔÚÅäÖÃÎļþÖÐÖØÐÂÖ¸¶¨ÒԸıäĬÈÏÐÐΪ¡£
ÖÁ´ËÒѰ²×°ºÃÁËCassandra£¬Ëæºó±ã¿É¶ÔÆä½øÐÐÅäÖá£
2¼òµ¥ÅäÖÃ
CassandraµÄÖ÷ÅäÖÃÎļþΪcassandra.yaml£¬ÆäλÖÃËæCassandra°²×°·½Ê½²»Í¬¶ø²»Í¬¡£
¶ÔÓÚCassandraPackage°²×°£º/etc/cassandra/conf
¶ÔÓÚCassandraBinary°²×°£º<install_location>/conf
¶ÔÓÚDataStaxEnterprise Packaged°²×°£º/etc/dse/cassandra
¶ÔÓÚDataStaxEnterpriseBinary°²×°£º<install_location>/resources/cassandra/conf
ÅäÖÃÎļþÖеÄÅäÖòÎÊý±»·ÖΪÈçϼ¸¸ö×é
Initialization properties£º¿ØÖƼ¯ÈºÄڵĽڵãÈçºÎÅäÖ㬰üÀ¨½Úµã¼äͨѶ£¬Êý¾Ý·ÖÇø¼°¸´ÖƲ¼Öá£
Global row and key caches properties£ºÓÃÓÚ»º´æ±íµÄ²ÎÊýµÄÅäÖòÎÊý¡£
Performance tuning properties£ºµ÷ÕûÐÔÄܺÍϵͳ×ÊÔ´µÄÀûÓ㬰üÀ¨ÄÚ´æ¡¢´ÅÅÌI/O¡¢CPU¡¢¶ÁºÍд¡£
Binary and RPC protocol timeout properties£ºÓÃÓÚ¶þ½øÖÆÐÒéµÄ³¬Ê±ÉèÖá£
Remote procedure call tuning£¨RPC£©properties£ºÓÃÓÚÅäÖú͵÷ÕûRPCs£¨¿Í»§¶ËÁ¬½Ó£©
Fault detection properties£ºÓÃÓÚ´¦ÀíÔËÐÐÇé¿ö½Ï²î»òÕßʧ°ÜµÄ½Úµã¡£
Automatic backup properties£ºÓÃÓÚ×Ô¶¯»¯±¸·Ý¡£
Security properties£ºÓÃÓÚ·þÎñÆ÷¶ËºÍ¿Í»§¶ËµÄ°²È«ÉèÖÃ
ÿ¸ö×é°ü¶¼º¬Èô¸É¾ßÌåµÄ²ÎÊý
ÀýÈ磬¶ÔÓÚа²×°µÄCassandra¿ÉÄÜ»áÐÞ¸ÄÅäÖÃÎļþÖеÄÏÂÃæ¼¸¸ö²ÎÊý
data_file_directories£ºÊý¾ÝĿ¼£¬¶ÔÓÚ°ü·½Ê½£¨Èçdeb»òrpm£©°²×°µÄCassandra£¬¸ÃĿ¼»áÔÚ°²×°¹ý³ÌÖÐ×Ô¶¯´´½¨²¢¾ßÓÐÕýÈ·µÄȨÏÞ£¬Ä¬ÈÏλÖÃΪ/var/lib/cassandra/data¡£
commitlog_directory£ºcommit logĿ¼£¬¶ÔÓÚ°ü·½Ê½°²×°µÄCassandra£¬¸ÃĿ¼»áÔÚ°²×°¹ý³ÌÖÐ×Ô¶¯´´½¨²¢¾ßÓÐÕýÈ·µÄȨÏÞ£¬Ä¬ÈÏλÖÃΪ/var/lib/cassandra/commitlog¡£
saved_caches_directory£º±£´æµÄ»º´æÄ¿Â¼£¬¶ÔÓÚ°ü·½Ê½°²×°µÄCassandra£¬¸ÃĿ¼»áÔÚ°²×°¹ý³ÌÖÐ×Ô¶¯´´½¨²¢¾ßÓÐÕýÈ·µÄȨÏÞ£¬Ä¬ÈÏλÖÃΪ/var/lib/cassandra/saved_caches¡£
Èç¹ûÒÔ¶þ½øÖÆ·½Ê½»òÔ´Â뷽ʽ°²×°CassandraÐè×ÔÐд´½¨ÏàӦĿ¼£¬¸³ÓèÕýÈ·µÄȨÏÞ¡£ÓÖ»òÕß²»ÏëʹÓÃĬÈϵÄλÖã¬Ò²¿ÉÒÔ×ÔÐд´½¨ÐµÄĿ¼£¬¸³ÓèÕýÈ·µÄȨÏÞ£¬²¢ÔÚÅäÖÃÎļþÖÐÖ¸¶¨¡£±ÈÈ磺
data_file_directories:/data/cassandra/data
commitlog_directory:/data/cassandra/commitlog
saved_caches_directory:/data/cassandra/saved_caches |
ÁíÍ⣬¶ÔÓÚ°ü·½Ê½°²×°µÄCassandra£¬»¹»áÔÚ°²×°¹ý³ÌÖÐ×Ô¶¯´´½¨
/var/log/cassandra Ŀ¼²¢¸³ÓèÕýÈ·µÄȨÏÞ¡£ ĬÈÏÇé¿öÏÂCassandra½«ÆäÈÕ־д½ø¸ÃĿ¼µÄsystem.logÎļþÖС£¿Éͨ¹ýÐÞ¸Älog4j-server.properiesÎļþ
£¨Óëcassandra.yamlλÓÚͬһĿ¼£©ÖеÄlog4j.appender.R.FileÀ´¸Ä±äĬÈÏÐÐΪ£¬
±ÈÈ磺log4j.appender.R.File=/data/cassandra/system.log
»¹¿ÉÄÜÒªÐÞ¸ÄJVM¼¶±ðµÄ²ÎÊý£¬¸Ã²¿·ÖµÄ²ÎÊý¿ÉÔÚcassandra-env.sh
Îļþ£¨ Óëcassandra.yamlλÓÚͬһĿ¼£©ÖÐÉèÖá£
3Æô¶¯¼°¼òµ¥Ê¹ÓÃ
3.1Æô¶¯Cassandra
¶ÔÓÚ¶þ½øÖưü°²×°·½Ê½
Ö´ÐÐbin/cassandra¨Cf£¬Ç°Ì¨Æô¶¯cassandra£¬cassandra»á½«ÈÕÖ¾Êä³öµ½±ê×¼Êä³öÖС£ÈôûÔÚÊä³öÖп´µ½¡°error¡±¡¢¡°fatal¡±»òÕßÀàËÆ¡°java
stack trace¡±µÄÄÚÈݱíÃ÷cassandra¿ÉÕý³£¹¤×÷¡£¿Éͨ¹ý¡°Control-C¡°Í£Ö¹casandra¡£
Ö´ÐÐbin/cassandra£¬ºǫ́Æô¶¯cassandra¡£
¿Éͨ¹ýkill»òpkillÃüÁîÍ£Ö¹cassandra
¶ÔÓÚYUM°²×°·½Ê½
Ö´ÐÐsudoservice Cassandra startÆô¶¯cassandra
Ö´ÐÐsudoservice Cassandra stop Í£Ö¹cassandra
3.2ʹÓÃcqlsh
Ö´ÐÐbin/cqlsh£¬³öÏÖÈçÏÂÌáʾÔò±íÃ÷Á¬½Ó³É¹¦£¨Ðèpython2.7£©£º
Connected toTest Cluster at localhost:9160.
[cqlsh 4.0.0 |Cassandra 2.0.0 | CQL
spec 3.1.0 | Thrift protocol 19.37.0]
Use HELP forhelp.
¿ÉÔÚcqlshÃüÁîÌáʾ·ûÏÂÊäÈëhelp»ò£¿»ñµÃ°ïÖú£¬ÊäÈëexit»òquitÍ˳öcqlsh£¬ÃüÁîĬÈÏÒÔ¡°;¡±½áÊø¡£
²é¿´keyspace
´´½¨keyspace
CREATEKEYSPACE
mykeyspace WITH REPLICATION = { 'class' : 'SimpleStrategy','replication_factor'
: 2 }; |
Çл»keyspace
´´½¨±í
CREATE TABLEusers
(
user_id int PRIMARY KEY,
fname text,
lname text
); |
²é¿´±í
²åÈëÊý¾Ý
INSERT INTOusers
(user_id, fname, lname)
VALUES (1745, 'john', 'smith');
INSERT INTOusers (user_id, fname, lname)
VALUES (1744, 'john', 'doe');
INSERT INTOusers (user_id, fname, lname)
VALUES (1746, 'john', 'smith'); |
²éѯÊý¾Ý
½¨Á¢Ë÷ÒýºóʹÓÃWHERE´Ó¾ä²éÕÒ
CREATE INDEXON
users (lname);¡¢
SELECT * FROMusers WHERE lname = 'smith'; |
ɾ³ý±í
ÖÁ´ËÒѾӵÓÐÁ˵¥½ÚµãµÄCassandra£¬ÇÒÄܹ»Í¨¹ýcqlshÁ¬½ÓÖÁcassandra²¢Ê¹ÓÃCQLÖ´ÐвÙ×÷¡£ÏÂÃæ¶ÔCassandra×÷½øÒ»²½½éÉÜ¡£
4´î½¨¼¯Èº
4.1µ¥Êý¾ÝÖÐÐļ¯Èº
4.1.1ǰÖù¤×÷
ÔÚÿ¸ö½ÚµãÉÏ×°ÅäCassandra
Ϊ¼¯ÈºÈ·¶¨Ãû³Æ
»ñȡÿ¸ö½ÚµãµÄIP
È·¶¨ÓÃÀ´×öÖÖ×ӵĽڵ㣨Cassandraͨ¹ýÖÖ×Ó½ÚµãÀ´ÕÒµ½±Ë´Ë²¢Á˽⻷µÄÍØÆË£©
È·¶¨snitch£¨ÓÃÓÚÈ·¶¨Ïò/´ÓÄĸöÊý¾ÝÖÐÐĺÍÍø¼ÜдÈë/¶ÁÈ¡Êý¾Ý¡£Óв»Í¬µÄÀàÐÍ¿ÉÑ¡£©
4.1.2¾ßÌåÅäÖÃ
1.¼Ù¶¨Ê¹ÓÃÒÔÏÂÒѾ°²×°ÁËCassandraµÄ½ÚµãÅäÖü¯Èº(×ÊÔ´ÓÐÏÞ£¬ÕâÀïÖ»ÓÃÁ½Ì¨»úÆ÷À´ËµÃ÷¹ý³Ì¡£ÕæÊµ»·¾³ÏÂ×îºÃÊÇÓжą̀»úÆ÷£¬ÇÒÒ»¸ö¼¯ÈºÖÐ×îºÃÓÐÒ»¸öÒÔÉϵÄÖÖ×Ó)
node0192.168.83.35 (seed)
node1192.168.83.37
2.¼Ù¶¨½ÚµãËùÔÚ»úÆ÷ÓзÀ»ðǽ£¬×¢Ò⿪·ÅCassandraËùʹÓõĶ˿Ú
3.ÈôCassandraÕýÔËÐÐÔòÏȹرգ¬ºóÇå³ýÊý¾Ý¡£
$ sudo servicecassandra
stop |
»òÕߣ¨¸ù¾Ý°²×°·½Ê½¶ø²»Í¬£©
$ ps auwx |grep
cassandra
$ sudo kill <pid> |
4.Çå³ýÊý¾Ý
$ sudo rm -rf/var/lib/cassandra/* |
5.ÐÞ¸Äcassandra.yamlÎļþÖеÄÏàÓ¦ÄÚÈÝ
cluster_name:'MyDemoCluster'
num_tokens:256
seed_provider:
- class_name:org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.83.35"
listen_address:192.168.83.35
rpc_address:0.0.0.0
endpoint_snitch:SimpleSnitch |
ÈôÊǽ¨Á¢È«ÐµĻ¹²»°üº¬Êý¾ÝµÄ¼¯ÈºÔò¼ÓÉÏauto_bootstrap:false
6.Ê£Óà½ÚµãµÄÅäÖÃÓë³ýÁËlisten_addressÓ¦µ±Îª×ÔÉíIPÍ⣬ÆäËûÅäÖÃÓëÉÏÊöÏàͬ
7.ÏÈÆô¶¯Öð¸öÆô¶¯seed½Úµã£¬ÔÙÖð¸öÆô¶¯Ê£Óà½Úµã
$ sudo servicecassandra
start |
»òÕß
$ cd<install_location>
$ bin/Cassandra |
8.ʹÓÃnodetoolstatusÃüÁî²é¿´¼¯ÈºÊÇ·ñ³É¹¦ÔËÐÐ
4.2¶àÊý¾ÝÖÐÐļ¯Èº
ÕâÀÊý¾ÝÖÐÐÄÖ¸µÄ¾ÍÊÇÒ»×é½Úµã£¬Óë¸´ÖÆ×éÊÇͬÒå´Ê¡£¶àÊý¾ÝÖÐÐļ¯ÈºÖУ¬Êý¾Ý¿ÉÒÔÔÚ²»Í¬Êý¾ÝÖÐÐļä×Ô¶¯¡¢Í¸Ã÷¸´ÖÆ¡£
4.2.1ǰÖù¤×÷
Óëµ¥½Úµã¼¯ÈºÅäÖûù±¾Ïàͬ£¬²»Í¬µÄÊÇ»¹ÐèҪȷ¶¨Êý¾ÝÖÐÐĺÍÍø¼ÜµÄÃüÃû¡£
4.2.2¾ßÌåÅäÖÃ
1.¼Ù¶¨ÔÚÒÔÏÂÒѾ°²×°ÁËCassandraµÄ½ÚµãÅäÖü¯Èº
node0 192.168.83.35(seed1)
node1 192.168.83.36
node2 192.168.83.37
node3 192.180.83.35(seed2)
node4 192.180.83.36
node5 192.168.83.37 |
2.ÈôÈç·À»ðǽ£¬ÔòÏÈ¿ª·ÅÏàÓ¦¶Ë¿Ú£¨Í¬ÉÏ£©
3.ÈôCassandraÕýÔËÐÐÔòÏȹرգ¨Í¬ÉÏ£©
4.Çå³ýÊý¾Ý£¨Í¬ÉÏ£©
5.ÐÞ¸Äcassandra.yamlÎļþÖеÄÏàÓ¦ÄÚÈÝ
¡Í¬ÉÏ¡
endpoint_snitch:PropertyFileSnitch
ÈôÊǽ¨Á¢È«ÐµĻ¹²»°üº¬Êý¾ÝµÄ¼¯ÈºÔò¼ÓÉÏauto_bootstrap:false
6.Ê£Óà½ÚµãµÄÅäÖÃÓë³ýÁËlisten_addressÓ¦µ±Îª×ÔÉíIPÍ⣬ÆäËûÅäÖÃÓëÉÏÊöÏàͬ
7.²½Öè5ÖÐÖ¸¶¨endpoint_snitchΪPropertyFileSnitchËùÒÔÒª±à¼¶ÔÓ¦µÄcassandra-topologies.propertiesÅäÖÃÎļþ£¨Èôendpoint_snitchÖ¸¶¨ÎªGossipingPropertyFileSnitchÔòÒª±à¼cassandra-rackdc.properties£¬Ö¸¶¨ÎªYamlFileNetworkTopologySnitchÔòÒª±à¼cassandra-topology.yaml£©
# CassandraNode
IP=Data Center:Rack
192.168.83.35=DC1:RAC1
192.168.83.36=DC2:RAC1
192.168.83.37=DC1:RAC1
192.180.83.35 =DC2:RAC1
192.180.83.36=DC1:RAC1
192.168.83.37=DC2:RAC1 |
Ö®ºó»¹ÒªÎªÎ»ÖõĽڵãÉèÖÃÒ»¸öĬÈϵÄÊý¾ÝÖÐÐĺÍÍø¼ÜÃû
# default forunknown
nodes
default=DC1:RAC1 |
8.Öð¸öÆô¶¯ÖÖ×ӽڵ㣬֮ºóÖð¸öÆô¶¯Ê£Óà½Úµã£¨Í¬ÉÏ£©
9.ÑéÖ¤»·ÊÇ·ñ³É¹¦Æô¶¯£¨Í¬ÉÏ£©
5ʹÓÃCQL
CQL:CassandraQuery Language
¼¤»îCQL£ºcqlsh¡¢DataStaxJava Driver¡¢Thrift·½·¨
set_cql_version¡¢PythonÇý¶¯ÖеÄconnect()µ÷Óá£
ʹÓÃcqlsh
bin/cqlsh hostport ¨Cu username ¨Cp password
´´½¨keyspace
keyspaceΪ±íÃüÃû¿Õ¼ä£¬Ö¸Ã÷½ÚµãÖÐÊý¾ÝÈçºÎ¸´ÖÆ£¬Ò»°ãÒ»¸öÓ¦ÓöÔÓ¦Ò»¸ö
keyspace¡£cassandraÖеĸ´ÖÆ¿ØÖÆÒÔµ¥¸ökeyspaceΪ»ù´¡¡£
CREATEKEYSPACE demodb WITH REPLICATION
= {'class' : 'SimpleStrategy','replication_factor':
3};
classÖ¸Ã÷¸´ÖƲßÂÔ£¬replication_factorÖ¸Ã÷¸´ÖƵķÝÊý
ʹÓÃkeyspace
¸üÐÂkeyspace
ALTER KEYSPACEdemodb
WITH REPLICATION = { 'class' : 'SimpleStrategy',
'replication_factor' : 2};
ALTER KEYSPACEdemodb WITH REPLICATION ={'class'
: 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2':
2}; |
Ö®ºóÔÚÿ¸öÊÜÓ°ÏìµÄ½ÚµãÖ´ÐÐnodetoolrepair demodb
´´½¨±í
use demodb
CREATE TABLEusers (
user_name varchar,
password varchar,
gender varchar,
session_token varchar,
state varchar,
birth_year bigint,
PRIMARY KEY (user_name)); |
ʹÓø´ºÏprimary key´´½¨±í
CREATE TABLEemp
(
empID int,
deptID int,
first_name varchar,
last_name varchar,
PRIMARY KEY (empID, deptID)); |
²åÈëÊý¾Ý
INSERT INTOemp
(empID, deptID, first_name, last_name) VALUES
(104, 15, 'jane', 'smith'); |
²éѯ±í£¨ÒÔϵͳ±íΪÀý£©
systemÊÇCassandraµÄϵͳ¿â£¬µ±Ç°º¬schema_keyspaces¡¢local¡¢
peers¡¢schema_columnsºÍschema_columnfamilies¼¸¸ö±í£¬·Ö±ð°üº¬keyspaceÐÅÏ¢£¬±¾µØ½ÚµãÐÅÏ¢¡¢¼¯Èº½ÚµãÐÅÏ¢¡¢columnsÐÅÏ¢ºÍcolumnfamiliesÐÅÏ¢
use system
SELECT * from schema_keyspaces;»ñÈ¡µ½µ±Ç°½ÚµãÖеÄeyspace
SELECT * FROMpeers»ñÈ¡½ÚµãËùÔÚ¼¯ÈºÐÅÏ¢
ÌáÈ¡²¢ÅÅÐò²éѯ½á¹û
SELECT * FROMemp WHERE empID IN (103,104) ORDER BY
deptID DESC;
ʹÓÃkeyspaceÏÞ¶¨·û
¾³£Ê¹ÓÃUSE keyspacenameÀ´Çл»keyspace¿ÉÄܲ»·½±ã£¬¿ÉʹÓÃkeyspaceÏÞ¶¨·ûÖ¸¶¨±íËùÊôµÄkeyspace£¬Èç
SELECT * fromsystem.schema_keyspaces;
¿ÉÔÚALTER TABLEC¡¢REATE TABLE¡¢DELETE¡¢INSERT¡¢
SELECT¡¢TRUNCATE¡¢UPDATEÖÐʹÓÃ
Ö¸¶¨columnµÄ¹ýÆÚʱ¼ä
INSERT INTOemp
(empID, deptID, first_name, last_name) VALUES
(105, 17, 'jane', 'smith')USING TTL 60; |
ÆäÖÐUSING TTL 60Ö¸Ã÷¸ÃÌõÊý¾Ý60Ãëºó¹ýÆÚ£¬½ìʱ»á±»×Ô¶¯É¾³ý¡£ÁíÍâÖ¸¶¨ÁËTTLµÄÊý¾Ýcolumns»áÔÚcompactionºÍrepair²Ù×÷Öб»×Ô¶¯É¾³ý¡£Ö¸¶¨TTL»áÓÐ8×Ö½Ú¶îÍ⿪Ïú¡£
²éѯ¹ýÆÚʱ¼ä
SELECT TTL(last_name)from
emp; |
¸üйýÆÚʱ¼ä
INSERT INTOemp (empID, deptID, first_name,
last_name) VALUES (105, 17, 'miaomiao', 'han')USING
TTL 3600;Ò²¼´£¬ÒÔеÄTTLÖØ²åÒ»±éÊý¾Ý¼´¿É¡££¨Ö¸¶¨²åÈëµÄÕûÌõÊý¾ÝµÄ¹ýÆÚʱ¼ä£©
»òÕßUPDATA emp USINGTTL 3600 SET last_name=
'han' where empid=105 and deptid=17; £¨Ö¸¶¨setÖ¸Ã÷µÄÊý¾ÝµÄ¹ýÆÚʱ¼ä£©
²éѯдÈëʱ¼ä
SELECTWRITETIME(first_name) from emp;¿É²éµÄ¸ÃÊý¾ÝºÎʱ±»²åÈë¡£
Ìí¼Ócolumns
ALTER TABLEemp ADD address varchar;
¸ü¸ÄcolumnÊý¾ÝÀàÐÍ
ALTER TABLEemp ALTER address TYPE text;
ÒÆ³ýÊý¾Ý
2 Ö¸¶¨¹ýÆÚʱ¼ä£¨Í¬ÉÏ£©
2 ɾ³ýtable»òkeyspace
DROP TABLE table_name
DROP KEYSPACE keyspace_name;
2 ɾ³ýcolumnsºÍrows
DELETE last_name FROM emp WHEREempid=104 and deptid=15;
DELETE FROM emp WHERE empid=104 anddeptid=15;
ʹÓÃcollectionÀàÐÍ
2 setÀàÐÍ
CREATE TABLE
users (
user_id text PRIMARY KEY,
first_name text,
last_name text,
emails set<text>
);
n INSERT INTO users (user_id, first_name, last_name,
emails) VALUES('frodo','Frodo', 'Baggins', {'f@baggins.com',
'baggins@gmail.com'});
n UPDATE users SET emails = emails + {'fb@friendsofmordor.org'}
WHEREuser_id = 'frodo';
n UPDATE users SET emails = emails - {'fb@friendsofmordor.org'}
WHEREuser_id = 'frodo';
n UPDATE users SET emails = {} WHERE user_id =
'frodo';
n DELETE emails FROM users WHERE user_id = 'frodo'; |
2 listÀàÐÍ
n ALTER TABLE
users ADD top_places list<text>;
n UPDATE users SET top_places = [ 'rivendell',
'rohan' ] WHERE user_id= 'frodo';
n UPDATE users SET top_places = [ 'the shire'
] + top_places WHEREuser_id = 'frodo';
n UPDATE users SET top_places = top_places + [
'mordor' ] WHEREuser_id = 'frodo';
n UPDATE users SET top_places[2] = 'riddermark'
WHERE user_id ='frodo';
n DELETE top_places[3] FROM users WHERE user_id
= 'frodo';
n UPDATE users SET top_places = top_places - ['rivendell']
WHEREuser_id = 'frodo'; |
2 mapÀàÐÍ
n ALTER TABLE
users ADD todo map<timestamp, text>;
n UPDATE users SET todo =
{ '2012-9-24' : 'entermordor',
'2012-10-2 12:00' : 'throwring into mount doom'
}
WHERE user_id = 'frodo';
n UPDATE users SET todo['2012-10-2 12:00'] = 'throw
my precious intomount doom'WHERE user_id = 'frodo';
n INSERT INTO users (user_id,todo) VALUES ('miaohan',
{ '2013-9-22 12:01' : 'birthday wishes to Bilbo',
'2013-10-1 18:00' : 'Check into Inn of Prancing
Pony' });
n DELETE todo['2012-9-24'] FROM users WHERE user_id
= 'frodo';
n UPDATE users USING TTL 60 SET todo['2012-10-1']
= 'find water' WHEREuser_id = 'frodo'; |
×¢£»¿ÉΪÉÏÊöÈýÖÖ¼¯ºÏÀàÐ͵Äÿ¸öÔªËØÉèÖõ¥¶ÀµÄ¹ýÆÚʱ¼ä¡£
´´½¨ºÍʹÓÃË÷Òý
CREATE INDEXlast_name_key
ON users(last_name);
SELECT * FROMusers WHERE last_name = 'Baggins'£¨Ðè´´½¨ÁËË÷Òý²ÅÄÜÔÚWHEREÖÐʹÓøÃÁнøÐвéѯ£¬ÔÝÎÞ¶àÁÐË÷Òý£¬ÐèÖðÁзֱð½¨Á¢Ë÷Òý£© |
ÇáÁ¿¼¶ÊÂÎñ
ʹÓÃIF´Ó¾äʵÏÖ
n INSERT INTO
emp(empid,deptid,address,first_name,last_name)
VALUES(102,14,'luoyang','Jane Doe','li') IF NOT
EXISTS;
n UPDATE emp SET address = 'luoyang' WHERE empid
= 103 and deptid = 16IF last_name='zhang'; |
ʹÓÃcounter
ÓÃÓÚ¼ÇÂ¼ÌØ¶¨Ê±¼ä»ò´¦ÀíµÄ´ÎÊý¡£¶ÔÓ¦µÄcolumnÐèʹÓÃcounterÊý¾ÝÀàÐÍ£¬¸ÃÀàÊý¾ÝÒ»°ã´æ´¢ÓÚרÃŵıíÖУ¬ÇÒʹÓÃUPDATEÔØÈë²¢Ôö¼õcounterÖµ£¬²»Ê¹ÓÃINSERT²åÈëcounterÖµ¡£Ö»ÄÜÔÚÔÊýÖµµÄ»ù´¡ÉÏÔö¼õ£¬²»ÄÜΪֱ½ÓÖ¸¶¨Ò»¸öÊýÖµ¡£
CREATEKEYSPACE
counterks WITH REPLICATION = { 'class' : 'SimpleStrategy','replication_factor'
: 3 };
CREATE TABLEcounterks.page_view_counts
(counter_valuecounter,
url_name varchar,
page_name varchar,
PRIMARY KEY (url_name, page_name)
);
UPDATEcounterks.page_view_counts
SET counter_value = counter_value + 1
WHERE url_name='www.datastax.com' ANDpage_name='home'; |
ÈôÔÀ´²»´æÔÚWHEREÌõ¼þÖÐÖ¸¶¨µÄÄÚÈÝ£¬¸ÃÌõÓï¾ä»á½«±íÖеÄurl_nameÖµÖÃΪ'www.datastax.com'½«page_nameÖÃΪ¡¯home¡¯,½«counter_valueÖ¸¶¨ÎªÄ¬Èϳõʼֵ0¼Ó1¡£ÈôWHEREÌõ¼þÖÐÖ¸¶¨µÄÄÚÈÝ´æÔÚ£¬Ôò½«counter_valueÖÃΪÔÀ´µÄcounter_value¼Ó1
UPDATEcounterks.page_view_counts
SET counter_value = counter_value + 2
WHERE url_name='www.baidu.com' ANDpage_name='map'; |
6°²È«
Èý·½Ã氲ȫ²ßÂÔ
Client-to-node/node-to-node¼ÓÃÜ£¨SSL£©£º¼ÓÃÜ´«ÊäµÄÊý¾Ý
»ùÓڵǼÕË»§/ÃÜÂëµÄÈÏÖ¤£ºÈ·¶¨Ë¿ÉÒÔʹÓÃÊý¾Ý¿â
¶ÔÏóÊÚȨ¹ÜÀí£ºÈ·¶¨Óû§¿ÉÔÚÔÚÊý¾Ý¿âÉϸÉʲô
6.1 SSL¼ÓÃÜ
6.1.1Client-to-node
×¼±¸Ö¤Êé
Ϊÿ¸ö½Úµã²úÉú˽Կ/¹«Ô¿¶Ô
keytool-genkey
-alias cassandra_vms00780 -keystore ~/keys/.keystore |
µ¼³ö¹«Ô¿²¿·Öµ½µ¥¶ÀµÄÖ¤ÊéÎļþ£¬²¢¿½±´¸ÃÎļþµ½ÆäËûËùÓнڵã
keytool-export
-alias cassandra_vms00780 -file ~keys/cassandra_vms00780.cer
-keystore ~/keys/.keystore |
½«Ã¿¸ö½ÚµãµÄÖ¤ÊéÌí¼Óµ½ËùÓнڵãµÄÐÅÈοâÖÐ
keytool-import
-v -trustcacerts -alias cassandra_vms00780 -file
cassandra_vms00780.cer¨Ckeystore ~/keys/ .truststore |
±£Ö¤½«.keystoreºÍtruststoreÎļþ·Ö·¢µ½ËùÓнڵã
È·ÈÏ.keystoreÎļþÖ»¶ÔCassandradaemon¿É¶Á
±à¼ÅäÖÃÎļþ
ÅäÖÃcassandra.yamlÎļþÖÐclient_encryption_options²¿·ÖµÄ²ÎÊý
client_encryption_options:
enabled: true
keystore: ~keys/.keystore## .keystore file·¾¶
keystore_password:<keystore password> ##
²úÉúkeystoreʱÓõÄÃÜÂë
truststore: ~keys/.truststore
truststore_password:<truststore password>
require_client_auth:<true or false> |
6.1.2node-to-node
×¼±¸Ö¤Êé
ͬÉÏ
±à¼ÅäÖÃÎļþ
ÅäÖÃcassandra.yamlÎļþÖÐserver_encryption_options²¿·ÖµÄ²ÎÊý
server_encryption_options:
internode_encryption: <internode_option:all/none/dc/rack>
keystore: ~keys/.keystore
keystore_password: <keystore password>
truststore:~keys/.truststore
truststore_password: <truststorepassword>
require_client_auth: <true or false> |
6.1.3ÔÚcqlshÖÐʹÓÃSSL
¿ÉÔÚÖ÷Ŀ¼ÒÀ¾ÝÑùÀýÎļþcqlshrc.sample´´½¨.cqlshrcÎļþ
[authentication]
username = cassandra
password = cassandra
[connection]
hostname = localhost
port = 9160
factory =cqlshlib.ssl.ssl_transport_factory
[ssl]
certfile =~/keys/cassandra.cer
validate = true
[certfiles]
192.168.1.3 =~/keys/cassandra01.cert
192.168.1.4 =~/keys/cassandra02.cert |
6.2ÄÚ²¿ÈÏÖ¤
»ùÓÚCassandra¿ØÖƵĵǼÕË»§ºÍÃÜÂë
ÈÏÖ¤ÓõĵǼÃûºÍ¾bcryptÉ¢ÁеÄÃÜÂë´æ´¢ÓÚ system_auth.credentials±íÖÐ
6.2.1ÅäÖÃ
µÚÒ»²½
ÈôҪʹÓûùÓÚÓû§Ãû/ÃÜÂëµÄÈÏÖ¤»úÖÆ£¬ÐèÒªÏÈÅäÖà cassandra.yamlÎļþÖÐauthenticatorµÄֵΪ
PasswordAuthenticator£¨¸Ã²ÎÊýĬÈÏֵΪAllowAllAuthenticator£¬¼´£¬²»½øÐÐÈκÎÈÏÖ¤£©¡£ÕâÑùcassandra
»áÔÚsystem_auth.user´´½¨Ò»¸ö³¬¼¶Óû§£¬ Óû§ÃûºÍÃÜÂë¾ùΪcassandra¡£Ö®ºó£¬
ÅäÖÃsystem_authÕâ¸ökeyspaceµÄ replication factorΪ½Ï´óµÄÖµ £¨Ïê¼ûµÚ5ÕÂʹÓô´½¨¡¢¸üÐÂkeyspace²¿·ÖµÄÄÚÈÝ£©
ÈÏÖ¤Óï¾ä
ALTER USER
ALTER USERuser_name
WITH PASSWORD 'password' (NOSUPERUSER| SUPERUSER) |
×¢£ºSUPERUSER¿É¸ü¸ÄÆäËûÓû§µÄÃÜÂëºÍSUPERUSER״̬
(NOSUPERUSER»ò SUPERUSER)£¬µ«²»Äܸıä×Ô¼ºµÄSUPERUSER״̬¡£ÆÕͨÓû§Ö»Äܸü¸Ä×Ô¼ºµÄÃÜÂë¡£
CREATE USER
CREATE USERuser_name
WITH PASSWORD 'password' (NOSUPERUSER| SUPERUSER) |
Ö»ÓÐSUPERUSER¿É´´½¨Óû§£¬´´½¨µÄÓû§Ä¬ÈÏΪNOSUPERUSER
DROP USER
Ö»ÓÐSUPERUSER¿Éɾ³ýÓû§£¬Óû§²»ÄÜ×Ô¼ºÉ¾³ý×Ô¼º¡£
LIST USERS
LIST USERS£¨ÎªÊ²Ã´Ã»Óнá¹û£¿£¿£¿£©
ÁгöÓû§
¸ü¸ÄĬÈÏSUPERUSER
ʹÓÃĬÈÏSUPERUSERÒ²¼´cassandraµÇ¼
./cqlsh -ucassandra
-p Cassandra |
н¨ÁíÒ»SUPERUSER£¬Ö®ºóɾ³ýÔcassandraSUPERUSER
create userus_yanzhaozhang
with password 'cassandra' superuser;
drop usercassandra; |
ÖØÆôcassandra£¬Ê¹ÓÃеÄSUPERUSERµÇ¼£¬Ö´ÐкóÐø²Ù×÷¡£
6.2.2ʹÓÃcqlshµÇ¼
ÈôʹÓÃcqlshµÇ¼£¬¿É½«ÈÏÖ¤ÐÅÏ¢´æ´¢ÓÚ.cqlshrcÎı¾Îļþ£¬·ÅÖÃÔÚÓû§Ö÷Ŀ¼ÖУ¬ÒÔÃâÖØ¸´Â¼ÈëµÇ¼ÐÅÏ¢¡£×¢Òâ¶Ô¸ÃÎı¾ÎļþÉèÖöÔÓ¦µÄȨÏÞÒÔ·ÀÐÅϢй¶¡£
[authentication]
username = example_username
password = example_password |
6.3ÄÚ²¿ÊÚȨ
¶ÔÏóȨÏÞ¹ÜÀí»ùÓÚÄÚ²¿ÊÚȨ£¬Óë¹ØÏµÐÍÊý¾Ý¿âGRANT/REVOKEÓï·¨ÀàËÆ¡£
Ê×ÏÈÒªÅäÖÃcassandra.yamlÖÐauthorizerµÄֵΪCassandraAuthorizer
(ĬÈÏΪAllowAllAuthorizer£¬ ÔÊÐíÈκÎÓû§µÄÈκζ¯×÷)£¬É趨Ϊ¸ÃÖµºó»á½«ÊÚȨÐÅÏ¢´æ´¢ÔÚ
system_auth.permissions±íÖС£
Ö®ºó£¬ÅäÖÃsystem_authÕâ¸ökeyspaceµÄreplicationfactorΪ½Ï´óµÄÖµ¡£
ͨ¹ýÉèÖÃpermissions_validity_in_msÑ¡Ïîµ÷ÕûȨÏÞÓÐЧÆÚ¡£
Óï·¨
GRANTpermission_name PERMISSION
| ( GRANT ALLPERMISSIONS ) ON resource TO user_name
REVOKE (permission_name PERMISSION )
| ( REVOKE ALLPERMISSIONS )
ON resourceFROM user_name
LISTpermission_name PERMISSION
| ( LIST ALLPERMISSIONS )
ON resource OF user_name
NORECURSIVE
ÆäÖÐpermission_nameΪ
ALL
ALTER
AUTHORIZE
CREATE
DROP
MODIFY
SELECT
resourceΪ
ALL KEYSPACES
KEYSPACE keyspace_name
TABLE keyspace_name.table_name
6.4ÅäÖ÷À»ðǽ¶Ë¿Ú·ÃÎÊ
ÐèÔÚ·À»ðǽ²ßÂÔÖпª·Åһ϶˿Ú
¹«¹²¶Ë¿Ú
n 22 ssh¶Ë¿Ú
n 8888 OpsCenter website¶Ë¿Ú
Cassandra½Úµã¼ä¶Ë¿Ú
n 1024+ JMX reconnection/loopback¶Ë¿Ú
n 7000 Cassand¼¯ÈºÄÚ½Úµã¼äͨѶ¶Ë¿Ú
n 7199 Cassandra JMX ¼à¿Ø¶Ë¿Ú
n 9160 Cassandra¿Í»§¶Ë¶Ë¿Ú
Cassandra OpsCenter ¶Ë¿Ú
n 61620 OpsCenter¼à¿Ø¶Ë¿Ú
n 61621 OpsCenter´úÀí¶Ë¿Ú
7¼Ü¹¹
7.1¹£¸Å
µã¶Ôµã·Ö²¼Ê½ÏµÍ³£¬¼¯ÈºÖи÷½ÚµãƽµÈ£¬Êý¾Ý·Ö²¼ÓÚ¼¯ÈºÖи÷½Úµã£¬¸÷½Úµã¼äÿÃë½»»»Ò»´ÎÐÅÏ¢¡£Ã¿¸ö½ÚµãµÄcommit
log²¶»ñд²Ù×÷À´È·±£Êý¾Ý³Ö¾ÃÐÔ¡£Êý¾ÝÏȱ»Ð´Èëmemtable-ÄÚ´æÖеÄÊý¾Ý½á¹¹£¬´ý¸Ã½á¹¹ÂúºóÊý¾Ý±»Ð´ÈëSSTable-Ó²ÅÌÖеÄÊý¾ÝÎļþ¡£ËùÓеÄдÄÚÈݱ»×Ô¶¯ÔÚ¼¯ÈºÖзÖÇø²¢¸´ÖÆ¡£
CassandraÊý¾Ý¿âÃæÏòÐС£ÊÚȨÓû§¿ÉÁ¬½ÓÖÁÈÎÒâÊý¾ÝÖÐÐĵÄÈÎÒâ½Úµã£¬²¢Í¨¹ýÀàËÆSQLµÄCQL²éѯÊý¾Ý¡£¼¯ÈºÖУ¬Ò»¸öÓ¦ÓÃÒ»°ã°üº¬Ò»¸ökeyspace£¬Ò»¸ökeyspaceÖаüº¬¶à¸ö±í¡£
¿Í»§¶ËÁ¬½Óµ½Ä³Ò»½Úµã·¢Æð¶Á»òдÇëÇóʱ£¬¸Ã½Úµã³äµ±¿Í»§¶ËÓ¦ÓÃÓëÓµÓÐÏàÓ¦Êý¾ÝµÄ½Úµã¼äµÄе÷Õß(coordinator£©ÒÔ¸ù¾Ý¼¯ÈºÅäÖÃÈ·¶¨»·ÖеÄÄĸö½Úµãµ±»ñÈ¡Õâ¸öÇëÇó¡£
¹Ø¼ü´Ê
Gossip£ºµã¶ÔµãͨÐÅÐÒ飬ÓÃÒÔCassandra¼¯ÈºÖнڵã¼ä½»»»Î»ÖúÍ״̬ÐÅÏ¢¡£
Partitioner£º¾ö¶¨ÈçºÎÔÚ¼¯ÈºÖеĽڵã¼ä·Ö·¢Êý¾Ý£¬Ò²¼´ÔÚÄĸö½Úµã·ÅÖÃÊý¾ÝµÄµÚÒ»¸öreplica¡£
Replica placement strategy£º¾ö¶¨ÔÚÄÄЩ½Úµã·ÅÖÃÊý¾ÝµÄÆäËûreplica¡£CassandraÔÚ¼¯ÈºÖеĶà¸ö½Úµã´æ´¢Êý¾ÝµÄ¶à·Ý¿½±´-replicasÀ´È·±£¿É¿¿ºÍÈÝ´í¡£
Snitch£º¶¨ÒåÁ˸´ÖƲßÂÔÓÃÀ´·ÅÖÃreplicasºÍ·ÓÉÇëÇóËùʹÓõÄÍØÆËÐÅÏ¢
cassandra.yamlÎļþ£ºCassandraÖ÷ÅäÖÃÎļþ
system:CassandraµÄϵͳkeyspace£¬´æ·Åtable¡¢keyspaceµÄÊôÐÔÐÅÏ¢µÈ¡£¶øÊôÐÔÐÅÏ¢¿Éͨ¹ýCQL»òÆäËûÇý¶¯ÉèÖá£
7.2½Úµã¼äͨÐÅ
CassandraʹÓõã¶ÔµãͨѶÐÒégossipÔÚ¼¯ÈºÖеĽڵã¼ä½»»»Î»ÖúÍ״̬ÐÅÏ¢¡£gossip½ø³ÌÿÃëÔËÐÐÒ»´Î£¬ÓëÖÁ¶à3¸öÆäËû½Úµã½»»»ÐÅÏ¢£¬ÕâÑùËùÓнڵã¿ÉºÜ¿ìÁ˽⼯ȺÖÐµÄÆäËû½ÚµãÐÅÏ¢¡£
ÅäÖÃgossip£¨ÔÚcassandra.ymalÖÐÉèÖã©
cluster_name:½ÚµãËùÊô¼¯ÈºÃû£¬¼¯ÈºÖÐÿ¸ö½ÚµãÓ¦Ïàͬ¡£
listen_address£º¹©ÆäËû½ÚµãÁ¬½ÓÖÁ¸Ã½ÚµãµÄIPµØÖ·»òÖ÷»úÃû£¬µ±ÓÉlocalhostÉèΪ¹«¹²µØÖ·¡£
seed_provider£º¶ººÅ·Ö¸ôµÄIPµØÖ·£¨ÖÖ×ÓÁÐ±í£©£¬gossipͨ¹ýÖÖ×Ó½Úµãѧϰ»·µÄÍØÆË£¬¼¯ÈºÖи÷½ÚµãÖÖ×ÓÁÐ±íµ±Ïàͬ¡£¶àÊý¾ÝÖÐÐļ¯ÈºÖÐÿ¸öÊý¾ÝÖÐÐĵÄÖÖ×ÓÁÐ±íµ±ÖÁÉÙ°üº¬Ò»¸ö¸ÃÖÐÐÄÄڵĽڵ㡣
storage_port£º½Úµã¼äͨѶ¶Ë¿Ú£¬¼¯ÈºÖи÷½Úµãµ±Ò»Ö¡£
initial_token£ºÓÃÓÚsingle-node-per-token½á¹¹£¬½ÚµãÔÚ»·¿Õ¼äÖ»ÓµÓÐÒ»¶ÎÁ¬ÐøµÄtoken·¶Î§¡£
num_tokens£ºÓÃÓÚvirtual nodes£¬¶¨ÒåÁ˽ڵãÔÚ»·¿Õ¼äËùÓµÓеÄËæ»ú·ÖÅäµÄtokenÊýÄ¿¡£
ʧ°Ü¼ì²âÓë»Ö¸´
gossip¿É¼ì²âÆäËû½ÚµãÊÇ·ñÕý³£ÒÔ±ÜÃ⽫ÇëÇó·ÓÉÖÁ²»¿É´ï»òÕßÐÔÄܲîµÄ½Úµã£¨ºóÕßÐèÅäÖÃΪdynamic
snitch·½¿É£©¡£
¿Éͨ¹ýÅäÖÃphi_convict_thresholdÀ´µ÷Õûʧ°Ü¼ì²âµÄÃô¸Ð¶È¡£
¶ÔÓÚʧ°ÜµÄ½Úµã£¬ÆäËû½Úµã»áͨ¹ýgossip¶¨ÆÚÓëÖ®ÁªÏµÒԲ鿴ÊÇ·ñ»Ö¸´¶ø·Ç¼òµ¥½«Ö®ÒƳý¡£ÈôÐèÇ¿ÖÆÌí¼Ó»òÒÆ³ý¼¯ÈºÖнڵãÐèʹÓÃnodetool¹¤¾ß¡£
Ò»µ©Ä³½Úµã±»±ê¼ÇΪʧ°Ü£¬Æä´í¹ýµÄд²Ù×÷»áÓÐÆäËûreplicas´æ´¢Ò»¶Îʱ¼ä£¨Ð迪Æôhinted
handoff£¬Èô½Úµãʧ°ÜµÄʱ¼ä³¬¹ýÁËmax_hint_window_in_ms£¬´í¹ýµÄд²»ÔÙ±»´æ´¢¡££©DownµôµÄ½Úµã¾¹ýÒ»¶Îʱ¼ä»Ö¸´ºóÐèÖ´ÐÐrepair²Ù×÷£¬Ò»°ãÔÚËùÓнڵãÔËÐÐnodetool
repairÒÔÈ·±£Êý¾ÝÒ»Ö¡£
7.3Êý¾Ý¸´Öƺͷַ¢
CassandraÖзַ¢¡¢¸´ÖÆÍ¬Ê±½øÐС£Cassandra±»Éè¼ÆÎªµã¶Ôµãϵͳ£¬»á´´½¨Êý¾ÝµÄ¶à¸ö¸±±¾´æ´¢ÔÚ¼¯ÈºÖеÄÒ»×é½ÚµãÖС£CassandraÖÐÊý¾Ý±»×é֯Ϊ±í£¬ÓÉprimary
key±êʶ£¬primary key¾ö¶¨Êý¾Ý½«±»´æ´¢ÔÚÄĸö½Úµã¡£
ÐèÖ¸¶¨µÄÄÚÈÝ
Virtual nodes£ºÖ¸¶¨Êý¾ÝÓëÎïÀí½ÚµãµÄËùÊô¹ØÏµ
Partitioner£ºÔÚ¼¯ÈºÄÚ»®·ÖÊý¾Ý
Replicationstrategy£º¾ö¶¨ÈçºÎ´¦ÀíÿÐÐÊý¾ÝµÄreplicas
Snitch£º¶¨Òåreplicationstrategy·ÅÖÃÊý¾ÝµÄreplicasʱʹÓõÄÍØÆËÐÅÏ¢
Ò»ÖÂÐÔ¹þÏ£
±íÖÐÿÐÐÊý¾ÝÓÉprimary key±êʶ£¬CassandraΪÿ¸öprimarykey·ÖÅäÒ»¸öhashÖµ£¬¼¯ÈºÖÐÿ¸ö½ÚµãÓµÓÐÒ»¸ö»ò¶à¸öhashÖµÇø¼ä¡£ÕâÑù±ã¿É¸ù¾Ýprimary
key¶ÔÓ¦µÄhashÖµ½«¸ÃÌõÊý¾Ý·ÅÔÚ°üº¬¸ÃhashÖµµÄhashÖµÇø¼ä¶ÔÓ¦µÄ½ÚµãÖС£
ÐéÄâ½Úµã
ʹÓÃÐéÄâ½ÓµçÊÓÊý¾ÝÔÚ¼¯ÈºÖеķֲ¼

Èô²»Ê¹ÓÃÐéÄâ½ÚµãÔòÐèÊÖ¹¤Îª¼¯ÈºÖÐÿ¸ö½Úµã¼ÆËãºÍ·ÖÅäÒ»¸ötoken¡£Ã¿¸ötoken¾ö¶¨Á˽ڵãÔÚ»·ÖеÄλÖÃÒÔ¼°½ÚµãÓ¦µ±³Ðµ£µÄÒ»¶ÎÁ¬ÐøµÄÊý¾ÝhashÖµµÄ·¶Î§¡£ÈçÉÏͼÉϰ벿·Ö£¬Ã¿¸ö½Úµã·ÖÅäÁËÒ»¸öµ¥¶ÀµÄtoken´ú±í»·ÖеÄÒ»¸öλÖã¬Ã¿¸ö½Úµã´æ´¢½«row
keyÓ³ÉäΪhashÖµÖ®ºóÂäÔڸýڵãÓ¦µ±³Ðµ£µÄΨһµÄÒ»¶ÎÁ¬ÐøµÄhashÖµ·¶Î§ÄÚµÄÊý¾Ý¡£Ã¿¸ö½ÚµãÒ²°üº¬À´×ÔÆäËû½ÚµãµÄrowµÄ¸±±¾¡£¶øÊÇÓÃÐéÄâ½ÚµãÔÊÐíÿ¸ö½ÚµãÓµÓжà¸ö½ÏСµÄ²»Á¬ÐøµÄhashÖµ·¶Î§¡£ÈçÉÏͼÖÐϰ벿·Ö£¬¼¯ÈºÖеĽڵãÊÇÓÃÁËÐéÄâ½Úµã£¬ÐéÄâ½ÚµãËæ»úÑ¡ÔñÇÒ²»Á¬Ðø¡£Êý¾ÝµÄ´æ·ÅλÖÃÒ²ÓÉrow
keyÓ³Éä¶øµÃµÄhashֵȷ¶¨£¬µ«ÊÇÊÇÂäÔÚ¸üСµÄ·ÖÇø·¶Î§ÄÚ¡£
ʹÓÃÐéÄâ½ÚµãµÄºÃ´¦
ÎÞÐèΪÿ¸ö½Úµã¼ÆËã¡¢·ÖÅätoken
Ìí¼ÓÒÆ³ý½ÚµãºóÎÞÐèÖØÐÂÆ½ºâ¼¯Èº¸ºÔØ
ÖØ½¨ËÀµôµÄ½Úµã¸ü¿ì
¸ÄÉÆÁËÔÚͬһ¼¯ÈºÊ¹ÓÃÒìÖÖ»úÆ÷
Êý¾Ý¸´ÖÆ
CassandraÔÚ¶à¸ö½ÚµãÖдæ·ÅreplicasÒÔ±£Ö¤¿É¿¿ÐÔºÍÈÝ´íÐÔ¡£
replicationstrategy¾ö¶¨·ÅÖÃreplicasµÄ½Úµã¡£ replicasµÄ×ÜÊýÓɸ´ÖÆÒò×Ó-
replication factorÈ·¶¨£¬±ÈÈçÒò×ÓΪ2´ú±íÿÐÐÓÐÁ½·Ý¿½±´£¬Ã¿·Ý¿½±´´æ´¢ÔÚ²»Í¬µÄ½ÚµãÖС£ËùÓеÄreplicasÎÞÖ÷´ÓÖ®·Ö¡£replication
factorͨ³£²»Äܳ¬¹ý¼¯ÈºÖнڵã×ÜÊý¡£È»¶ø£¬¿ÉÏÖÔö¼Óreplication factoÖ®ºóÔÚ½«½ÚµãÔöÖÁÆÚÍûµÄÊýÁ¿¡£
µ±replication facto³¬¹ý×ܽáµãÊýʱ£¬Ð´²Ù×÷±»¾Ü¾ø£¬µ«¶Á²Ù×÷¿É½øÐУ¬Ö»ÒªÂú×ãÆÚÍûµÄÒ»ÖÂÐÔ¼¶±ð¡£
µ±Ç°ÓÐÁ½ÖÖ¿ÉÓõĸ´ÖƲßÂÔ£º
SimpleStrategy£º½öÓÃÓÚµ¥Êý¾ÝÖÐÐÄ£¬½«µÚÒ»¸öreplica·ÅÔÚÓÉ
partitionerÈ·¶¨µÄ½ÚµãÖУ¬ÆäÓàµÄreplicas·ÅÔÚÉÏÊö½Úµã˳ʱÕë·½ÏòµÄºóÐø½ÚµãÖС£
NetworkTopologyStrategy£º¿ÉÓÃÓڽϸ´ÔӵĶàÊý¾ÝÖÐÐÄ¡£¿ÉÒÔÖ¸¶¨ÔÚÿ¸öÊý¾ÝÖÐÐÄ·Ö±ð´æ´¢¶àÉÙ·Ýreplicas¡£ÔÚÿ¸öÊý¾ÝÖÐÐÄ·ÅÖÃreplicasµÄ·½Ê½ÀàËÆÓÚSimpleStrategy£¬µ«ÇãÏòÓÚ½«replicas·ÅÔÚ²»Í¬rack£¬ÒòΪͬһrackµÄ½ÚµãÇãÏòÓÚͬʱʧ°Ü¡£ÅäÖÃÿ¸öÊý¾ÝÖÐÐÄ·Ö±ð·ÅÖöàÉÙreplicasʱҪ¿¼ÂÇÁ½¸öÖ÷Òª·½Ã棺(1)¿ÉÂú×ã±¾µØ¶Á¶ø·Ç¿çÊý¾ÝÖÐÐĶÁ£»(2)ʧ°Ü³¡¾°¡£Á½ÖÖ³£ÓõÄÅäÖ÷½Ê½Îª(1)ÿ¸öÊý¾ÝÖÐÐÄÁ½·Ýreplicas£¬(2)ÿ¸öÊý¾ÝÖÐÐÄ3·Ýreplicas¡£µ±È»£¬ÓÃÓÚÌØÊâÄ¿µÄµÄ·Ç¶Ô³ÆÅäÖÃÒ²ÊÇ¿ÉÒԵ쬱ÈÈçÔÚ¶Á²Ù×÷½ÏƵ·±µÄÊý¾ÝÖÐÐÄÅäÖÃ3·Ýreplicas¶øÔÚÓÃÓÚ·ÖÎöµÄÊý¾ÝÖÐÐÄÅäÖÃÒ»·Ýreplicas¡£
¸´ÖƲßÂÔÔÚ´´½¨keyspaceʱָ¶¨£¬Èç
CREATEKEYSPACE Excelsior WITH REPLICATION
= { 'class' : 'SimpleStrategy','replication_factor'
: 3 };
CREATEKEYSPACE "Excalibur"
WITH REPLICATION = {'class' :'NetworkTopologyStrategy',
'dc1' : 3, 'dc2' : 2};
ÆäÖÐdc1¡¢dc2ÕâЩÊý¾ÝÖÐÐÄÃû³ÆÒªÓësnitchÖÐÅäÖõÄÃû³ÆÒ»Ö¡£
7.4Partitioners
ÔÚCassandraÖУ¬tableµÄÿÐÐÓÉΨһµÄprimarykey±êʶ£¬partitionerʵ¼ÊÉÏΪһhashº¯ÊýÓÃÒÔ¼ÆËãprimary
keyµÄtoken¡£CassandraÒÀ¾ÝÕâ¸ötokenÖµÔÚ¼¯ÈºÖзÅÖöÔÓ¦µÄÐС£
ÈýÖÖpartitioner(ÔÚcassandra.yamlÖÐÉèÖÃ)
Murmur3Partitioner£ºµ±Ç°µÄĬÈÏÖµ£¬ÒÀ¾ÝMurmurHash¹þÏ£ÖµÔÚ¼¯ÈºÖоùÔÈ·Ö²¼Êý¾Ý¡£
RandomPartitioner£ºÒÀ¾ÝMD5¹þÏ£ÖµÔÚ¼¯ÈºÖоùÔÈ·Ö²¼Êý¾Ý¡£
ByteOrderedPartitioner£ºÒÀ¾ÝÐÐkeyµÄ×Ö½Ú´Ó×ÖÃæÉÏÔÚ¼¯ÈºÖÐ˳Ðò·Ö²¼Êý¾Ý¡££¨²»ÍƼöʹÓã©
Murmur3PartitionerºÍRandomPartitionerʹÓÃtokenÏòÿ¸ö½ÚµãÖ¸ÅɵÈÁ¿µÄÊý¾Ý´Ó¶ø½«
keyspaceÖеıí¾ùÔÈ·Ö²¼ÔÚ»·ÖУ¬¼´Ê¹²»Í¬µÄ±íʹÓò»Í¬µÄprimary key¡£¶ÁдÇëÇó¾ù±»¾ùÔȵķֲ¼¡£
ByteOrderedPartitionerÔÊÐíͨ¹ýprimary key˳ÐòɨÃ裨¿Éͨ¹ýindex´ïµ½Í¬ÑùÄ¿µÄ£©£¬µ«ÒÑÒýÆðÈçÏÂÎÊÌâ(1)½Ï¸´ÔӵĸºÔؾùºâ£¬(2)˳ÐòµÄдÒ×µ¼ÖÂÈȵ㣬(3)¶à±í²»¾ùÔȵĸºÔؾùºâ¡£
×¢Ò⣺ÈôʹÓÃÐéÄâ½Úµã(vnodes)ÔòÎÞÐèÊÖ¹¤¼ÆËãtokens¡£
Èô²»Ê¹ÓÃÐéÄâ½ÚµãÔò±ØÐëÊÖ¹¤¼ÆËãtokens ½«ËùµÃµÄÖµÖ¸Åɸøcassandra.ymalÖ÷ÅäÖÃÎļþÖеÄinitial_token²ÎÊý¡£
7.5Snitches
Ìá¹©ÍøÂçÍØÆËÐÅÏ¢£¬ÓÃÒÔÈ·¶¨Ïò/´ÓÄĸöÊý¾ÝÖÐÐÄ»òÕßÍø¼ÜдÈë/¶ÁÈ¡Êý¾Ý¡£
×¢Ò⣺(1)ËùÓнڵãÐèÓÃÏàͬµÄsnitch;(2)¼¯ÈºÖÐÒѲåÈëÊý¾ÝºóÓɸü¸ÄÁËsnitchÔòÐèÔËÐÐÒ»´Îfullrepair¡£
Dynamic snitching
¼à¿Ø´Ó²»Í¬replica¶Á²Ù×÷µÄÐÔÄÜ£¬Ñ¡ÔñÐÔÄÜ×îºÃµÄreplica¡£dynamic snitchĬÈÏ¿ªÆô£¬ËùÓÐÆäËûsnitch»áĬÈÏʹÓÃdynamic
snitch ²ã¡£
SimpleSnitch
ĬÈÏÖµ£¬ÓÃÓÚµ¥Êý¾ÝÖÐÐIJ¿Ê𣬲»Ê¹ÓÃÊý¾ÝÖÐÐĺÍÍø¼ÜÐÅÏ¢¡£Ê¹ÓøÃֵʱkeyspace¸´ÖƲßÂÔÖÐΨһÐèÖ¸¶¨µÄÊÇreplication
factor
RackInferringSnitch
¸ù¾ÝÊý¾ÝÖÐÐĺÍÍø¼ÜÈ·¶¨½ÚµãλÖ㬶øÊý¾ÝÖÐÐļ°Íø¼ÜÐÅÏ¢ÓÖÓнڵãµÄIPµØÖ·Òþº¬Ö¸Ê¾¡£
PropertyFileSnitch
¸ù¾ÝÊý¾ÝÖÐÐĺÍÍø¼ÜÈ·¶¨½ÚµãλÖ㬶øÍøÂçÍØÆËÐÅÏ¢ÓÖÓÉÓû§¶¨ÒåµÄÅäÖÃÎļþ
cassandra-topology.properties »ñÈ¡¡£ ÔÚ½ÚµãIPµØÖ·¸ñʽ²»Í³Ò»ÎÞ·¨Òþº¬Ö¸Ê¾Êý¾ÝÖÐÐļ°Íø¼ÜÐÅÏ¢»òÕ߸´Ôӵĸ´ÖÆ×éÖÐʹÓøÃÖµ¡£Ðè×¢ÒâµÄÊÇ£º(
1)ÅäÖÃÎļþÖÐÊý¾ÝÖÐÐÄÃûÐèÓëkeyspaceÖи´ÖƲßÂÔÖÐÖ¸¶¨µÄÊý¾ÝÖÐÐÄÃû³ÆÒ»Ö£» (2)ÅäÖÃÎļþÖÐÐè°üº¬¼¯ÈºÖÐÈÎÒ»½Úµã£»
£¨3£©¼¯ÈºÖи÷½ÚµãÄÚcassandra-topology.propertiesÅäÖÃÎļþÐèÏàͬ¡£
GossipingPropertyFileSnitch
ÔÚcassandra-rackdc.propertiesÅäÖÃÎļþÖж¨Òå±¾½ÚµãËùÊôµÄÊý¾ÝÖÐÐĺÍÍø¼Ü£¬
ÀûÓÃgossipÐÒéÓëÆäËû½Úµã½»»»¸ÃÐÅÏ¢¡£Èô´ÓPropertyFileSnitchÇÐÖÁ¸ÃÖµ£¬ÔòÐèÖð½ÚµãÖð´Î¸üÐÂֵΪ
GossipingPropertyFileSnitchÒÔÈ·±£gossipÓÐʱ¼ä´«²¥ÐÅÏ¢¡£
EC2Snitch
ÓÃÓÚ²¿ÊðÔÚAmazon EC2ÖÐÇÒËùÓнڵãÔÚµ¥¸öÇøÓòÖеļ¯Èº¡£
EC2MultiRegionSnitch
ÓÃÓÚ²¿ÊðÔÚAmazonEC2ÖУ¬ÇÒ½Úµã¿ç¶à¸öÇøÓòµÄ¼¯Èº¡£
7.6¿Í»§¶ËÇëÇó
clientÁ¬½ÓÖÁ½Úµã²¢·¢³öread/writeÇëÇóʱ£¬ ¸Ãnode³äµ±client¶ËÓ¦ÓÃÓë°üº¬ÇëÇóÊý¾ÝµÄ½Úµã
(»òreplica)Ö®¼äµÄе÷Õߣ¬ËüÀûÓÃÅäÖõÄpartitionerºÍreplicaplacement²ßÂÔÈ·¶¨ÄǸö½Úµãµ±»ñÈ¡ÇëÇó¡£
7.6.1дÇëÇó

е÷Õß(coordinator)½«writeÇëÇó·¢Ë͵½ÓµÓжÔÓ¦rowµÄËùÓÐreplica½Úµã£¬
Ö»Òª½Úµã¿ÉÓñã»ñÈ¡²¢Ö´ÐÐдÇëÇó¡£Ð´Ò»ÖÂÐÔ¼¶±ð(write consistency level)È·¶¨ÒªÓжàÉÙ¸ö
replica½Úµã±ØÐë·µ»Ø³É¹¦µÄÈ·ÈÏÐÅÏ¢¡£³É¹¦Òâζ×ÅÊý¾Ý±»ÕýȷдÈëÁË commit log¸ömemtable¡£
ÉÏÀýΪµ¥Êý¾ÝÖÐÐÄ£¬11¸ö½Úµã£¬¸´ÖÆÒò×ÓΪ3£¬Ð´Ò»ÖÂÐԵȼ¶ÎªONEµÄдÇé¿ö¡£
7.6.2¶àÊý¾ÝÖÐÐĵÄдÇëÇó

»ù±¾Í¬ÉÏ£¬µ«»áÔÚ¸÷Êý¾ÝÖÐÐÄ·Ö±ðÑ¡ÔñÒ»¸öе÷ÕßÒÔ ´¦Àí¸ÃÊý¾ÝÖÐÐÄÄÚµÄдÇëÇó¡£ÓëclientÖ±½ÓÁ¬½ÓµÄ
coordinator½ÚµãÖ»Ð轫дÇëÇó·¢Ë͵½Ô¶³ÌÊý¾ÝÖÐÐĵÄcoordinatorÒ»¸ö½Úµã¼´¿É£¬ Ê£ÓàµÄÓɸÃcoordinatorÍê³É¡£ÈôÒ»ÖÂÐÔ¼¶±ðÉèÖÃΪONE»òÕßLOCAL_QUORUMÔò½öÓëÖ±½Óе÷ÕßλÓÚͬһÊý¾ÝÖÐÐĵĽڵãÐè·µ»Ø³É¹¦È·ÈÏ¡£
ÉÏÀýΪ˫µ¥Êý¾ÝÖÐÐÄ£¬¸÷11¸ö½Úµã£¬¸´ÖÆÒò×ÓΪ6£¬Ð´Ò»ÖÂÐԵȼ¶ÎªONEµÄдÇé¿ö¡£
7.6.3¶ÁÇëÇó

Ö±½Ó¶ÁÇëÇó
ºǫ́¶ÁÐÞ¸´ÇëÇó
ÓëÖ±½Ó¶ÁÇëÇóÁªÏµµÄreplicaÊýÄ¿ÓÉÒ»ÖÂÐÔ¼¶±ðÈ·¶¨¡£ºǫ́¶ÁÐÞ¸´ÇëÇó±»·¢Ë͵½Ã»ÓÐÊÕµ½Ö±½Ó¶ÁÇëÇóµÄ¶îÍâµÄreplica£¬ÒÔÈ·±£ÇëÇóµÄrowÔÚËùÓÐreplicaÉÏÒ»Ö¡£
е÷ÕßÊ×ÏÈÓëÒ»ÖÂÐÔ¼¶±ðÈ·¶¨µÄËùÓÐreplicaÁªÏµ£¬±»ÁªÏµµÄ½Úµã·µ»ØÇëÇóµÄÊý¾Ý£¬Èô¶à¸ö½Úµã±»ÁªÏµ£¬ÔòÀ´×Ô¸÷replicaµÄrow»áÔÚÄÚ´æÖÐ×÷±È½Ï£¬Èô²»Ò»Ö£¬Ôòе÷ÕßʹÓú¬×îÐÂÊý¾ÝµÄreplicaÏòclient·µ»Ø½á¹û¡£
ͬʱ£¬Ðµ÷ÕßÔÚºǫ́ÁªÏµºÍ±È½ÏÀ´×ÔÆäÓàÓµÓжÔÓ¦rowµÄreplicaµÄÊý¾Ý£¬Èô²»Ò»Ö£¬»áÏò¹ýʱµÄreplica·¢Ð´ÇëÇóÓÃ×îеÄÊý¾Ý½øÐиüС£ÕâÒ»¹ý³Ì½Ðread
repair¡£
ÉÏÀýΪµ¥Êý¾ÝÖÐÐÄ£¬11¸ö½Úµã£¬¸´ÖÆÒò×ÓΪ3£¬Ò»ÖÂÐÔ¼¶±ðΪQUORUMµÄ¶ÁÇé¿ö¡£
8Êý¾Ý¿âÄÚ²¿
8.1Êý¾Ý¹ÜÀí
ʹÓÃÀàËÆLog-StructuredMerge TreeµÄ´æ´¢½á¹¹£¬¶ø·ÇµäÐ͵ĹØÏµÐÍÊý¾Ý¿âʹÓõÄB-Tree½á¹¹¡£´æ´¢ÒýÇæÁ¬ÐøµÄ½«Êý¾ÝÒÔ×·¼ÓµÄģʽдÎï´ÅÅ̲¢³ÖÐø´æ´¢Êý¾Ý¡£½Úµã¼ä/ÄڵIJÙ×÷²¢ÐÐÔËÐС£Òò²»Ê¹ÓÃB-Tree¹ÊÎÞÐèÐͬ¿ØÖÆ£¬ÔÚдʱ²»±ØÖ´ÐиüС£CassandraÔÚSSDÖÐÐÔÄܱíÏÖ¼«¼Ñ¡£
¸ßÍÌÍÂÁ¿ºÍµÍÑÓ³Ù
²Ù×÷²¢ÐÐÔËÐУ¬ÍÌÍÂÁ¿ºÍÑÓ³ÙÏ໥¶ÀÁ¢¡£log-structuredÉè¼Æ±ÜÃâѯÅÌ¿ªÏú¡£È¥³ýon-diskÊý¾ÝÐ޸ģ¬Ê¡Ê±ÇÒÑÓ³¤SSDÊÙÃü¡£ÎÞon-diskÐ͵ÄÊý¾ÝÐ޸ĹÊÎÞÐèËø¶¨Ð´ÇëÇóÕâÑùµÄÐͬ¿ØÖÆ¡£ÎÞÖ÷¡¢´Ó£¬ÔÚËùÓнڵãÔËÐÐͬÑùµÄ´úÂë¡£
µ¥¶ÀµÄ±íĿ¼
/var/lib/cassandra/data/ks1/cf1 /ks1-cf1-ja-1-Data.db
ÆäÖÐ/var/lib/cassandra/data/Ϊcassandra.yamlÖÐÖ¸¶¨µÄÊý¾ÝÎļþĿ¼¡£ks1ΪkeyspaceÃûcf1/ΪcolumnfamiliesÃû¡£ÕâÑù¿É½«±íÁ¬½ÓÖÁÑ¡¶¨µÄÄ¿±êλÖÃÒÔ±ãÓÚ½«»îÔ¾µÄ±íÒÆµ½¸ü¿ìµÄ´æ´¢½éÖÊ£¬»òÕß½«±í·Ö²»µ½¶à¸ö¿ÉÓõĴ洢É豸ÒÔ¾ùºâ¸ºÔØ
8.2¹ØÓÚд
¸´ÖƵĽÇÉ«
ͨ¹ýÔÚ¶à¸öͬ¼¶½Úµã´´½¨Êý¾ÝµÄ¶à¸ö¸±±¾±£Ö¤¿É¿¿ÐÔºÍÈÝ´í¡£±íÊǷǹØÏµÐ͵ģ¬ÎÞÐè¹ý¶à¶îÍ⹤×÷À´Î¬»¤¹ØÁªµÄ±íµÄÍêÕûÐÔ£¬Òò´Ëд²Ù×÷½Ï¹ØÏµÐÍÊý¾Ý¿â¿ìºÜ¶à¡£
д¹ý³Ì

ÏȽ«Êý¾Ýд½øÄÚ´æÖеÄÊý¾Ý½á¹¹memtable£¬Í¬Ê±×·¼Óµ½´ÅÅÌÖеÄcommitlogÖС£±íʹÓõÄÔ½¶à£¬¶ÔÓ¦µÄmemtableÓ¦Ô½´ó£¬cassandra¶¯Ì¬µÄΪmemtable·ÖÅäÄڴ棬Ҳ¿É×Ô¼ºÊÖ¹¤Ö¸¶¨¡£memtableÄÚÈݳ¬³öÖ¸¶¨ÈÝÁ¿ºómemtableÊý¾Ý£¨°üÀ¨Ë÷Òý£©±»·Å½ø½«±»Ë¢Èë´ÅÅ̵ĶÓÁУ¬¿Éͨ¹ýmemtable_flush_queue_sizeÅäÖöÓÁг¤¶È¡£Èô½«±»Ë¢Èë´ÅÅ̵ÄÊý¾Ý³¬³öÁ˶ÓÁг¤¶È£¬cassandra»áËø¶¨Ð´¡£memtable±íÖеÄÊý¾ÝÓÉÁ¬ÐøµÄI/OË¢½ø´ÅÅÌÖеÄSSTable£¬Ö®ºócommit
log±»Çå¿Õ¡£Ã¿¸ö±íÓжÀÁ¢µÄmemtableºÍSSTable¡£
8.3¹ØÓÚ¸üС¢É¾³ýºÍhinted handoff writes
¸üУ¨cassandraÖвåÈëÖØ¸´µÄprimarykeyÒ²±»¿´×öÊǸüвÙ×÷£©


²»Ö±½ÓÔÚ´ÅÅÌÖÐԵظüжøÊÇÏÈÔÚmemtable½øÐÐËùÓеĸüС£×îºó¸üÐÂÄÚÈݱ»Ë¢Èë´ÅÅÌ´æ´¢ÔÚеÄSSTableÖУ¬½öµ±columnµÄʱ¼ä´Á±È¼È´æµÄcolumn¸üÐÂʱ²Å¸²¸ÇÔÀ´µÄÊý¾Ý¡£
ɾ³ý
²»»áÁ¢¼´´Ó´ÅÅÌÒÆ³ýɾ³ýµÄÊý¾Ý
±»É¾³ýµÄÊý¾Ý»á±»tombstone±ê¼ÇÒÔÖ¸¶¨Æä״̬£¬Ëü»á´æÔÚÒ»¶¨µÄʱ¼ä
£¨ÓÉgc_grace_secondsÖ¸¶¨£©£¬³¬³ö¸Ãʱ¼äºócompaction½ø³ÌÓÀ¾Ãɾ³ý¸Ãcolumn¡£
Èô²»ÀýÐÐÐÔµÄÖ´Ðнڵãrepair²Ù×÷£¬±»É¾³ýµÄcolumn¿ÉÄÜÖØÐ³öÏÖ
Èôɾ³ýÆÚ¼ä½Úµãdownµô£¬±»±ê¼ÇΪtombstoneµÄcolumn»á·¢ËÍÐźŸøCassandraʹÆäÖØ·¢É¾³ýÇëÇó¸ø¸Ãreplica½Úµã¡£ÈôreplicaÔÚgc_grace_secondsÆÚ¼ä¸´»î£¬»á×îÖÕÊܵ½É¾³ýÇëÇó£¬ÈôreplicaÔÚgc_grace_secondsÖ®ºó¸´»î£¬½Úµã¿ÉÄÜ´í¹ýɾ³ýÇëÇ󣬶øÔÚ½Úµã»Ö¸´ºóÁ¢¼´É¾³ýÊý¾Ý¡£Ð趨ÆÚÖ´ÐнڵãÐÞ¸´²Ù×÷À´±ÜÃâɾ³ýÊý¾ÝÖØÏÖ¡£
hinted handoff writes
ÔÚ²»ÒªÇóÒ»ÖÂÐÔʱȷ±£Ð´µÄ¸ß¿ÉÓã¬ÔÚcassandra.yamlÖпªÆô¸Ã¹¦ÄÜ¡£Ö´ÐÐwrite²Ù×÷ʱÈôÓµÓжÔÓ¦rowµÄreplica
downµôÁË»òÕßÎÞ»ØÓ¦£¬Ôòе÷Õß»áÔÚ±¾µØµÄsystem.hints±íÖд洢һ¸öhint£¬Ö¸Ê¾¸Ãд²Ù×÷ÐèÔÚ²»¿ÉÓõÄreplica»Ö¸´ºóÖØÐÂÖ´ÐС£Ä¬ÈÏhints±£´æ3Сʱ£¬¿Éͨ¹ýmax_hint_window_in_ms¸Ä±ä¸ÃÖµ¡£
ÌáʾµÄwrite²»¼ÆÈëconsistencylevelÖеÄONE£¬QUORUM»òALL£¬µ«¼ÆÈëANY¡£
ANYÒ»ÖÂÐÔ¼¶±ð¿ÉÈ·±£cassandraÔÚËùÓÐreplica²»¿ÉÓÃʱÈԿɽÓÊÜwrite£¬²¢ÇÒÔÚÊʵ±µÄreplica¿ÉÓÃÇÒÊÕµ½hintÖØ·Åºó¸Ãwrite²Ù×÷¿É¶Á¡£
ÒÆ³ý½Úµãºó½Úµã¶ÔÓ¦µÄhints×Ô¶¯ÒƳý£¬É¾³ý±íºó¶ÔÓ¦µÄhintsÒ²»á±»ÒƳý¡£
ÈÔÐ趨ÆÚÖ´ÐÐrepair£¨±ÜÃâÓ²¼þ¹ÊÕÏÔì³ÉµÄÊý¾Ý¶ªÊ§£©
8.4¹ØÓÚ¶Á
´ÓSSD²¢ÐÐËæ»ú¶ÁÈ¡£¬ÑÓʱ¼«µÍ£¨²»ÍƼöcassandraʹÓÃתÅÌʽӲÅÌ£©¡£
ÒÔpartition key¶Á/д£¬Ïû³ýÁ˹ØÏµÐÍÊý¾Ý¿âÖи´ÔӵIJéѯ¡£
¶ÁSSTable

Ê×Ïȼì²éBloom filter£¬Ã¿¸öSSTable¶¼ÓÐÒ»¸öBloomfilter
£¬ÓÃÒÔÔÚ½øÐÐÈκδÅÅÌI/Oǰ¼ì²éÇëÇóµÄ partition key¶ÔÓ¦µÄÊý¾ÝÔÚSSTableÖдæÔڵĿÉÄÜÐÔ¡£
ÈôÊý¾ÝºÜ¿ÉÄÜ´æÔÚ£¬Ôò¼ì²é Partition key cache(Cassandra ±ípartition
indexµÄ»º´æ)£¬Ö®ºó¸ù¾ÝindexÌõÄ¿ÊÇ·ñÔÚcacheÖÐÕÒµ½¶øÖ´Ðв»Í¬²½Ö裺
ÕÒµ½
´Ócompression offset mapÖвéÕÒÓµÓжÔÓ¦Êý¾ÝµÄѹËõ¿ì¡£
´Ó´ÅÅÌÈ¡³öѹËõµÄÊý¾Ý£¬·µ»Ø½á¹û¼¯¡£
δÕÒµ½
ËÑË÷Partition summary£¨partition indexµÄÑù±¾¼¯£©È·¶¨indexÌõÄ¿ÔÚ´ÅÅÌÖеĽüËÆÎ»Öá£
´Ó´ÅÅÌÖÐSSTableÄÚÈ¡³öindexÌõÄ¿¡£
´Ócompression offset mapÖвéÕÒÓµÓжÔÓ¦Êý¾ÝµÄѹËõ¿ì¡£
´Ó´ÅÅÌÈ¡³öѹËõµÄÊý¾Ý£¬·µ»Ø½á¹û¼¯¡£
»Ø¹Ë²åÈë/¸üÐÂÊý¾Ý


¶ÁµÄ¹ý³Ì

ÓÉinsert/update¹ý³Ì¿ÉÖª£¬readÇëÇóµ½´ïijһ½Úµãºó£¬±ØÐë½áºÏËùÓаüº¬ÇëÇóµÄrowÖеÄcolumnµÄSSTableÒÔ¼°memtableÀ´²úÉúÇëÇóµÄÊý¾Ý¡£

ÀýÈ磬Ҫ¸üаüº¬Óû§Êý¾ÝµÄij¸örowÖеÄemail ÁУ¬cassandra²¢²»ÖØÐ´Õû¸örowµ½ÐµÄÊý¾ÝÎļþ£¬¶ø½ö½ö½«ÐµÄemailд½øÐµÄÊý¾ÝÎļþ£¬usernameµÈÈÔ´¦ÓھɵÄÊý¾ÝÎļþÖС£ÉÏͼÖкìÏß±íʾCassandraÐèÒªÕûºÏµÄrowµÄƬ¶ÎÓÃÒÔ²úÉúÓû§ÇëÇóµÄ½á¹û¡£Îª½ÚÊ¡CPUºÍ´ÅÅÌI/O£¬Cassandra»á»º´æºÏ²¢ºóµÄ½á¹û£¬ÇÒ¿ÉÖ±½ÓÔÚ¸ÃcacheÖиüÐÂrow¶ø²»ÓÃÖØÐºϲ¢¡£
8.5¹ØÓÚÊÂÎñºÍÐͬ¿ØÖÆ
²»Ö§³ÖRDBMSÖоßÓлعöºÍËø¶¨»úÖÆµÄACIDÊÂÎñ£¬µ«ÌṩÁËÒ»¶¨³Ì¶ÈµÄÔ×ÓÐÔ£¨Ðм¶£©¡¢¸ôÀëÐÔ£¨Ðм¶£©¡¢³Ö¾ÃÐÔºÍeventual/tunable
ÀàÐ͵ÄÒ»ÖÂÐÔ£¨Òò²»Ö§³ÖÁ¬½ÓºÍÍâ¼ü£¬¹Ê²»ÌṩACID³¡¾°ÏµÄÒ»ÖÂÐÔ£©¡£
Ô×ÓÐÔ
row-level£¬¶ÔÒ»¸örowµÄ²åÈë/¸üб»µ±×öÒ»¸öÔ×Ó²Ù×÷¡£²»Ö§³ÖҪô¶¼×öҪô¶¼²»×öµÄ¶àÐвåÈë/¸üС£²»Ö§³ÖÔÚÒ»¸öreplicaÉÏwrite³É¹¦¶øÔÚÆäËûreplicaÉÏwriteʧ°ÜµÄ»Ø¹ö¡£ÓÃʱ¼ä´ÁÈ·¶¨columnµÄ×îиüС£Èô¶à¸ösessionͬʱ¸üÐÂͬÑùµÄcolumnÔòʹÓÃ×î½üµÄ¸üС£
Ò»ÖÂÐÔ
l TuneableÒ»ÖÂÐÔ
ÌṩpartitionÈÝ´í¡£Óû§¿ÉÒÔÒÔµ¥¸ö²Ù×÷Ϊ»ù´¡¾ö¶¨Ðè¶àÉÙ¸ö½Úµã½ÓÊÕDML²Ù×÷»òÏìÓ¦SELECT²Ù×÷¡£
l LinearizableÒ»ÖÂÐÔ
l ÇáÁ¿ÊÂÎñ(compare-and-set)µÄһϵÁиôÀë¼¶±ð¡£ ÔÚtuneableÒ»ÖÂÐÔ²»×ãÒÔÂú×ãÒªÇóʱʹÓã¬
ÈçÖ´ÐÐÎÞ¼ä¶ÏµÄÏà¼Ì²Ù×÷»òͬʱ/²»Í¬Ê±ÔËÐÐÒ»¸ö²Ù×÷²úÉúͬÑùµÄ½á¹û¡£ Cassandra2.0ʹÓÃÀàËÆ2-phase
commit µÄPaxos consensusÐÒéʵÏÖ LinearizableÒ»ÖÂÐÔ¡£ £¨ÎªÖ§³Ö¸ÃÒ»ÖÂÐÔÒýÈëÁËSERIALÀàÐ͵Äconsistency
level¼°ÔÚCQLÖÐʹÓÃÁË´øIF´Ó¾äµÄÇáÁ¿ÊÂÎñ£©
¸ôÀëÐÔ
Cassandra2.0¿ªÊ¼Ö§³Örow-levelµÄ¸ôÀëÐÔ¡£¶ÔÐеÄд²Ù×÷ÔÚÍê³É֮ǰ¶ÔÆäËûÓû§²»¿É¼û¡£
³Ö¾ÃÐÔ
ͬʱ½«Êý¾ÝдÈëÄÚ´æÖеÄmemtable¼°´ÅÅÌÖеÄcommit log¡£·þÎñÆ÷¹ÊÕÏʱÈômemtableÉÐδˢÈë´ÅÅÌ£¬ÔÚ¹ÊÕϻָ´ºó¿ÉÖØ·Åcommit
log»Ö¸´¶ªÊ§Êý¾Ý¡£ÕâÌṩÁ˱¾µØ³Ö¾ÃÐÔ¡£Êý¾ÝÔÚÆäËû½ÚµãµÄ¸±±¾¼ÓÇ¿Á˳־ÃÐÔ¡£
ÇáÁ¿ÊÂÎñ
Cassandra2.0ÖÐÒýÈ룬ÃÖ²¹TuneableÒ»ÖÂÐÔ¡£
n INSERT INTO
emp(empid,deptid,address,first_name,last_name)
VALUES(102,14,'luoyang','Jane Doe','li') IF NOT
EXISTS;
n UPDATE emp SET address = 'luoyang' WHERE empid
= 103 and deptid = 16IF last_name='zhang'; |
8.6ÅäÖÃÊý¾ÝÒ»ÖÂÐÔ
CassandraÖУ¬Ò»ÖÂÐÔ¼¶±ð¿ÉÅäÖã¬ÒÔÈ·¶¨ÇëÇóµÄÊý¾ÝÈçºÎÔÚ²»Í¬µÄreplica±£³ÖÒ»ÖÂÐÔ£¬´Ó¶øÆ½ºâÏìӦʱ¼äºÍÊý¾Ý¾«È·ÐÔ¡£
дһÖÂÐÔ
Ö¸Ã÷ÔÚ·µ»ØÈ·ÈÏÖÁ¿Í»§¶Ëǰ£¬write²Ù×÷±ØÐë³É¹¦µÄreplicaÊý¡£
l ANY£ºwriteÖÁÉÙÔÚÒ»¸öreplica³É¹¦¡£¼´Ê¹ËùÓÐreplica
¶¼downµô£¬ ÔÚдhinted handoffºówriteÈԳɹ¦¡£ÔÚreplica»Ö¸´ºó¸Ãwrite¿É¶Á¡£
l ONE£ºwrite±ØÐë³É¹¦Ð´ÈëÖÁÉÙÒ»¸ö replicaµÄcommit
logºÍmemtable¡£
l TWO£ºÖÁÉÙÁ½¸ö
l THREE£ºÖÁÉÙÈý¸ö
l QUORUM£ºÖÁÉÙ(replication_factor/ 2) + 1¸ö
l LOCAL_QUORUM£ºÖÁÉÙ(replication_factor/ 2) + 1¸ö£¬ÇÒÓëе÷Õß´¦ÓÚͬһÊý¾ÝÖÐÐÄ
l EACH_QUORUM£ºËùÓÐÊý¾ÝÖÐÐÄ£¬ÖÁÉÙ(replication_factor/ 2) +
1¸ö
l ALL£ºÈ«²¿
l SERIAL£ºÖÁÉÙ(replication_factor/ 2) + 1¸ö£¬ÓÃÓÚ´ï³ÉÇáÁ¿ÊÂÎñµÄlinearizable
consistency
Ðè×¢ÒâµÄÊÇ£ºÊµ¼ÊÉÏwrite»¹Êǻᱻ·¢µ½ËùÓÐÏà¹ØµÄreplicaÖУ¬Ò»ÖÂÐÔ¼¶±ðÖ»ÊÇÈ·¶¨±ØÐèÒª·´À¡µÄreplicaÊý¡£
¶ÁÒ»ÖÂÐÔ
Ö¸Ã÷ÔÚ·µ»ØÊý¾ÝÖµ¿Í»§¶Ëǰ£¬ÐèÒªÏàÓ¦readÇëÇóµÄÏà¹ØreplicaÊý¡£Cassandra´ÓÕâЩÊýÁ¿µÄreplicaÖиù¾Ýʱ¼ä´Á¼ì²é×îеÄÊý¾Ý¡£¼¶±ðͬдһÖÂÐÔ¡£
¿Éͨ¹ýcqlshÃüÁîCONSISTENCYÉèÖÃkeyspaceµÄÒ»ÖÂÐÔ£¬Ò²¿É±à³ÌÉèÖÃÒ»ÖÂÐÔ¡£
9²Ù×÷
9.1¼à¿ØCassandra¼¯Èº
¹¤¾ß£ºnodetool utility¡¢DataStaxOpsCenter¡¢
JConsole
nodetool utility£ºCassandra·¢Ðа渽´øµÄÃüÁîÐй¤¾ß£¬
ÓÃÓÚ¼à¿ØºÍ³£¹æÊý¾Ý¿â²Ù×÷¡£Ò»Ð©³£ÓÃÃüÁîÈç status¡¢cfstats¡¢cfhistograms¡¢netstats¡¢tpstatsµÈ¡£
DataStax OpsCenter£ºÍ¼ÐÎÓû§½çÃæ¹¤¾ß£¬´ÓÖÐÑë¿ØÖÆÌ¨¼à¿ØºÍ¹ÜÀí¼¯ÈºÖÐËùÓнڵ㡣
JConsole£ºJMX¼æÈݹ¤¾ßÓÃÒÔ¼à¿ØjavaÓ¦ÓóÌÐò£¬ÌṩOverview¡¢
Memory¡¢Thread¡¢Classes¡¢VM summary¡¢Mbeans·½ÃæµÄÐÅÏ¢¡£
9.2µ÷ÕûBloom filters
Bloom filtersÓÃÒÔÔÚÖ´ÐÐI/Oǰȷ¶¨SSTableÊÇ·ñº¬Ìض¨µÄrow¡£ÓÃÓÚindexɨÃè¶ø²»ÓÃÓÚrangeɨÃ衣ͨ¹ýbloom_filter_fp_chance²ÎÊýÅäÖÃÆäÊôÐÔÖµ£¬·¶Î§Îª0ÖÁ1.0(¹Ø±Õ)£¬ÖµÔ½´óÔòʹÓõÄÄÚ´æÔ½ÉÙ£¬µ«Ò²Òâζ×ÅÈôSSTableÓɽ϶àË鯬Ôòµ¼Ö½ϸߵĴÅÅÌI/O¡£Ä¬ÈÏÖµÒÀÀµÓÚcompaction_strategyÀàÐÍ¡£ÖµµÄÉèÖÃÒÀÀµ¹¤×÷¸ººÉ£¬È磬ÈôÐèÔÚÒ»ÌØ¶¨±íÉÏÔËÐз±ÖصÄscanÔòÐ轫bloom_filter_fp_chanceÉèÖøßÒ»µã¡£
ͨ¹ýÈçÏÂÓï¾äÉèÖãº
ALTER TABLEaddamsFamily WITH bloom_filter_fp_chance
= 0.1;
ÉèÖúúóÐèʹÓÃInitiatecompaction »òUpgrade
SSTables·½Ê½Ö®Ò»ÖØÐ²úÉúBloom filter¡£
9.3Êý¾Ý»º´æ
Á½Ààcache£ºpartitionkey cacheºÍrow cache
partition key cache£ºCassandra±ípartition indexµÄcache
row cache£ºÒ»¸örowÊ״α»·ÃÎʺóÕû¸öro w(ºÏ²¢×Ô¶à¸ö¶ÔÓ¦µÄSSTable¼°memtable)
±»·ÅÔÚrow cacheÖÐÒÔ±ãÓÚºóÐø¶Ô¸ÄrowµÄ·ÃÎÊÄÜÖ±½ÓÓÉÄÚ´æ»ñÈ¡Êý¾Ý¡£
¶ÔÓÚºÜÉÙ·ÃÎʵÄarchive±íµ±½ûÓûº´æ¡£
¿ªÆôÓëÅäÖÃcache
¿ªÆô
CREATE TABLEusers
(
userid text PRIMARY KEY,
first_name text,
last_name text,
)
WITH caching ='all'; |
ÅäÖÃ
ÔÚcassandra.yamlÖУ¬µ÷ÕûÏÂÁвÎÊý£»
l key_cache_keys_to_save
l key_cache_save_period
l key_cache_size_in_mb
l row_cache_keys_to_save
l row_cache_size_in_mb
l row_cache_save_period
l row_cache_provider |
¹¤×÷ÔÀí£º

µÚÒ»¸öread²Ù×÷Ö±½ÓÃüÖÐrowcache£¬´ÓÄÚ´æÈ¡³öÊý¾Ý¡£µÚ¶þ¸öread²Ù×÷ΪÃüÖÐ
row cache£¬µ«ÃüÖÐpartition key cache£¬ ²¢ÓÉ´ËÕûºÏËùÓÐÏà¹ØµÄSSTable¼°memtableÖÐµÄÆ¬¶ÎΪÇëÇóµÄrow£¬·µ»Ørow²¢Ð´½ørow
cache¡£
cacheʹÓÃÓÅ»¯½¨Òé
½«ºÜÉÙÇëÇóµÄÊý¾Ý»òrowºÜ³¤µÄÊý¾Ý·ÅÔÚcache½ÏС»ò²»Ê¹ÓÃcacheµÄ±íÖÐ
Óý϶àµÄ½Úµã²¿Êð¸÷½Úµã¸ºÔؽÏÇáµÄ¼¯Èº
Âß¼ÉϽ«read³íÃܵÄÊý¾Ý·Ö¿ªÔÚÀëÉ¢µÄ±íÖÐ
9.4ÅäÖÃmemtableÍÌÍÂÁ¿
¿É¸ÄÉÆwriteÐÔÄÜ¡£CassandraÔÚcommit logspace threshold³¬³öʱ½«memtablesÄÚÈÝË¢½ø´ÅÅÌ´´½¨SSTable¡£ÔÚcassandra.ymalÖÐÅäÖÃcommit
log space thresholdÀ´µ÷ÕûmemtableÍÌÍÂÁ¿¡£ÅäÖõÄÖµÒÀÀµÓÚÊý¾ÝºÍwrite¸ºÔØ¡£ÏÂÁÐÁ½ÖÖÇé¿ö¿É¿¼ÂÇÔö¼ÓÍÌÍÂÁ¿£º
write¸ºÔذüº¬´óÁ¿ÔÚСÊý¾Ý¼¯ÉϵĸüвÙ×÷
Îȶ¨³ÖÐøµÄд²Ù×÷
9.5CompactionÓëCompression
9.5.1Compaction
ÖÜÆÚÐԵĺǫ́½ø³Ì¡£CompactionÆÚ¼äCassandraͨ¹ý
ÕûºÏrowƬ¶ÎºÏ²¢SSTable¡¢ÒƳý¹ýÆÚµÄtombstones¡¢Öؽ¨Ë÷ÒýµÈ£¬²¢ÔÚÐÂSSTableºÏ²¢Íê³ÉºóÒÆ³ý¾ÉµÄSSTable¡£
Á½ÀàCompaction
SizeTieredCompactionStrategy
ÊÕ¼¯³ß´çÏà½üµÄSSTableºÏ²¢ÎªÒ»¸ö½Ï´óµÄSSTable¡£
LeveledCompactionStrategy
´´½¨Ïà¶Ô½ÏСµÄSSTable£¬³ß´ç±»¹Ì¶¨Îª²»Í¬µÈ¼¶£¨L0¡¢L1¡¢L2¡¡£©£¬Í¬Ò»¼¶ÄÚSSTable´óСÏàͬ£¬Ã¿²îÒ»¸öµÈ¼¶³ß´ç²î10±¶¡£SSTable´Ó½ÏСµÄµÈ¼¶Ö𽥺ϲ¢ÖÁ½Ï¸ßµÄµÈ¼¶¡£
Compaction²Ù×÷»áÁÙʱÔö¼Ó´ÅÅÌI/O£¬µ«Íê³Éºó¿É¸ÄÉÆreadÐÔÄÜ¡£
¿ªÆôÓëÅäÖÃCompaction
ʹÓÃCQLÓï¾äCREATE/ALTER TABLE
l ALTER TABLE
users WITH
compaction = { 'class' : 'LeveledCompactionStrategy',
'sstable_size_in_mb' : 10 }
l ALTER TABLE users
WITH compaction ={'class' : 'SizeTieredCompactionStrategy','min_threshold'
: 6 } |
¸ü¶àÊôÐԲμûCQL keyspace and table properties.
ÅäÖÃcassandra.yamlÎļþ
l snapshot_before_compaction
l in_memory_compaction_limit_in_mb
l multithreaded_compaction
l compaction_preheat_key_cache
l concurrent_compactors
l compaction_throughput_mb_per_sec |
9.5.2Compression
ͨ¹ý¼õÉÙÊý¾ÝÌå»ýºÍ´ÅÅÌI/OÀ´×î´ó»¯´æ´¢ÄÜÁ¦¡£´ó´óÌáÉý¶ÁÐÔÄÜÇÒ ²»»áÏñ´«Í³¹ØÏµÐÍÊý¾Ý¿âÖеÄCompression²Ù×÷½µµÍwriteÐÔÄÜ¡£
ʲôʱºòÖ´ÐÐCompression
ÊÊÓÃÓÚÓµÓдóÁ¿µÄrowÇÒÿ¸örowÓëÆäËûrowÓÐÒ»ÑùµÄcolumn»ò¾¡¿ÉÄܶàÏàͬµÄcolumnµÄ±í¡£Ô½ÏàËÆÑ¹Ëõ±ÈÔ½¸ß£¬ÐÔÄÜÌáÉýÔ½Ã÷ÏÔ¡£row¾ßÓвîÒì½Ï´óµÄcolumn¼¯µÄ±í²»ÊÊÓÚCompression¡£ÈçDynamic±í¡£
ÅäÖúÃcompressionºóºóÐø´´½¨µÄSSTable±»Ñ¹Ëõ£¬ ֮ǰÒѾ´æÔÚµÄSSTable²»±»Á¢¼´Ñ¹ËõÖ±µ½Õý³£µÄ
Cassandracompaction½ø³Ì¿ªÊ¼¡£¿ÉʹÓÃnodetool upgradesstables
ÃüÁîÇ¿ÖÆÑ¹Ëõ¼È´æµÄSSTable
ÅäÖÃCompression
½ûÓÃ
CREATE TABLEDogTypes
(
block_id uuid,
species text,
alias text,
population varint,
PRIMARY KEY (block_id)
)
WITH compression = {'sstable_compression' : ''
}; |
¿ªÆô
CREATE TABLEDogTypes
(
block_id uuid,
species text,
alias text,
population varint,
PRIMARY KEY (block_id)
)
WITH compression = {'sstable_compression' : 'LZ4Compressor'
}; |
µ÷Õû
ALTER TABLECatTypes
WITH compression = { 'sstable_compression' :'DeflateCompressor',
'chunk_length_kb' : 64 } |
9.6µ÷ÕûJava×ÊÔ´
ÐÔÄÜϽµ»òÄÚ´æÏûºÄ¹ý¶àʱÐ迼Âǵ÷ÕûJava×ÊÔ´¡£ÓÐÁ½¸öÎļþÓÃÓÚCassandraÖл·¾³ÉèÖãº
comf/cassandra-env.sh£ºÅäÖÃJVM
bin¡¢cassandra-in.sh£ºÅäÖÃCassandra»·¾³±äÁ¿
µ÷ÕûHeap³ß´çʱMAX_HEAP_SIZEÓëHEAP_NEWSIZEҪͬʱÉèÖã¬Ç°ÕßÉèÖÃJVM×î´óheap³ß´ç£¬ºóÕßÉèÖÃÐÂÉú´úµÄ³ß´ç£¬ÐÂÉú´ú³ß´çÔ½´óÀ¬»ø»ØÊÕÔÝͣʱ¼äÔ½³¤£¬·´Ö®À¬»ø»ØÊÕÏûºÄÔ½´ó¡£
µ±Ç°Ä¬ÈÏÅäÖãº

heap´óС²¢·ÇÔ½´óÔ½ºÃ£ºÊ×ÏÈJava6´¦Àí8GBÒÔÉϵÄÀ¬»øÊÕ¼¯µÄÄÜÁ¦»áѸËÙËõ¼õ£»Æä´Î»á¼õÉÙ²Ù×÷ϵͳ»º´æÒ³ËùÄÜʹÓõÄÄÚ´æ¡£
Cassandra1.2ÒÔºó°æ±¾BloomfilterºÍcompression
offset mapÊÇoff-heapµÄ£¬²»ËãÔÚJVMµÄheapÖ®ÄÚ¡£ Cassandra2.0ºópartition
summaryÒ² ÊÇoff-heapµÄ¡£ÈôÔÚCassandraÖÐʹÓà JNA¿â£¬row cacheÒ²»áÉý¼¶Îªoff-heap¡£
ÕâЩ¿É°ï¼õÉÙheap´óС£¬ ÔöÇ¿JVM GCÐÔÄÜ£¬´Ó¶øÔö¼ÓCassandra¸ßЧ´¦Àíÿ¸ö½ÚµãÖÐÊý¾ÝµÄÄÜÁ¦¡£
ÈôGCƵ·¢·¢ÉúÇÒÔÚÊʶȵÄʱ¼äÍê³É±íÃ÷JVM GCѹÁ¦¹ý´ó£¬´ËʱÐè×÷³öÔö¼Ó½Úµã¡¢½µµÍcache´óС¡¢µ÷ÕûJVMÖÐÓйØGCµÄ²ÎÊýµÈ²¹¾È´ëÊ©¡£
JavaManagement Extensions (JMX)ÌṩÁ˹ÜÀíºÍ¼à¿ØJavaÓ¦ÓúͷþÎñµÄ¸÷ÖÖ¹¤¾ß¡£
ÈçJConsole,¡¢the nodetool utilityºÍ DataStax OpsCenterÕâЩJMX¼æÈݹ¤¾ß¡£
comf/cassandra-env.shÖÐÆäËûÏà¹Ø²ÎÊý
com.sun.management.jmxremote.port
com.sun.management.jmxremote.ssl
com.sun.management.jmxremote.authenticate
-Djava.rmi.server.hostname
9.7ÐÞ¸´ node
ʹÓÃnodetoolµÄrepairÃüÁÐÞ¸´Óë¸ø¶¨µÄÊý¾Ý ·¶Î§Ïà¹ØµÄreplica¼äµÄ²»Ò»ÖÂÐÔ¡£ÔÚÏÂÊôÇéÐÎÔËÐÐÐÞ¸´£º
¹æÂɵġ¢¼Æ»®µÄ¼¯ÈºÎ¬»¤²Ù×÷ÆÚ¼ä£¨³ý·ÇûÓÐÖ´Ðйýdelete£©
½Úµã»Ö¸´ºó
ÔÚ°üº¬½ÏÉÙ±»·ÃÎʵÄÊý¾ÝµÄ½ÚµãÉÏ
ÔÚdownµôµÄ½Úµã¸üÐÂÊý¾Ý
ÔËÐнڵãÐÞ¸´µÄ·½Õ룺
³£¹æÐÞ¸´²Ù×÷Ö´ÐдÎÊýÓÉgc_graceÖµÓ²ÐԹ涨¡£ÐèÔÚ¸Ãʱ¼äÄÚÔÚÿ¸ö½ÚµãÖÁÉÙÔËÐÐÒ»´ÎÐÞ¸´²Ù×÷¡£
ͬʱÔÚ¶àÓÚÒ»¸öµÄ½ÚµãÔËÐг£¹æÐÞ¸´Ê±Ðè½÷É÷£¬×îºÃÔڵͷåÆÚ¹æÂÉÔËÐÐÐÞ¸´¡£
ÔÚºÜÉÙdelete»òoverwriteÊý¾ÝµÄϵͳÖУ¬¿ÉÔö¼Ógc_graceµÄÖµ¡£
ÐÞ¸´²Ù×÷ÏûºÄ´ÅÅÌI/O£¬¿Éͨ¹ýÏÂÊö;¾¶¼õÇ᣺
ʹÓÃnodetoolµÄcompactionthrottlingÑ¡Ïî¡£
ʹÓÃnodetoolsnapshotÖ®ºó´ÓsnapshotÖ´ÐÐÐÞ¸´¡£
ÐÞ¸´²Ù×÷»áµ¼ÖÂoverstreaming£¨ÎÊÌâÔ´ ÓÚCassandraÄÚ²¿MerkletreesÊý¾Ý½á¹¹£©¡£
±ÈÈçÖ»ÓÐÒ»¸öË𻵵Äpartitionµ«È´Ðè·¢ËͺܶàµÄstream£¬ ÇÒÈô½ÚµãÖдæÔÚµÄpartitionÔ½¶àÎÊÌâÔ½ÑÏ
ÖØ¡£Õâ»áÒýÆð´ÅÅ̿ռäÀ˷ѺͲ» ±ØÒªµÄcompaction¡£¿ÉʹÓÃsubrange ÐÞ¸´À´¼õÇáoverstreaming¡£subrange
repairÖ»ÐÞ¸´ÊôÓÚ½ÚµãµÄ²¿·ÖÊý¾Ý¡£
9.8Ìí¼Ó/ÒÆ³ý½Úµã»òÊý¾ÝÖÐÐÄ
Ôڼȴ漯ȺÖÐÌí¼Ó½Úµã
ÒÔʹÓÃvnodesµÄ½ÚµãΪÀý£¨ÍƼö´ËÖÖ·½Ê½£¬ÐéÄâ½ÚµãÏà¹ØÄÚÈݼûµÚ7½Ú£©
1. ÔÚнڵ㰲װCassandra£¬¹Ø±Õcassandra£¬Çå³ýÊý¾Ý¡£
2. ÔÚcassandra.yamlºÍcassandra-topology.propertiesÖÐÅäÖÃÈçÏÂÊôÐÔ£º
l cluster_name
l listern_address/broadcast_address
l endpoint_snitch
l num_tokens
l seed_provider
3. Öð¸öÆô¶¯Ð½ڵãÖеÄcassandra£¬²»Í¬½ÚµãµÄ³õʼ»¯Ö®¼ä±£³ÖÁ½·ÖÖӵļä¸ô¡£
¿ÉÓÃnodetool netstats¼à¿ØÆô¶¯ºÍÊý¾ÝÁ÷´¦Àí
4. ´ýËùÓÐнڵãÔËÐÐÆðÀ´ºóÖð¸öÔÚÿ¸ö֮ǰÒÑ´æÔڵĽڵãÖ´ÐÐnodetool
cleanupÀ´ÒƳý²»ÔÙÊôÓÚÕâЩ½ÚµãµÄkey¡£ÔÚÏÂÒ»¸ö½ÚµãÖ´ÐÐnodetool cleanupǰ±ØÐëµÈÉÏÒ»¸ö½ÚµãÖÐ
µÄnodetool cleanup½áÊø¡£ÁíÍâcleanup²Ù×÷¿É¿¼ÂÇÔڵͷåÆÚ½øÐС£
Ïò¼È´æ¼¯ÈºÖÐÌí¼ÓÊý¾ÝÖÐÐÄ
ÒÔʹÓÃvnodesµÄ½Úµã¹¹³ÉµÄ¼¯ÈºÎªÀý
1. È·±£keyspaceʹÓÃNetworkTopologyStrategy¸´ÖƲßÂÔ
2. ¶ÔÓÚÿ¸öнڵãÔÚcassandra.yamlÖÐÉèÖÃÈçÏÂÊôÐÔ
l auto_bootstrap: false.
l ÉèÖÃÆäËûÓëËùÊô¼¯ÈºÆ¥ÅäµÄÊôÐÔ£¨²Î¼ûÉÏÒ»²¿·Ö£ºÔڼȴ漯ȺÖÐÌí¼Ó½Úµã£©
3. ¸ù¾ÝÉèÖõÄsnitchÀàÐÍÔÚ¸÷нڵãÅäÖöÔÓ¦µÄÖ¸Ã÷ÍøÂçÍØÆËµÄÅäÖÃÎļþ£¨ÎÞÐèÖØÆô£©
4. È·±£Ê¹ÓõĿͻ§¶Ë²»»á×Ô¶¯Ì½²âеĽڵ㡣
5. ÈôʹÓÃQUORUMÒ»ÖÂÐÔ¼¶±ð£¬Ðè¼ì²éLOCAL_QUORUM
»òEACH_QUORUMÒ»ÖÂÐÔ¼¶±ðÊÇ·ñÂú×ã¶àÊý¾ÝÖÐÐĵÄÒªÇó
6. Öð¸öÔÚÿ¸ö½Úµã¿ªÆôcassandra¡£×¢Òâ³õʼ»¯Ê±¼ä¼ä¸ô¡£
7. ËùÓнڵãÔËÐÐÆðÀ´ºóÖ´ÐÐÏÂÁвÙ×÷
Ìæ»»ËÀµôµÄ½Úµã
ÒÔʹÓÃvnodesµÄ½Úµã¹¹³ÉµÄ¼¯ÈºÎªÀý
1. ÓÃnodetool statusÃüÁîÈ·ÈÏ»·ÖÐËÀµôµÄ½Úµã£¬´ÓÊä³öÖмǼ¸Ã½ÚµãµÄHOST ID¡£
2. Ìí¼Ó²¢Æô¶¯ÐµÄÌæ´ú½Úµã£¨²Î¼û£ºÔڼȴ漯ȺÖÐÌí¼Ó½Úµã£©
3. ʹÓÃnodetool removenodeÃüÁî¸ù¾Ý¼Ç¼µÄËÀÍö½ÚµãµÄHOST ID´Ó¼¯ÈºÖÐÒÆ³ýËÀµôµÄ½Úµã¡£
ÒÆ³ýÊý¾ÝÖÐÐÄ
1. È·ÈÏûÓÐclientÕýÔÚÏòÊý¾ÝÖÐÐÄÄÚµÄÈκνڵãдÊý¾Ý
2. ÔÚÊý¾ÝÖÐÐÄÄڵĸ÷½ÚµãÖÐÖ´ÐÐnodetool repairÒÔÈ·±£Êý¾Ý´Ó¸ÃÖÐÐĵõ½ÕýÈ·µÄ´«²¥¡£¸ü¸ÄËùÓеÄkeyspaceÊôÐÔÈ·±£²»ÔÙÒýÓü´½«ÒƳýµÄÊý¾ÝÖÐÐÄ¡£
3. ÔÚÊý¾ÝÖÐÐÄÄڵĸ÷½Úµã·Ö±ðÔËÐÐnodetool decommission
9±¸·Ý»Ö¸´
Cassandraͨ¹ýΪ´ÅÅÌÖеÄÊý¾ÝÎļþ£¨SSTableÎļþ£©´´½¨¿ìÕÕÀ´±¸·ÝÊý¾Ý¡£¿ÉΪµ¥¸ö±í¡¢µ¥¸ökeyspace¡¢ËùÓÐkeyspace´´½¨¿ìÕÕ¡£¿ÉÓò¢ÐÐSSH¹¤¾ßΪÕû¸ö¼¯Èº´´½¨¿ìÕÕ¡£´´½¨Ê±²»±£Ö¤ËùÓÐreplicaÒ»Ö£¬µ«ÔÚ»Ö¸´¿ìÕÕʱ
CassandraÀûÓÃÄÚ½¨µÄÒ»ÖÂÐÔ»úÖÆ±£³ÖÒ»ÖÂÐÔ¡£´´½¨ÁËϵͳ·¶Î§µÄ¿ìÕÕºó¿É¿ªÆôÔöÁ¿±¸·ÝÖ»±¸·Ý×ÔÉϴοìÕÕÒÔÀ´±ä»¯Á˵ÄÊý¾Ý£¨Ã¿µ±Ò»¸öSSTable±»flushºó£¬Ò»¸ö¶ÔÓ¦µÄÓ²Á´½Ó±»¿½±´ÖÁÓë/snapshotͬ¼¶µÄ/backups×ÓĿ¼(ÐèʹÓÃJNA)£©¡£
ÈôÔÚCassandraÖÐʹÓÃÁËJNA£¬Ôò¿ìÕÕͨ¹ýÓ²Á´½Ó´´½¨¡£·ñÔò»áÒò½«Îļþ¿½±´ÖÁ²»Í¬µÄλÖöøÔö¼Ó´ÅÅÌI/O¡£
9.1´´½¨¿ìÕÕ
ÔÚÿ¸ö½ÚµãÖ´ÐÐnodetoolsnapshotÃüÁîΪ½Úµã´´½¨¿ìÕÕ¡£Ò²¿Éͨ¹ý²¢ÐÐSSH¹¤¾ß£¨Èçpssh£©ÔËÐÐnodetool
snapshot´´½¨È«¾ÖµÄ¿ìÕÕ¡£
$ nodetool -h localhost -p 7199 snapshot demdb
Ö´ÐÐÃüÁîºóÊ×ÏȻὫÄÚ´æÖеÄÊý¾ÝË¢½ø´ÅÅÌ£¬Ö®ºóΪÿ¸ö keyspaceµÄSSTableÎļþ´´½¨Ó²Á´½Ó¡£
¿ìÕÕµÄĬÈÏλÖÃΪ/var/lib/cassandra/data/<keyspace_name>
/<table_name>/snapshots¡£ ÆäÖÐ/var/lib/cassandra/data²¿·ÖÒÀ¾ÝÊý¾ÝĿ¼ÉèÖöø²»Í¬¡£
Òª±£Ö¤¿Õ¼ä³ä×㣬´´½¨ºó¿É¿¼ÂÇÒÆÖÁÆäËûλÖá£
9.2ɾ³ý¿ìÕÕ
´´½¨ÐµĿìÕÕ²¢²»»á×Ô¶¯É¾³ý¾ÉµÄ¿ìÕÕ£¬ÐèÔÚ´´½¨Ð¿ìÕÕǰͨ¹ýnodetool clearsnapshotÃüÁîÒÆ³ý¾ÉµÄ¿ìÕÕ¡£
$ nodetool -h localhost -p 7199 clearsnapshot
ͬÑù¿Éͨ¹ý²¢ÐÐSSH¹¤¾ß£¨Èçpssh£©ÔËÐÐ nodetoolclearsnapshotÒ»´Îɾ³ýËùÓнڵãµÄ¿ìÕÕ¡£
9.3ÆôÓÃÔöÁ¿±¸·Ý
ĬÈϲ»¿ªÆô£¬¿Éͨ¹ýÔÚ¸÷½ÚµãµÄcassandra.yamlÅäÖÃÎļþÖÐÉèÖÃ
incremental_backupsΪtrueÀ´¿ªÆôÔöÁ¿±¸·Ý¡£¿ªÆôºó»áΪÿ¸öеı»Ë¢ÈëµÄSSTable´´½¨Ò»¸öÓ²Á´½Ó²¢¿½±´ÖÁÊý¾ÝĿ¼µÄ/backups×ÓĿ¼¡£
Cassandra²»»á×Ô¶¯É¾³ýÔöÁ¿±¸·ÝÎļþ£¬´´½¨ÐµĿìÕÕǰÐèÊÖ¹¤ÒƳý¾ÉµÄÔöÁ¿±¸·ÝÎļþ¡£
9.4´Ó¿ìÕÕ»Ö¸´Êý¾Ý
ÐèËùÓеĿìÕÕÎļþ£¬ÈôʹÓÃÁËÔöÁ¿±¸·Ý»¹Ðè¿ìÕÕ´´½¨Ö®ºóËùÓеÄÔöÁ¿±¸·ÝÎļþ¡£Í¨³££¬ÔÚ´Ó¿ìÕÕ»Ö¸´Êý¾ÝǰÐèÏÈtruncate±í¡££¨Èô±¸·Ý·¢ÉúÔÚdeleteǰ¶ø»Ö¸´·¢ÉúÔÚdeleteºóÇÒûtruncate±íʱ£¬Ôò²»Äܵõ½×îÔʼµÄÊý¾Ý£¬ÒòΪֱµ½compaction²Ù×÷·¢Éúǰ±»±ê¼ÇΪtombstoneµÄÊý¾ÝÓëÔʼÊý¾Ý´¦ÓÚ²»Í¬µÄSSTableÖУ¬ËùÒÔ»Ö¸´°üº¬ÔʼÊý¾ÝµÄSSTable²»»áÒÆ³ý±»±ê¼Ç±»tombstoneµÄÊý¾Ý£¬ÕâЩÊý¾ÝÈÔÈ»ÏÔʾΪ½«±»É¾³ý£©¡£
¿ÉÒÔÓÃÈçÏ·½Ê½´Ó¿ìÕÕ»Ö¸´Êý¾Ý
ʹÓÃsstableloader¹¤¾ß
ÏÈ¿½±´snapshotĿ¼ÖеĿìÕÕÎļþÖÁÏàÓ¦Êý¾ÝĿ¼¡£Ö®ºóͨ¹ý JConsoleµ÷ÓÃcolumn
family MBean ÖеÄJMX·½·¨loadNewSSTables()»òÕßʹÓÃnodetool
refreshÃüÁî¶ø²»µ÷ÓÃÉÏÊö·½·¨¡£
ʹÓÃÖØÆô½ÚµãµÄ·½Ê½
1. Èô»Ö¸´µ¥½ÚµãÔòÏȹرոýڵ㣬Èô»Ö¸´Õû¸ö¼¯ÈºÔòÐèÏȹرÕËùÓнڵã
2. Çå³ý/var/lib/cassandra/commitlogÖеÄËùÓÐÎļþ
3. ɾ³ý<data_directory_location>/
<keyspace_name>/<table_name>ÖÐËùÓÐ*.dbÎļþ
4. ¿½±´×îÐÂ<data_directory_location>
/<keyspace_name>/<table_name> /snapshots/
<snapshot_name> µÄ¿ìÕÕÎļþÖÁ<data_directory_location>
/ <keyspace_name> /<table_name> /snapshots/<snapshot_name>
5. ÈôʹÓÃÁËÔöÁ¿±¸·ÝÔò»¹Ð追±´<data_directory_location>
/<keyspace_name>/<table_name> /backupsÖеÄÄÚÈÝÖÁ
<data_directory_location> /<keyspace_name>/<table_name>
6. ÖØÆô½Úµã
7. ÔËÐÐnodetool repair
|