์ด๊ฒ์ ๋๋ด๋ ์๋๋๋ค. ์ด ํน์ ๊ทธ๋ฆผ์ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณธ์ง์ ๊ฐ์ฅ ์ ํํ๊ฒ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๊ฒฐ๊ตญ ๊ทธ ์ด์ ๋ ๋ถ๋ช ํด์ง ๊ฒ์ ๋๋ค.
DB-Engines Ranking์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง NoSQL ์ปฌ๋ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Cassandra(์ดํ CS)์ HBase(HB)์
๋๋ค.
์ด๋ช
์ ๋ป์ ๋ฐ๋ผ Sberbank์ ๋ฐ์ดํฐ ๋ก๋ฉ ๊ด๋ฆฌ ํ์ ์ด๋ฏธ
๊ทธ๋ฌ๋ ์ํ๋ ํ
์คํธ ๊ฒฐ๊ณผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํ๊ฒฝ ๊ตฌ์ฑ์ ์ค์ํ ์ธก๋ฉด์ ์ค๋ช
ํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ฌ์ค CS๋ ๋ฐ์ดํฐ ์์ค์ด ํ์ฉ๋๋ ๋ชจ๋์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ ๊ฒ๋ค. ์ด๋ ํ๋์ ์๋ฒ(๋
ธ๋)๋ง์ด ํน์ ํค์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋นํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ์ด๋ค ์ด์ ๋ก๋ ์คํจํ๋ฉด ์ด ํค์ ๊ฐ์ด ์์ค๋ฉ๋๋ค. ๋ง์ ์
๋ฌด์์ ์ด๋ ์ค์ํ์ง ์์ง๋ง, ์ํ ๋ถ๋ฌธ์์๋ ์ด๊ฒ์ด ๊ท์น์ด๋ผ๊ธฐ๋ณด๋ค๋ ์์ธ์
๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์์ ์ ์ธ ์ ์ฅ์ ์ํด ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ ๋ณด์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ผ์ค ๋ณต์ ๋ชจ๋์์๋ CS ์๋ ๋ชจ๋๋ง ๊ณ ๋ ค๋์์ต๋๋ค. ์ผ์ด์ค ๊ณต๊ฐ ์์ฑ์ ๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋์์ต๋๋ค.
CREATE KEYSPACE ks WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};
๋ค์์ผ๋ก, ํ์ํ ์์ค์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ผ๋ฐ ๊ท์น:
๋ถ์ + 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)์
๋๋ค.
์๋ง๋ ์ด๊ฒ์ ๋ถ๋ถ์ ์ผ๋ก CS์ฉ DataStax๊ฐ ์ํํ ์ฑ๊ณต์ ์ธ ๋ก๋ ํ ์คํธ์ ๋น๊ฒฐ์ผ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ ์คํ ๋์ HB์ ๋ํด ๋ณต์ ์ธ์๋ฅผ 2์์ 3์ผ๋ก ๋ณ๊ฒฝํด๋ ์๋ฌด๋ฐ ํจ๊ณผ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๊ฒ๋ค. ๋์คํฌ๋ ์ฐ๋ฆฌ ๊ตฌ์ฑ์ HB ๋ณ๋ชฉ ํ์์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ค๋ฅธ ๋ง์ ํจ์ ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ ๋ฒ์ ์ HB๊ฐ ์ฝ๊ฐ ํจ์น๋๊ณ ์กฐ์ ๋์์ผ๋ฉฐ ํ๊ฒฝ์ด ์์ ํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. CS๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ณ CS๋ฅผ ์ฌ์ฉํ๋ ๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด ์์ ์๋ ์๋ค๋ ์ ๋ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋๊ธ์์ ์์๋ผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ง๋ง ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ด ์์ต๋๋ค.
๋ชจ๋ ํ ์คํธ๋ ๊ฐ๊ฐ ๋ค์ ๊ตฌ์ฑ์ ๊ฐ์ถ 4๊ฐ์ ์๋ฒ๋ก ๊ตฌ์ฑ๋ ํ๋์จ์ด ํด๋ฌ์คํฐ์์ ์ํ๋์์ต๋๋ค.
CPU: Xeon E5-2680 v4 @ 2.40GHz 64 ์ค๋ ๋.
๋์คํฌ: SATA HDD 12๊ฐ
์๋ฐ ๋ฒ์ : 1.8.0_111
CS ๋ฒ์ : 3.11.5
cassandra.yml ๋งค๊ฐ๋ณ์num_tokens: 256
Hinted_handoff_enabled: ์ฐธ
Hinted_handoff_throttle_in_kb: 1024
max_hints_delivery_threads: 2
ํํธ ๋๋ ํฐ๋ฆฌ: /data10/cassandra/hints
ํํธ_ํ๋ฌ์_๊ธฐ๊ฐ_์ธ_ms: 10000
max_hints_file_size_in_mb: 128
Batchlog_replay_throttle_in_kb: 1024
์ธ์ฆ์: AllowAllAuthenticator
์น์ธ์: AllowAllAuthorizer
role_manager: CassandraRoleManager
Roles_validity_in_ms: 2000
ํ๊ฐ_์ ํจ์ฑ_in_ms: 2000
credential_validity_in_ms: 2000
ํํฐ์
๋: org.apache.cassandra.dht.Murmur3Partitioner
๋ฐ์ดํฐ_ํ์ผ_๋๋ ํฐ๋ฆฌ:
- /data1/cassandra/data # ๊ฐ dataN ๋๋ ํฐ๋ฆฌ๋ ๋ณ๋์ ๋์คํฌ์
๋๋ค.
- /data2/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data3/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data4/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data5/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data6/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data7/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
- /data8/์นด์ฐ๋๋ผ/๋ฐ์ดํฐ
commitlog_directory: /data9/cassandra/commitlog
cdc_enabled: ๊ฑฐ์ง
disk_failure_policy: ์ค์ง
commit_failure_policy: ์ค์ง
prepare_statements_cache_size_mb:
thrift_prepared_statements_cache_size_mb:
key_cache_size_in_mb:
key_cache_save_๊ธฐ๊ฐ: 14400
row_cache_size_in_mb: 0
row_cache_save_๊ธฐ๊ฐ: 0
counter_cache_size_in_mb:
counter_cache_save_๊ธฐ๊ฐ: 7200
save_caches_directory: /data10/cassandra/saved_caches
commitlog_sync: ์ฃผ๊ธฐ์
commitlog_sync_๊ธฐ๊ฐ_in_ms: 10000
commitlog_segment_size_in_mb: 32
์ข
์ ๊ณต๊ธ์:
- ํด๋์ค ์ด๋ฆ: org.apache.cassandra.locator.SimpleSeedProvider
๋งค๊ฐ ๋ณ์ :
โ ์๋: "*,*"
๋์_์ฝ๊ธฐ: 256 # ์๋ 64 - ์ฐจ์ด์ ์ด ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.
Concurrent_writes: 256 # ์๋ 64 - ์ฐจ์ด์ ์ด ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.
๋์_counter_writes: 256 # ์๋ 64 - ์ฐจ์ด์ ์ด ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.
Concurrent_materialized_view_writes: 32
memtable_heap_space_in_mb: 2048 # 16GB๋ฅผ ์๋ํ๋๋ฐ ์๋๊ฐ ๋๋ ธ์ต๋๋ค.
memtable_allocation_type: ํ_๋ฒํผ
index_summary_capacity_in_mb:
index_summary_resize_interval_in_๋ถ: 60
trickle_fsync: ๊ฑฐ์ง
trickle_fsync_interval_in_kb: 10240
์คํ ๋ฆฌ์ง ํฌํธ: 7000
SSL_storage_port: 7001
Listen_address: *
๋ฐฉ์ก_์ฃผ์: *
Listen_on_broadcast_address: ์ฌ์ค
internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_transport: ์ฌ์ค
Native_transport_port: 9042
start_rpc: ์ฐธ
rpc_์ฃผ์: *
rpc_port: 9160
rpc_keepalive: ์ฐธ
rpc_server_type: ๋๊ธฐํ
thrift_framed_transport_size_in_mb: 15
Incremental_backups: ๊ฑฐ์ง
snapshot_before_compaction: ๊ฑฐ์ง
auto_snapshot: ์ฐธ
column_index_size_in_kb: 64
column_index_cache_size_in_kb: 2
๋์ ์์ถ๊ธฐ: 4
Compaction_throughput_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
Slow_query_log_timeout_in_ms: 500
cross_node_timeout: ๊ฑฐ์ง
Endpoint_snitch: ํ๋ดํ๋PropertyFileSnitch
Dynamic_snitch_update_interval_in_ms: 100
Dynamic_snitch_reset_interval_in_ms: 600000
Dynamic_snitch_badness_threshold: 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
์๋ฒ_์ํธํ_์ต์
:
๋
ธ๋ ๊ฐ ์ํธํ: ์์
ํด๋ผ์ด์ธํธ_์ํธํ_์ต์
:
์ฌ์ฉ : ๊ฑฐ์ง
internode_compression: dc
inter_dc_tcp_nodelay: ๊ฑฐ์ง
Tracetype_query_ttl: 86400
Tracetype_repair_ttl: 604800
ํ์ฑํ_์ฌ์ฉ์_์ ์_ํจ์: ๊ฑฐ์ง
ํ์ฑํ_์คํฌ๋ฆฝํธ_์ฌ์ฉ์_์ ์_ํจ์: ๊ฑฐ์ง
windows_timer_interval: 1
transparent_data_encryption_options:
์ฌ์ฉ : ๊ฑฐ์ง
tombstone_warn_threshold: 1000
tombstone_failure_threshold: 100000
๋ฐฐ์น_ํฌ๊ธฐ_warn_threshold_in_kb: 200
Batch_size_fail_threshold_in_kb: 250
unlogged_batch_across_partitions_warn_threshold: 10
Compaction_large_partition_warning_threshold_mb: 100
gc_warn_threshold_in_ms: 1000
back_press_enabled: ๊ฑฐ์ง
ํ์ฑํ_materialized_views: true
ํ์ฑํ_sasi_indexes: true
GC ์ค์ :
### CMS ์ค์ -XX:+ParNewGC ์ฌ์ฉ
-XX:+ConcMarkSweepGC ์ฌ์ฉ
-XX:+CMSParallelRemarkEnabled
-XX:์์กด์ ๋น์จ=8
-XX:MaxTenuringThreshold=1
-XX:CMSIinitiatingOccupancyFraction=75
-XX:+CMMSInitiatingOccupancyOnly ์ฌ์ฉ
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XX:+CMSClassUnloadingEnabled
jvm.options ๋ฉ๋ชจ๋ฆฌ์๋ 16Gb๊ฐ ํ ๋น๋์์ต๋๋ค(32Gb๋ ์๋ํ์ง๋ง ์ฐจ์ด๋ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค).
ํ ์ด๋ธ์ ๋ค์ ๋ช ๋ น์ผ๋ก ์์ฑ๋์์ต๋๋ค.
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 ๋งค๊ฐ๋ณ์์ฌ์ก์ฌ.session.timeout: 120000
hbase.rpc.timeout: 2๋ถ
hbase.client.scanner.timeout.๊ธฐ๊ฐ: 2๋ถ
hbase.master.handler.count: 10
hbase.regionserver.lease.๊ธฐ๊ฐ, hbase.client.scanner.timeout.๊ธฐ๊ฐ: 2๋ถ
hbase.regionserver.handler.count: 160
hbase.regionserver.metahandler.count: 30
hbase.regionserver.logroll.๊ธฐ๊ฐ: 4์๊ฐ
hbase.regionserver.maxlogs: 200
hbase.hregion.memstore.flush.size: 1GiB
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.ionalcacheflushinterval18000000
hbase.regionserver.thread.compaction.large12
hbase.regionserver.wal.enablecompressiontrue
hbase.hstore.compaction.max.size1073741824
hbase.server.compactchecker.interval.multiplier200
HBase RegionServer์ ๋ํ Java ๊ตฌ์ฑ ์ต์
:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -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 ์๋ฒ ์ต๋ ๋ก๊ทธ ํฌ๊ธฐ: 100MiB
HBase REST ์๋ฒ ์ต๋ ๋ก๊ทธ ํ์ผ ๋ฐฑ์
: 5
HBase Thrift ์๋ฒ ์ต๋ ๋ก๊ทธ ํฌ๊ธฐ: 100MiB
HBase Thrift ์๋ฒ ์ต๋ ๋ก๊ทธ ํ์ผ ๋ฐฑ์
: 5
๋ง์คํฐ ์ต๋ ๋ก๊ทธ ํฌ๊ธฐ: 100MiB
๋ง์คํฐ ์ต๋ ๋ก๊ทธ ํ์ผ ๋ฐฑ์
: 5
RegionServer ์ต๋ ๋ก๊ทธ ํฌ๊ธฐ: 100MiB
RegionServer ์ต๋ ๋ก๊ทธ ํ์ผ ๋ฐฑ์
: 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 ํ ํฌ๊ธฐ(๋ฐ์ดํธ): 1GiB
HBase REST ์๋ฒ ๊ธฐ๋ณธ ๊ทธ๋ฃน: 3GiB
HBase Thrift ์๋ฒ ๊ธฐ๋ณธ ๊ทธ๋ฃน: 3GiB
HBase ๋ง์คํฐ์ Java ํ ํฌ๊ธฐ(๋ฐ์ดํธ): 16GiB
HBase RegionServer์ Java ํ ํฌ๊ธฐ(๋ฐ์ดํธ): 32GiB
+๋๋ฌผ์ ์ฌ์ก์ฌ
maxClientCnxns: 601
maxSessionTimeout: 120000
ํ
์ด๋ธ ์์ฑ:
hbase org.apache.hadoop.hbase.util.RegionSplitter ns:t1 ๊ท ์ผ ๋ถํ -c 64 -f cf
alter 'ns:t1', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF', COMPRESSION => 'GZ'}
์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ์ค์ํ ์ ์ด ์์ต๋๋ค. DataStax ์ค๋ช ์๋ HB ํ ์ด๋ธ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์์ญ ์๋ ๋์ ์์ง ์์ง๋ง ์ด๋ ๋์ฉ๋์ ๊ฒฝ์ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ๋ฅผ ์ํด ์ต๋ 64GB๊น์ง ์ ์ฅํ ์ ์๋ ์๋ = 640๊ฐ ์ ํ๋์์ต๋๋ค. ์ค๊ฐ ํฌ๊ธฐ์ ํ ์ด๋ธ.
ํ ์คํธ ๋น์ 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 ์ค์ ์ ์ผ์ข
์ ๋ณ๋ชฉ ํ์์ด ์๋ค๋ ์ํน์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธํฐ๋ท ๊ฒ์๊ณผ ๊ฐ์ฅ ํ์คํ ๋งค๊ฐ๋ณ์(concurrent_writes ๋๋ memtable_heap_space_in_mb ๋ฑ)๋ฅผ ๊ฒ์ํด๋ ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์์ต๋๋ค. ๋์์ ํต๋๋ฌด๋ ๊นจ๋ํ๊ณ ์๋ฌด๊ฒ๋ ๋งน์ธํ์ง ์์ต๋๋ค.
๋ฐ์ดํฐ๋ ๋ ธ๋ ์ ์ฒด์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ๋์์ผ๋ฉฐ ๋ชจ๋ ๋ ธ๋์ ํต๊ณ๋ ๊ฑฐ์ ๋์ผํ์ต๋๋ค.
๋ค์์ ๋
ธ๋ ์ค ํ๋์ ํ
์ด๋ธ ํต๊ณ์
๋๋ค.ํค์คํ์ด์ค: ks
์ฝ๊ธฐ ํ์: 9383707
์ฝ๊ธฐ ์ง์ฐ ์๊ฐ: 0.04287025042448576ms
์ฐ๊ธฐ ํ์: 15462012
์ฐ๊ธฐ ์ง์ฐ ์๊ฐ: 0.1350068438699957ms
๋ณด๋ฅ ์ค์ธ ํ๋ฌ์: 0
ํ
์ด๋ธ: t1
SSํ
์ด๋ธ ์: 16
์ฌ์ฉ๋ ๊ณต๊ฐ(๋ผ์ด๋ธ): 148.59MiB
์ฌ์ฉ๋ ๊ณต๊ฐ(์ด): 148.59MiB
์ค๋
์ท์ ์ฌ์ฉ๋ ๊ณต๊ฐ(์ด๊ณ): 0๋ฐ์ดํธ
์ฌ์ฉ๋ ์คํ ํ ๋ฉ๋ชจ๋ฆฌ(์ด๊ณ): 5.17MiB
SSTable ์์ถ ๋น์จ: 0.5720989576459437
ํํฐ์
์(์ถ์ ): 3970323
๋ฉ๋ชจ๋ฆฌ ๊ฐ๋ฅํ ์
์: 0
๋ฉ๋ชจ๋ฆฌ ํ
์ด๋ธ ํฌ๊ธฐ: 0๋ฐ์ดํธ
์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ์คํ ํ ๋ฉ๋ชจ๋ฆฌ: 0๋ฐ์ดํธ
๋ฉ๋ชจ๋ฆฌ ๊ฐ๋ฅํ ์ค์์น ์: 5
๋ก์ปฌ ์ฝ๊ธฐ ํ์: 2346045
๋ก์ปฌ ์ฝ๊ธฐ ๋๊ธฐ ์๊ฐ: NaN ms
๋ก์ปฌ ์ฐ๊ธฐ ํ์: 3865503
๋ก์ปฌ ์ฐ๊ธฐ ๋๊ธฐ ์๊ฐ: NaN ms
๋ณด๋ฅ ์ค์ธ ํ๋ฌ์: 0
์๋ฆฌ๋ ๋น์จ: 0.0
๋ธ๋ฃธ ํํฐ ์คํ: 25
๋ธ๋ฃธ ํํฐ ๊ฑฐ์ง ๋น์จ: 0.00000
์ฌ์ฉ๋ ๋ธ๋ฃธ ํํฐ ๊ณต๊ฐ: 4.57MiB
์ฌ์ฉ๋ ๋ธ๋ฃธ ํํฐ ์คํ ํ ๋ฉ๋ชจ๋ฆฌ: 4.57MiB
์ฌ์ฉ๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ธ๋ฑ์ค ์์ฝ: 590.02 KiB
์ฌ์ฉ๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ถ ๋ฉํ๋ฐ์ดํฐ: 19.45KiB
์์ถ๋ ํํฐ์
์ต์ ๋ฐ์ดํธ: 36
์์ถ๋ ํํฐ์
์ต๋ ๋ฐ์ดํธ: 42
์์ถ๋ ํํฐ์
ํ๊ท ๋ฐ์ดํธ: 42
์ฌ๋ผ์ด์ค๋น ํ๊ท ์ด์์๋ ์ธํฌ(๋ง์ง๋ง XNUMX๋ถ): NaN
์ฌ๋ผ์ด์ค๋น ์ต๋ ๋ผ์ด๋ธ ์
(์ง๋ 0๋ถ): XNUMX
์กฐ๊ฐ๋น ํ๊ท ์ญ์ ํ์(์ง๋ XNUMX๋ถ): NaN
์กฐ๊ฐ๋น ์ต๋ ์ญ์ ํ์(์ง๋ 0๋ถ): XNUMX
์ญ์ ๋ ๋์ฐ๋ณ์ด: 0๋ฐ์ดํธ
๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ค๋ ์๋(๊ฐ๋ณ์ ์ผ๋ก ์ ์กํ๋ ๊ฒฝ์ฐ์๋)๋ ํจ๊ณผ๊ฐ ์์๊ณ ์ํฉ์ ๋์ฑ ์ ํ๋์์ต๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ CS์ ์ต๋ ์ฑ๋ฅ์ผ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์๋ํ๋ฉด CS์ ๋ํด ์ป์ ๊ฒฐ๊ณผ๋ DataStax์์ ์ป์ ๊ฒฐ๊ณผ์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค(์ด๋น ์ฝ ์์ญ๋ง ๊ฐ์ ์์ ). ๋ํ ๋ฆฌ์์ค ํ์ฉ๋๋ฅผ ์ดํด๋ณด๋ฉด CS๊ฐ ํจ์ฌ ๋ ๋ง์ CPU์ ๋์คํฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ฐ์์ผ๋ก ๋ชจ๋ ํ
์คํธ๋ฅผ ์คํํ๋ ๋์์ ํ์ฉ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
HB์ ๊ฐ๋ ฅํ ๋ ์ ์ด์ ์ ๋ํด. ์ฌ๊ธฐ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ ์ฝ๊ธฐ ์ค ๋์คํฌ ํ์ฉ๋๊ฐ ๋งค์ฐ ๋ฎ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฝ๊ธฐ ํ ์คํธ๋ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ํ ์คํธ ์ฃผ๊ธฐ์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋๋ค. ์๋ฅผ ๋ค์ด CS์ ๊ฒฝ์ฐ 15:20๋ถํฐ 15:40๊น์ง์ ๋๋ค. HB์ ๊ฒฝ์ฐ ์ด์ ๋ ๋ถ๋ช ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ, memstore์ ์ ์ง๋๊ณ ์ผ๋ถ๋ ๋ธ๋ก ์บ์์ ์บ์๋ฉ๋๋ค. CS์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ช ํํ์ง ์์ง๋ง ๋์คํฌ ์ฌํ์ฉ๋ ๋ณด์ด์ง ์์ง๋ง ํน์๋ผ๋ ์บ์ row_cache_size_in_mb = 2048์ ํ์ฑํํ๊ณ ์บ์ฑ = {'keys': 'ALL'์ ์ค์ ํ๋ ค๊ณ ์๋ํ์ต๋๋ค. 'rows_per_partition': ' 2000000'}, ํ์ง๋ง ์ด๋ก ์ธํด ์ํฉ์ด ๋์ฑ ์ ํ๋์์ต๋๋ค.
HB์ ์ง์ญ ์์ ๊ดํ ์ค์ํ ์ ์ ๋ค์ ํ ๋ฒ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๊ฐ์ 64๋ก ์ง์ ๋์์ต๋๋ค. ์ด๋ฅผ ์ค์ฌ์ ์๋ฅผ ๋ค์ด 4์ ๊ฐ๊ฒ ๋ง๋ค๋ฉด ์ฝ์ ๋ ์๋๊ฐ 2๋ฐฐ๋ก ๋จ์ด์ง๋๋ค. ๊ทธ ์ด์ ๋ memstore๊ฐ ๋ ๋นจ๋ฆฌ ์ฑ์์ง๊ณ ํ์ผ์ด ๋ ์์ฃผ ํ๋ฌ์๋๋ฉฐ ์ฝ์ ๋ ๋ ๋ง์ ํ์ผ์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ HB์ ๊ฒฝ์ฐ ๋ค์ ๋ณต์กํ ์์ ์ ๋๋ค. ์ค์ ์ํฉ์์๋ ์ฌ์ ๋ถํ ๋ฐ ์์ถ ์ ๋ต์ ํตํด ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ํนํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ง์์ ์ผ๋ก ๊ฐ๋น์ง๋ฅผ ์์งํ๊ณ HFiles๋ฅผ ์์ถํ๋ ์์ฒด ์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. DataStax ํ ์คํธ์ ๊ฒฝ์ฐ ํ ์ด๋ธ๋น 1๊ฐ์ ์์ญ๋ง ํ ๋นํ์ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ(์ฌ๋ฐ๋ฅด์ง ์์) ์ด๋ HB๊ฐ ์ฝ๊ธฐ ํ ์คํธ์์ ๊ทธํ ๋ก ์ด๋ฑํ ์ด์ ๋ฅผ ์ด๋ ์ ๋ ๋ช ํํ๊ฒ ํด์ค๋๋ค.
์ด๊ฒ์ผ๋ก๋ถํฐ ๋ค์๊ณผ ๊ฐ์ ์๋น ๊ฒฐ๋ก ์ด ๋์ถ๋๋ค. ํ ์คํธ ์ค์ ํฐ ์ค์๊ฐ ์์๋ค๊ณ ๊ฐ์ ํ๋ฉด Cassandra๋ ์ ํ ๋ฐ์ ๊ฐ์ง ๊ฑฐ์ธ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ข ๋ ์ ํํ ๋งํ์๋ฉด, ๊ธฐ์ฌ ์๋ถ๋ถ์ ์ฌ์ง์ฒ๋ผ ํ์ชฝ ๋ค๋ฆฌ๋ก ๊ท ํ์ ์ก๊ณ ์๋ ๋์ ๋น๊ต์ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ์ง๋ง, ๊ฐ์ ์กฐ๊ฑด์์์ ์ธ์์์๋ ์์ ํ ํจ๋ฐฐํ๋ค. ๋์์ ํ๋์จ์ด์ ๋ฎ์ CPU ์ฌ์ฉ๋ฅ ์ ๊ณ ๋ คํ์ฌ ํธ์คํธ๋น XNUMX๊ฐ์ RegionServer HB๋ฅผ ์ค์นํ์ฌ ์ฑ๋ฅ์ ๋ ๋ฐฐ๋ก ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์ ๊ฒ๋ค. ์์ ํ์ฉ์ ๊ณ ๋ คํ๋ฉด 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