МонгоДБ Схардинг: Практични водич корак по корак

Схардинг је процес раздвајања великог обима скупова података у комад мањих скупова података у више МонгоДБ инстанци у дистрибуираном окружењу.

Шта је шардинг?

МонгоДБ схардинг нам пружа скалабилно решење за складиштење велике количине података међу бројем сервера уместо на једном серверу.

У практичном смислу, није изводљиво чувати експоненцијално растуће податке на једној машини. Упитивање огромне количине података ускладиштених на једном серверу може довести до високог коришћења ресурса и можда неће обезбедити задовољавајућу пропусност за читање и писање.

У основи, постоје две врсте метода скалирања за преузимање података са системом:

Вертикално скалирање ради на побољшању перформанси једног сервера додавањем снажнијих процесора, надоградњом РАМ-а или додавањем више простора на диску систему. Али постоје могуће импликације примене вертикалног скалирања у практичним случајевима употребе са постојећом технологијом и хардверским конфигурацијама.

Хоризонтално скалирање ради са додавањем више сервера и расподелом оптерећења на више сервера. Пошто ће свака машина управљати подскупом целог скупа података, она пружа бољу ефикасност и исплативо решење уместо да примењује врхунски хардвер. Али то захтева додатно одржавање сложене инфраструктуре са великим бројем сервера.

Монго ДБ схардинг ради на технику хоризонталног скалирања.

Компоненте за разбијање

Да бисте постигли дијељење у МонгоДБ-у, потребне су сљедеће компоненте:

Схард је Монго инстанца за руковање подскупом оригиналних података. Делови морају бити распоређени у скупу реплика.

Монгос је Монго инстанца и делује као интерфејс између клијентске апликације и подељеног кластера. Ради као рутер за упите за шардове.

Цонфиг Сервер је Монго инстанца која чува информације о метаподацима и детаље о конфигурацији кластера. МонгоДБ захтева да се конфигурациони сервер примени као скуп реплика.

Схардинг Арцхитецтуре

МонгоДБ кластер се састоји од више скупова реплика.

Сваки скуп реплика се састоји од најмање 3 или више монго инстанци. Дељени кластер се може састојати од више инстанци монго делова, а свака инстанца шарда ради у оквиру скупа реплика шарда. Апликација је у интеракцији са Монгос-ом, који заузврат комуницира са шардовима. Због тога у Схардинг-у, апликације никада не ступају у директну интеракцију са чворовима шарда. Рутер упита дистрибуира подскупове података међу чворовима шарда на основу кључа шарда.

Схардинг Имплементација

Пратите доле наведене кораке за дељење

Корак 1

  • Покрените конфигурациони сервер у скупу реплика и омогућите репликацију између њих.

монгод –цонфигсвр –порт 27019 –реплСет рс0 –дбпатх Ц:датадата1 –бинд_ип лоцалхост

монгод –цонфигсвр –порт 27018 –реплСет рс0 –дбпатх Ц:датадата2 –бинд_ип лоцалхост

монгод –цонфигсвр –порт 27017 –реплСет рс0 –дбпатх Ц:датадата3 –бинд_ип лоцалхост

Корак 2

  • Иницијализујте скуп реплика на једном од конфигурационих сервера.

рс.инитиате( { _ид : “рс0”, цонфигсвр: труе, мемберс: [   { _id: 0, host: “IP:27017” },   { _id: 1, host: “IP:27018” },   { _id: 2, host: “IP:27019” }    ] })

rs.initiate( { _id : "rs0",  configsvr: true,  members: [   { _id: 0, host: "IP:27017" },   { _id: 1, host: "IP:27018" },   { _id: 2, host: "IP:27019" }    ] })
{
        "ok" : 1,
        "$gleStats" : {
                "lastOpTime" : Timestamp(1593569257, 1),
                "electionId" : ObjectId("000000000000000000000000")
        },
        "lastCommittedOpTime" : Timestamp(0, 0),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593569257, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1593569257, 1)
}

Корак 3

  • Започните дељење сервера у скупу реплика и омогућите репликацију између њих.
  Објашњене највеће грешке трансформације испоруке у Агиле

монгод –схардсвр –порт 27020 –реплСет рс1 –дбпатх Ц:датадата4 –бинд_ип лоцалхост

монгод –схардсвр –порт 27021 –реплСет рс1 –дбпатх Ц:датадата5 –бинд_ип лоцалхост

монгод –схардсвр –порт 27022 –реплСет рс1 –дбпатх Ц:датадата6 –бинд_ип лоцалхост

МонгоДБ иницијализује први сервер за дељење као примарни, да би преместио употребу примарног сервера за шардинг мовеПримари методом.

Корак 4

  • Иницијализујте скуп реплика на једном од подељених сервера.

рс.инитиате( { _ид : “рс0”, чланови: [   { _id: 0, host: “IP:27020” },   { _id: 1, host: “IP:27021” },   { _id: 2, host: “IP:27022” }    ] })

rs.initiate( { _id : "rs0",  members: [   { _id: 0, host: "IP:27020" },   { _id: 1, host: "IP:27021" },   { _id: 2, host: "IP:27022" }    ] })
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593569748, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1593569748, 1)
}

Корак 5

  • Започните манго за исецкани грозд

монгос –порт 40000 –цонфигдб рс0/лоцалхост:27019,лоцалхост:27018, лоцалхост:27017

Корак 6

  • Повежите сервер руте монго

монго –порт 40000

  • Сада додајте сервере за шардирање.

сх.аддСхард( “рс1/лоцалхост:27020,лоцалхост:27021,лоцалхост:27022”)

sh.addShard( "rs1/localhost:27020,localhost:27021,localhost:27022")
{
        "shardAdded" : "rs1",
        "ok" : 1,
        "operationTime" : Timestamp(1593570212, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593570212, 2),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Корак 7

  • На монго љусци омогућите шардирање на ДБ-у и колекцијама.
  • Омогући дијељење на ДБ-у

сх.енаблеСхардинг(“геекФлареДБ”)

sh.enableSharding("geekFlareDB")
{
        "ok" : 1,
        "operationTime" : Timestamp(1591630612, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1591630612, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Корак 8

  • За дељење кључа шарда колекције (описано касније у овом чланку) је потребно.

Синтакса: сх.схардЦоллецтион(“дбНаме.цоллецтионНаме”, { “кеи” : 1 } )<бр>

sh.shardCollection("geekFlareDB.geekFlareCollection", { "key" : 1 } )
{
        "collectionsharded" : "geekFlareDB.geekFlareCollection",
        "collectionUUID" : UUID("0d024925-e46c-472a-bf1a-13a8967e97c1"),
        "ok" : 1,
        "operationTime" : Timestamp(1593570389, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593570389, 3),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Обратите пажњу ако колекција не постоји, креирајте на следећи начин.

db.createCollection("geekFlareCollection")
{
        "ok" : 1,
        "operationTime" : Timestamp(1593570344, 4),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593570344, 5),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Корак 9

Убаците податке у колекцију. Монго евиденције ће почети да расту, што указује да је балансер у акцији и покушава да уравнотежи податке међу деловима.

Корак 10

Последњи корак је провера статуса шардирања. Статус се може проверити покретањем наредбе испод на чвору руте Монгос.

Статус шарања

Проверите статус дељења тако што ћете покренути наредбу испод на чвору руте монго.

сх.статус()

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5ede66c22c3262378c706d21")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/localhost:27020,localhost:27021,localhost:27022",  "state" : 1 }
  active mongoses:
        "4.2.7" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  5
        Last reported error:  Could not find host matching read preference { mode: "primary" } for set rs1
        Time of Reported error:  Tue Jun 09 2020 15:25:03 GMT+0530 (India Standard Time)
        Migration Results for the last 24 hours:
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1     1024
                        too many chunks to print, use verbose if you want to force print
        {  "_id" : "geekFlareDB",  "primary" : "rs1",  "partitioned" : true,  "version" : {  "uuid" : UUID("a770da01-1900-401e-9f34-35ce595a5d54"),  "lastMod" : 1 } }
                geekFlareDB.geekFlareCol
                        shard key: { "key" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1     1
                        { "key" : { "$minKey" : 1 } } -->> { "key" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0)
                geekFlareDB.geekFlareCollection
                        shard key: { "product" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1     1
                        { "product" : { "$minKey" : 1 } } -->> { "product" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0)
        {  "_id" : "test",  "primary" : "rs1",  "partitioned" : false,  "version" : {  "uuid" : UUID("fbc00f03-b5b5-4d13-9d09-259d7fdb7289"),  "lastMod" : 1 } }

mongos>

Дистрибуција података

Монгос рутер распоређује оптерећење између шардова на основу кључа шарда и равномерно распоређује податке; балансер ступа у акцију.

  Алатка за боље управљање пројектима и продуктивност

Кључна компонента за дистрибуцију података међу деловима су

  • Балансер игра улогу у балансирању подскупа података међу подељеним чворовима. Баланцер се покреће када Монгос сервер почне да дистрибуира оптерећење међу фрагментима. Када је покренут, Баланцер је равномерније дистрибуирао податке. Да бисте проверили стање балансера, покрените <стронг>сх.статус() или сх.гетБаланцерСтате() или<цоде цласс=”лангуаге-маркуп”>сх.исБаланцерРуннинг().
mongos> sh.isBalancerRunning()
true
mongos>

ИЛИ

mongos> sh.getBalancerState()
true
mongos>

Након уметања података, могли смо да приметимо неку активност у Монгос демону који наводи да помера неке делове за одређене делове и тако даље, тј. балансер ће бити у акцији покушавајући да избалансира податке по деловима. Покретање балансера може довести до проблема са перформансама; стога се предлаже покретање балансера унутар одређеног балансер прозор.

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5efbeff98a8bbb2d27231674")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022",  "state" : 1 }
        {  "_id" : "rs2",  "host" : "rs2/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025",  "state" : 1 }
  active mongoses:
        "4.2.7" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  yes
        Failed balancer rounds in last 5 attempts:  5
        Last reported error:  Could not find host matching read preference { mode: "primary" } for set rs2
        Time of Reported error:  Wed Jul 01 2020 14:39:59 GMT+0530 (India Standard Time)
        Migration Results for the last 24 hours:
                1024 : Success
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs2     1024
                        too many chunks to print, use verbose if you want to force print
        {  "_id" : "geekFlareDB",  "primary" : "rs2",  "partitioned" : true,  "version" : {  "uuid" : UUID("a8b8dc5c-85b0-4481-bda1-00e53f6f35cd"),  "lastMod" : 1 } }
                geekFlareDB.geekFlareCollection
                        shard key: { "key" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs2     1
                        { "key" : { "$minKey" : 1 } } -->> { "key" : { "$maxKey" : 1 } } on : rs2 Timestamp(1, 0)
        {  "_id" : "test",  "primary" : "rs2",  "partitioned" : false,  "version" : {  "uuid" : UUID("a28d7504-1596-460e-9e09-0bdc6450028f"),  "lastMod" : 1 } }

mongos>
  • Кључ шарда одређује логику за дистрибуцију докумената подељене колекције међу деловима. Кључ шарда може бити индексирано поље или индексирано сложено поље које мора бити присутно у свим документима колекције која се убацује. Подаци ће бити подељени у делове, а сваки део ће бити повезан са кључем шарда заснованог на опсегу. На основу упита опсега, рутер ће одлучити који ће део похранити комад.

Схард Кеи се може изабрати узимајући у обзир пет својстава:

  • Кардиналност
  • Напишите дистрибуцију
  • Прочитајте дистрибуцију
  • Прочитајте циљање
  • Прочитајте локалитет

Идеалан кључ шарда чини да МонгоДБ равномерно распоређује оптерећење на све делове. Одабир доброг кључа шарда је изузетно важан.

Слика: МонгоДБ

Уклањање чвора шарда

Пре уклањања шардова из кластера, корисник мора да обезбеди безбедну миграцију података на преостале делове. МонгоДБ се брине о безбедном одводу података у друге чворове шарда пре уклањања потребног чвора шарда.

Покрените наредбу испод да бисте уклонили потребну крхотину.

Корак 1

Прво, морамо да одредимо име хоста за део који треба да буде уклоњен. Наредба испод ће приказати све делове присутне у кластеру заједно са стањем шарда.

дб.админЦомманд( { листСхардс: 1 } )

mongos> db.adminCommand( { listShards: 1 } )
{
        "shards" : [
                {
                        "_id" : "rs1",
                        "host" : "rs1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022",
                        "state" : 1
                },
                {
                        "_id" : "rs2",
                        "host" : "rs2/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025",
                        "state" : 1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1593572866, 15),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593572866, 15),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Корак 2

Издајте наредбу у наставку да бисте уклонили потребну фракцију из кластера. Једном издат, балансер се брине о уклањању комада из дренажног чвора шарда, а затим балансира дистрибуцију преосталих комада између осталих чворова.

дб.админЦомманд( { ремовеСхард: “схардедРеплицаНодес” })

mongos> db.adminCommand( { removeShard: "rs1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022" } )
{
        "msg" : "draining started successfully",
        "state" : "started",
        "shard" : "rs1",
        "note" : "you need to drop or movePrimary these databases",
        "dbsToMove" : [ ],
        "ok" : 1,
        "operationTime" : Timestamp(1593572385, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593572385, 2),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Корак 3

Да бисте проверили статус дезинфекције, поново издајте исту команду.

дб.админЦомманд( { ремовеСхард: “рс1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022” })

Морамо да сачекамо док се одвод података не заврши. Поља мсг и стате ће показати да ли је дренирање података завршено или не, као што следи

"msg" : "draining ongoing",
"state" : "ongoing",

Статус можемо проверити и командом сх.статус(). Једном уклоњен подељени чвор се неће одразити на излазу. Али ако ће одвод бити у току, раздвојени чвор ће имати статус одвода као истинит.

Корак 4

Наставите да проверавате статус пражњења истом горњом командом, све док се захтевани део не уклони у потпуности.
Када се заврши, излаз команде ће одражавати поруку и стање као завршено.

"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "rs1",
"ok" : 1,

Корак 5

Коначно, морамо да проверимо преостале делове у кластеру. Да бисте проверили статус, унесите <стронг>сх.статус() или <стронг>дб.админЦомманд( { листСхардс: 1 } )

mongos> db.adminCommand( { listShards: 1 } )
{
        "shards" : [
                {
                        "_id" : "rs2",
                        "host" : "rs2/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025",
                        "state" : 1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1593575215, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1593575215, 3),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Овде можемо видети да уклоњени део више није присутан на листи делова.

Предности дељења у односу на репликацију

  • У репликацији, примарни чвор управља свим операцијама писања, док су секундарни сервери потребни да одржавају резервне копије или служе операцијама само за читање. Али приликом дељења заједно са скуповима реплика, оптерећење се распоређује између броја сервера.
  • Један скуп реплика је ограничен на 12 чворова, али нема ограничења у броју делова.
  • Репликација захтева врхунски хардвер или скалирање вертикала за руковање великим скуповима података, што је прескупо у поређењу са додавањем додатних сервера у шардовању.
  • У репликацији, перформансе читања се могу побољшати додавањем више подређених/секундарних сервера, док ће код шардинга перформансе читања и писања бити побољшане додавањем више чворова шарда.

Ограничење шарања

  • Схардед кластер не подржава јединствено индексирање преко шардова све док јединствени индекс не има префикс са пуним кључем шарда.
  • Све операције ажурирања за подељену колекцију на једном или више докумената морају да садрже подељени кључ или поље _ид у упиту.
  • Колекције се могу делити ако њихова величина не прелази наведени праг. Овај праг се може проценити на основу просечне величине свих кључева и конфигурисане величине делова.
  • Дељење се састоји од оперативних ограничења максималне величине колекције или броја подела.
  • Одабир погрешних кључева шарда доводи до импликација на перформансе.

Закључак

МонгоДБ нуди уграђено дијељење за имплементацију велике базе података без угрожавања перформанси. Надам се да ће вам горе наведено помоћи да подесите МонгоДБ схадинг. Затим, можда ћете желети да се упознате са неким од најчешће коришћених наредби МонгоДБ.