Настройка масштабируемой базы данных MongoDB
Linux, VPS | Комментировать запись
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: Cloud Server, Linux, MongoDB, NoSQL