Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

See pole isegi nali, tundub, et see konkreetne pilt peegeldab kÔige tÀpsemalt nende andmebaaside olemust ja lÔpuks saab selgeks, miks:

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

DB-Engines Rankingu jÀrgi on kaks populaarseimat NoSQL-i veergude andmebaasi Cassandra (edaspidi CS) ja HBase (HB).

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

Saatuse tahtel on meie Sberbanki andmete laadimise juhtimismeeskond seda juba teinud pikk ja teeb tihedat koostööd HB-ga. Selle aja jooksul uurisime pĂ€ris hĂ€sti selle tugevaid ja nĂ”rku kĂŒlgi ning Ă”ppisime seda kĂŒpsetama. Alternatiivi olemasolu CS-i nĂ€ol sundis meid aga alati pisut piinama kahtlustega: kas tegime Ă”ige valiku? Pealegi tulemused vĂ”rdlused, mille esitas DataStax, ĂŒtlesid nad, et CS vĂ”idab kergesti HB-d peaaegu purustava skooriga. Teisest kĂŒljest on DataStax huvitatud osapool ja te ei tohiks nende sĂ”na vĂ”tta. Meid ajas segadusse ka ĂŒsna vĂ€ike info testimistingimuste kohta, mistĂ”ttu otsustasime omal kĂ€el uurida, kes on BigData NoSql kuningas ning saadud tulemused osutusid vĂ€ga huvitavateks.

Enne tehtud testide tulemuste juurde asumist on aga vaja kirjeldada keskkonnakonfiguratsioonide olulisi aspekte. Fakt on see, et CS-i saab kasutada reĆŸiimis, mis vĂ”imaldab andmete kadumist. Need. see on siis, kui teatud vĂ”tme andmete eest vastutab ainult ĂŒks server (sĂ”lm) ja kui see mingil pĂ”hjusel ebaĂ”nnestub, lĂ€heb selle vĂ”tme vÀÀrtus kaotsi. Paljude ĂŒlesannete puhul pole see kriitilise tĂ€htsusega, kuid pangandussektori jaoks on see pigem erand kui reegel. Meie puhul on usaldusvÀÀrseks salvestamiseks oluline andmete mitu koopiat.

SeetĂ”ttu arvestati ainult CS tööreĆŸiimi kolmekordse replikatsiooni reĆŸiimis, s.o. Juhtumiruumi loomine viidi lĂ€bi jĂ€rgmiste parameetritega:

CREATE KEYSPACE ks WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};

JĂ€rgmiseks on nĂ”utava jĂ€rjepidevuse tagamiseks kaks vĂ”imalust. Üldreegel:
NW + NR > RF

Mis tÀhendab, et sÔlmede kinnituste arv kirjutamisel (NW) pluss sÔlmede kinnituste arv lugemisel (NR) peab olema suurem kui replikatsioonitegur. Meie puhul on RF = 3, mis tÀhendab, et sobivad jÀrgmised valikud:
2 + 2 > 3
3 + 1 > 3

Kuna meie jaoks on pÔhimÔtteliselt oluline andmete vÔimalikult usaldusvÀÀrne talletamine, valiti 3+1 skeem. Lisaks töötab HB sarnasel pÔhimÔttel, st. selline vÔrdlus on Ôiglasem.

Tuleb mÀrkida, et DataStax tegi oma uuringus vastupidist, nad mÀÀrasid nii CS kui ka HB jaoks RF = 1 (viimase jaoks HDFS-i seadeid muutes). See on tÔesti oluline aspekt, kuna mÔju CS-i jÔudlusele on antud juhul tohutu. NÀiteks alloleval pildil on nÀha andmete CS-i laadimiseks kuluva aja pikenemist:

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

Siin nĂ€eme jĂ€rgmist: mida rohkem konkureerivaid lĂ”ime andmeid kirjutab, seda kauem see aega vĂ”tab. See on loomulik, kuid on oluline, et RF=3 jĂ”udluse halvenemine oleks oluliselt suurem. TeisisĂ”nu, kui kirjutame 4 lĂ”ime 5 tabelisse (kokku 20), siis RF=3 kaotab umbes 2 korda (150 sekundit RF=3 puhul versus 75 RF=1 puhul). Aga kui tĂ”stame koormust, laadides andmed 8 tabelisse, millest igaĂŒhes on 5 lĂ”ime (kokku 40), siis on RF=3 kadu juba 2,7 korda (375 sekundit versus 138).

VÔib-olla on see osaliselt DataStaxi CS-i eduka koormustesti saladus, sest HB jaoks meie stendis replikatsiooniteguri muutmine 2-lt 3-le ei avaldanud mingit mÔju. Need. kettad ei ole meie konfiguratsiooni HB kitsaskoht. Siin on aga palju muid lÔkse, sest tuleb mÀrkida, et meie HB versiooni sai veidi lapitud ja timmitud, keskkonnad on tÀiesti erinevad jne. Samuti vÀÀrib mÀrkimist, et vÔib-olla ma lihtsalt ei tea, kuidas CS-i Ôigesti ette valmistada ja sellega töötamiseks on mÔned tÔhusamad viisid ning ma loodan, et saame selle kommentaarides teada. Aga kÔigepealt asjad kÔigepealt.

KĂ”ik testid viidi lĂ€bi riistvaraklastris, mis koosnes neljast serverist, millest igaĂŒhel oli jĂ€rgmine konfiguratsioon:

Protsessor: Xeon E5-2680 v4 @ 2.40 GHz 64 keermega.
Kettad: 12 tĂŒkki SATA HDD
java versioon: 1.8.0_111

CS-i versioon: 3.11.5

cassandra.yml parameetridmÀrkide_arv: 256
hinted_handoff_enabled: tÔsi
hinted_handoff_throttle_in_kb: 1024
max_hints_delivery_threads: 2
vihjete_kataloog: /data10/cassandra/hints
hints_flush_period_in_ms: 10000
max_hints_file_size_in_mb: 128
batchlog_replay_throttle_in_kb: 1024
autentija: AllowAllAuthenticator
autoriseerija: AllowAllAuthorizer
roll_manager: CassandraRoleManager
rolls_validity_in_ms: 2000
permissions_validity_in_ms: 2000
volituste_kehtivus_ms: 2000
partitsioonija: org.apache.cassandra.dht.Murmur3Partitioner
data_file_directories:
- /data1/cassandra/data # iga dataN kataloog on eraldi ketas
- /data2/cassandra/data
- /data3/cassandra/data
- /data4/cassandra/data
- /data5/cassandra/data
- /data6/cassandra/data
- /data7/cassandra/data
- /data8/cassandra/data
commitlogi_kataloog: /data9/cassandra/commitlog
cdc_enabled: vale
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
salvestatud_vahemÀlukataloog: /data10/cassandra/salvestatud_vahemÀlud
commitlog_sync: perioodiline
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 32
seed_provider:
- klassi_nimi: org.apache.cassandra.locator.SimpleSeedProvider
parameetrid:
— seemned: "*,*"
concurrent_reads: 256 # proovitud 64 - erinevust ei mÀrganud
concurrent_writes: 256 # proovisin 64 - erinevust ei mÀrganud
concurrent_counter_writes: 256 # proovisin 64 - erinevust ei mÀrganud
concurrent_materialized_view_writes: 32
memtable_heap_space_in_mb: 2048 # proovis 16 GB - see oli aeglasem
memtable_allocation_type: heap_buffers
index_summary_capacity_in_mb:
index_summary_resize_interval_in_minutes: 60
trickle_fsync: vale
trickle_fsync_interval_in_kb: 10240
salvestusport: 7000
ssl_storage_port: 7001
kuula_aadress: *
saate_aadress: *
listen_on_broadcast_address: tÔsi
internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_transport: tÔsi
native_transport_port: 9042
start_rpc: tÔsi
rpc_address: *
rpc_port: 9160
rpc_keepalive: tÔsi
rpc_serveri_tĂŒĂŒp: sĂŒnkroonimine
thrift_framed_transport_size_in_mb: 15
incremental_backups: vale
snapshot_before_compaction: false
auto_snapshot: tÔsi
veeru_indeksi_suurus_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: vale
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: puudub
client_encryption_options:
lubatud: vale
internode_compression: dc
inter_dc_tcp_nodelay: vale
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:
lubatud: vale
tombstone_warn_threshold: 1000
hauakivi_tÔrgete_lÀvi: 100000 XNUMX
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: vale
enable_materialized_views: tÔene
enable_sasi_indexes: tÔene

GC seaded:

### CMS-i seaded-XX:+UseParNewGC
-XX:+Kasutage ConcMarkSweepGC-d
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=1
-XX:CMSIinitiatingOccupancyFraction=75
-XX:+Kasuta CMSIinitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XX:+CMSClassUnloadingEnabled

jvm.options mÀlule eraldati 16Gb (proovisime ka 32 Gb, vahet ei mÀrganud).

Tabelid loodi kÀsuga:

CREATE TABLE ks.t1 (id bigint PRIMARY KEY, title text) WITH compression = {'sstable_compression': 'LZ4Compressor', 'chunk_length_kb': 64};

HB versioon: 1.2.0-cdh5.14.2 (klassis org.apache.hadoop.hbase.regionserver.HRegion jĂ€tsime vĂ€lja MetricsRegion, mis viis GC-ni, kui RegionServeris oli piirkondade arv ĂŒle 1000)

HBase'i vaikeparameetridloomaaiapidaja.session.timeout: 120000
hbase.rpc.timeout: 2 minutit
hbase.client.scanner.timeout.period: 2 minut(i)
hbase.master.handler.count: 10
hbase.regionserver.lease.period, hbase.client.scanner.timeout.period: 2 minut(i)
hbase.regionserver.handler.count: 160
hbase.regionserver.metahandler.count: 30
hbase.regionserver.logroll.period: 4 tundi(t)
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 pÀev(i)
HBase'i teenuse tÀpsema konfiguratsiooni fragment (kaitseklapp) hbase-site.xml jaoks:
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 konfiguratsioonisuvandid HBase RegionServeri jaoks:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m
hbase.snapshot.master.timeoutMillis: 2 minut(i)
hbase.snapshot.region.timeout: 2 minut(i)
hbase.snapshot.master.timeout.millis: 2 minut(i)
HBase REST serveri maksimaalne logi suurus: 100 MiB
HBase REST serveri logifailide maksimaalsed varukoopiad: 5
HBase Thrift Serveri maksimaalne logi suurus: 100 MiB
HBase Thrift Serveri maksimaalne logifaili varukoopia: 5
Master Max Logi suurus: 100 MiB
Peamised logifailide maksimaalsed varukoopiad: 5
RegionServeri maksimaalne logi suurus: 100 MiB
RegionServeri logifailide maksimaalsed varukoopiad: 5
HBase'i aktiivne pÔhituvastusaken: 4 minutit
dfs.client.hedged.read.threadpool.size: 40
dfs.client.hedged.read.threshold.millis: 10 millisekundit
hbase.rest.threads.min: 8
hbase.rest.threads.max: 150
Maksimaalne protsessifaili kirjeldus: 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
Piirkonna liikuja teemad: 6
Kliendi Java kuhja suurus baitides: 1 GiB
HBase REST serveri vaikerĂŒhm: 3 GiB
HBase Thrift Serveri vaikerĂŒhm: 3 GiB
Java kuhja HBase Masteri suurus baitides: 16 GiB
HBase RegionServeri Java kuhja suurus baitides: 32 GiB

+ZooKeeper
maxClientCnxns: 601
max SessionTimeout: 120000
Tabelite koostamine:
hbase org.apache.hadoop.hbase.util.RegionSplitter ns:t1 UniformSplit -c 64 -f cf
muuda 'ns:t1', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF', COMPRESSION => 'GZ'}

Siin on ĂŒks oluline punkt – DataStaxi kirjeldus ei ĂŒtle, mitut piirkonda HB tabelite loomisel kasutati, kuigi see on suurte mahtude puhul kriitiline. SeetĂ”ttu valiti testide jaoks kogus = 64, mis vĂ”imaldab salvestada kuni 640 GB, s.o. keskmise suurusega laud.

Testimise ajal oli HBase'il 22 tuhat tabelit ja 67 tuhat piirkonda (see oleks olnud surmav versiooni 1.2.0 jaoks, kui mitte ĂŒlalmainitud plaastrit).

NĂŒĂŒd koodist. Kuna polnud selge, millised konfiguratsioonid olid konkreetse andmebaasi jaoks soodsamad, viidi testid lĂ€bi erinevates kombinatsioonides. Need. mĂ”nes testis laaditi korraga 4 tabelit (ĂŒhendamiseks kasutati kĂ”iki 4 sĂ”lme). Teistes testides töötasime 8 erineva tabeliga. MĂ”nel juhul oli partii suurus 100, teistel 200 (partii parameeter - vt allpool olevat koodi). VÀÀrtuse andmemaht on 10 baiti vĂ”i 100 baiti (dataSize). Kokku kirjutati ja loeti igasse tabelisse iga kord 5 miljonit kirjet. Samal ajal kirjutati / loeti igasse tabelisse 5 lĂ”ime (lĂ”ime number - thNum), millest igaĂŒks kasutas oma vĂ”tmevahemikku (loendus = 1 miljon):

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);
    }
}

Sellest lÀhtuvalt pakuti HB jaoks sarnast funktsiooni:

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);
    }
}

Kuna HB-s peab klient hoolitsema andmete ĂŒhtlase jaotuse eest, nĂ€gi vĂ”tmesoolamise funktsioon vĂ€lja jĂ€rgmine:

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);
}

NĂŒĂŒd kĂ”ige huvitavam osa – tulemused:

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

Sama asi graafiku kujul:

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus

HB eelis on nii ĂŒllatav, et tekib kahtlus, et CS-i seadistuses on mingi kitsaskoht. Googeldamine ja kĂ”ige ilmsemate parameetrite otsimine (nt concurrent_writes vĂ”i memtable_heap_space_in_mb) aga asja ei kiirendanud. Samal ajal on palgid puhtad ja ei vannu midagi.

Andmed jaotati sĂ”lmede vahel ĂŒhtlaselt, kĂ”igi sĂ”lmede statistika oli ligikaudu sama.

Nii nĂ€eb tabeli statistika ĂŒhest sĂ”lmest vĂ€ljaKlahviruum: ks
Lugemiste arv: 9383707
Lugemise latentsusaeg: 0.04287025042448576 ms
Kirjade arv: 15462012
Kirjutamise latentsusaeg: 0.1350068438699957 ms
Ootel mastid: 0
Tabel: t1
SST-tabelite arv: 16
Kasutatud ruum (otses): 148.59 MiB
Kasutatud ruum (kokku): 148.59 MiB
HetketÔmmiste jaoks kasutatud ruum (kokku): 0 baiti
Kasutatud mÀlumaht (kokku): 5.17 MiB
SST-tabeli tihendussuhe: 0.5720989576459437
Vaheseinte arv (hinnanguline): 3970323
MĂ€letatavate rakkude arv: 0
MĂ€letatava andmemaht: 0 baiti
Kasutatud kuhjavÀlismÀlu: 0 baiti
MĂ€letatavate lĂŒlitite arv: 5
Kohalik loetud arv: 2346045
Kohaliku lugemise latentsus: NaN ms
Kohalike kirjade arv: 3865503
Kohaliku kirjutamise latentsus: NaN ms
Ootel loputusi: 0
Parandatud protsent: 0.0
Õitsemisfiltri valepositiivsed tulemused: 25
Õitsemise filtri valesuhe: 0.00000
Kasutatud Bloom filtri ruum: 4.57 MiB
Kasutatud Bloom-filtri kuhjamÀlu: 4.57 MiB
Kasutatud kuhjamÀlu indeksi kokkuvÔte: 590.02 KiB
Kasutatud kuhjamÀlu tihendamise metaandmed: 19.45 KiB
Tihendatud partitsiooni minimaalsed baidid: 36
Tihendatud partitsiooni maksimaalne bait: 42
Tihendatud partitsiooni keskmine bait: 42
Keskmine elusrakkude arv viilu kohta (viimased viis minutit): NaN
Maksimaalne elusrakkude arv viilu kohta (viimased viis minutit): 0
Keskmine hauakivide arv viilu kohta (viimase viie minuti jooksul): NaN
Maksimaalne hauakivide arv viilu kohta (viimased viis minutit): 0
TĂŒhistatud mutatsioonid: 0 baiti

Katse partii suurust vÀhendada (isegi eraldi saatmine) ei andnud mingit mÔju, lÀks ainult hullemaks. VÔimalik, et tegelikult on see CS-i jaoks tÔesti maksimaalne jÔudlus, kuna CS-i tulemused on sarnased DataStaxi puhul saadud tulemustega - umbes sadu tuhandeid toiminguid sekundis. Lisaks, kui vaatame ressursside kasutamist, nÀeme, et CS kasutab palju rohkem protsessorit ja kettaid:

Kahe yakozuna lahing ehk Cassandra vs HBase. Sberbanki meeskonna kogemus
Joonisel on nÀidatud mÔlema andmebaasi kÔigi jÀrjestikuste testide kasutamine.

Seoses HB vĂ”imsa lugemiseelisega. Siin on nĂ€ha, et mĂ”lema andmebaasi puhul on ketta kasutamine lugemise ajal ÀÀrmiselt madal (lugemistestid on iga andmebaasi testimistsĂŒkli viimane osa, nĂ€iteks CS puhul on see 15:20 kuni 15:40). HB puhul on pĂ”hjus selge – suurem osa andmetest ripub mĂ€llu, memstore’is ja osa on vahemĂ€llu plokivahemĂ€lus. Mis puutub CS-i, siis pole vĂ€ga selge, kuidas see töötab, kuid ketta taaskasutust pole ka nĂ€ha, kuid igaks juhuks prooviti lubada vahemĂ€lu row_cache_size_in_mb = 2048 ja mÀÀrata caching = {'keys': 'ALL', 'rows_per_partition': ' 2000000'}, kuid see tegi asja veelgi hullemaks.

Samuti tasub veel kord mainida olulist punkti HB piirkondade arvu kohta. Meie puhul mÀÀrati vÀÀrtuseks 64. Kui vĂ€hendame seda ja teeme selle vĂ”rdseks nĂ€iteks 4-ga, siis lugemisel langeb kiirus 2 korda. PĂ”hjus on selles, et memstore tĂ€itub kiiremini ja faile loputatakse sagedamini ning lugemisel tuleb rohkem faile töödelda, mis on HB jaoks ĂŒsna keeruline toiming. Reaalsetes tingimustes saab seda ravida, mĂ”eldes lĂ€bi eeljaotamise ja tihendamise strateegia; eelkĂ”ige kasutame ise kirjutatud utiliiti, mis kogub prĂŒgi kokku ja tihendab pidevalt taustal HFilesi. On tĂ€iesti vĂ”imalik, et DataStaxi testide jaoks eraldasid nad ainult 1 piirkonna tabeli kohta (mis pole Ă”ige) ja see selgitaks mĂ”nevĂ”rra, miks HB nende lugemistestides nii kehvem oli.

Sellest tehakse jĂ€rgmised esialgsed jĂ€reldused. Kui eeldada, et testimisel suuri vigu ei tehtud, siis nĂ€eb Cassandra vĂ€lja nagu savijalgadega koloss. TĂ€psemalt, kui ta tasakaalustab ĂŒhel jalal, nagu pildil artikli alguses, nĂ€itab ta suhteliselt hĂ€id tulemusi, kuid vĂ”itluses samadel tingimustel kaotab ta otse. Samal ajal, vĂ”ttes arvesse meie riistvara madalat protsessori kasutamist, Ă”ppisime iga hosti kohta kaks RegionServer HB-d ja kahekordistasime seelĂ€bi jĂ”udlust. Need. VĂ”ttes arvesse ressursside kasutamist, on CS-i olukord veelgi nukram.

Loomulikult on need testid ĂŒsna sĂŒnteetilised ja siin kasutatud andmemaht on suhteliselt tagasihoidlik. VĂ”imalik, et terabaitidele ĂŒle minnes oleks olukord teine, kuid kui HB puhul saame laadida terabaite, siis CS-i puhul osutus see problemaatiliseks. Sageli viskas see isegi nende mahtude puhul OperationTimedOutExceptioni, kuigi vastuse ootamise parameetreid suurendati juba mitu korda vĂ”rreldes vaikevÀÀrtustega.

Loodan, et ĂŒhisel jĂ”ul leiame CS kitsaskohad ja kui suudame seda kiirendada, siis postituse lĂ”ppu lisan kindlasti info lĂ”pptulemuste kohta.

UPD: TÀnu seltsimeeste nÔuannetele Ônnestus mul lugemist kiirendada. Oli:
159 644 operatsiooni (4 lauda, ​​5 voogu, partii 100).
Lisatud:
.with LoadBalancingPolicy(new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()))
Ja ma mÀngisin niitide arvuga ringi. Tulemus on jÀrgmine:
4 lauda, ​​100 niiti, partii = 1 (tĂŒkk tĂŒki haaval): 301 969 operatsiooni
4 tabelit, 100 lÔime, partii = 10: 447 608 operatsiooni
4 tabelit, 100 lÔime, partii = 100: 625 655 operatsiooni

Hiljem rakendan muid tuunimisnippe, jooksen lĂ€bi tĂ€iskatsetsĂŒkli ja lisan tulemused postituse lĂ”ppu.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster