Настройка масштабируемой базы данных MongoDB

MongoDB – это система управления базами данных (СУБД) NoSQL с большим количеством встроенных функций, среди которых репликация и сегментирование. Благодаря этим функциям БД можно масштабировать на необходимое количество серверов путём распространения контента между ними.

Прежде чем приступить к установке MongoDB и её зависимостей, нужно убедиться, что сервер и установленное на нём ПО подготовлены и корректно настроены.

1: Жесткие диски

Если у вас есть возможность выбрать жёсткий диск, выбирайте SSD корпоративного уровня RAID 1, поскольку они экономны и высокопроизводительны.

Отредактируйте файл /etc/fstab системы Linux и отключите ведение журнала времени доступа. Добавьте noatime в четвертый столбец. Повторно смонтируйте раздел:

[root@mongodb1 ~]# mount -o remount /

Убедитесь, что новые настройки вступили в исполнение:

[[root@mongodb1 ~]# mount
/dev/sda on / type ext4 (rw,noatime)

2: Оперативная память и ресурсы CPU

Настройка MongoDB as a VM на гипервизоре позволяет в дальнейшем масштабировать RAM и ядра CPU. количество ядер CPU и RAM зависит от потребностей и бюджета инфраструктуры.

3: Оптимизация

На данном этапе нужно оптимизировать запросы к базе данных:

  • Добавьте индексы для наиболее часто искомых или распределенных запросов.
  • Используйте команду MongoDB explain().
  • Ограничьте вывод результатов и полей поиска.

Для тестирования понадобится три виртуальных сервера:

mongodb1: 111.11.11.11
mongodb2: 222.22.22.22
mongodb3: 333.33.33.33

Установка MongoDB

Эта процедура одинакова для всех тестовых серверов. Установка MongoDB на CentOS очень проста. Добавьте репозиторий, отредактировав:

/etc/yum.repos.d/10gen.repo
[10gen] name=10gen
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

Затем установите пакеты:

[root@mongodb1 ~]# yum -y install mongo-10gen mongo-10gen-server

Настройте автоматический запуск MongoDB при загрузке системы, а затем запустите как сервис:

[root@mongodb1 ~]# chkconfig mongod on && service mongod start
Starting mongod: forked process: 1387
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting
[  OK  ]

Теперь можно просмотреть статистику по ссылке http://SERVER:28017/

Настройка репликации базы данных по типу Master-Slave

К примеру, mongodb1 будет master-сервером. Внесите строку «master = true» в файл /etc/mongod.conf и выполните:

service mongod restart

Соответственно, mongodb2 и mongodb3 будут slave-серверами. Внесите строки «slave=true», «source = mongodb1» в /etc/mongod.conf и выполните:

service mongod restart

Теперь нужно защитить Бд паролем или создать правило iptables для портов 27017 (MongoDB) и 28017 (веб-интерфейс).

Чтобы создать пользователя и пароль:

> use test
> db.addUser('admin', 'password');
{
"user" : "admin",
"readOnly" : false,
"pwd" : "90f500568434c37b61c8c1ce05fdf3ae",
"_id" : ObjectId("50eaae88790af41ffffdcc58")
}

Также нужно добавить правила брандмауэра для других баз MongoDB и IP серверов.

[root@mongodb1 ~]# iptables -N MongoDB
[root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 27017 -j MongoDB
[root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 28017 -j MongoDB
[root@mongodb1 ~]# iptables -I MongoDB -s 127.0.0.1 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 111.11.11.11 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 222.22.22.22 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 333.33.33.33 -j ACCEPT
[root@mongodb1 ~]# iptables -A MongoDB -s 0/0 -j DROP
[root@mongodb1 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

Повторите этот процесс на серверах mongodb2 и mongodb3.

Если в качестве фронтэнда используется PHP, нужно установить модуль MongoDB для PHP:

[root@webserver ~]# pecl install mongo
[root@webserver ~]# echo extension=mongo.so >> `php -i | grep /php.ini | awk '{print $5}'`
[root@webserver ~]# service httpd restart

Внесение данных в БД

Теперь можно протестировать установку. Получить дотуп к базе данных можно при помощи командной строки, набрав:

[root@mongodb1 ~]# mongo
MongoDB shell version: 2.2.2
connecting to: test

Для примера внесём в БД список бестселлеров по версии New York Times:

> db.books.save( { title: 'Safe Haven', author: 'Nicholas Sparks' } )
> db.books.save( { title: 'Gone Girl', author: 'Gillian Flynn' } )
> db.books.save( { title: 'The Coincidence Of Callie And Kayden', author: 'Jessica Sorensen' } )
> db.books.save( { title: 'Fifty Shades of Grey', author: 'E.L. James' } )
> db.books.save( { title: 'Hopeless', author: 'Colleen Hoover' } )
To display all results:
> db.books.find()
{ "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" }
{ "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" }
{ "_id" : ObjectId("50eaaa8d633625147f205996"), "title" : "The Coincidence Of Callie And Kayden", "author" : "Jessica Sorensen" }
{ "_id" : ObjectId("50eaaaa0633625147f205997"), "title" : "Fifty Shades of Grey", "author" : "E.L. James" }
{ "_id" : ObjectId("50eaaab3633625147f205998"), "title" : "Hopeless", "author" : "Colleen Hoover" }

Теперь эти данные должны появиться и на серверах mongodb2 и mongodb3.

Такая таблица может содержать и гораздо больше столбцов; но чтобы оптимизировать запросы, лучше ограничить количество результатов и полей.

К примеру, чтобы ограничить вывод до 2 результатов, нужно использовать limit() в конце строки:

> db.books.find( {}, { title : 1 , author: 1 } ).sort( { timestamp : -1 } ).limit(2)
{ "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" }
{ "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" }

Достигнув максимальной производительности текущей настройки, можно приступать к сегментированию базы данных.

Tags: , , ,

Добавить комментарий