Apache áá±á¬á·ááºáá²áá±á¬ááºáá±ážááŸááºážááẠnoSQL á áá áºáá»á¬ážá á¡áááºážá¡á á¬ážááŸáá·áº áááºááá¯ááºááá·áº ááŒáá·áºáá±áá¬ážáá±á¬ DBMS Apache Cassandra 4.0 ááᯠáááºááŒááŒá®áž associative array (hash) áá¯á¶á á¶ááŒáá·áº ááááºážáááºážáá¬ážáá±á¬ áá»á¬ážááŒá¬ážááŸáá±á¬ áá±áá¬ááá¬áááᯠá¡ááœááºá¡á á¬ážááŒá®ážáá¬ážááŒá®áž áá¯á¶ááŒááºá áááºáá»ááá±á¬ ááá¯ááŸá±á¬ááºááŸá¯ááᯠáááºáá®ážááẠáá®ááá¯ááºážáá¯ááºáá¬ážáááºá Cassandra 4.0 ááŒáá·áºáá»áááŸá¯ááᯠáá¯ááºáá¯ááºá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠá¡áááºááá·áºááŒá áºáá±ááŒá®áᯠáá°ááááŒá®áž Amazoná Appleá DataStaxá Instaclustrá iland ááŸáá·áº Netflix á á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá»á¬ážááœáẠá ááºážáááºáá¬ážááŒá®áž áá¯á¶ááŸááºáá±á«ááºáž 1000 áá»á±á¬áºááŸááááºá ááá±á¬áá»ááºáá¯ááºááᯠJava ááŒáá·áºáá±ážáá¬ážáá¬ážááŒá®áž Apache 2.0 ááá¯ááºá ááºá¡á±á¬ááºááœáẠááŒáá·áºáá±áá¬ážáááºá
Cassandra DBMS ááᯠáá°áá Facebook á០áá®ááœááºáá²á·ááŒá®áž 2009 áá¯ááŸá áºááœáẠApache Foundation á áá¶á·ááá¯ážáá°áá®ááŸá¯á¡á±á¬ááºááœáẠááœáŸá²ááŒá±á¬ááºážáá²á·áááºá Cassandra ááá¯á¡ááŒá±áá¶ááá·áº á ááºááŸá¯ááŒá±ááŸááºážáá»ááºáá»á¬ážá¡á¬áž Appleá Adobeá CERNá Ciscoá IBMá HPá Comcastá Disneyá eBayá Huaweiá Netflixá Sonyá Rackspaceá Reddit ááŸáá·áº Twitter áá²á·ááá¯á·áá±á¬ áá¯áá¹ááá®áá»á¬ážá០áá«áá«áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠá¡áá¯á¶ážáá»áá¬ážáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá Apple ááŸá¡áá¯á¶ážááŒá¯áá±á¬ Apache Cassandra-based ááá¯ááŸá±á¬ááºááŸá¯á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááœáẠnode 160 nodes ááŸáá·áº 100 petabytes áááºááá¯áá±á¬áá±áá¬ááá¯ááááºážáááºážááŒááºážá¡áá«á¡ á ááºá¡á á¯á¡á ááºážáá áºáá±á¬ááºáá»á±á¬áºááŸááááºá Huawei ááẠnode 300 á¡áá«á¡ááẠApache Cassandra á¡á á¯á¡áá±áž 30 áá»á±á¬áºááᯠá¡áá¯á¶ážááŒá¯áá¬ážááŒá®áž Netflix ááẠá¡á á¯á¡áá±ážáá±á«ááºáž 100 áá»á±á¬áºááᯠá¡áá¯á¶ážááŒá¯áᬠ10 node áá»á¬ážááᯠááœáŸááºážááŒá¯á¶áᬠáá áºáá±á·áá»áŸáẠáá±á¬ááºážááá¯áá»ááºáá±á«ááºáž ááá®áá®áá¶áá»á±á¬áºááᯠáá¯ááºáá±á¬ááºáá±áááºá
Cassandra DBMS ááẠáá±áá¬ááá¬á ááá¯ážáá¬áááºááŸáá·áºá¡áá»áŸ áá áºááŒá±ážáá®áá®ážáá«áž áá»á²á·ááœááºááá¯ááºááŸá¯ááᯠáá¶á·ááá¯ážáá±ážááá·áº á¡ááŒáá·áºá¡áááŒáá·áºáá±áá¬ážáá±á¬ Dynamo hash á áá áºáá áºáá¯ááᯠáá±á«ááºážá ááºáá¬ážáááºá Cassandra ááẠáá±á¬áºáá¶áááá¬ážá ᯠ(ColumnFamily) ááá¯á¡ááŒá±áá¶á áá±áá¬ááááºážáááºážááŸá¯áá¯á¶á á¶ááᯠáá±á¬á·/áááºááá¯ážááœááºážáááºáá áºáá¯ááœááºáᬠááááºážáááºážáá¬ážááá·áº memcachedb áá²á·ááá¯á· á áá áºáá»á¬ážááŸáá·áº ááœá²ááŒá¬ážááá·áº áá±áá¬ááááºážáááºážááŸá¯áá¯á¶á á¶ááᯠá¡áá¯á¶ážááŒá¯áááºá áá±áá¬áá±á·á áºááŸáá·áº á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááᯠááá¯ážááŸááºážá á±áááºá ááœá²á·á ááºážáááºáá±á¬ááºáá¬ážáá±á¬ áá±ážááœááºážáá¬áá¬á áá¬áž CQL (Cassandra Query Language) ááᯠSQL ááŸáá·áº á¡ááŸááºááá±á¬áºáááºáž áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠáá»áŸá±á¬á·áá»áá¬ážáááºá á¡ááºá¹áá«áááºáá»á¬ážááœáẠnamespace áá»á¬ážááŸáá·áº áá±á¬áºáá¶áááá¬ážá á¯áá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯á "CREATE INDEX" á áá¬ážáááºááᯠá¡áá¯á¶ážááŒá¯á á¡ááœáŸááºážáá»á¬ážáááºáá®ážááŒááºážáá»á¬áž áá«áááºáááºá
DBMS ááẠááá·áºá¡á¬áž áá»áá¯á·ááœááºážááŸá¯áá¶ááá¯ááºáááºááŸááá±á¬ ááá¯ááŸá±á¬ááºááŸá¯ááᯠáááºáá®ážááá¯ááºá á±áááº- áá±áá¬áá±á·á áºááœááºááá·áºáá¬ážáá±á¬áá±áá¬ááẠááœá²ááŒá¬ážáá±á¬áá±áá¬á ááºáá¬áá»á¬ážá¡áá áá»á¶á·ááŸá¶á·ááá¯ááºááá·áº ááŒáá·áºáá±áá¬ážáá±á¬ááœááºáááºá node á¡áá»á¬ážá¡ááŒá¬ážááá¯á· á¡ááá¯á¡áá»á±á¬ááºáá¯á¶áá°ááœá¬ážáááºá node áá áºáá¯áá»ááºááœá¬ážáá±á¬á¡áá«á áááºážááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡ááŒá¬áž node áá»á¬ážá០áá±á¬ááºáá°áá«áááºá á¡á á¯á¡áá±ážááá¯á· node á¡áá áºáá»á¬ážááá·áºááŒááºážááŸáá·áº Cassandra áá¬ážááŸááºážááᯠá¡ááºááááºáá¯ááºááŒááºážááẠá¡ááá¯áá°ááá¯ááºááá¯ááºáááºáá±á¬ááºá áœááºáááºááŸá¯ ááá¯á·ááá¯áẠá¡ááŒá¬áž node áá»á¬ážááᯠááŒááºáááºááŒááºáááºááŒááºážáááŸááá² áá»ááºááŒááºá áœá¬áá¯ááºáá±á¬ááºáá«áááºá CQL áá¶á·ááá¯ážááŸá¯ááŸááá±á¬ Drivers áá»á¬ážááᯠPythoná Java (JDBC/DBAPI2)á Rubyá PHPá C++ ááŸáá·áº JavaScript (Node.js) á¡ááœáẠááŒááºáááºáá¬ážáá«áááºá
á¡ááá áá®ááœááºáááºážáá áºááŸá¯áá»á¬áž-
- á áœááºážáá±á¬ááºáááºááŸáá·áº áá»áœááºážáá»ááºááá¯ááºááá¯ááºááŸá¯ááá¯á·ááᯠááŒáŸáá·áºáááºáá¬ážáááºá nodes áá»á¬ážááŒá¬áž SSTable (Sorted Strings Table) áá±á¬áºáááºááŸá áá±áá¬áááŸááºááŸá¯á á áœááºážáá±á¬ááºáááºááᯠááŒáŸáá·áºáááºáá¬ážáá«áááºá Internode Messaging Protocol ááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬áẠááŒá¯áá¯ááºáá¬ážáá«áááºá node áá»á¬ážááŒá¬áž áá±áá¬á á®ážááŒá±á¬ááºážáá»á¬áž ááœáŸá²ááŒá±á¬ááºážááŒááºážá á¡ááŒááºááŸá¯ááºážááẠ5 áá¡áá ááá¯ážáá¬ááẠ(á¡áááá¡á¬ážááŒáá·áº Zero Copy áááºážááá¬ááŸáá·áº SSTables áá áºáá¯áá¯á¶ážááᯠááœáŸá²ááŒá±á¬ááºážááŒááºáž) ááŒá±á¬áá·áºááŒá áºááŒá®ážá áááºááŸá¯ááŒááºáž ááŸáá·áº á á¬áá±ážááŒááºážááá¯ááºáᬠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááœáẠááŒááºáááºážááŸá¯ááºážááẠ25% á¡áá ááá¯ážáá¬áá«áááºá ááá¯ážááŒáá·áºáá¬áá±á¬ ááŒááºáááºááá°áá±áž áá¯ááºáááºážá ááºááᯠá¡áá±á¬ááºážáá¯á¶ážááŒá áºá¡á±á¬áẠáá¯ááºáá±á¬ááºááŒá®ážááŒá áºáááºá á¡ááŸáá¯ááºá á¯áá±á¬ááºážááŸá¯ áá±áá¹ááááºááŒááºážááŒá±á¬áá·áº latency ááᯠáá®áá®á áá¹ááá·áºá¡áááºážáááºááá¯á· áá»áŸá±á¬á·áá»áááºá
- á¡áá¯á¶ážááŒá¯áá° á á áºááŸááºááŒá±á¬ááºáž á¡áá±á¬ááºá¡áá¬ážááŒááŒááºáž áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááŒá®áž CQL áá±ážááŒááºážáá»ááºá¡á¬ážáá¯á¶ážááᯠááŒá±áá¬áá¶ááẠááœáá·áºááŒá¯ááá·áº á á¬áááºážá á áºááŸááºáááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ áááºááá·áºáá¬ážáááºá
- áá±á¬ááºážááá¯áá»ááºááŸáá·áº áá¯á¶á·ááŒááºááŸá¯á¡ááœá¬ážá¡áá¬á¡á¬ážáá¯á¶ážááᯠááááºážáááºážááá¯ááºá á±ááá·áº binary áá±á¬ááºážááá¯ááŸá¯ááŸááºáááºáž á¡ááŒáá·áºá¡á á¯á¶ááᯠááááºážááááºážáá¬ážááá¯ááºááá·áº á áœááºážáááºááᯠááá·áºááœááºážáá¬ážáááºá á á®áá¶ááá·áºááœá²ááŸá¯á¡ááœááºá "nodetool enablefullquerylog|disablefullquerylog|resetfullquerylog" áá°áá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡ááá¯ááŒá¯áá¬ážááŒá®áž fqltool utility ááᯠááŸááºáááºážááœá²ááŒááºážá áááºááŒá¬áááºá¡ááœáẠáá¶á·ááá¯ážáá±ážáá¬ážáááºá ááŸááºáááºážááᯠáááºááŸá¯ááá¯ááºáá±á¬ áá¯á¶á ᶠ(Dump) á¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áááºá áá¯ááºáá±á¬ááºáá»áẠá¡áá»ááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºááŒááºáž (Compare) ááŸáá·áº ááŸááºáááºáá±á¬ áááºááŸá á¡ááŒá±á¡áá±áá»á¬ážááᯠááŒááºáááºáá¯ááºáá¯ááºááŒááºážá¡ááœáẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠááŒááºáááºáá¯ááºáá±á¬ááºááŒááºáž (Replay) á¡ááœáẠá¡áááá·áºáá±ážáá¬ážáá«áááºá
- SSTables ááœááºááááºážáááºážáá¬ážáá±á¬áá±áá¬ááá¯ááºáá±á¬á¡áá»ááºá¡áááºáá»á¬ážááá¯áááºáááºá á±áá±á¬ virtual tables áá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯áááºááŒáá·áºáá¬ážáá±á¬áºáááºáž API (á áœááºážáá±á¬ááºáááºáááºááá áºáá»á¬ážá áááºáááºá¡áá»ááºá¡áááºáá»á¬ážá áááºááŸáºá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá áá»áááºáááºáá¬ážáá±á¬áááá¯ááºážááá·áºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážá á áááºááŒáá·áº) á០á¡áá»ááºá¡áááºáá»á¬ážáá¯ááºáá±ážááŒááºážá
- áá»á¯á¶á·áá¬ážáá±á¬ áá±áá¬ááá¯ááŸá±á¬ááºááŸá¯á á áœááºážáá±á¬ááºáááºááᯠááŒáŸáá·áºáááºáá¬ážááŒá®ážá áá áºááºáá±áᬠáá¯á¶ážá áœá²ááŸá¯ááᯠáá»áŸá±á¬á·áá»áᬠáááºááŸá¯ááŸá¯ á áœááºážáá±á¬ááºáááºááᯠááŒáŸáá·áºáááºáá±ážáá²á·áááºá
- á áá áºáá±á¬á·ááœááºááẠ(system.*) ááŸáá·áº áááºáááºááá·áº áá±áá¬ááᯠááá¯á¡áá« áá±áá¬áááºážááœáŸááºá¡á¬ážáá¯á¶ážááœáẠááŒáá·áºáá±ááá·áºá¡á á¬áž áá°ááá¯á¶á á¶ááŒáá·áº ááááááºážááœáŸááºááœáẠáá¬ážááŸááá¬ážááŒá®ážá á¡ááá¯áá áºáá»á¬ážáá²á០áá áºáá¯áá»ááºááœááºáá«á node á¡á¬áž áááºáááºáááºáááºááá¯ááºá á±áááºááŒá áºáááºá
- Transient Replication ááŸáá·áº á á»á±ážáááºáá¬áá±á¬ Quorums á¡ááœáẠá ááºážáááºááŸá¯ áá¶á·ááá¯ážááŸá¯ áááºáá±á¬ááºážááá·áºáá¬ážáá«áááºá áá¬áá®áá¯á¶áá°áá»á¬ážááẠáá±áá¬á¡á¬ážáá¯á¶ážááᯠááááºážáááºážááŒááºáž áááŒá¯áá«ááŸáá·áº áá¯á¶áá°áá»á¬áž á¡ááŒáá·áºá¡á á¯á¶ááŸáá·áº ááá¯ááºáá®á á±ááẠáááºááá¯ážááŒááºáááºááá°ááŒááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá Light quorums áá»á¬ážááẠáá¯á¶áá±á¬ááºáá±á¬ áá¯á¶áá°áá»á¬áž á¡á á¯á¶ááááŸáááá¯ááºááá»ááºáž á á¬áá±ážááŒááºážáááŒá¯áá² áá¬áá®áá¯á¶áá°áá»á¬ážááᯠááŒá¯áá¯ááºáá¬ážááŒááºážááŒá áºáááºá
- Java 11 á¡ááœáẠá ááºážáááºááŸá¯ á¡áá±á¬ááºá¡áá¶á·ááᯠáá±á«ááºážááá·áºáá¬ážáááºá
- Merkle Trees á¡á¬ážáá¯á¶ážááᯠááŸáá¯ááºážááŸááºááẠá ááºážáááºááœá±ážáá»ááºá áá¬ááᯠáááºááá·áºáá¬ážáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá¯á¶áá°ááŸá áºáá¯áá°áá®ááŒá®áž áá áºáá¯ááẠáá±á¬ááºážááœááºážáá±ááá·áº 3-node á¡á á¯á¡áá±ážááœáẠááœá±ážáá»ááºááœáá·áºááᯠááœáá·áºááŒááºážááŒáá·áº áááºááŸááá¯á¶á á¶áá°á áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯áááºážááᯠá¡áá¯á¶ážááŒá¯á stale áá¯á¶á á¶áá°á ááœááºážáá¶ááŸá¯ááᯠááŒá áºáá±á«áºá á±áááºááŒá áºáááºá
- áááºááŸáTimestampá currentDateá currentTime ááŸáá·áº currentTimeUUID áá¯ááºáá±á¬ááºáá»ááºá¡áá áºáá»á¬ážááᯠááá·áºááœááºážáá¬ážáááºá
- CQL á á¯á¶á ááºážááŸá¯áá»á¬ážááœáẠááááºážáááºá¹áá»á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ áááºáá±á¬ááºážááá·áºáá¬ážáááºá
- âá¡áá»áááºáá¶ááááºáá¯á¶ážâ/âáááºá áœá²â ááŸáá·áº âá¡áá»áááºáá¬áâ á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŒáá·áº áá±áá¬áá»á¬ážááŒá¬ážááœáẠááááºážáááºá¹áá»á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠáá±ážáá¬ážáááºá
- ááŒááºáááºááá°áááºá¡ááœáẠááá¯á¡ááºáá±á¬ áá±áá¬á á®ážááŒá±á¬ááºážáá»á¬ážááᯠá¡á ááºážááŒáá·áºááŸá¯ááŒááºážáá¯ááºáá áºáᯠ(nodetool ááŒá¯ááŒááºááŒááºážâá¡ááŒáá¯ááŒáá·áºááŸá¯ááŒááºáž) ááŸáá·áº ááŒááºáááºááá°áá¬ážááá·áºáá±áá¬á ááŸááºáááºááŸá¯ááᯠá á áºáá±ážááá¯ááºááŸá¯ (nodetool ááŒá¯ááŒááºááŒááºáž âvalidate)á
- SELECT queries ááẠááᯠMap ááŸáá·áº Element áá»á¬ážááᯠáááºááŸááºááẠáá¯ááºáá±á¬ááºááá¯ááºá áœááºážááŸááááºá
- áá¯ááºáá¯á¶ážáá±á«áºáá¬áá±á¬ ááŒááºááœááºážáá»á¬ážá áááŠážáááºáá±á¬ááºááŸá¯á¡ááá·áºááᯠááŒáá¯ááºáá°ááŒá¯áá¯ááºááẠáá¶á·ááá¯ážááŸá¯ áááºáá±á¬ááºážááá·áºááœááºážáá¬ážááẠ(cassandra.yaml:concurrent_materialized_view_builders)á
- "nodetool cfstats" ááœáŸááºááŒá¬ážáá»ááºááœáẠá¡áá»áá¯á·áá±á¬ áááºááá áºáá»á¬ážááŒáá·áº á á®áááºááŸáá·áº ááŒáááá·áº á¡áááºážá¡áá±á¡ááœááºááᯠááá·áºáááºáááºá¡ááœáẠáá¶á·ááá¯ážááŸá¯ áááºáá±á¬ááºážáá±ážáá¬ážáááºá
- á¡áá»áá¯á·áá±á¬áá±áá¬á ááºáá¬áá»á¬ážááœááºáᬠá¡áá¯á¶ážááŒá¯áá°ááá»áááºáááºááŸá¯ááᯠááá·áºáááºááẠáááºáááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá¬ážáááºá
- áá»áŸááºáá áºááŒááºááá¯ááºáá»ááºáááºáá®ážááŒááºážááŸáá·áº ááŸááºážáááºážááŒááºážáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá ááŒááºážáááºááŸá¯ (ááŸá¯ááºážááá·áºáááºáá»ááº) ááᯠááá·áºáááºááẠá áœááºážáááºááᯠááá·áºááœááºážáá¬ážáááºá
- cqlsh ááŸáá·áº cqlshlib ááẠááᯠPython 3 ááᯠáá¶á·ááá¯ážáá±ážááẠ(Python 2.7 ááᯠáá¶á·ááá¯ážáá±áá²ááŒá áºáááº)á
- Windows ááááºáá±á¬ááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááᯠáááºááá¯ááºážááá¯ááºáá«ááŒá®á Windows ááœáẠCassandra ááᯠrun áááºá WSL2 á áá áºááœá² (Windows Subsystem for Linux 2) ááá¯á·ááá¯áẠvirtualization á áá áºáá»á¬ážááᯠá¡ááŒá±áá¶á áááºáá®ážáá¬ážáá±á¬ Linux áááºáááºážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠá¡ááŒá¶ááŒá¯áá¬ážáááºá
source: opennet.ru