Tas pat nav joks, Ŕķiet, ka tieÅ”i Ŕī bilde visprecÄ«zÄk atspoguļo Å”o datu bÄzu bÅ«tÄ«bu, un beigÄs bÅ«s skaidrs, kÄpÄc:
SaskaÅÄ ar DB-Engines Ranking, divas populÄrÄkÄs NoSQL kolonnu datu bÄzes ir Cassandra (turpmÄk CS) un HBase (HB).
PÄc likteÅa gribas mÅ«su datu ielÄdes vadÄ«bas komanda Sberbank to jau ir izdarÄ«jusi
TomÄr, pirms pÄriet pie veikto testu rezultÄtiem, ir jÄapraksta vides konfigurÄciju bÅ«tiskie aspekti. Fakts ir tÄds, ka CS var izmantot režīmÄ, kas ļauj zaudÄt datus. Tie. tas ir tad, kad par noteiktas atslÄgas datiem atbild tikai viens serveris (mezgls), un ja kÄda iemesla dÄļ tas neizdodas, tad Ŕīs atslÄgas vÄrtÄ«ba tiks zaudÄta. Daudziem uzdevumiem tas nav bÅ«tiski, bet banku sektoram tas ir drÄ«zÄk izÅÄmums, nevis likums. MÅ«su gadÄ«jumÄ ir svarÄ«gi, lai bÅ«tu vairÄkas datu kopijas droÅ”ai uzglabÄÅ”anai.
TÄpÄc tika Åemts vÄrÄ tikai CS darbÄ«bas režīms trÄ«skÄrÅ”Ä replikÄcijas režīmÄ, t.i. Lietu telpas izveide tika veikta ar Å”Ädiem parametriem:
CREATE KEYSPACE ks WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};
TÄlÄk ir divi veidi, kÄ nodroÅ”inÄt nepiecieÅ”amo konsekvences lÄ«meni. VispÄrÄjs noteikums:
ZR + NR > RF
Tas nozÄ«mÄ, ka apstiprinÄjumu skaitam no mezgliem rakstÄ«Å”anas laikÄ (NW) plus apstiprinÄjumu skaitam no mezgliem lasÄ«Å”anas laikÄ (NR) ir jÄbÅ«t lielÄkam par replikÄcijas koeficientu. MÅ«su gadÄ«jumÄ RF = 3, kas nozÄ«mÄ, ka ir piemÄrotas Å”Ädas iespÄjas:
2 + 2 > 3
3 + 1 > 3
TÄ kÄ mums ir bÅ«tiski svarÄ«gi datus glabÄt pÄc iespÄjas uzticamÄk, tika izvÄlÄta shÄma 3+1. TurklÄt HB darbojas pÄc lÄ«dzÄ«ga principa, t.i. Å”Äds salÄ«dzinÄjums bÅ«s godÄ«gÄks.
JÄpiebilst, ka DataStax savÄ pÄtÄ«jumÄ rÄ«kojÄs pretÄji, viÅi uzstÄdÄ«ja RF = 1 gan CS, gan HB (pÄdÄjam mainot HDFS iestatÄ«jumus). Tas ir patieÅ”Äm svarÄ«gs aspekts, jo ietekme uz CS veiktspÄju Å”ajÄ gadÄ«jumÄ ir milzÄ«ga. PiemÄram, zemÄk esoÅ”ajÄ attÄlÄ ir redzams laika pieaugums, kas nepiecieÅ”ams datu ielÄdei CS:
Å eit mÄs redzam sekojoÅ”o: jo vairÄk konkurÄjoÅ”u pavedienu ieraksta datus, jo ilgÄks laiks ir nepiecieÅ”ams. Tas ir dabiski, taÄu ir svarÄ«gi, lai RF=3 veiktspÄjas pasliktinÄÅ”anÄs bÅ«tu ievÄrojami lielÄka. Citiem vÄrdiem sakot, ja mÄs ierakstÄm 4 pavedienus 5 tabulÄs katrÄ (kopÄ 20), tad RF=3 zaudÄ apmÄram 2 reizes (150 sekundes RF=3 pret 75 RF=1). Bet ja palielina slodzi, ielÄdÄjot datus 8 tabulÄs ar 5 pavedieniem katrÄ (kopÄ 40), tad RF=3 zudums jau ir 2,7 reizes (375 sekundes pret 138).
VarbÅ«t tas daļÄji ir DataStax for CS veiksmÄ«gÄs slodzes pÄrbaudes noslÄpums, jo HB mÅ«su stendÄ replikÄcijas koeficienta maiÅa no 2 uz 3 nedeva nekÄdu efektu. Tie. diski nav HB saÅ”aurinÄjums mÅ«su konfigurÄcijai. TomÄr Å”eit ir daudz citu slazdu, jo jÄÅem vÄrÄ, ka mÅ«su HB versija tika nedaudz lÄpÄ«ta un pielabota, vides ir pilnÄ«gi atŔķirÄ«gas utt. Ir arÄ« vÄrts atzÄ«mÄt, ka, iespÄjams, es vienkÄrÅ”i nezinu, kÄ pareizi sagatavot CS, un ir daži efektÄ«vÄki veidi, kÄ ar to strÄdÄt, un es ceru, ka mÄs to uzzinÄsim komentÄros. Bet vispirms vispirms.
Visi testi tika veikti aparatÅ«ras klasterÄ«, kas sastÄv no 4 serveriem, katrs ar Å”Ädu konfigurÄciju:
CPU: Xeon E5-2680 v4 @ 2.40 GHz 64 pavedieni.
Diski: 12 gab SATA HDD
java versija: 1.8.0_111
CS versija: 3.11.5
cassandra.yml parametritokenu skaits: 256
hinted_handoff_enabled: patiess
hinted_handoff_throttle_in_kb: 1024
max_hints_delivery_threads: 2
hints_directory: /data10/cassandra/hints
hints_flush_period_in_ms: 10000
max_hints_file_size_in_mb: 128
batchlog_replay_throttle_in_kb: 1024
autentifikators: AllowAllAuthenticator
autorizÄtÄjs: AllowAllAuthorizer
role_manager: CassandraRoleManager
roles_validity_in_ms: 2000
permissions_validity_in_ms: 2000
credentials_validity_in_ms: 2000
sadalÄ«tÄjs: org.apache.cassandra.dht.Murmur3Partitioner
data_file_directories:
- /data1/cassandra/data # katrs datuN direktorijs ir atseviŔķs disks
- /data2/cassandra/data
- /data3/cassandra/data
- /data4/cassandra/data
- /data5/cassandra/data
- /data6/cassandra/data
- /data7/cassandra/data
- /data8/cassandra/data
commitlog_direktorijs: /data9/cassandra/commitlog
cdc_enabled: false
disk_failure_policy: stop
commit_failure_policy: stop
ready_statements_cache_size_mb:
thrift_prepared_statements_cache_size_mb:
key_cache_size_in_mb:
key_cache_save_period: 14400
row_cache_size_in_mb: 0
row_cache_save_period: 0
counter_cache_size_in_mb:
counter_cache_save_period: 7200
saved_caches_directory: /data10/cassandra/saved_caches
commitlog_sync: periodisks
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 32
seed_provider:
- klases_nosaukums: org.apache.cassandra.locator.SimpleSeedProvider
parametri:
ā sÄklas: "*,*"
concurrent_reads: 256 # mÄÄ£inÄjuÅ”i 64 ā atŔķirÄ«ba nav pamanÄ«ta
concurrent_writes: 256 # izmÄÄ£inÄts 64 - atŔķirÄ«ba nav pamanÄ«ta
concurrent_counter_writes: 256 # izmÄÄ£inÄts 64 - atŔķirÄ«ba nav manÄ«ta
concurrent_materialized_view_writes: 32
memtable_heap_space_in_mb: 2048 # izmÄÄ£inÄju 16 GB ā tas bija lÄnÄks
memtable_allocation_type: kaudzes_buferi
index_summary_capacity_in_mb:
index_summary_resize_interval_in_minutes: 60
trickle_fsync: nepatiess
trickle_fsync_interval_in_kb: 10240
Storage_port: 7000
ssl_storage_port: 7001
klausÄ«Å”anÄs_adrese: *
apraides_adrese: *
listen_on_broadcast_address: true
internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_transport: taisnība
native_transport_port: 9042
start_rpc: taisnība
rpc_address: *
rpc_port: 9160
rpc_keepalive: taisnība
rpc_server_type: sinhronizÄcija
thrift_framed_transport_size_in_mb: 15
incremental_backups: false
snapshot_before_compaction: false
auto_snapshot: taisnība
column_index_size_in_kb: 64
column_index_cache_size_in_kb: 2
concurrent_compactors: 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: false
endpoint_snitch: GossipingPropertyFileSnitch
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
server_encryption_options:
internode_encryption: nav
client_encryption_options:
iespÄjots: false
internode_compression: dc
inter_dc_tcp_nodelay: false
tracetype_query_ttl: 86400
tracetype_repair_ttl: 604800
enable_user_defined_functions: false
enable_scripted_user_defined_functions: false
windows_timer_interval: 1
transparent_data_encryption_options:
iespÄjots: false
kapa piemineklis_brÄ«dinÄjuma slieksnis: 1000
kapakmens_neveiksmes_slieksnis: 100000
batch_size_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_pressure_enabled: false
enable_materialized_views: patiess
enable_sasi_indexes: true
GC iestatījumi:
### SPS iestatījumi-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+Izmantojiet CMSIinitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XX:+CMSClassUnloadingEnabled
jvm.options atmiÅai tika atvÄlÄti 16Gb (mÄs pamÄÄ£inÄjÄm arÄ« 32Gb, atŔķirÄ«ba netika manÄ«ta).
Tabulas tika izveidotas ar komandu:
CREATE TABLE ks.t1 (id bigint PRIMARY KEY, title text) WITH compression = {'sstable_compression': 'LZ4Compressor', 'chunk_length_kb': 64};
HB versija: 1.2.0-cdh5.14.2 (klasÄ org.apache.hadoop.hbase.regionserver.HRegion mÄs izslÄdzÄm MetricsRegion, kas noveda pie GC, kad RegionServer reÄ£ionu skaits pÄrsniedza 1000)
HBase parametri, kas nav noklusÄjuma iestatÄ«jumizookeeper.session.timeout: 120000
hbase.rpc.timeout: 2 minūte(s)
hbase.client.scanner.timeout.period: 2 minūte(s)
hbase.master.handler.count: 10
hbase.regionserver.lease.period, hbase.client.scanner.timeout.period: 2 minūte(s)
hbase.regionserver.handler.count: 160
hbase.regionserver.metahandler.count: 30
hbase.regionserver.logroll.period: 4 stunda(s)
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 diena(s)
HBase pakalpojuma papildu konfigurÄcijas fragments (droŔības vÄrsts) vietnei hbase-site.xml:
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
Java konfigurÄcijas opcijas HBase RegionServer:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m
hbase.snapshot.master.timeoutMillis: 2 minūte(s)
hbase.snapshot.region.timeout: 2 minūte(s)
hbase.snapshot.master.timeout.millis: 2 minūte(s)
HBase REST servera maksimÄlais žurnÄla izmÄrs: 100 MiB
HBase REST servera maksimÄlais žurnÄlfaila dublÄjumkopijas: 5
HBase Thrift servera maksimÄlais žurnÄla izmÄrs: 100 MiB
HBase Thrift servera maksimÄlais žurnÄlfaila dublÄjumkopijas: 5
Master Max žurnÄla izmÄrs: 100 MiB
GalvenÄs maksimÄlÄs žurnÄlfaila dublÄjumkopijas: 5
RegionServer Max žurnÄla izmÄrs: 100 MiB
RegionServer maksimÄlie žurnÄlfailu dublÄjumkopijas: 5
HBase aktÄ«vÄ galvenÄ noteikÅ”anas logs: 4 minÅ«te(s)
dfs.client.hedged.read.threadpool.size: 40
dfs.client.hedged.read.threshold.millis: 10 milisekundes(s)
hbase.rest.threads.min: 8
hbase.rest.threads.max: 150
MaksimÄlie procesa failu deskriptori: 180000 XNUMX
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
Region Mover pavedieni: 6
Klienta Java kaudzes lielums baitos: 1 GiB
HBase REST servera noklusÄjuma grupa: 3 GiB
HBase Thrift servera noklusÄjuma grupa: 3 GiB
Java kaudzes HBase Master lielums baitos: 16 GiB
Java kaudzes HBase RegionServer lielums baitos: 32 GiB
+ZooKeeper
maxClientCnxns: 601
maxSessionTimeout: 120000
Tabulu izveide:
hbase org.apache.hadoop.hbase.util.RegionSplitter ns:t1 UniformSplit -c 64 -f cf
mainīt 'ns:t1', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF', COMPRESSION => 'GZ'}
Å eit ir viens svarÄ«gs punkts - DataStax aprakstÄ nav norÄdÄ«ts, cik reÄ£ionu tika izmantoti HB tabulu izveidoÅ”anai, lai gan tas ir ļoti svarÄ«gi lieliem apjomiem. TÄpÄc testiem tika izvÄlÄts daudzums = 64, kas ļauj uzglabÄt lÄ«dz 640 GB, t.i. vidÄja izmÄra galds.
Testa laikÄ HBase bija 22 tÅ«kstoÅ”i tabulu un 67 tÅ«kstoÅ”i reÄ£ionu (tas bÅ«tu bijis letÄls versijai 1.2.0, ja ne iepriekÅ” minÄtais ielÄps).
Tagad par kodu. TÄ kÄ nebija skaidrs, kuras konfigurÄcijas konkrÄtai datubÄzei bija izdevÄ«gÄkas, tika veikti testi dažÄdÄs kombinÄcijÄs. Tie. dažos testos vienlaikus tika ielÄdÄtas 4 tabulas (savienojumam tika izmantoti visi 4 mezgli). Citos testos strÄdÄjÄm ar 8 dažÄdÄm tabulÄm. Dažos gadÄ«jumos partijas lielums bija 100, citos 200 (partijas parametrs - skatÄ«t kodu zemÄk). VÄrtÄ«bas datu lielums ir 10 baiti vai 100 baiti (dataSize). KopumÄ katrÄ tabulÄ tika ierakstÄ«ti un nolasÄ«ti 5 miljoni ierakstu katru reizi. TajÄ paÅ”Ä laikÄ katrÄ tabulÄ tika ierakstÄ«ti/nolasÄ«ti 5 pavedieni (pavediena numurs - thNum), no kuriem katrs izmantoja savu atslÄgu diapazonu (skaits = 1 miljons):
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);
}
}
AttiecÄ«gi HB tika nodroÅ”inÄta lÄ«dzÄ«ga funkcionalitÄte:
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);
}
}
TÄ kÄ HB klientam ir jÄrÅ«pÄjas par vienmÄrÄ«gu datu sadalÄ«jumu, galvenÄ sÄlÄ«Å”anas funkcija izskatÄ«jÄs Å”Ädi:
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);
}
Tagad interesantÄkÄ daļa - rezultÄti:
Tas pats diagrammas formÄ:
HB priekÅ”rocÄ«ba ir tik pÄrsteidzoÅ”a, ka rodas aizdomas, ka CS iestatÄ«jumos ir kÄds vÄjÅ” kakls. TomÄr googlÄÅ”ana un acÄ«mredzamÄko parametru (piemÄram, concurrent_writes vai memtable_heap_space_in_mb) meklÄÅ”ana nepaÄtrina darbÄ«bu. TajÄ paÅ”Ä laikÄ baļķi ir tÄ«ri un ne par ko nezvÄr.
Dati tika sadalÄ«ti vienmÄrÄ«gi pa mezgliem, statistika no visiem mezgliem bija aptuveni vienÄda.
Å Ädi izskatÄs tabulas statistika no viena no mezgliemTaustiÅu atstarpe: ks
Lasījumu skaits: 9383707
LasīŔanas latentums: 0.04287025042448576 ms
Rakstu skaits: 15462012
RakstīŔanas latentums: 0.1350068438699957 ms
GaidÄmie skalojumi: 0
Tabula: t1
SST tabulu skaits: 16
IzmantotÄ vieta (tieÅ”raidÄ): 148.59 MiB
IzmantotÄ vieta (kopÄ): 148.59 MiB
MomentuzÅÄmumu izmantotÄ vieta (kopÄ): 0 baiti
IzmantotÄ kaudzÄ«tes atmiÅa (kopÄ): 5.17 MiB
SSTable kompresijas pakÄpe: 0.5720989576459437
Starpsienu skaits (aptuvenais): 3970323
IegaumÄjamo Ŕūnu skaits: 0
IegaumÄjamo datu lielums: 0 baiti
IzmantotÄ iegaumÄjamÄ kaudzes atmiÅa: 0 baitu
IegaumÄjamo slÄdžu skaits: 5
VietÄjais lasÄ«to skaits: 2346045
VietÄjais lasÄ«Å”anas latentums: NaN ms
VietÄjais rakstÄ«Å”anas skaits: 3865503
VietÄjais rakstÄ«Å”anas latentums: NaN ms
GaidÄmie skalojumi: 0
Remonta procents: 0.0
Bloom filtra kļūdaini pozitÄ«vi rezultÄti: 25
Bloom filtra viltus koeficients: 0.00000
IzmantotÄ Bloom filtra vieta: 4.57 MiB
IzmantotÄ Bloom filtra kaudzes atmiÅa: 4.57 MiB
IzmantotÄs kaudzes atmiÅas rÄdÄ«tÄja kopsavilkums: 590.02 KiB
IzmantotÄ kaudzes atmiÅas saspieÅ”anas metadati: 19.45 KiB
SablÄ«vÄta nodalÄ«juma minimÄlie baiti: 36
SablÄ«vÄta nodalÄ«juma maksimÄlais baiti: 42
SablÄ«vÄta nodalÄ«juma vidÄjie baiti: 42
VidÄjais dzÄ«vo Ŕūnu skaits ŔķÄlÄ (pÄdÄjÄs piecas minÅ«tes): NaN
MaksimÄlais dzÄ«vu Ŕūnu skaits ŔķÄlÄ (pÄdÄjÄs piecas minÅ«tes): 0
VidÄjais kapu pieminekļu skaits vienÄ Å”Ä·ÄlÄ (pÄdÄjÄs piecÄs minÅ«tÄs): NaN
MaksimÄlais kapu pieminekļu skaits ŔķÄlÄ (pÄdÄjÄs piecÄs minÅ«tÄs): 0
NomestÄs mutÄcijas: 0 baiti
MÄÄ£inÄjums samazinÄt partijas lielumu (pat nosÅ«tot to atseviŔķi) nedeva nekÄdu efektu, tas tikai pasliktinÄjÄs. IespÄjams, ka patiesÄ«bÄ Å”Ä« patieÅ”Äm ir maksimÄlÄ CS veiktspÄja, jo CS iegÅ«tie rezultÄti ir lÄ«dzÄ«gi DataStax iegÅ«tajiem - aptuveni simtiem tÅ«kstoÅ”u operÄciju sekundÄ. TurklÄt, ja mÄs skatÄmies uz resursu izmantoÅ”anu, mÄs redzÄsim, ka CS izmanto daudz vairÄk CPU un disku:
AttÄlÄ parÄdÄ«ta izmantoÅ”ana visu testu izpildes laikÄ pÄc kÄrtas abÄm datu bÄzÄm.
AttiecÄ«bÄ uz HB jaudÄ«go lasÄ«Å”anas priekÅ”rocÄ«bu. Å eit var redzÄt, ka abÄm datu bÄzÄm diska izmantoÅ”ana lasÄ«Å”anas laikÄ ir ÄrkÄrtÄ«gi zema (lasÄ«Å”anas testi ir katras datu bÄzes testÄÅ”anas cikla beigu daļa, piemÄram, CS tas ir no 15:20 lÄ«dz 15:40). HB gadÄ«jumÄ iemesls ir skaidrs - lielÄkÄ daļa datu karÄjas atmiÅÄ, memstore, un daži tiek saglabÄti blokkeÅ”atmiÅÄ. Kas attiecas uz CS, tad nav Ä«sti skaidrs, kÄ tas darbojas, bet diska pÄrstrÄde arÄ« nav redzama, taÄu katram gadÄ«jumam tika mÄÄ£inÄts iespÄjot cache row_cache_size_in_mb = 2048 un iestatÄ«t caching = {'keys': 'ALL', 'rows_per_partition': ' 2000000'}, taÄu tas padarÄ«ja to vÄl nedaudz sliktÄku.
Ir arÄ« vÄrts vÄlreiz pieminÄt svarÄ«gu punktu par reÄ£ionu skaitu HB. MÅ«su gadÄ«jumÄ vÄrtÄ«ba tika norÄdÄ«ta kÄ 64. Ja to samazina un padara to vienÄdu ar, piemÄram, 4, tad lasot Ätrums samazinÄs 2 reizes. Iemesls ir tÄds, ka memstore piepildÄ«sies ÄtrÄk un faili tiks izskaloti biežÄk un lasot bÅ«s jÄapstrÄdÄ vairÄk failu, kas HB ir diezgan sarežģīta darbÄ«ba. ReÄlos apstÄkļos to var novÄrst, izmantojot iepriekÅ”Äjas sadalÄ«Å”anas un blÄ«vÄÅ”anas stratÄÄ£iju; jo Ä«paÅ”i mÄs izmantojam paÅ”rakstÄ«tu utilÄ«tu, kas savÄc atkritumus un fonÄ pastÄvÄ«gi saspiež HFiles. PilnÄ«gi iespÄjams, ka DataStax testiem viÅi katrai tabulai pieŔķīra tikai 1 reÄ£ionu (kas nav pareizi), un tas zinÄmÄ mÄrÄ izskaidro, kÄpÄc HB bija tik sliktÄks viÅu lasÄ«Å”anas testos.
No tÄ tiek izdarÄ«ti Å”Ädi sÄkotnÄjie secinÄjumi. PieÅemot, ka testÄÅ”anas laikÄ netika pieļautas lielas kļūdas, tad Kasandra izskatÄs pÄc kolosa ar mÄla pÄdÄm. PrecÄ«zÄk, kamÄr viÅa balansÄ uz vienas kÄjas, kÄ bildÄ raksta sÄkumÄ, uzrÄda salÄ«dzinoÅ”i labus rezultÄtus, taÄu cÄ«ÅÄ pie tÄdiem paÅ”iem nosacÄ«jumiem zaudÄ tieÅ”i. TajÄ paÅ”Ä laikÄ, Åemot vÄrÄ mÅ«su aparatÅ«ras zemo CPU noslodzi, mÄs iemÄcÄ«jÄmies uzstÄdÄ«t divus RegionServer HB uz vienu saimniekdatoru un tÄdÄjÄdi dubultojÄm veiktspÄju. Tie. Å emot vÄrÄ resursu izlietojumu, CS situÄcija ir vÄl bÄdÄ«gÄka.
Protams, Å”ie testi ir diezgan sintÄtiski, un Å”eit izmantoto datu apjoms ir salÄ«dzinoÅ”i neliels. IespÄjams, ja mÄs pÄrietu uz terabaitiem, situÄcija bÅ«tu citÄda, bet, kamÄr HB varam ielÄdÄt terabaitus, CS tas izrÄdÄ«jÄs problemÄtiski. Tas bieži iemeta OperationTimedOutException pat ar Å”iem apjomiem, lai gan atbildes gaidÄ«Å”anas parametri jau tika palielinÄti vairÄkas reizes, salÄ«dzinot ar noklusÄjuma parametriem.
Ceru, ka kopÄ«giem spÄkiem mÄs atradÄ«sim CS vÄjÄs vietas un, ja izdosies to paÄtrinÄt, tad ieraksta beigÄs noteikti pievienoÅ”u informÄciju par gala rezultÄtiem.
UPD: Pateicoties biedru padomiem, man izdevÄs paÄtrinÄt lasÄ«Å”anu. Bija:
159 644 operÄcijas (4 galdi, 5 straumes, 100. partija).
Pievienots:
.withLoadBalancingPolicy(new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()))
Un es spÄlÄjos ar pavedienu skaitu. RezultÄts ir Å”Äds:
4 galdi, 100 pavedieni, partija = 1 (gabals pa gabalam): 301 969 operÄcijas
4 tabulas, 100 pavedieni, partija = 10: 447 608 operÄcijas
4 tabulas, 100 pavedieni, partija = 100: 625 655 operÄcijas
VÄlÄk es izmantoÅ”u citus regulÄÅ”anas padomus, izpildÄ«Å”u pilnu testa ciklu un pievienoÅ”u rezultÄtus ieraksta beigÄs.
Avots: www.habr.com