MongoDB. Шардированный кластер и Replica Set

Thank you for reading this post, don't forget to subscribe!

В нашей кон­фи­гу­ра­ции мы будем исполь­зо­вать сле­ду­ю­щую схему:

Более уни­вер­саль­ной схе­мой будет счи­тать­ся сле­ду­ю­щая, она пред­по­ла­га­ет отказоустойчивость:

Нач­нем с уста­нов­ки mongodb демо­нов на сер­ве­ра, будем исполь­зо­вать для это­го офи­ци­аль­ную документацию

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

config пер­во­го CFG репли­ка сет сер­ве­ра для mongo

 

 

 

Для осталь­ных двух cfg сер­ве­ров все по ана­ло­гии, меня­ем толь­ко bindIP.

Так­же сто­ит обра­тить вни­ма­ние, что все ноды были опи­са­ны пред­ва­ри­тель­но в /etc/hosts и файл hosts раз­лит на все ноды.

192.168.1.2 mongos
192.168.1.3 mongos-cfg1
192.168.1.4 mongos-cfg2
192.168.1.5 mongos-cfg3
192.168.1.6 dbstore1
192.168.1.7 dbstore2
192.168.1.8 dbstore3

Под­клю­ча­ем­ся к наше­му пер­во­му сер­ве­ру mongos-cfg1 и дела­ем репликасет

mongo --host mongos-cfg1 --port 27017

выпол­ня­ем:

 

 

В выво­де «ок»: 1 — озна­ча­ет успеш­ное выпол­не­ние нашей преды­ду­щей команды.

Про­ве­ря­ем состо­я­ние всех трех сер­ве­ров, дол­жен быть 1 Primary и 2 Secondary, коман­ды для про­вер­ки состояния:

rs.isMaster()
rs.status()
Скон­фи­гу­ри­ру­ем наши сто­рей­джи для мон­ги, кон­фиг такой

 

 

Для ката­ло­га хра­не­ния дан­ных mongo ука­зан­ной dbPath проверим/установим вер­но­го владельца:

chown -R mongod:mongod /opt/mongo/
Запус­ка­ем сер­ви­сы, про­ве­ря­ем, что порт 27017 слу­ша­ют нуж­ные нам демоны.

Послед­ние и самое инте­рес­ное, настрой­ка mongos — роу­те­ра всех запро­сов в наш буду­щий кластер.

После того, как на буду­щий роу­тер уста­нов­лен пакет mongod, созда­дим service файл для того, что­бы mongos запус­кал­ся автоматически

!!! Непо­сред­ствен­но mongod сер­вис дол­жен быть оста­нов­лен и исклю­чен из автозапуска !!!

nano /etc/systemd/system/mongos.service

 

 

Выпол­ним коман­ду для обнов­ле­ние спис­ка сервисов

systemctl daemon-reload

systemctl enable mongos
Наш кон­фи­гу­ра­ци­он­ный файл для mongos /etc/mongos.conf будет следующим:

 

 

Запус­ка­ем mongos сервис

systemctl start mongos
Про­ве­ря­ем, что работает

# netstat -ntupl | grep mongos
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 3570/mongos
Так­же в логе /var/log/mongodb/mongos.log долж­ны быть стро­ки с успеш­ным под­клю­че­ни­ем к наше­му config replicaset mongo

Successfully connected to mongos-cfg1:27017
Successfully connected to mongos-cfg2:27017
Successfully connected to mongos-cfg3:27017
Послед­ний штрих, реги­стра­ция наших mongo shard сер­ве­ров в mongos роутере

На сер­ве­ре mongos, под­клю­ча­ем­ся к наше­му кластеру:

mongo --host mongos --port 27017
и добав­ля­ем наши shard сервера

sh.addShard( "dbstore1:27017")
sh.addShard( "dbstore2:27017")
sh.addShard( "dbstore3:27017")
Перей­дем к прак­ти­ке. Сге­не­ри­ру­ем дан­ные и сде­ла­ем им шардированние.

Сге­не­ри­ро­вать дан­ные мож­но сле­ду­ю­щем способом

Созда­ем базу дан­ных в mongo (на сер­ве­ре mongos) и захо­дим в нее, далее выпол­ним несколь­ко команд что­бы сге­не­ри­ро­вать 1 000 000 документов.

 

 

После того как дан­ные сге­не­ри­ро­ван­ны, надо сде­лать индекс шардирорвания.

Напри­мер, кол­лек­ция lemp уже содер­жит сге­не­ри­ро­ван­ные дан­ные по при­ме­ру чуть выше.

Для нача­ла вклю­ча­ем шар­ди­ро­ва­ние для опре­де­лен­ной коллекции

Про­ве­рем, что шар­динг вклю­чил­ся, коман­да sh.status() долж­на отоб­ро­зить в пере­мен­ных ста­ту­са кол­лек­ции «partitioned» : true

Визу­аль­ное пред­став­ле­ние наших доку­мен­тов в коллекции

mongos> show collections
lemp
stack
В lemp для lemp будем стро­ить хеши­ро­ван­ный индекс по полю id, не силь­но удач­но были сге­не­ри­ро­ва­ны дан­ные для при­ме­ра, но поста­ра­ем­ся не запутаться.

Созда­ем индекс

mongos> db.lemp.createIndex({_id:"hashed"},{background:true})
Выпол­ня­ем шардирование

mongos> sh.shardCollection("lemp.lemp",{"_id":"hashed"})
После дан­ной коман­ды дол­жен запу­стить­ся балан­си­ров­щик и чан­ки (chunks — части дан­ных рас­пре­де­ля­ю­щи­е­ся меж­ду шар­да­ми) будут пере­ме­щать­ся по шардам

На скрине ниже, вид­но нали­чие 11 чан­ков рас­пре­де­лен­ных по 3 шар­дам, 5 6 и 5 соот­вет­ствен­но шар­дам 0000, 0001 и 0002

В дан­ном при­ме­ре в lemp содер­жит­ся 5 000 000 доку­мен­тов рас­пре­де­лен­ных меж­ду 3 шардами

Так­же в каче­стве заме­ча­ния не сто­ит забы­вать про тюнинг самой ОС на кото­рой будет нахо­дить­ся кластер.

Для mongo реко­мен­ду­ет­ся выби­рать XFS

Настрой­ки sysctl следующие

net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096
vm.swappiness = 1
Не забы­ва­ем син­хро­ни­зи­ро­вать вре­мя — уста­нав­ли­ва­ем ntp

А так­же изме­нить /sys/kernel/mm/transparent_hugepage/enabled с always на never

transparent_hugepage=never

в centos7 сде­лал дела­ем через tuned

Уста­нав­ли­ва­ем tuned

yum install tuned
nano /etc/tuned/no-thp/tuned.conf

 

 

И акти­ви­ру­ем дан­ные профайл

~# tuned-adm profile no-thp