๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

์ด๊ฒƒ์€ ๋†๋‹ด๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํŠน์ • ๊ทธ๋ฆผ์€ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณธ์งˆ์„ ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๊ฒฐ๊ตญ ๊ทธ ์ด์œ ๋Š” ๋ถ„๋ช…ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

DB-Engines Ranking์— ๋”ฐ๋ฅด๋ฉด ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ NoSQL ์ปฌ๋Ÿผํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Cassandra(์ดํ•˜ CS)์™€ HBase(HB)์ž…๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

์šด๋ช…์˜ ๋œป์— ๋”ฐ๋ผ Sberbank์˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ด€๋ฆฌ ํŒ€์€ ์ด๋ฏธ ๊ธด HB์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ˜‘๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์„ ๊ฝค ์ž˜ ์—ฐ๊ตฌํ–ˆ๊ณ  ์š”๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CS ํ˜•ํƒœ์˜ ๋Œ€์•ˆ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์šฐ๋ฆฌ๋Š” ์˜์‹ฌ์œผ๋กœ ์šฐ๋ฆฌ ์ž์‹ ์„ ์กฐ๊ธˆ ๊ดด๋กญ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์„ ํ•˜์˜€์Šต๋‹ˆ๊นŒ? ๊ฒŒ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๋Š” ๋น„๊ต, DataStax์—์„œ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ CS๊ฐ€ ๊ฑฐ์˜ ์••๋„์ ์ธ ์ ์ˆ˜๋กœ HB๋ฅผ ์‰ฝ๊ฒŒ ์ด๊ฒผ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— DataStax๋Š” ์ดํ•ด๊ด€๊ณ„์ž์ด๋ฏ€๋กœ ๊ทธ๋“ค์˜ ๋ง์„ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„๋“ค์—ฌ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ €ํฌ๋„ ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋„ˆ๋ฌด ์ ์–ด์„œ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ๋ˆ„๊ฐ€ BigData NoSql์˜ ์™•์ธ์ง€ ์ง์ ‘ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๊ณ , ์–ป์€ ๊ฒฐ๊ณผ๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜ํ–‰๋œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ™˜๊ฒฝ ๊ตฌ์„ฑ์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค 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์— ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์˜ ์ฆ๊ฐ€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฒฝ์Ÿ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ์ˆ˜๋ก ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹น์—ฐํ•˜์ง€๋งŒ 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);
}

์ด์ œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

๊ทธ๋ž˜ํ”„ ํ˜•์‹์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜

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์™€ ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ์•ผ์ฝ”์ฆˆ๋‚˜ ๋˜๋Š” ์นด์‚ฐ๋“œ๋ผ ๋Œ€ HBase์˜ ์ „ํˆฌ. Sberbank ํŒ€ ๊ฒฝํ—˜
๊ทธ๋ฆผ์€ ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์—ฐ์†์œผ๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ์˜ ํ™œ์šฉ๋„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€