Оптимизация настроек MongoDB

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

в MongoDB не так мно­го настро­ек, есть толь­ко несколь­ко пара­мет­ров, кото­рые вы може­те изме­нить на сер­ве­ре. Реаль­ная настрой­ка выпол­ня­ет­ся в запро­сах и индек­сах, кото­рые долж­ны при­сут­ство­вать. И для этой цели хоро­шо подой­дет dex утилита.

Dex — это кон­соль­ная ути­ли­та, кото­рая может ана­ли­зи­ро­вать логи MongoDB, срав­ни­вать запро­сы, кото­рые реги­стри­ру­ют­ся в запу­щен­ном экзем­пля­ре MongoDB и сооб­щать вам, какие индек­сы сле­ду­ет доба­вить, что­бы опти­ми­зи­ро­вать вашу производительность.

нам потре­бу­ет­ся dex и нуж­но его установить.

Инстру­мент dex уста­нав­ли­ва­ет­ся через pip — мене­джер паке­тов Python. Вот при­мер того, как мож­но уста­но­вить pip на CentOS/Fedora/RedHat:

yum install python-pip -y

Уста­нов­ка pip/setuptools/wheel в CentOS/RHEL
Что­бы уста­но­вить pip и wheel, суще­ству­ет два варианта:

1. Вклю­чи­те репо­зи­то­рий EPEL
После чего, вы може­те уста­но­вить pip сле­ду­ю­щим образом:
yum install python-pip

На EPEL 7 (но не EPEL 6), вы може­те уста­но­вить wheel сле­ду­ю­щим образом:
yum install python-wheel

2. Вклю­чи­те репо­зи­то­рий PyPA Copr репозиторий:

CentOS 6:

[pypa-pypa]
name=Copr repo for pypa owned by pypa
baseurl=https://copr-be.cloud.fedoraproject.org/results/pypa/pypa/epel-6-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/pypa/pypa/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
CentOS 7:
[pypa-pypa]
name=Copr repo for pypa owned by pypa
baseurl=https://copr-be.cloud.fedoraproject.org/results/pypa/pypa/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/pypa/pypa/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
После чего, вы може­те уста­но­вить pip сле­ду­ю­щим образом:
yum install python-pip python-wheel
Что­бы обно­вить setuptools, запустите:
yum upgrade python-setuptools
Что­бы уста­но­вить Python 3.4 на CentOS7/RHEL7, используйте:
yum install python34u python34u-wheel

 

Что­бы уста­но­вить dex,  исполь­зу­ем:
pip install dex

Запус­ка­ем:
dex -f /var/log/mongodb/mongod.log mongodb://localhost
Дан­ное дей­ствие, запу­стит dex, кото­рый будет читать все логи в  mongodb.log фай­ле и про­ве­рять для каж­до­го запро­са, суще­ству­ют ли необ­хо­ди­мые индек­сы. Например:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Если нет необ­хо­ди­мо­сти что-то опти­ми­зи­ро­вать, вы полу­чи­те нечто подобное:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Он про­ве­рил все стро­ки в фай­ле mongod.log и не смог посо­ве­то­вать ника­кое улуч­ше­ние. Хоро­шая новость — MongoDB, кажет­ся, рабо­та­ет про­сто отлично!

Воз­мож­но, вы не хоти­те про­ве­рять каж­дый запрос в лог-фай­ле. Мож­но доба­вить пара­метр «—slowms», что­бы про­ве­рять толь­ко запро­сы, кото­рые пре­вы­ша­ют тайм-аут мед­лен­но­го журнала:

dex -f dex -f /var/log/mongodb/mongod.log mongodb://localhost --slowms 200
При таком вари­ан­те, будут про­ве­рять­ся толь­ко те запро­сы, дли­тель­ность кото­рых пре­вы­ша­ет 200 мс.

В каче­стве аль­тер­на­ти­вы вы може­те исполь­зо­вать пара­метр «—watch», что­бы не пар­сить весь лог при запус­ке, а обра­ба­ты­вать толь­ко новые запи­си. Такой вари­ант может быть полез­ным, когда ваш лог уже пре­вы­ша­ет пару ГБ, и вам нет необ­хо­ди­мо­сти исполь­зо­вать ста­рые значения:

dex -f /var/log/mongodb/mongod.log mongodb://localhost --watch
Это зна­чи­тель­но уско­ря­ет запуск dex.

Инстру­мент dex пред­ла­га­ет вам очень про­стой спо­соб при­ме­не­ния индек­сов, кото­рые он реко­мен­ду­ет: коман­да выво­дить­ся на выхо­де! Вот пример:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

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

mongo collection
> db["collection"].ensureIndex({"columnId": 1}, {"background": true})

В резуль­та­те индекс добав­ля­ет­ся в фоно­вом режи­ме: это не бло­ки­ру­ет стро­ки, и при­ло­же­ние может про­дол­жать рабо­тать. В MongoDB есть несколь­ко исход­ных индек­сов, но для меня они пере­ве­ши­ва­ют недо­ста­ток нали­чия бло­ки­ров­ки чте­ния и запи­си данных.

Если вы рабо­та­е­те с MongoDB, обя­за­тель­но исполь­зуй­те инстру­мент dex, что­бы помочь устра­нить про­бле­мы с производительностью.