የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

ይህ ቀልድ እንኳን አይደለም ፣ ይህ ልዩ ምስል የእነዚህን የውሂብ ጎታዎች ምንነት በትክክል የሚያንፀባርቅ ይመስላል ፣ እና በመጨረሻም ለምን እንደሆነ ግልፅ ይሆናል-

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

በዲቢ-ኢንጂነሮች ደረጃ አሰጣጥ መሠረት፣ ሁለቱ በጣም ታዋቂዎቹ የNoSQL ዓምድ ዳታቤዝዎች ካሳንድራ (ከዚህ በኋላ CS) እና HBase (HB) ናቸው።

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

በእጣ ፈንታው የእኛ የውሂብ ጭነት አስተዳደር ቡድን በ Sberbank ቀድሞውኑ አለው። давно እና ከHB ጋር በቅርበት ይሰራል። በዚህ ጊዜ, ጥንካሬውን እና ድክመቶቹን በደንብ አጥንተናል እና እንዴት ማብሰል እንደሚቻል ተምረናል. ይሁን እንጂ በሲኤስ መልክ ያለው አማራጭ መኖሩ ሁልጊዜ እራሳችንን በጥርጣሬዎች ትንሽ እንድንሰቃይ አስገድዶናል: ትክክለኛውን ምርጫ አድርገናል? ከዚህም በላይ ውጤቶቹ ንፅፅሮችበ DataStax የተከናወነው፣ ሲ ኤስ በቀላሉ HBን በሚያስጨንቅ ነጥብ እንደሚያሸንፍ ተናግረዋል። በሌላ በኩል, DataStax ፍላጎት ያለው አካል ነው, እና ቃላቶቻቸውን ለእሱ መውሰድ የለብዎትም. ስለ የሙከራ ሁኔታዎች በጣም ትንሽ በሆነው መረጃ ግራ ተጋብተናል፣ ስለዚህ የBigData NoSql ንጉስ ማን እንደሆነ በራሳችን ለማወቅ ወሰንን እና የተገኘው ውጤት በጣም አስደሳች ሆነ።

ነገር ግን, ወደ ተደረጉት የፈተናዎች ውጤቶች ከመቀጠልዎ በፊት, የአካባቢያዊ አወቃቀሮችን ጉልህ ገጽታዎች መግለጽ አስፈላጊ ነው. እውነታው ግን ሲኤስ የውሂብ መጥፋትን በሚፈቅድ ሁነታ መጠቀም ይቻላል. እነዚያ። ይህ ለአንድ የተወሰነ ቁልፍ ውሂብ አንድ አገልጋይ (ኖድ) ብቻ ተጠያቂ በሚሆንበት ጊዜ ነው ፣ እና በሆነ ምክንያት ካልተሳካ ፣ ከዚያ የዚህ ቁልፍ ዋጋ ይጠፋል። ለብዙ ተግባራት ይህ ወሳኝ አይደለም, ነገር ግን ለባንክ ሴክተር ይህ ከደንቡ ይልቅ ልዩ ነው. በእኛ ሁኔታ, ለታማኝ ማከማቻ ብዙ ቅጂዎች መኖሩ አስፈላጊ ነው.

ስለዚህ, የሶስትዮሽ ማባዛት ሁነታ የሲኤስ ኦፕሬቲንግ ሁነታ ብቻ ነው የታሰበው, ማለትም. የጉዳይ ቦታ መፈጠር በሚከተሉት መለኪያዎች ተካሂዷል።

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

በመቀጠልም የሚፈለገውን ወጥነት ደረጃ ለማረጋገጥ ሁለት መንገዶች አሉ. አጠቃላይ ህግ፡
NW + NR > RF

ይህም ማለት በሚጽፉበት ጊዜ (NW) እና በማንበብ ጊዜ (NR) ከአንጓዎች የማረጋገጫዎች ብዛት ከማባዛት ሁኔታ የበለጠ መሆን አለበት። በእኛ ሁኔታ, RF = 3, ይህም ማለት የሚከተሉት አማራጮች ተስማሚ ናቸው.
2 + 2 > 3
3 + 1 > 3

መረጃውን በተቻለ መጠን በአስተማማኝ ሁኔታ ማከማቸት ለእኛ በመሠረቱ አስፈላጊ ስለሆነ የ 3+1 እቅድ ተመርጧል. በተጨማሪም, HB በተመሳሳይ መርህ ላይ ይሰራል, ማለትም. እንዲህ ዓይነቱ ንጽጽር የበለጠ ፍትሃዊ ይሆናል.

ዳታስታክስ በጥናታቸው ውስጥ ተቃራኒውን እንዳደረጉ ልብ ሊባል ይገባል ፣ ለሁለቱም CS እና HB (ለሁለተኛው የ HDFS ቅንብሮችን በመቀየር) RF = 1 አዘጋጅተዋል ። በዚህ ጉዳይ ላይ በሲኤስ አፈፃፀም ላይ ያለው ተጽእኖ በጣም ትልቅ ስለሆነ ይህ በጣም አስፈላጊ ገጽታ ነው. ለምሳሌ፣ ከታች ያለው ምስል ውሂብን ወደ ሲኤስ ለመጫን የሚፈልገውን ጊዜ መጨመር ያሳያል፡-

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

እዚህ የሚከተለውን እናያለን፡ ብዙ ተፎካካሪ ክሮች ውሂብ ሲጽፉ፣ ብዙ ጊዜ ይወስዳል። ይህ ተፈጥሯዊ ነው, ነገር ግን ለ RF = 3 የአፈፃፀም ውድቀት በጣም ከፍ ያለ መሆኑ አስፈላጊ ነው. በሌላ አነጋገር እያንዳንዳቸው 4 ክሮች በ 5 ሰንጠረዦች (በአጠቃላይ 20) ከጻፍን, ከዚያም RF=3 በ 2 ጊዜ ያህል ይሸነፋሉ (150 ሰከንድ ለ RF = 3 እና 75 ለ RF=1). ነገር ግን መረጃን ወደ 8 ጠረጴዛዎች በመጫን እያንዳንዱን 5 ክሮች (በአጠቃላይ 40) ከጨመርን የ RF=3 ኪሳራ ቀድሞውኑ 2,7 ጊዜ ነው (375 ሴኮንድ ከ 138 ጋር)።

ምናልባት ይህ በዳታስታክስ ለ CS የተደረገው የተሳካ የሎድ ሙከራ ሚስጥሩ በከፊል ነው፣ ምክንያቱም HB በእኛ አቋም ከ 2 ወደ 3 የማባዛት ሁኔታን መለወጥ ምንም ውጤት አላመጣም። እነዚያ። ዲስኮች ለኛ ውቅረት የ HB ማነቆ አይደሉም። ነገር ግን፣ እዚህ ብዙ ሌሎች ወጥመዶች አሉ፣ ምክንያቱም የእኛ የHB እትም በትንሹ ተስተካክሎ እና ተስተካክሏል ፣ አካባቢዎቹ ሙሉ በሙሉ የተለያዩ ናቸው ፣ ወዘተ. እንዲሁም ምናልባት CSን በትክክል እንዴት ማዘጋጀት እንዳለብኝ አላውቅም እና ከእሱ ጋር ለመስራት አንዳንድ ተጨማሪ ውጤታማ መንገዶች እንዳሉ ልብ ሊባል የሚገባው ነው, እና በአስተያየቶቹ ውስጥ እንደምናገኝ ተስፋ አደርጋለሁ. ግን መጀመሪያ ነገሮች መጀመሪያ።

ሁሉም ሙከራዎች የተከናወኑት 4 አገልጋዮችን ባቀፈ የሃርድዌር ክላስተር ላይ ነው፣ እያንዳንዳቸው የሚከተለው ውቅር አሏቸው።

ሲፒዩ፡ Xeon E5-2680 v4 @ 2.40GHz 64 ክሮች።
ዲስኮች: 12 ቁርጥራጮች SATA HDD
ጃቫ ስሪት: 1.8.0_111

CS ስሪት: 3.11.5

cassandra.yml መለኪያዎችቁጥር_ቶከኖች፡ 256
ፍንጭ_እጅ_የነቃ፡ እውነት
ፍንጭ_የተሰጠ_ሃንዶፍ_ስሮትል_በኪባ፡ 1024
ከፍተኛ_ፍንጭ_ማድረስ_ክሮች፡ 2
hints_directory: /data10/cassandra/hints
ፍንጭ_ፍሳሽ_ጊዜ_በሚሴ፡10000
ከፍተኛ_ፍንጭ_የፋይል_መጠን_በሜባ፡ 128
ባችሎግ_ድጋሚ_ስሮትል_በኪባ፡ 1024
አረጋጋጭ፡ AllowAll አረጋጋጭ
ደራሲ፡ AllowAllAuthorizer
ሚና_አስተዳዳሪ፡ CassandraRoleManager
ሚናዎች_ትክክለኛነት_በሚሴ፡ 2000
የፍቃዶች_ትክክለኛነት_በሚሴ፡ 2000
ምስክርነቶች_ትክክለኛነት_በሚሴ፡ 2000
ክፍልፋይ፡ org.apache.cassandra.dht.Murmur3ክፍልፋይ
የውሂብ_ፋይል_ዳይሬክቶሪዎች፡-
- /ዳታ1/ካሳንድራ/ዳታ # እያንዳንዱ ዳታኤን ማውጫ የተለየ ዲስክ ነው።
- /ዳታ2/ካሳንድራ/ዳታ
- /ዳታ3/ካሳንድራ/ዳታ
- /ዳታ4/ካሳንድራ/ዳታ
- /ዳታ5/ካሳንድራ/ዳታ
- /ዳታ6/ካሳንድራ/ዳታ
- /ዳታ7/ካሳንድራ/ዳታ
- /ዳታ8/ካሳንድራ/ዳታ
Committeelog_directory: /data9/cassandra/commitlog
cdc_የነቃ፡ ሐሰት
የዲስክ_አለመሳካት_መመሪያ፡ አቁም
የውድቀትን_መመሪያ መፈጸም፡ ማቆም
የተዘጋጁ_መግለጫዎች_መሸጎጫ_መጠን_mb፡
በቁጠባ_የተዘጋጁ_መግለጫዎች_መሸጎጫ_መጠን_ሜባ፡-
የቁልፍ_መሸጎጫ_መጠን_በሜባ፡
የቁልፍ_መሸጎጫ_ማዳን_ጊዜ፡ 14400
የረድፍ_መሸጎጫ_መጠን_በሜባ፡0
ረድፍ_መሸጎጫ_የማዳን_ጊዜ፡ 0
ቆጣሪ_መሸጎጫ_መጠን_በሜባ፡
ቆጣሪ_መሸጎጫ_ማዳን_ጊዜ፡ 7200
የተቀመጠ_መሸጎጫ_ዳይሬክቶሪ፡ /data10/cassandra/saved_caches
ቁርጠኝነት_sync: ወቅታዊ
ኮምሎግ_sync_period_in_ms: 10000
የኮሚሽን_ክፍል_መጠን_በሜባ፡ 32
ዘር_አቅራቢ
- ክፍል_ስም: org.apache.cassandra.locator.SimpleSeed አቅራቢ
መለኪያዎች
- ዘሮች: "*,*"
concurrent_reads: 256 # ሞክረዋል 64 - ምንም ልዩነት አልታየም
በአንድ ጊዜ_ይጽፋል፡ 256 # ሞክሯል 64 - ምንም ልዩነት አልታየም።
በአንድ ጊዜ_ቆጣሪ_ይጽፋል፡ 256 # ሞክሯል 64 - ምንም ልዩነት አልታየም።
በአንድ ጊዜ_ቁሳዊ_ዕይታ_ይጽፋል፡ 32
የማይንቀሳቀስ_ክምር_ቦታ_በሜባ፡ 2048 # 16 ጊባ ሞክሯል - ቀርፋፋ ነበር
የማይንቀሳቀስ_መመደብ_አይነት፡ ክምር_ማቆሚያዎች
መረጃ ጠቋሚ_ማጠቃለያ_አቅም_በሜባ፡-
ኢንዴክስ_ማጠቃለያ_የመጠኑ_የጊዜ_ደቂቃ፡ 60
trickle_fsync: ውሸት
trickle_fsync_interval_in_kb: 10240
የማከማቻ_ወደብ: 7000
ኤስኤስኤል_ማከማቻ_ወደብ፡ 7001
ያዳምጡ_አድራሻ፡*
የስርጭት_አድራሻ፡ *
በስርጭት_አድራሻ_ያዳምጡ፡ እውነት
internode_authenticator፡ org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_መጓጓዣ፡ እውነት
ቤተኛ_ትራንስፖርት_ፖርት፡ 9042
start_rpc: እውነት
አርፒሲ_አድራሻ፡*
አርፒሲ_ፖርት፡ 9160
rpc_keepalive: እውነት
rpc_server_type፡ ማመሳሰል
ቆጣቢ_ፍሬድ_የትራንስፖርት_መጠን_በሜባ፡ 15
ተጨማሪ_ምትኬዎች፡ ሐሰት
ቅጽበታዊ_ፎቶ_በፊት_መጭመቅ፡- ሐሰት
auto_snapshot: እውነት
የአምድ_ኢንዴክስ_መጠን_በኪባ፡ 64
አምድ_ኢንዴክስ_የመሸጎጫ_መጠን_በኪባ፡ 2
ተጓዳኝ_ኮምፓክተሮች፡ 4
compaction_throughput_mb_per_sec: 1600
የተረጋጋ_ቅድመ_ክፍት_ክፍት_ጊዜ_በሜባ፡ 50
የማንበብ_ጥያቄ_ጊዜ_ጊዜ_በሚሰ፡100000
ክልል_የጥያቄ_ጊዜ_ጊዜ_በሚሰ፡200000
ጻፍ_request_timeout_in_ms: 40000
አጸፋዊ_መጻፍ_ጥያቄ_ጊዜ_በሚሰ፡100000
የክስ_ውድድር_ጊዜ_በሚሴ_ውስጥ፡ 20000
መቁረጫ_ጥያቄ_ጊዜ_በሚሴ_ውስጥ፡60000
የጥያቄ_ጊዜ_ጊዜ_በሚሴ፡ 200000
slow_query_log_timeout_in_ms: 500
መስቀለኛ መንገድ_ጊዜ አልቋል፡ ሐሰት
endpoint_snitch: GossipingPropertyFileSnitch
ተለዋዋጭ_snitch_ዝማኔ_interval_in_ms: 100
ተለዋዋጭ_snitch_reset_interval_in_ms: 600000
ተለዋዋጭ_ስኒች_መጥፎ_ደረጃ፡ 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
የአገልጋይ_ምስጠራ_አማራጮች፡-
internode_encryption: የለም
የደንበኛ_ምስጠራ_አማራጮች፡-
የነቃ፡ ውሸት
internode_compression: dc
inter_dc_tcp_nodelay፡ ሐሰት
tracetype_query_ttl: 86400
tracetype_repair_ttl: 604800
አንቃ_ተጠቃሚ_የተገለጹ_ተግባራት፡ ሐሰት
አንቃ_ስክሪፕት_በተጠቃሚ_የተገለጹ_ተግባራት፡ ሐሰት
windows_timer_interval: 1
ግልጽ_የውሂብ_ምስጠራ_አማራጮች፡-
የነቃ፡ ውሸት
የመቃብር_ድንጋይ_አስጠንቅቅ_ደረጃ፡ 1000
የመቃብር_ድንጋያ_ውድቀት_ደረጃ፡ 100000
ባች_መጠን_ያስጠነቅቃል_ደረጃ_በኪባ፡ 200
ባች_መጠን_ውድቀት_ደረጃ_በኪባ፡ 250
ያልተመዘገቡ_ባች_በአቋራጭ_ክፍልፋዮች_ያስጠነቅቃል፡ 10
የታመቀ_ትልቅ_ክፍልፋይ_የማስጠንቀቂያ_ጣራ_mb፡ 100
gc_ማስጠንቀቂያ_ገደብ_በሚሰ፡ 1000
የኋላ_ግፊት_ነቅቷል፡ ሐሰት
የቁሳቁስ_ዕይታዎችን አንቃ፡ እውነት
አንቃ_sasi_indexes፡ እውነት

የጂሲ ቅንብሮች፡-

### የሲኤምኤስ ቅንጅቶች-XX:+ParNewGC ይጠቀሙ
-XX:+ConcMarkSweepGC ይጠቀሙ
-XX፡+CMSParallelRemark ነቅቷል።
-XX፡SurvivorRatio=8
-XX፡MaxTenuringThreshold=1
-XX፡CMSIniitiatingOccupancyFraction=75
-XX፡+መኖርያ ብቻ ተጠቀም
-XX፡CMSWwaitDuration=10000
-XX፡+CMSparallelየመጀመሪያ ምልክት የነቃ
-XX:+CMSEdenChunks መዝገብ ሁልጊዜ
-XX፡+CMSClass ማውረድ ነቅቷል።

የ jvm.options ማህደረ ትውስታ 16Gb ተመድቧል (በተጨማሪም 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 እኛ ክልል አገልጋይ ላይ ከ 1000 በላይ በነበረበት ጊዜ GC ያደረሰውን MetricsRegion አገለለ)

ነባሪ ያልሆኑ የHBase መለኪያዎችzookeeper.session.ጊዜ ማብቂያ፡ 120000
hbase.rpc.ጊዜ ማብቂያ፡ 2 ደቂቃ(ዎች)
hbase.client.scanner.timeout.period፡ 2 ደቂቃ(ዎች)
hbase.master.handler.ቁጥር፡ 10
hbase.regionserver.lease.period፣ hbase.client.scanner.timeout.period፡ 2 ደቂቃ(ዎች)
hbase.regionserver.handler.ቁጥር፡ 160
hbase.regionserver.metahandler.ቁጥር፡ 30
hbase.regionserver.logroll.period: 4 ሰዓቶች
hbase.regionserver.maxlogs: 200
hbase.hregion.memstore.flush.መጠን: 1 ጂቢ
hbase.hregion.memstore.block.multiplier፡ 6
hbase.hstore.compaction ደረጃ፡ 5
hbase.hstore.blockingየመደብር ፋይሎች፡ 200
hbase.hregion.majorcompaction፡ 1 ቀን(ዎች)
HBase አገልግሎት የላቀ ውቅር ቅንጣቢ (Safety Valve) ለ 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.ትልቅ12
hbase.regionserver.wal.enablecompressiontrue
hbase.hstore.compaction.max.size1073741824
hbase.server.compactchecker.interval.multiplier200
ለHBase RegionServer የጃቫ ውቅር አማራጮች፡-
-XX:+ParNewGC -XX:+ConcMarkSweepGC -XX:CMSinitiatingOccupancyFraction=70 -XX:+CMSparallelRemarkEnabled -XX:ReservedCodeCacheSize=256m
hbase.snapshot.master.timeout ሚሊስ፡ 2 ደቂቃ(ዎች)
hbase.snapshot.region.ጊዜ አልቋል፡ 2 ደቂቃ(ዎች)
hbase.snapshot.master.timeout.millis፡ 2 ደቂቃ(ዎች)
HBase REST አገልጋይ ከፍተኛ የምዝግብ ማስታወሻ መጠን፡ 100 ሚቢ
HBase REST አገልጋይ ከፍተኛው የምዝግብ ማስታወሻ ፋይል ምትኬዎች፡ 5
የHBase Thrift አገልጋይ ከፍተኛ የምዝግብ ማስታወሻ መጠን፡ 100 ሚቢ
የHBase Thrift አገልጋይ ከፍተኛው የምዝግብ ማስታወሻ ፋይል ምትኬዎች፡ 5
ማስተር ከፍተኛ የምዝግብ ማስታወሻ መጠን: 100 ሚቢ
ዋና ከፍተኛ የምዝግብ ማስታወሻ ፋይል ምትኬዎች፡ 5
የክልል አገልጋይ ከፍተኛ የምዝግብ ማስታወሻ መጠን፡ 100 ሚቢ
የክልል አገልጋይ ከፍተኛው የምዝግብ ማስታወሻ ፋይል ምትኬዎች፡ 5
HBase ንቁ ማስተር ማወቂያ መስኮት፡ 4 ደቂቃ(ዎች)
dfs.client.hedged.read.threadpool.መጠን፡ 40
dfs.client.hedged.read.threshold.ሚሊስ፡ 10 ሚሊሰከንድ(ሰ)
hbase.rest.strings.min: 8
hbase.rest.strings.max: 150
ከፍተኛው የሂደት ፋይል ገላጭ፡ 180000
hbase.thrift.min WorkerThreads: 200
hbase.master.executor.openregion.threads፡ 30
hbase.master.executor.closeregion.threads፡ 30
hbase.master.executor.serverops.threads፡ 60
hbase.regionserver.thread.compaction.mall፡ 6
hbase.ipc.server.read.threadpool.መጠን፡ 20
የክልል አንቀሳቃሽ ክሮች፡ 6
የደንበኛ ጃቫ ክምር መጠን በባይት፡ 1 ጊቢ
HBase REST አገልጋይ ነባሪ ቡድን፡ 3 ጊቢ
HBase Thrift አገልጋይ ነባሪ ቡድን: 3 GiB
የHBase ማስተር የጃቫ ክምር መጠን በባይት፡ 16 ጊቢ
የHBase Region አገልጋይ የጃቫ ክምር መጠን በባይት፡ 32 ጊቢ

+ ZooKeeper
maxClientCnxns: 601
maxSessionTimeout: 120000
ጠረጴዛዎችን መፍጠር;
hbase org.apache.hadoop.hbase.util.ክልል Splitter ns:t1 UniformSplit -c 64 -f cf
alter 'ns:t1', {NAME => 'cf', DATA_BLOCK_ENCODING => 'ፈጣን_DIFF'፣ COMPRESSION => 'GZ'}

እዚህ አንድ አስፈላጊ ነጥብ አለ - የ DataStax መግለጫ የ HB ሰንጠረዦችን ለመፍጠር ምን ያህል ክልሎች ጥቅም ላይ እንደዋሉ አይገልጽም, ምንም እንኳን ይህ ለትልቅ ጥራዞች ወሳኝ ነው. ስለዚህ, ለፈተናዎች, ብዛት = 64 ተመርጧል, ይህም እስከ 640 ጂቢ ማከማቸት ያስችላል, ማለትም. መካከለኛ መጠን ያለው ጠረጴዛ.

በፈተናው ጊዜ HBase 22 ሺህ ጠረጴዛዎች እና 67 ሺህ ክልሎች (ይህ ከላይ ለተጠቀሰው ፕላስተር ካልሆነ ለ 1.2.0 ስሪት ገዳይ ይሆናል).

አሁን ለኮዱ። ለአንድ የተወሰነ የውሂብ ጎታ የትኞቹ አወቃቀሮች የበለጠ ጥቅም እንዳላቸው ግልጽ ስላልሆነ ሙከራዎች በተለያዩ ውህዶች ተካሂደዋል። እነዚያ። በአንዳንድ ሙከራዎች 4 ጠረጴዛዎች በአንድ ጊዜ ተጭነዋል (ሁሉም 4 ኖዶች ለግንኙነት ጥቅም ላይ ውለዋል)። በሌሎች ሙከራዎች ከ 8 የተለያዩ ጠረጴዛዎች ጋር ሠርተናል. በአንዳንድ ሁኔታዎች, የመጠን መጠኑ 100, ሌሎች 200 (የባች መለኪያ - ከታች ያለውን ኮድ ይመልከቱ). የዋጋው የውሂብ መጠን 10 ባይት ወይም 100 ባይት (የውሂብ መጠን) ነው። በጠቅላላው 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);
}

አሁን በጣም አስደሳች ክፍል - ውጤቶቹ:

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

በግራፍ መልክ ተመሳሳይ ነገር:

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ

የ HB ጥቅም በጣም የሚያስደንቅ ነው, በሲኤስ ማቀናበሪያ ውስጥ አንድ ዓይነት ማነቆ አለ የሚል ጥርጣሬ አለ. ነገር ግን በጣም ግልፅ የሆኑትን መመዘኛዎች (እንደ concurrent_writes or memtable_heap_space_in_mb) መፈለግ ነገሩን አላፋጠነውም። በተመሳሳይ ጊዜ, ምዝግቦቹ ንጹህ ናቸው እና ምንም ነገር አይሳደቡ.

መረጃው በመስቀለኛ መንገዶቹ ላይ በእኩል መጠን ተሰራጭቷል፣ ከሁሉም አንጓዎች የተገኘው ስታቲስቲክስ በግምት ተመሳሳይ ነበር።

የሠንጠረዥ ስታቲስቲክስ ከአንደኛው አንጓዎች የሚመስለው ይህ ነውቁልፍ ቦታ: ks
የተነበበ ቁጥር: 9383707
መዘግየት አንብብ፡ 0.04287025042448576 ሚሴ
የተጻፈ ቁጥር: 15462012
መዘግየት ይጻፉ፡ 0.1350068438699957 ሚሴ
በመጠባበቅ ላይ ያሉ ፍሳሾች፡ 0
ጠረጴዛ፡ t1
የተረጋጋ ቁጥር: 16
ያገለገለ ቦታ (በቀጥታ): 148.59 ሚቢ
ጥቅም ላይ የዋለ ቦታ (ጠቅላላ): 148.59 ሚቢ
በቅጽበተ-ፎቶዎች ጥቅም ላይ የዋለ ቦታ (ጠቅላላ)፡ 0 ባይት
ጥቅም ላይ የዋለ የጠፋ ክምር ማህደረ ትውስታ (ጠቅላላ): 5.17 ሚቢ
SSTable Compression ሬሾ፡ 0.5720989576459437
የክፍሎች ብዛት (ግምት): 3970323
የማይንቀሳቀስ የሕዋስ ብዛት፡ 0
የማይንቀሳቀስ የውሂብ መጠን፡ 0 ባይት
ጥቅም ላይ የሚውል የማይንቀሳቀስ ክምር ማህደረ ትውስታ፡ 0 ባይት
የማይንቀሳቀስ መቀየሪያ ብዛት፡ 5
የሀገር ውስጥ የተነበበ ቁጥር፡ 2346045
የአካባቢ ንባብ መዘግየት፡ ናኤን ms
የሀገር ውስጥ የጽሁፍ ብዛት፡ 3865503
የአካባቢ የመጻፍ መዘግየት፡ ናኤን ms
በመጠባበቅ ላይ ያሉ ማፍሰሻዎች፡ 0
በመቶኛ ተስተካክሏል፡ 0.0
የብሉ ማጣሪያ የውሸት አወንታዊ ውጤቶች፡ 25
የብሉ ማጣሪያ የውሸት ሬሾ፡ 0.00000
ጥቅም ላይ የዋለው የአበባ ማጣሪያ ቦታ: 4.57 ሚቢ
ጥቅም ላይ የዋለው የክምር ማህደረ ትውስታን ማጥፋት የብሉ ማጣሪያ: 4.57 ሚቢ
ጥቅም ላይ የዋለው የክምር ማህደረ ትውስታ ማጠቃለያ፡ 590.02 ኪቢ
ጥቅም ላይ የዋለው የማመቂያ ሜታዳታ ከክምር ማህደረ ትውስታ: 19.45 ኪቢ
የታመቀ ክፍልፋይ ዝቅተኛ ባይት፡ 36
የታመቀ ክፍልፋይ ከፍተኛ ባይት፡ 42
የታመቀ ክፍልፍል አማካኝ ባይት፡ 42
አማካኝ የቀጥታ ሕዋሳት በአንድ ቁራጭ (ያለፉት አምስት ደቂቃዎች)፡ ኤን.ኤን
በአንድ ቁራጭ የሚፈቀደው ከፍተኛ የቀጥታ ሕዋሳት (ያለፉት አምስት ደቂቃዎች)፡ 0
አማካይ የመቃብር ድንጋይ በአንድ ቁራጭ (ያለፉት አምስት ደቂቃዎች)፡ ኤን.ኤን
በአንድ ቁራጭ ከፍተኛው የመቃብር ድንጋይ (ባለፉት አምስት ደቂቃዎች)፡ 0
የተጣሉ ሚውቴሽን፡ 0 ባይት

የቡድኑን መጠን ለመቀነስ የተደረገው ሙከራ (በተናጠል መላክ እንኳን) ምንም ውጤት አላመጣም, የበለጠ እየባሰ ይሄዳል. ለ CS የተገኘው ውጤት ለ DataStax ከተገኘው ጋር ተመሳሳይ ስለሆነ በእውነቱ ይህ ለ CS ከፍተኛው አፈፃፀም ሊሆን ይችላል - በሰከንድ በመቶ ሺዎች የሚቆጠሩ ኦፕሬሽኖች። በተጨማሪም፣ የሀብት አጠቃቀምን ከተመለከትን፣ ሲኤስ ብዙ ሲፒዩ እና ዲስኮች እንደሚጠቀም እናያለን።

የሁለት ያኮዙና ጦርነት፣ ወይም ካሳንድራ vs HBase። የ Sberbank ቡድን ልምድ
ስዕሉ ለሁለቱም የውሂብ ጎታዎች በተከታታይ የሁሉንም ሙከራዎች በሩጫ ወቅት አጠቃቀሙን ያሳያል።

የHB ኃይለኛ የማንበብ ጥቅምን በተመለከተ። እዚህ ለሁለቱም የመረጃ ቋቶች በንባብ ጊዜ የዲስክ አጠቃቀም እጅግ በጣም ዝቅተኛ መሆኑን ማየት ይችላሉ (የማንበብ ፈተናዎች ለእያንዳንዱ የውሂብ ጎታ የሙከራ ዑደት የመጨረሻ ክፍል ናቸው ፣ ለምሳሌ ለ CS ይህ ከ 15: 20 እስከ 15: 40 ነው)። በ HB ጉዳይ ላይ ምክንያቱ ግልጽ ነው - አብዛኛው መረጃ በማህደረ ትውስታ ውስጥ, በማስታወሻ ማከማቻ ውስጥ, እና አንዳንዶቹ በብሎክካሼ ውስጥ ተደብቀዋል. ሲኤስን በተመለከተ፣ እንዴት እንደሚሰራ ግልጽ አይደለም፣ ነገር ግን የዲስክ መልሶ ጥቅም ላይ ማዋልም እንዲሁ አይታይም፣ ነገር ግን እንደዚያ ከሆነ፣ መሸጎጫውን row_cache_size_in_mb = 2048 ለማንቃት እና መሸጎጫ = {'keys': 'ALL' ለማድረግ ተሞክሯል። 'ረድፎች_በክፍል'፡ '2000000'}፣ ግን ያ ትንሽ የከፋ አድርጎታል።

በHB ውስጥ ስላለው የክልሎች ብዛት አንድ ጠቃሚ ነጥብ በድጋሚ መጥቀስ ተገቢ ነው። በእኛ ሁኔታ, እሴቱ በ 64 ውስጥ ተገልጿል. ብንቀንስ እና እኩል ካደረግን, ለምሳሌ, 4, ከዚያም በማንበብ ጊዜ, ፍጥነቱ በ 2 እጥፍ ይቀንሳል. ምክንያቱ ሜምስቶር በፍጥነት ይሞላል እና ፋይሎች ብዙ ጊዜ ይታጠባሉ እና በሚያነቡበት ጊዜ ብዙ ፋይሎች መከናወን አለባቸው ፣ ይህም ለ HB በጣም የተወሳሰበ አሰራር ነው። በተጨባጭ ሁኔታዎች፣ ይህ በቅድመ ዝግጅት እና ማጠቃለያ ስልት በማሰብ ሊታከም ይችላል፣ በተለይም፣ ቆሻሻን የሚሰበስብ እና HFilesን ያለማቋረጥ ከበስተጀርባ የሚጨምቅ በራስ የተጻፈ መገልገያ እንጠቀማለን። ለዳታስታክስ ፈተናዎች በሰንጠረዥ 1 ክልል ብቻ መድበዋል (ይህም ትክክል አይደለም) እና ይህ ለምን HB በንባብ ፈተናቸው ዝቅተኛ እንደነበር በተወሰነ ደረጃ ግልጽ ያደርገዋል።

የሚከተሉት የመጀመሪያ መደምደሚያዎች ከዚህ ተወስደዋል. በፈተና ወቅት ምንም አይነት ትልቅ ስህተት እንዳልተሰራ በማሰብ ካሳንድራ የሸክላ እግር ያለው ኮሎሰስ ይመስላል። በትክክል ፣ በአንድ እግሩ ላይ ሚዛን ስትይዝ ፣ በአንቀጹ መጀመሪያ ላይ በሥዕሉ ላይ እንደሚታየው ፣ በአንፃራዊነት ጥሩ ውጤቶችን ታሳያለች ፣ ግን በተመሳሳይ ሁኔታ ውስጥ በሚደረገው ውጊያ ሙሉ በሙሉ ታጣለች። በተመሳሳይ ጊዜ፣ በእኛ ሃርድዌር ላይ ያለውን ዝቅተኛ የሲፒዩ አጠቃቀምን ከግምት ውስጥ በማስገባት በአንድ አስተናጋጅ ሁለት RegionServer HBs መትከልን ተምረናል እና አፈፃፀሙን በእጥፍ ጨምር። እነዚያ። የሃብት አጠቃቀምን ከግምት ውስጥ በማስገባት የሲኤስ ሁኔታ የበለጠ አሳዛኝ ነው.

በእርግጥ እነዚህ ሙከራዎች ሰው ሠራሽ ናቸው እና እዚህ ጥቅም ላይ የዋለው የውሂብ መጠን በአንጻራዊ ሁኔታ መጠነኛ ነው. ወደ ቴራባይት ከቀየርን ሁኔታው ​​​​የተለየ ሊሆን ይችላል ነገር ግን ለኤች.ቢ. ግን ቴራባይት መጫን እንችላለን, ለ CS ይህ ችግር ሆኖበታል. ብዙ ጊዜ በእነዚህ ጥራዞችም ቢሆን OperationTimedOutExceptionን ይጥላል፣ ምንም እንኳን ምላሽን ለመጠበቅ መለኪያዎች ከነባሪው ጋር ሲነፃፀሩ ብዙ ጊዜ ጨምረዋል።

በጋራ ጥረቶች የሲኤስ ማነቆዎችን እናገኛለን እና ማፋጠን ከቻልን በጽሁፉ መጨረሻ ላይ በእርግጠኝነት ስለ መጨረሻው ውጤት መረጃ እጨምራለሁ ብዬ ተስፋ አደርጋለሁ ።

UPD: ለባልደረባዎች ምክር ምስጋና ይግባውና ንባቡን ማፋጠን ቻልኩ። ነበር፡
159 ops (644 ሰንጠረዦች፣ 4 ዥረቶች፣ ባች 5)።
ተጨምሯል በ
.በLoadBalancing ፖሊሲ(አዲስ TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()))
እና በክር ብዛት ተጫወትኩኝ። ውጤቱ የሚከተለው ነው።
4 ጠረጴዛዎች፣ 100 ክሮች፣ ባች = 1 (ቁራጭ በክፍል): 301 ops
4 ጠረጴዛዎች፣ 100 ክሮች፣ ባች = 10: 447 ops
4 ጠረጴዛዎች፣ 100 ክሮች፣ ባች = 100: 625 ops

በኋላ ሌሎች የማስተካከያ ምክሮችን እጠቀማለሁ, ሙሉ የሙከራ ዑደት አሂድ እና ውጤቶቹን በጽሁፉ መጨረሻ ላይ እጨምራለሁ.

ምንጭ: hab.com

አስተያየት ያክሉ