ããã¯åè«ã§ã¯ãªãããã®ç¹å®ã®å³ããããã®ããŒã¿ããŒã¹ã®æ¬è³ªãæãæ£ç¢ºã«åæ ããŠããããã§ãæçµçã«ã¯ãã®çç±ãæããã«ãªãã§ãããã
DB-Engines ã©ã³ãã³ã°ã«ãããšãNoSQL ååããŒã¿ããŒã¹ã§æã人æ°ã®ãã XNUMX ã€ã¯ãCassandra (以äžãCS) ãš HBase (HB) ã§ãã
éåœã®æå¿ã«ããããºãã«ãã³ã¯ã®ããŒã¿èªã¿èŸŒã¿ç®¡çããŒã ã¯ãã§ã«
ãã ããå®è¡ããããã¹ãã®çµæã«é²ãåã«ãç°å¢æ§æã®éèŠãªåŽé¢ã説æããå¿
èŠããããŸãã å®éãCS ã¯ããŒã¿æ倱ã蚱容ãããã¢ãŒãã§äœ¿çšãããå¯èœæ§ããããŸãã ãããã®ã ããã¯ãXNUMX ã€ã®ãµãŒã㌠(ããŒã) ã ããç¹å®ã®ããŒã®ããŒã¿ãæ
åœããå Žåã§ãããäœããã®çç±ã§å€±æãããšããã®ããŒã®å€ã¯å€±ãããŸãã å€ãã®ã¿ã¹ã¯ã§ã¯ãããã¯éèŠã§ã¯ãããŸããããéè¡éšéã§ã¯ãããã¯ååã§ã¯ãªãäŸå€ã§ãã ç§ãã¡ã®å Žåãä¿¡é Œæ§ã®é«ãä¿ç®¡ã®ããã«ããŒã¿ã®ã³ããŒãããã€ãçšæããããšãéèŠã§ãã
ãããã£ãŠãããªãã« ã¬ããªã±ãŒã·ã§ã³ ã¢ãŒãã® CS åäœã¢ãŒãã®ã¿ãèæ ®ãããŸããã ã±ãŒã¹ã¹ããŒã¹ã®äœæã¯ã次ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠå®è¡ãããŸããã
CREATE KEYSPACE ks WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};
次ã«ãå¿
èŠãªã¬ãã«ã®äžè²«æ§ã確ä¿ããã«ã¯ XNUMX ã€ã®æ¹æ³ããããŸãã ååïŒ
å西 + NR > RF
ã€ãŸããæžã蟌ã¿æã®ããŒãããã®ç¢ºèªæ° (NW) ãšèªã¿åãæã®ããŒãããã®ç¢ºèªæ° (NR) ã®åèšãã¬ããªã±ãŒã·ã§ã³ä¿æ°ãã倧ãããªããã°ãªããŸããã ãã®å ŽåãRF = 3 ã§ããããã¯ã次ã®ãªãã·ã§ã³ãé©åã§ããããšãæå³ããŸãã
2 + 2> 3
3 + 1> 3
ããŒã¿ãã§ããã ã確å®ã«ä¿åããããšãåºæ¬çã«éèŠã§ããããã3+1 ã¹ããŒã ãéžæãããŸããã ããã«ãHB ãåæ§ã®åçã§åäœããŸãã ãã®ãããªæ¯èŒã¯ããå ¬å¹³ã«ãªããŸãã
DataStax ã¯èª¿æ»ã§ã¯éã®ããšãè¡ããCS ãš HB ã®äž¡æ¹ã« RF = 1 ãèšå®ããããšã«æ³šæããŠãã ãã (åŸè ã®å Žå㯠HDFS èšå®ãå€æŽããŸãã)ã ãã®å Žåã® CS ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯éåžžã«å€§ãããããããã¯éåžžã«éèŠãªåŽé¢ã§ãã ããšãã°ã以äžã®å³ã¯ãCS ãžã®ããŒã¿ã®ããŒãã«å¿ èŠãªæéã®å¢å ã瀺ããŠããŸãã
ããã§ã¯ã次ã®ããšãããããŸãã競åããã¹ã¬ãããããŒã¿ãæžã蟌ãã»ã©ãæéãããããŸãã ããã¯åœç¶ã®ããšã§ãããRF=3 ã®ããã©ãŒãã³ã¹äœäžã倧å¹
ã«å€§ããããšãéèŠã§ãã ã€ãŸãã4 ã€ã®ã¹ã¬ããããããã 5 ã€ã®ããŒãã« (åèš 20) ã«æžã蟌ããšãRF=3 ã¯çŽ 2 åã®æ倱ã«ãªããŸã (RF=150 ã§ã¯ 3 ç§ãRF=75 ã§ã¯ 1 ç§)ã ãããããããã 8 ã€ã®ã¹ã¬ãããæ〠5 ã€ã®ããŒãã« (åèš 40) ã«ããŒã¿ãããŒãããŠè² è·ãå¢ãããšãRF=3 ã®æ倱ã¯ãã§ã« 2,7 åã«ãªããŸã (375 ç§å¯Ÿ 138)ã
ããããããããDataStax for CS ã«ãã£ãŠå®è¡ãããè² è·ãã¹ããæåããç§å¯ã®äžéšã§ãããªããªããç§ãã¡ã®ã¹ã¿ã³ãã® HB ã§ã¯ãã¬ããªã±ãŒã·ã§ã³ä¿æ°ã 2 ãã 3 ã«å€æŽããŠãå¹æããªãã£ãããã§ãã ãããã®ã ãã®æ§æã§ã¯ããã£ã¹ã¯ã¯ HB ããã«ããã¯ã§ã¯ãããŸããã ãã ããããã«ã¯ä»ã«ãå€ãã®èœãšãç©ŽããããŸãããªããªããç§ãã¡ã®ããŒãžã§ã³ã® HB ã«ã¯ãããã«ããããšåŸ®èª¿æŽãå ããããŠããããšãç°å¢ãå®å šã«ç°ãªãããšãªã©ã«æ³šæããå¿ èŠãããããã§ãã ããããç§ã CS ãæ£ããæºåããæ¹æ³ãç¥ããªãã ãã§ãCS ã䜿çšããããå¹æçãªæ¹æ³ãããã€ãããããšã泚ç®ã«å€ããŸããã³ã¡ã³ãã§èŠã€ããããããšãé¡ã£ãŠããŸãã ãããããŸãæåã«ã
ãã¹ãŠã®ãã¹ãã¯ããããã次ã®æ§æãæ〠4 å°ã®ãµãŒããŒã§æ§æãããããŒããŠã§ã¢ ã¯ã©ã¹ã¿ãŒäžã§å®è¡ãããŸããã
CPU: Xeon E5-2680 v4 @ 2.40GHz 64 ã¹ã¬ããã
ãã£ã¹ã¯: 12 åã® SATA HDD
Java ããŒãžã§ã³: 1.8.0_111
CSããŒãžã§ã³ïŒ3.11.5
cassandra.ymlã®ãã©ã¡ãŒã¿ããŒã¯ã³æ°: 256
hinted_handoff_enabled: true
hinted_handoff_throttle_in_kb: 1024
max_hints_delivery_threads: 2
ãã³ããã£ã¬ã¯ããª: /data10/cassandra/hints
hint_flush_period_in_ms: 10000
max_hints_file_size_in_mb: 128
ããããã°_ãªãã¬ã€_ã¹ãããã«_in_kb: 1024
èªèšŒå:AllowAllAuthenticator
ãªãŒãœã©ã€ã¶ãŒ:AllowAllAuthorizer
role_manager: CassandraRoleManager
ããŒã«æå¹æé: 2000
èš±å¯æå¹æé: 2000
credentials_validity_in_ms: 2000
ããŒãã£ã·ã§ããŒ: org.apache.cassandra.dht.Murmur3Partitioner
ããŒã¿ãã¡ã€ã«ãã£ã¬ã¯ããª:
- /data1/cassandra/data # å dataN ãã£ã¬ã¯ããªã¯åå¥ã®ãã£ã¹ã¯ã§ã
- /data2/cassandra/data
- /data3/cassandra/data
- /data4/cassandra/data
- /data5/cassandra/data
- /data6/cassandra/data
- /data7/cassandra/data
- /data8/cassandra/data
commitlog_directory: /data9/cassandra/commitlog
cdc_enabled: false
ãã£ã¹ã¯é害ããªã·ãŒ: åæ¢
commit_failure_policy: åæ¢
prepare_statements_cache_size_mb:
thrift_prepared_statements_cache_size_mb:
key_cache_size_in_mb:
ããŒãã£ãã·ã¥ä¿åæé: 14400
row_cache_size_in_mb: 0
è¡ãã£ãã·ã¥ä¿åæé: 0
counter_cache_size_in_mb:
ã«ãŠã³ã¿ãã£ãã·ã¥ä¿åæé: 7200
ä¿åããããã£ãã·ã¥ãã£ã¬ã¯ããª: /data10/cassandra/saved_caches
commitlog_sync: å®æç
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 32
ã·ãŒããããã€ããŒ:
- ã¯ã©ã¹å: org.apache.cassandra.locator.SimpleSeedProvider
ãã©ã¡ãŒã¿ïŒ
â ã·ãŒã: "*,*"
concurrent_reads: 256 # è©Šè¡åæ° 64 - éãã¯èªããããŸããã§ãã
concurrent_writes: 256 # è©Šè¡åæ° 64 - éãã¯èªããããŸããã§ãã
concurrent_counter_writes: 256 # è©Šè¡åæ° 64 - éãã¯èªããããŸããã§ãã
concurrent_materialized_view_writes: 32
memtable_heap_space_in_mb: 2048 # 16 GB ãè©ŠããŸãã - é
ãã£ãã§ã
memtable_allocation_type: heap_buffers
Index_summary_capacity_in_mb:
Index_summary_resize_interval_in_ minutes: 60
trickle_fsync: false
trickle_fsync_interval_in_kb: 10240
ã¹ãã¬ãŒãžããŒã: 7000
ssl_storage_port: 7001
ãªãã¹ã³ã¢ãã¬ã¹: *
ãããŒããã£ã¹ãã¢ãã¬ã¹: *
listen_on_broadcast_address: true
internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_transport: true
ãã€ãã£ããã©ã³ã¹ããŒãããŒã: 9042
start_rpc: true
rpc_ã¢ãã¬ã¹: *
rpc_ããŒã: 9160
rpc_keepalive: true
rpc_server_type: åæ
thrift_framed_transport_size_in_mb: 15
å¢åããã¯ã¢ãã: false
ã¹ãããã·ã§ããåã®å§çž®: false
auto_snapshot: true
kb ã®åã€ã³ããã¯ã¹ ãµã€ãº: 64
column_index_cache_size_in_kb: 2
concurrent_compactors: 4
å§çž®ã¹ã«ãŒããã_mb_per_sec: 1600
sstable_preemptive_open_interval_in_mb: 50
read_request_timeout_in_ms: 100000
range_request_timeout_in_ms: 200000
write_request_timeout_in_ms: 40000
counter_write_request_timeout_in_ms: 100000
cas_contention_timeout_in_ms: 20000
truncate_request_timeout_in_ms: 60000
request_timeout_in_ms: 200000
low_query_log_timeout_in_ms: 500
ã¯ãã¹ããŒãã¿ã€ã ã¢ãŠã: false
endpoint_snitch: GossipingPropertyFileSnitch
Dynamic_snitch_update_interval_in_ms: 100
Dynamic_snitch_reset_interval_in_ms: 600000
åçã¹ãããäžè¯éŸå€: 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
ãµãŒããŒæå·åãªãã·ã§ã³:
ããŒãéæå·å: ãªã
client_encryption_options:
æå¹: false
ããŒãéå§çž®: DC
inter_dc_tcp_nolay: false
ãã¬ãŒã¹ã¿ã€ã_ã¯ãšãª_ttl: 86400
ãã¬ãŒã¹ã¿ã€ã_修埩_ttl: 604800
ãŠãŒã¶ãŒå®çŸ©é¢æ°ãæå¹ã«ãã: false
ã¹ã¯ãªããåããããŠãŒã¶ãŒå®çŸ©é¢æ°ãæå¹ã«ãã: false
ãŠã£ã³ããŠã¿ã€ããŒéé: 1
éæããŒã¿æå·åãªãã·ã§ã³:
æå¹: false
tombstone_warn_threshold: 1000
tombstone_failure_threshold: 100000
ããããµã€ãºèŠåéŸå€in_kb: 200
ããããµã€ãºãã§ã€ã«éŸå€in_kb: 250
unlogged_batch_across_partitions_warn_threshold: 10
å§çž®_倧èŠæš¡ããŒãã£ã·ã§ã³_èŠå_ãããå€_mb: 100
gc_warn_threshold_in_ms: 1000
back_pressure_enabled: false
Enable_materialized_views: true
Enable_sasi_indexes: true
GC èšå®:
### CMS èšå®-XX:+UseParNewGC
-XX:+UseConcMarkSweatGC
-XX:+CMSParallelRemarkEnabled
-XX:çåç=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XXïŒ+ CMSClassUnloadingEnabled
jvm.options ã¡ã¢ãªã«ã¯ 16 GB ãå²ãåœãŠãããŸãã (32 GB ãè©ŠããŸããããéãã¯èªããããŸããã§ãã)ã
ããŒãã«ã¯æ¬¡ã®ã³ãã³ãã§äœæãããŸããã
CREATE TABLE ks.t1 (id bigint PRIMARY KEY, title text) WITH compression = {'sstable_compression': 'LZ4Compressor', 'chunk_length_kb': 64};
HB ããŒãžã§ã³: 1.2.0-cdh5.14.2 (ã¯ã©ã¹ org.apache.hadoop.hbase.regionserver.HRegion ã§ã¯ãRegionServer äžã®ãªãŒãžã§ã³æ°ã 1000 ãè¶ ãããšãã« GC ãåŒãèµ·ãã MetricsRegion ãé€å€ããŸãã)
ããã©ã«ã以å€ã® HBase ãã©ã¡ãŒã¿åç©åããŒããŒ.ã»ãã·ã§ã³.ã¿ã€ã ã¢ãŠã: 120000
hbase.rpc.timeout: 2 å
hbase.client.scanner.timeout.period: 2 å
hbase.master.handler.count: 10
hbase.regionserver.lease.periodãhbase.client.scanner.timeout.period: 2 å
hbase.regionserver.handler.count: 160
hbase.regionserver.metahandler.count: 30
hbase.regionserver.logroll.æé: 4 æé
hbase.regionserver.maxlogs: 200
hbase.hregion.memstore.flush.size: 1 GiB
hbase.hregion.memstore.block.multiplier: 6
hbase.hstore.compactionThreshold: 5
hbase.hstore.blockingStoreFiles: 200
hbase.hregion.majorcompaction: 1 æ¥
hbase-site.xml ã® HBase ãµãŒãã¹è©³çŽ°æ§æã¹ãããã (å®å
šãã«ã):
hbase.regionserver.wal.codecorg.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec
hbase.master.namespace.init.timeout3600000
hbase.regionserver.optionalcacheflushinterval18000000
hbase.regionserver.thread.compaction.large12
hbase.regionserver.wal.enablecompressiontrue
hbase.hstore.compaction.max.size1073741824
hbase.server.compactchecker.interval.multiplier200
HBase RegionalServer ã® Java æ§æãªãã·ã§ã³:
-XX:+UseParNewGC -XX:+UseConcMarkSoupGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m
hbase.snapshot.master.timeoutMillis: 2 å
hbase.snapshot.region.timeout: 2 å
hbase.snapshot.master.timeout.millis: 2 å
HBase REST ãµãŒããŒã®æ倧ãã° ãµã€ãº: 100 MiB
HBase REST ãµãŒããŒã®æ倧ãã° ãã¡ã€ã« ããã¯ã¢ãã: 5
HBase Thrift ãµãŒããŒã®æ倧ãã° ãµã€ãº: 100 MiB
HBase Thrift Server ã®æ倧ãã° ãã¡ã€ã« ããã¯ã¢ãã: 5
ãã¹ã¿ãŒæ倧ãã° ãµã€ãº: 100 MiB
ãã¹ã¿ãŒãã°ãã¡ã€ã«ã®æ倧ããã¯ã¢ããæ°: 5
ãªãŒãžã§ã³ãµãŒããŒã®æ倧ãã°ãµã€ãº: 100 MiB
RegionalServer ã®æ倧ãã° ãã¡ã€ã« ããã¯ã¢ãã: 5
HBase ã¢ã¯ãã£ã ãã¹ã¿ãŒæ€åºãŠã£ã³ããŠ: 4 å
dfs.client.hedged.read.threadpool.size: 40
dfs.client.hedged.read.threshold.millis: 10 ããªç§
hbase.rest.threads.min: 8
hbase.rest.threads.max: 150
æ倧ããã»ã¹ ãã¡ã€ã«èšè¿°å: 180000
hbase.thrift.minWorkerThreads: 200
hbase.master.executor.openregion.threads: 30
hbase.master.executor.closeregion.threads: 30
hbase.master.executor.serverops.threads: 60
hbase.regionserver.thread.compaction.small: 6
hbase.ipc.server.read.threadpool.size: 20
ãªãŒãžã§ã³ã ãŒããŒã¹ã¬ãã: 6
ã¯ã©ã€ã¢ã³ã Java ããŒã ãµã€ãº (ãã€ãåäœ): 1 GiB
HBase REST ãµãŒããŒã®ããã©ã«ã ã°ã«ãŒã: 3 GiB
HBase Thrift ãµãŒããŒã®ããã©ã«ã ã°ã«ãŒã: 3 GiB
HBase ãã¹ã¿ãŒã® Java ããŒã ãµã€ãº (ãã€ãåäœ): 16 GiB
HBase RegionalServer ã® Java ããŒã ãµã€ãº (ãã€ãåäœ): 32 GiB
+åç©åã®é£Œè²å¡
maxClientCnxns: 601
maxSessionTimeout: 120000
ããŒãã«ã®äœæ:
hbase org.apache.hadoop.hbase.util.RegionSplitter ns:t1 UniformSplit -c 64 -f cf
alter 'ns:t1'ã{NAME => 'cf'ãDATA_BLOCK_ENCODING => 'FAST_DIFF'ãCOMPRESSION => 'GZ'}
ããã§éèŠãªç¹ã 64 ã€ãããŸããDataStax ã®èª¬æã«ã¯ãHB ããŒãã«ã®äœæã«äœ¿çšããããªãŒãžã§ã³ã®æ°ãèšèŒãããŠããŸããããããã¯å€§å®¹éã®å Žåã«ã¯éèŠã§ãã ãããã£ãŠããã¹ãã§ã¯æ°é = 640 ãéžæãããæ倧 XNUMX GBãã€ãŸã XNUMX GB ãŸã§ã®ä¿åãå¯èœã«ãªããŸãã äžãããã®å€§ããã®ããŒãã«ã
ãã¹ãã®æç¹ã§ãHBase ã«ã¯ 22 ã®ããŒãã«ãš 67 ã®ãªãŒãžã§ã³ããããŸãã (ããã¯ãäžèšã®ãããããªããã°ããŒãžã§ã³ 1.2.0 ã«ãšã£ãŠèŽåœçã§ãã)ã
ããŠãã³ãŒãã§ãã ç¹å®ã®ããŒã¿ããŒã¹ã«å¯ŸããŠã©ã®æ§æãããæå©ã§ããããæ確ã§ã¯ãªãã£ãããããã¹ãã¯ããŸããŸãªçµã¿åããã§å®è¡ãããŸããã ãããã®ã äžéšã®ãã¹ãã§ã¯ã4 ã€ã®ããŒãã«ãåæã«ããŒããããŸãã (4 ã€ã®ããŒããã¹ãŠãæ¥ç¶ã«äœ¿çšãããŸãã)ã ä»ã®ãã¹ãã§ã¯ã8 ã€ã®ç°ãªãããŒãã«ã䜿çšããŸããã ããã ãµã€ãºã 100 ã®å Žåãããã°ã200 ã®å ŽåããããŸãã (ããã ãã©ã¡ãŒã¿ãŒ - 以äžã®ã³ãŒããåç §)ã valueã®ããŒã¿ãµã€ãºã¯10ãã€ããŸãã¯100ãã€ã(dataSize)ã§ãã åèšã§ãæ¯å 5 äžä»¶ã®ã¬ã³ãŒããåããŒãã«ã«æžã蟌ãŸããèªã¿åãããŸããã åæã«ã5 ã€ã®ã¹ã¬ãããåããŒãã« (ã¹ã¬ããçªå· - thNum) ã«æžã蟌ã¿/èªã¿åãããããããããç¬èªã®ããŒç¯å² (ã«ãŠã³ã = 1 äž) ã䜿çšããŸããã
if (opType.equals("insert")) {
for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
StringBuilder sb = new StringBuilder("BEGIN BATCH ");
for (int i = 0; i < batch; i++) {
String value = RandomStringUtils.random(dataSize, true, true);
sb.append("INSERT INTO ")
.append(tableName)
.append("(id, title) ")
.append("VALUES (")
.append(key)
.append(", '")
.append(value)
.append("');");
key++;
}
sb.append("APPLY BATCH;");
final String query = sb.toString();
session.execute(query);
}
} else {
for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
StringBuilder sb = new StringBuilder("SELECT * FROM ").append(tableName).append(" WHERE id IN (");
for (int i = 0; i < batch; i++) {
sb = sb.append(key);
if (i+1 < batch)
sb.append(",");
key++;
}
sb = sb.append(");");
final String query = sb.toString();
ResultSet rs = session.execute(query);
}
}
ãããã£ãŠãåæ§ã®æ©èœã HB ã«ãæäŸãããŸããã
Configuration conf = getConf();
HTable table = new HTable(conf, keyspace + ":" + tableName);
table.setAutoFlush(false, false);
List<Get> lGet = new ArrayList<>();
List<Put> lPut = new ArrayList<>();
byte[] cf = Bytes.toBytes("cf");
byte[] qf = Bytes.toBytes("value");
if (opType.equals("insert")) {
for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
lPut.clear();
for (int i = 0; i < batch; i++) {
Put p = new Put(makeHbaseRowKey(key));
String value = RandomStringUtils.random(dataSize, true, true);
p.addColumn(cf, qf, value.getBytes());
lPut.add(p);
key++;
}
table.put(lPut);
table.flushCommits();
}
} else {
for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
lGet.clear();
for (int i = 0; i < batch; i++) {
Get g = new Get(makeHbaseRowKey(key));
lGet.add(g);
key++;
}
Result[] rs = table.get(lGet);
}
}
HB ã§ã¯ã¯ã©ã€ã¢ã³ããããŒã¿ã®åäžãªåæ£ãåŠçããå¿ èŠããããããããŒã®ãœã«ãã£ã³ã°é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
public static byte[] makeHbaseRowKey(long key) {
byte[] nonSaltedRowKey = Bytes.toBytes(key);
CRC32 crc32 = new CRC32();
crc32.update(nonSaltedRowKey);
long crc32Value = crc32.getValue();
byte[] salt = Arrays.copyOfRange(Bytes.toBytes(crc32Value), 5, 7);
return ArrayUtils.addAll(salt, nonSaltedRowKey);
}
ããŠãæãèå³æ·±ãéšåãçµæã¯æ¬¡ã®ãšããã§ãã
åãããšãã°ã©ã圢åŒã§è¡šç€ºãããšã次ã®ããã«ãªããŸãã
HB ã®å©ç¹ã¯éåžžã«é©ãã¹ããã®ã§ãããããCS ã»ããã¢ããã«äœããã®ããã«ããã¯ãããã®ã§ã¯ãªãããšçãããã»ã©ã§ãã ãã ããGoogle ã§æãæçœãªãã©ã¡ãŒã¿ (concurrent_writes ã memtable_heap_space_in_mb ãªã©) ãæ€çŽ¢ããŠãé床ã¯äžãããŸããã§ããã åæã«ããã°ã¯ã¯ãªãŒã³ã§ãããäœãæªå£ãèšã£ãŠããŸããã
ããŒã¿ã¯ããŒãå šäœã«åçã«åæ£ããããã¹ãŠã®ããŒãããã®çµ±èšã¯ã»ãŒåãã§ããã
ããã¯ãããŒãã® XNUMX ã€ããã®ããŒãã«çµ±èšãã©ã®ããã«èŠãããã§ããããŒã¹ããŒã¹: ks
èªã¿åãæ°: 9383707
èªã¿åãã¬ã€ãã³ã·: 0.04287025042448576 ããªç§
æžã蟌ã¿æ°: 15462012
æžã蟌ã¿ã¬ã€ãã³ã·: 0.1350068438699957 ããªç§
ä¿çäžã®ãã©ãã·ã¥: 0
ããŒãã«: t1
SSTããŒãã«æ°ïŒ16
䜿çšå®¹é (ã©ã€ã): 148.59 MiB
䜿çšå®¹é (åèš): 148.59 MiB
ã¹ãããã·ã§ããã«ãã£ãŠäœ¿çšãããã¹ããŒã¹ (åèš): 0 ãã€ã
䜿çšãããŠãããªãããŒã ã¡ã¢ãª (åèš): 5.17 MiB
SSTableå§çž®ç: 0.5720989576459437
ããŒãã£ã·ã§ã³æ°ïŒæšå®ïŒïŒ3970323
Memtable ã»ã«æ°: 0
Memtable ããŒã¿ãµã€ãº: 0 ãã€ã
䜿çšãããŠãã Memtable ãªãããŒã ã¡ã¢ãª: 0 ãã€ã
Memtable ã¹ã€ããæ°: 5
ããŒã«ã«èªã¿åãæ°: 2346045
ããŒã«ã«èªã¿åãã¬ã€ãã³ã·ãŒ: NaN ããªç§
ããŒã«ã«æžã蟌ã¿æ°: 3865503
ããŒã«ã«æžã蟌ã¿ã¬ã€ãã³ã·: NaN ããªç§
ä¿çäžã®ãã©ãã·ã¥: 0
修埩ç: 0.0
ãã«ãŒã ãã£ã«ã¿ãŒã®èª€æ€ç¥: 25
ãã«ãŒã ãã£ã«ã¿ãŒåœçïŒ0.00000
䜿çšããããã«ãŒã ãã£ã«ã¿ãŒ ã¹ããŒã¹: 4.57 MiB
ãã«ãŒã ãã£ã«ã¿ãŒ ãªã ããŒã ã¡ã¢ãªäœ¿çšé: 4.57 MiB
ã€ã³ããã¯ã¹ã®æŠèŠãªãããŒã ã¡ã¢ãªäœ¿çšé: 590.02 KiB
䜿çšãããããŒã ã¡ã¢ãªããã®å§çž®ã¡ã¿ããŒã¿: 19.45 KiB
å§çž®ãããããŒãã£ã·ã§ã³ã®æå°ãã€ãæ°: 36
å§çž®ãããããŒãã£ã·ã§ã³ã®æ倧ãã€ãæ°: 42
å§çž®ãããããŒãã£ã·ã§ã³ã®å¹³åãã€ãæ°: 42
ã¹ã©ã€ã¹ãããã®å¹³åç现è (æåŸã® XNUMX åé): NaN
ã¹ã©ã€ã¹ãããã®æ倧ç现èæ° (æåŸã® 0 åé): XNUMX
ã¹ã©ã€ã¹ããšã®å¹³åãã¥ãŒã ã¹ããŒã³ (éå» XNUMX åé): NaN
ã¹ã©ã€ã¹ããšã®æ倧ãã¥ãŒã ã¹ããŒã³ (éå» 0 åé): XNUMX
ãããããããçªç¶å€ç°: 0 ãã€ã
ãããã®ãµã€ãºãæžããããšããŠã (åå¥ã«éä¿¡ããŠã) å¹æã¯ãªããç¶æ³ã¯æªåããã ãã§ããã CS ã§åŸãããçµæã¯ãXNUMX ç§ãããçŽæ°åäžåã®æäœãšãã DataStax ã§åŸãããçµæãšäŒŒãŠãããããå®éã«ã¯ããã CS ã®æ倧ããã©ãŒãã³ã¹ã§ããå¯èœæ§ããããŸãã ããã«ããªãœãŒã¹äœ¿çšçãèŠããšãCS ãããå€ãã® CPU ãšãã£ã¹ã¯ã䜿çšããŠããããšãããããŸãã
ãã®å³ã¯ãäž¡æ¹ã®ããŒã¿ããŒã¹ã®ãã¹ãŠã®ãã¹ããé£ç¶ããŠå®è¡ãããšãã®äœ¿çšçã瀺ããŠããŸãã
HBã®åŒ·åãªèªã¿ã®ã¢ããã³ããŒãžã«ã€ããŠã ããã§ã¯ãã©ã¡ãã®ããŒã¿ããŒã¹ã§ããèªã¿åãäžã®ãã£ã¹ã¯äœ¿çšçãéåžžã«äœãããšãããããŸã (èªã¿åããã¹ãã¯åããŒã¿ããŒã¹ã®ãã¹ã ãµã€ã¯ã«ã®æåŸã®éšåã§ããããšãã°ãCS ã®å Žåããã㯠15:20 ãã 15:40 ãŸã§ã§ã)ã HB ã®å Žåãçç±ã¯æããã§ããã»ãšãã©ã®ããŒã¿ã¯ã¡ã¢ãªå ãmemstore å ã§ãã³ã°ããäžéšã¯ãããã¯ãã£ãã·ã¥ã«ãã£ãã·ã¥ãããŸãã CS ã«é¢ããŠã¯ãä»çµã¿ãããããããŸãããããã£ã¹ã¯ã®ãªãµã€ã¯ã«ã衚瀺ãããŸãããã念ã®ããããã£ãã·ã¥ row_cache_size_in_mb = 2048 ãæå¹ã«ããŠãcaching = {'keys': 'ALL', ãèšå®ããŠã¿ãŸããã 'rows_per_partition': ' 2000000'} ã§ããããããããã«ç¶æ³ãããã«æªåãããŸããã
HB ã®ãªãŒãžã§ã³ã®æ°ã«é¢ããéèŠãªç¹ãããäžåºŠèšåãã䟡å€ããããŸãã ãã®äŸã§ã¯ãå€ã¯ 64 ã«æå®ãããŸããããããæžãããŠãããšãã° 4 ã«ãããšãèªã¿åãæã®é床ã 2 åäœäžããŸãã ãã®çç±ã¯ãmemstore ãããæ©ããã£ã±ãã«ãªãããã¡ã€ã«ãããé »ç¹ã«ãã©ãã·ã¥ãããèªã¿åãæã«ããå€ãã®ãã¡ã€ã«ãåŠçããå¿ èŠãããããã§ãããã㯠HB ã«ãšã£ãŠããªãè€éãªæäœã§ãã å®éã®ç¶æ³ã§ã¯ãããã¯äºååå²ãšå§çž®æŠç¥ãæ€èšããããšã§å¯ŸåŠã§ããŸããç¹ã«ãã¬ããŒãžãåéããããã¯ã°ã©ãŠã³ãã§åžžã« HFile ãå§çž®ããèªäœã®ãŠãŒãã£ãªãã£ã䜿çšããŸãã DataStax ãã¹ãã§ã¯ãããŒãã«ããšã« 1 ã€ã®ãªãŒãžã§ã³ã®ã¿ãå²ãåœãŠãããå¯èœæ§ãé«ã (ããã¯æ£ãããããŸãã)ãããã«ãããHB ãèªã¿åããã¹ãã§ããã»ã©å£ã£ãŠããçç±ãããçšåºŠæ確ã«ãªããŸãã
ãããã以äžã®æ«å®çãªçµè«ãå°ãåºãããŸãã ãã¹ãäžã«å€§ããªãã¹ããªãã£ããšä»®å®ãããšãã«ãµã³ãã©ã¯ç²åã®è¶³ãæã€å·šåã®ããã«èŠããŸãã æ£ç¢ºã«èšããšãèšäºåé ã®åçã®ããã«ç足ã§ãã©ã³ã¹ããšã£ãŠããéã¯æ¯èŒçè¯ãæ瞟ãåããŠããã®ã§ãããåãæ¡ä»¶ã§æŠããšå®æããŠããŸããŸãã åæã«ãããŒããŠã§ã¢ã® CPU 䜿çšçãäœãããšãèæ ®ããŠããã¹ãããšã« XNUMX ã€ã® RegionServer HB ãé 眮ããããšãåŠç¿ããããã«ããããã©ãŒãã³ã¹ã XNUMX åã«ãªããŸããã ãããã®ã ãªãœãŒã¹ã®æŽ»çšãèæ ®ãããšãCS ã®ç¶æ³ã¯ããã«æ²æšã§ãã
ãã¡ããããããã®ãã¹ãã¯ããªãç·åçãªãã®ã§ãããããã§äœ¿çšãããããŒã¿ã®éã¯æ¯èŒçæ§ããã§ãã ãã©ãã€ãã«åãæ¿ããã°ç¶æ³ã¯å€ããå¯èœæ§ããããŸãããHB ã§ã¯ãã©ãã€ããèªã¿èŸŒãããšãã§ããŸãããCS ã§ã¯ãããåé¡ã§ããããšãå€æããŸããã ãããã®ããªã¥ãŒã ã§ããå¿çãåŸ æ©ããããã®ãã©ã¡ãŒã¿ãŒãããã©ã«ãã®ãã©ã¡ãŒã¿ãŒãšæ¯èŒããŠãã§ã«æ°åå¢å ããŠããã«ãããããããOperationTimedOutException ãã¹ããŒãããããšããããããŸããã
å ±åã®åªåã§CSã®ããã«ããã¯ãèŠã€ãããããæ©ããããšãã§ããã°ãæçµçµæã«ã€ããŠã¯èšäºã®æåŸã«å¿ ãè¿œèšããããšæããŸãã
UPD: 仲éã®ã¢ããã€ã¹ã®ãããã§ããªããšãèªãã¹ããŒããäžããããšãã§ããŸããã ã ã£ãïŒ
159 ãªãã¬ãŒã·ã§ã³ (644 ããŒãã«ã4 ã¹ããªãŒã ãããã 5)ã
è¿œå è
ïŒ
.withLoadBalancingPolicy(new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()))
ãããŠã¹ã¬ããã®æ°ãããã£ãŠã¿ãŸããã çµæã¯æ¬¡ã®ãšããã§ãã
4 ããŒãã«ã100 ã¹ã¬ãããããã = 1 (ããŒã¹ããš): 301 ops
4 ããŒãã«ã100 ã¹ã¬ãããããã = 10: 447 ãªãã¬ãŒã·ã§ã³
4 ããŒãã«ã100 ã¹ã¬ãããããã = 100: 625 ãªãã¬ãŒã·ã§ã³
åŸã§ãä»ã®ãã¥ãŒãã³ã°ã®ãã³ããé©çšããå®å
šãªãã¹ã ãµã€ã¯ã«ãå®è¡ããŠãçµæãæçš¿ã®æåŸã«è¿œå ããŸãã
åºæïŒ habr.com