След успешното разработване на приложението и преди да се посветите на производството на MongoDB, съобразете се с тези бързи насоки, за да осигурите плавен и ефективен поток, както и да постигнете оптимална производителност.
1) Опции за внедряване
Избор на подходящ хардуер
За оптимална производителност е за предпочитане да използвате SSD вместо HDD. Необходимо е да се погрижите дали вашето хранилище е локално или отдалечено и да вземете съответните мерки. По-добре е да използвате RAID за защита на хардуерни дефекти и схема за възстановяване, но не разчитайте изцяло на него, тъй като не предлага никаква защита срещу неблагоприятни повреди. За изпълнение на дискове, RAID-10 е подходящ по отношение на производителност и наличност, което често липсва при други нива на RAID. Правилният хардуер е градивният елемент за вашето приложение за оптимизирана производителност и за избягване на голям провал.
Облачен хостинг
Налична е гама от доставчици в облак, които предлагат предварително инсталирани хостове на база данни MongoDB. Изборът на най-добрия избор е основополагащата стъпка за вашето приложение да се разрасне и да направи първи впечатления на целевия пазар. MongoDB Atlas е един от възможните избори, който предлага цялостно решение за облачен интерфейс с функции като разполагане на вашите възли и моментна снимка на вашите данни, съхранявани в Amazon S3. ClusterControl е друга добра налична опция за лесно разгръщане и мащабиране. Което предлага разнообразие от функции като лесно добавяне и премахване на възли, преоразмеряване на екземпляри и клониране на вашия производствен клъстер. Можете да опитате ClusterControl тук, без да бъдете таксувани. Други налични опции са RackSpace ObjectRocket и MongoStitch.
2) RAM
Често достъпните елементи се кешират в RAM, така че MongoDB може да осигури оптимално време за реакция. RAM обикновено зависи от количеството данни, които ще съхранявате, броя на колекциите и индексите. Уверете се, че имате достатъчно RAM, за да поберете вашите индекси, в противен случай това ще повлияе драстично на производителността на вашето приложение в производството. Повече RAM означава по-малко грешки в страницата и по-добро време за реакция.
3) Индексиране
За приложения, които включват хронични заявки за запис, индексирането играе наложителна роля. Според MongoDB документи:
„Ако операция на запис променя индексирано поле, MongoDB актуализира всички индекси, които имат модифицираното поле като ключ“
Така че, бъдете внимателни, докато избирате индекси, тъй като това може да повлияе на производителността на вашата DB.
Пример за индексиране:Примерен запис в базата данни на ресторанта
{
"address": {
"building": "701",
"street": "Harley street",
"zipcode": "71000"
},
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Bombay Bakery",
"restaurant_id": "187521"
}
-
Създаване на индекс на едно поле
> db.restaurants.createIndex( { "cuisine": 1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
В горния пример индексът на възходящ ред е създаден в полето за кухня.
-
Създаване на индекс върху множество полета
> db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
Тук се създава съставен индекс в полета за кухня и пощенски код. Числото -ve определя низходящ ред.
4) Бъдете подготвени за разделяне
MongoDB разделя данните на различни машини, използвайки механизъм, известен като разделяне. Не се препоръчва да добавяте разделяне в началото, освен ако не очаквате масивни набори от данни. Не забравяйте да поддържате ефективността на приложението си в съответствие, имате нужда от добър ключ за разделяне, според моделите на вашите данни, тъй като той пряко влияе върху времето ви за реакция. Балансирането на данни между фрагментите е автоматично. Въпреки това е по-добре да сте подготвени и да имате правилен план. Така че можете да консолидирате, когато приложението ви изисква.
5) Най-добри практики за конфигуриране на ОС
- XFS файлова система
- Това е силно мащабируема, високопроизводителна 64-битова файлова система за журналиране. Обновява I/O производителността, като позволява по-малко и по-големи I/O операции.
- Поставете ограничение на файловия дескриптор.
- Деактивирайте прозрачните огромни страници и паметта с неравномерен достъп (NUMA).
- Променете времето за поддържане на TCP по подразбиране на 300 секунди (за Linux) и 120 секунди (за Azure).
Опитайте тези команди за промяна на времето за поддържане по подразбиране;
За Linux
sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>
За Windows
Въведете тази команда в командния ред като администратор, където
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>
6) Осигуряване на висока наличност с помощта на репликация
Производството без репликация може да причини внезапни повреди на приложението ви. Репликацията се грижи за проблема, ако възелът не успее. Управлявайте операциите за четене, запис за вашите вторични екземпляри на MongoDB според нуждите на вашето приложение.
Имайте предвид тези неща, докато репликирате:
- За висока наличност внедрете своя набор от реплика в минимум три центъра за данни.
- Уверете се, че екземплярите на MongoDB имат 0 или 1 глас.
- Осигурете пълна двупосочна мрежова свързаност между всички екземпляри на MongoDB.
Пример за създаване на набор от реплика с 4 локални екземпляра на MongoDB:
-
Създаване на 4 локални екземпляра на MongoDB
Първо, създайте директории с данни
mkdir -p /data/m0 mkdir -p /data/m1 mkdir -p /data/m2 mkdir -p /data/m3
-
Стартирайте 4 локални екземпляра
mongod --replSet cluster1 --port 27017 --dbpath /data/m0 mongod --replSet cluster2 --port 27018 --dbpath /data/m1 mongod --replSet cluster1 --port 27019 --dbpath /data/m2 mongod --replSet cluster1 --port 27020 --dbpath /data/m3
-
Добавете екземплярите към клъстера и инициирайте
mongo myhost:34014 myConfig = {_id: ‘cluster1’, members: [ {_id: 0, host: ‘myhost1:27017’}, {_id: 1, host: ‘myhost2:27018’}, {_id: 2, host: ‘myhost3:27019’}, {_id: 3, host: ‘myhost4:27020’}] } rs.initiate(myConfig);
Мерки за сигурност
7) Сигурни машини
Отворените портове на машини, хостващи MongoDB, са уязвими към различни злонамерени атаки. Повече от 30 хиляди бази данни на MongoDB бяха компрометирани при атака на ransomware поради изоставане в правилната конфигурация за сигурност. Докато продължавате производството, затворете публичните си портове на сървъра MongoDB. Въпреки това, трябва да държите един порт отворен за целите на SSh.
Активиране на удостоверяване на екземпляр на MongoDB:
-
Стартирайте файла mongod.conf в любимия си редактор.
-
Добавете тези редове в края на конфигурационния файл.
security: authorization: enabled
-
Добавете тези редове в края на конфигурационния файл.
service mongod restart
-
Потвърдете състоянието
service mongod status
Ограничаване на външен достъп
Отворете отново файла mongod.conf, за да зададете ограничени IP адреси за достъп до вашия сървър.
bind_ip=127.0.0.1
Добавянето на този ред означава, че имате достъп до сървъра си само през 127.0.0. (който е локален хост). Можете също да добавите няколко IP адреса в опцията за свързване.
bind_ip=127.0.0.1,168.21.200.200
Това означава, че имате достъп от localhost и вашата частна мрежа.
8) Защита с парола
За да добавите допълнителен защитен слой към вашите машини, активирайте контрол на достъпа и наложете удостоверяване. Въпреки факта, че сте ограничили сървъра на MongoDB да приема връзки от външния свят, все още има възможност злонамерени скриптове да влязат във вашия сървър. Така че, не се колебайте да зададете потребителско име/парола за вашата база данни и да зададете необходимите разрешения. Активираният контрол на достъпа ще позволи на потребителите само да извършват действия, определени от техните роли.
Ето стъпките за създаване на потребител и задаване на достъп до база данни с конкретни роли.
На първо място ще създадем потребител (в този случай това е администратор) за управление на всички потребители и бази данни и след това ще създадем конкретен собственик на база данни, който има привилегии само за четене и запис на една инстанция на базата данни MongoDB.
Създайте потребител с администратор за управление на други потребители за екземпляри на база данни
-
Отворете вашата обвивка на Mongo и превключете към администраторската база данни:
use admin
-
Създайте потребител за администраторска база данни
db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
-
Удостоверяване на новосъздадения потребител
db.auth("admin", "admin_password")
-
Създаване на конкретен потребител на екземпляр:
use database_1 db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
-
Сега проверете дали потребителят е създаден успешно или не.
db.auth("user_1", "your_password") show collections
Това е! Успешно защитихте вашите екземпляри от база данни с правилно удостоверяване. Можете да добавите толкова потребители, колкото искате, като следвате същата процедура.
9) Криптиране и защита на данните
Ако използвате Wiredtiger като машина за съхранение, тогава можете да използвате конфигурацията му за криптиране в състояние на покой, за да криптирате данните си. Ако не, тогава криптирането трябва да се извърши на хоста с помощта на файлова система, устройства или физическо криптиране.
10) Наблюдавайте внедряването си
След като приключите с внедряването на MongoDB в производство, тогава трябва да проследите активността на производителността, за да предотвратите ранни възможни проблеми. Има набор от стратегии, които можете да адаптирате, за да наблюдавате ефективността на данните си в производствената среда.
-
MongoDB включва помощни програми, които връщат статистически данни за производителността и активността на екземпляра. Помощните програми се използват за определяне на проблеми и анализ на нормалните операции.
-
Използвайте mongostat, за да разберете подредбата на видовете операции и планирането на капацитета.
-
За проследяване на отчети и дейности за четене и запис се препоръчва mongotop.
mongotop 15
Тази команда ще връща изход след всеки 15 секунди.
ns total read write 2018-04-22T15:32:01-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
ns total read write 2018-04-22T15:32:16-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
Услугата за наблюдение на MongoDB (MMS) е друга налична опция, която следи вашия MongoDB клъстер и ви улеснява да наблюдавате дейностите по внедряване на продукцията.
И разбира се има ClusterControl от Severalnines, системата за автоматизация и управление на бази данни с отворен код. ClusterControl позволява лесно разгръщане на клъстери с автоматизирани настройки за сигурност и улеснява отстраняването на неизправности във вашата база данни, като предоставя лесна за използване автоматизация за управление, която включва ремонт и възстановяване на повредени възли, автоматични надстройки и др. Можете да започнете с неговото (безплатно завинаги) Community Edition, с което можете да разгръщате и наблюдавате MongoDB, както и да създавате персонализирани съветници, за да настроите усилията си за наблюдение към онези аспекти, които са специфични за вашата настройка. Изтеглете го безплатно тук.