Как создать защищенный кластер RethinkDB в Ubuntu 14.04

Вступление

  • RethinkDB * - база данных NoSQL. Он имеет простой в использовании API для взаимодействия с базой данных. RethinkDB также упрощает настройку кластеров базы данных; то есть группы серверов, обслуживающих одинаковые базы данных и таблицы. Кластеры - это способ легко масштабировать ваши базы данных без простоев.

В этом руководстве будет рассказано, как настроить кластер, импортировать данные и защитить его. Если вы новичок в RethinkDB, ознакомьтесь с основами в https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an-ubuntu-12-04-vps [ это руководство], прежде чем углубляться в более сложный процесс настройки кластера.

Предпосылки

Для этого урока требуется как минимум 2 Droplets под управлением Ubuntu 14.04 LTS с именем * rethink1 * & * rethink2 * (эти имена будут использоваться в этом уроке). Вы должны set up root пользователь sudo на каждом Капли перед настройкой RethinkDB - это хорошая практика безопасности.

Этот учебник также ссылается на клиентский драйвер Python, который описан в https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an-ubuntu-12-04-vps [этот урок].

Настройка узла

Кластеры в RethinkDB не имеют специальных узлов; это чистая одноранговая сеть. Прежде чем мы сможем настроить кластер, нам нужно установить RethinkDB. На каждом сервере из вашего домашнего каталога добавьте ключ и репозиторий RethinkDB в apt-get:

source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list

wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -

Затем обновите apt-get и установите RethinkDB:

sudo apt-get update
sudo apt-get install rethinkdb

Далее нам нужно настроить RethinkDB на запуск при запуске. RethinkDB поставляется со скриптом для запуска при запуске, но этот скрипт должен быть включен:

sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/cluster_instance.conf

Скрипт запуска также служит в качестве файла конфигурации. Давайте откроем этот файл:

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

Имя машины (имя в консоли веб-управления и файлах журнала) задается в этом файле. Давайте сделаем это так же, как имя хоста машины, найдя строку (в самом низу):

# machine-name=server1

И изменив его на:

machine-name=

(Примечание: если вы не установили имя до первого запуска RethinkDB, оно автоматически установит имя в стиле DOTA.)

Установите RethinkDB так, чтобы он был доступен для всех сетевых интерфейсов путем нахождения строки:

# bind=127.0.0.1

И изменив его на:

bind=all

Сохраните конфигурацию и закройте nano (нажав + Ctrl-X +, затем + Y +, затем + Enter +). Теперь мы можем запустить RethinkDB с новым файлом конфигурации:

sudo service rethinkdb start

Вы должны увидеть этот вывод:

rethinkdb: cluster_instance: Starting instance. (logging to `/var/lib/rethinkdb/cluster_instance/data/log_file')

RethinkDB запущен и работает.

Защита RethinkDB

Мы включили опцию + bind = all +, делая RethinkDB доступным извне сервера. Это небезопасно. Итак, нам нужно заблокировать RethinkDB из Интернета. Но нам нужно разрешить доступ к его услугам с авторизованных компьютеров.

Для порта кластера мы будем использовать брандмауэр для включения нашего кластера. Для веб-консоли управления и порта драйвера мы будем использовать SSH-туннели для доступа к ним извне сервера. Туннели SSH перенаправляют запросы с клиентского компьютера на удаленный компьютер через SSH, предоставляя клиенту доступ ко всем службам, доступным только в пространстве имен локального хоста удаленного сервера.

Повторите эти шаги на всех ваших серверах RethinkDB.

Сначала заблокируйте все внешние соединения:

# The Web Management Console
sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 8080 -j ACCEPT

# The Driver Port
sudo iptables -A INPUT -i eth0 -p tcp --dport 28015 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 28015 -j ACCEPT

# The Cluster Port
sudo iptables -A INPUT -i eth0 -p tcp --dport 29015 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 29015 -j ACCEPT

Для получения дополнительной информации о настройке IPTables, ознакомьтесь с https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04 в этом руководстве] ,

Давайте установим «iptables-persistent», чтобы сохранить наши правила:

sudo apt-get update
sudo apt-get install iptables-persistent

Вы увидите такое меню:

изображение: https: //assets.digitalocean.com/articles/RethinkDB_Ubuntu14/1.png [изображение IPtables]

Выберите опцию + Yes (нажмите` + Enter`), чтобы сохранить правила брандмауэра. Вы также увидите похожее меню о правилах IPv6, которое вы также можете сохранить.

Настройка управления пользователем

Чтобы получить доступ к веб-консоли управления RethinkDB и интерфейсу драйвера, нам нужно настроить SSH-туннель. Давайте создадим нового пользователя для туннеля ssh на * rethink1 *:

sudo adduser ssh-to-me

Затем настройте файл авторизованных ключей для нашего нового пользователя:

sudo mkdir /home/ssh-to-me/.ssh
sudo touch /home/ssh-to-me/.ssh/authorized_keys

Если вы используете SSH для подключения к облачному серверу, откройте терминал на * вашем локальном компьютере *. Если вы этого не сделаете, вы можете узнать learn больше о ключах SSH. Получите ваш открытый ключ и скопируйте его в буфер обмена:

cat ~/.ssh/id_rsa.pub

Затем добавьте этот ключ в новую учетную запись, открыв файл author_keys * на сервере *:

sudo nano /home/ssh-to-me/.ssh/authorized_keys

Вставьте свой ключ в файл. Затем сохраните и закройте nano (+ Ctrl-X +, затем + Y +, затем + Enter +).

«» «»»

Вам нужно повторить все эти шаги для других узлов вашего кластера.

Импорт или создание базы данных

Вы можете импортировать существующую базу данных в ваш кластер. Это необходимо только в том случае, если у вас есть уже существующая база данных на другом сервере или на этом сервере; в противном случае RethinkDB автоматически создаст пустую базу данных.

  • Если вам нужно импортировать внешнюю базу данных: *

Если база данных, которую вы хотите импортировать, не хранится в + rethink1 +, вам необходимо скопировать ее. Сначала найдите путь к вашей текущей базе данных RethinkDB. Это будет автоматически созданный каталог + rethinkdb_data +, если вы использовали команду + rethinkdb + для запуска своей старой базы данных. Затем скопируйте его, используя + scp + on * rethink1 *:

sudo scp -rpC @://* /var/lib/rethinkdb/cluster_instance/data

Например:

sudo scp -rpC [email protected]:/home/user/rethinkdb_data/* /var/lib/rethinkdb/cluster_instance/data

Затем перезапустите RethinkDB:

sudo service rethinkdb restart
  • Если у вас есть база данных на переосмысление1: *

Если у вас есть база данных RethinkDB в * rethink1 *, процедура будет другой. Сначала откройте файл конфигурации на * rethink1 *:

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

Затем найдите путь к базе данных RethinkDB, которую вы хотите импортировать. Это будет автоматически созданный каталог + rethinkdb_data +, если вы использовали команду + rethinkdb + для запуска своей старой базы данных. Вставьте этот путь в файл конфигурации, добавив строку:

directory=

Закройте файл, чтобы сохранить изменения (используя + Ctrl-X +, затем + Y +, затем + Enter +). Теперь перезапустите RethinkDB:

sudo service rethinkdb restart

Важно отметить, что импорт ранее существующей базы данных будет означать, что * rethink1 * унаследует имя старого компьютера базы данных. Это необходимо знать при управлении сегментированием базы данных позже.

Создание кластера

Чтобы создать кластер, необходимо разрешить всем компьютерам кластера через брандмауэры друг друга. На вашем компьютере * rethink1 * добавьте правило IPTables, чтобы другие узлы могли проходить через брандмауэр. В этом примере вы должны заменить + rethink2 IP + на IP-адрес этого сервера:

sudo iptables -I INPUT -i eth0 -s  -p tcp --dport 29015 -j ACCEPT

Повторите команду для любых других узлов, которые вы хотите добавить.

Затем сохраните правила брандмауэра:

sudo sh -c "iptables-save > /etc/iptables/rules.v4"

Затем повторите эти шаги для других ваших узлов. Для установки с двумя серверами вы должны подключиться к * rethink2 * и разблокировать IP-адрес * rethink1 *.

Теперь вам нужно соединить все узлы, чтобы создать кластер. Используйте SSH для подключения к * rethink2 * и откройте файл конфигурации:

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

Опция + join + указывает адрес кластера для присоединения. Найдите строку + join + в файле конфигурации:

# join=example.com:29015

И заменить его на:

join=

Сохраните и закройте файл конфигурации (используя + Ctrl-X +, затем + Y +, затем + Enter +). Затем перезапустите RethinkDB:

sudo service rethinkdb restart

Первый узел, * rethink1 *, НЕ нуждается в обновлении + join +. Повторите редактирование файла конфигурации на всех других узлах, кроме * rethink1 *.

Теперь у вас есть полностью работающий кластер RethinkDB!

Подключение к веб-консоли управления

Консоль веб-управления - это простой в использовании онлайн-интерфейс, обеспечивающий доступ к основным функциям управления RethinkDB. Эта консоль полезна, когда вам нужно просмотреть состояние кластера, выполнить отдельные команды RethinkDB и изменить основные настройки таблицы.

Каждый экземпляр RethinkDB в кластере обслуживает консоль управления, но она доступна только из пространства имен локального хоста сервера, поскольку мы использовали правила брандмауэра, чтобы заблокировать его от остального мира. Мы можем использовать SSH-туннель для перенаправления наших запросов на + localhost: 8080 + на * rethink1 *, который отправит запрос на + localhost: 8080 + внутри своего пространства имен. Это позволит вам получить доступ к консоли веб-управления. Вы можете сделать это, используя SSH на вашем * локальном компьютере *:

ssh -L 8080:localhost:8080 ssh-to-me@

Если вы перейдете по адресу http: // localhost: 8080 [localhost: 8080] в своем браузере, вы увидите консоль веб-управления RethinkDB.

Если вы получили сообщение об ошибке «+ bind: Адрес уже используется», вы уже используете порт 8080 на вашем компьютере. Вы можете перенаправить консоль веб-управления на другой порт, который доступен на вашем компьютере. Например, вы можете переслать его на порт 8081 и перейти по адресу http: // localhost: 8081 [localhost: 8081]:

ssh -L :localhost:8080 ssh-to-me@

Если вы видите конфликт из-за наличия двух тестовых баз данных, вы можете переименовать одну из них.

Подключение к кластеру с помощью драйвера Python

В этой настройке все серверы RethinkDB (консоль веб-управления, порт драйвера и порт кластера) заблокированы от внешнего мира. Мы можем использовать SSH-туннель для подключения к порту драйвера, как и в веб-консоли управления. Порт драйвера - это то, как драйверы API RethinkDB (те, с которыми вы создаете приложения) подключаются к вашему кластеру.

Сначала выберите узел для подключения. Если у вас есть несколько клиентов (например, серверы веб-приложений), подключающихся к кластеру, вам нужно распределить их по кластеру. Было бы неплохо написать список ваших клиентов, а затем выделить сервер для каждого клиента. Попробуйте сгруппировать клиентов таким образом, чтобы клиенты, которым требуются аналогичные таблицы, подключались к одному и тому же облачному серверу или группе серверов, чтобы ни один сервер не был перегружен большим количеством клиентов.

В этом примере мы будем использовать * rethink2 * в качестве нашего сервера подключения. Однако в более крупной системе, где ваша база данных и серверы веб-приложений разделены, вы захотите сделать это с сервера веб-приложений, который фактически выполняет вызовы из базы данных.

Затем на * подключающемся сервере * сгенерируйте ключ SSH:

ssh-keygen -t rsa

И скопируйте это в буфер обмена:

cat ~/.ssh/id_rsa.pub

Затем авторизуйте новый ключ на * узле кластера * (в этом примере * rethink1 *), открыв файл + Author_keys + и вставив ключ в новую строку:

sudo nano /home/ssh-to-me/.ssh/authorized_keys

Закройте nano и сохраните файл (+ Ctrl-X +, затем + Y +, затем + Enter +).

Затем используйте туннелирование SSH для доступа к порту драйвера с * соединяющего сервера *:

ssh -L 28015:localhost:28015 ssh-to-me@ -f -N

Драйвер теперь доступен с localhost: 28015. Если вы получили ошибку + bind: Address уже используется, вы можете изменить порт. Например, используйте порт 28016:

ssh -L 28016:localhost:28015 ssh-to-me@ -f -N

Установите драйвер Python на * подключающемся сервере *. Здесь кратко описаны команды, и вы можете прочитать о них более подробно в https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an -ubuntu-12-04-vps [это руководство].

Установите виртуальную среду Python:

sudo apt-get install python-virtualenv

Создайте каталог + ~ / rethink +:

cd ~
mkdir rethink

Перейдите в каталог и создайте новую структуру виртуальной среды:

cd rethink
virtualenv venv

Активируйте среду (вы должны активировать среду каждый раз перед запуском интерфейса Python, иначе вы получите сообщение об ошибке отсутствующих модулей):

source venv/bin/activate

Установите модуль RethinkDB:

pip install rethinkdb

Теперь запустите Python с * подключающегося сервера *:

python

Подключитесь к базе данных, заменив + 28015 + на используемый вами порт, если это необходимо:

import rethinkdb as r
r.connect("localhost", ).repl()

Создайте таблицу + test:

r.db("test").table_create("test").run()

Вставьте данные в таблицу + test:

r.db("test").table("test").insert({"hello":"world"}).run()
r.db("test").table("test").insert({"hello":"world number 2"}).run()

И распечатать данные:

list(r.db("test").table("test").run())

Вы должны увидеть вывод, похожий на следующий:

[{u'hello': u'world number 2', u'id': u'0203ba8b-390d-4483-901d-83988e6befa1'},
{u'hello': u'world', u'id': u'7d17cd96-0b03-4033-bf1a-75a59d405e63'}]

Настройка шардинга

В RethinkDB вы можете настроить таблицу для разделения (разделения) между несколькими облачными серверами. Разделение - это простой способ, чтобы наборы данных больше, чем умещается в ОЗУ одного компьютера, работали хорошо, поскольку для кэширования доступно больше ОЗУ. Поскольку разделение также разделяет набор данных на несколько машин, у вас могут быть большие таблицы с низкой производительностью, поскольку для таблицы доступно больше дискового пространства. Это можно сделать через веб-консоль управления.

Для этого перейдите на вкладку * Таблицы * в веб-консоли управления.

изображение: https: //assets.digitalocean.com/articles/RethinkDB_Ubuntu14/2.png [Список таблиц]

Нажмите на таблицу * test * (ту, которую мы создали в предыдущем разделе), чтобы ввести ее настройки. Прокрутите вниз до карточки * Настройки шардинга *.

изображение: https: //assets.digitalocean.com/articles/RethinkDB_Ubuntu14/3.png [Разделение карты настроек]

Нажмите кнопку * Редактировать *. Там вы можете ввести количество серверов для разделения таблицы. Введите * 2 * для этого примера. Нажмите кнопку * Rebalance *, чтобы сохранить настройки.

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

Расширенный Sharding

Внутри RethinkDB имеет шарды на основе диапазона, основанные на идентификаторах документов. Это означает, что если у нас есть набор данных с идентификаторами A, B, C и D, RethinkDB может разделить его на 2 сегмента: A, B (-infinity to C) и C, D (C to + infinity). Если вы вставите документ с идентификатором A1, он будет в пределах диапазона первого сегмента (от -infinity до C), поэтому он попадет в этот фрагмент. Мы можем установить границы шардов, которые могут оптимизировать конфигурацию вашей базы данных.

Прежде чем мы сможем это сделать, мы хотим добавить набор данных для игры. На вкладке * Data Explorer * консоли веб-управления мы можем создать таблицу, выполнив эту команду (нажмите * Run * после ввода):

r.db('test').tableCreate('testShards')

Затем вставьте наши тестовые данные:

r.db("test").table("testShards").insert([
 {id:"A"},
 {id:"B"},
 {id:"C"},
 {id:"D"},
 {id:"E"}])

Теперь мы можем детально настроить осколки. Для этого нам нужно войти в админку. Оболочка администратора - это более продвинутый способ управления кластером, позволяющий вам точно настроить настройки. На компьютере * rethink1 * откройте оболочку администратора:

rethinkdb admin

Затем мы можем просмотреть некоторую информацию о нашей таблице:

ls test.testShards

Ожидаемый результат:

table 'testShards' b91fda27-a9f1-4aeb-bf6c-a7a4211fb674

...

1 replica for 1 shard
shard      machine uuid                          name      primary
-inf-+inf  91d89c12-01c7-487f-b5c7-b2460d2da22e  rethink1  yes

В RethinkDB есть много способов назвать таблицу. Вы можете использовать + database.name + (+ test.testShards +), имя (+ testShards +) или таблицу uuid (+ e780f2d2-1baf-4667-b725-b228c7869aab +). Все они могут быть использованы взаимозаменяемо.

Давайте разделим этот осколок. Мы сделаем 2 осколка: -infinity до C и C до + бесконечности:

split shard test.testShards C

Общая форма команды:

split shard

Запуск + ls testShards + снова показывает, что осколок был разделен. Вы можете переместить новый осколок с одной машины на другую. В этом примере мы можем прикрепить (переместить) осколок + -inf-C + (-infinty to C) к машине * rethink2 *:

pin shard test.testShards -inf-C --master rethink2

Общая форма команды:

pin shard  --master

Если вы снова + ls testShards +, вы должны увидеть, что осколок перемещен на другой сервер.

Мы также можем объединить 2 осколка, если мы знаем общую границу. Давайте объединим только что сделанные осколки (от бесконечности до C и от C до + бесконечности):

merge shard test.testShards C

Общая форма команды:

merge shard

Чтобы выйти из оболочки, введите + exit +

Безопасное извлечение машины

Когда документ разделен на несколько машин, один компьютер всегда будет хранить свой первичный индекс. Если облачный сервер с первичным индексом для определенного документа отключен, документ будет потерян. Поэтому, прежде чем вы удалите машину, вы должны перенести с нее все основные осколки.

В этом примере мы попытаемся перенести данные с узла * rethink2 *, чтобы оставить * rethink1 * в качестве единственного узла.

Войдите в административную оболочку RethinkDB на * rethink1 *:

rethinkdb admin

Во-первых, давайте перечислим осколки (группы документов), за которые * rethink2 * отвечает:

ls rethink2

Ваш вывод должен выглядеть примерно так:

machine 'rethink2' bc2113fc-efbb-4afc-a2ed-cbccb0c55897
in datacenter 00000000-0000-0000-0000-000000000000

hosting 1 replicas from 1 tables
table                                 name        shard                                               primary
b91fda27-a9f1-4aeb-bf6c-a7a4211fb674  testShards  -inf-+inf                                           yes

Это показывает, что * rethink2 * отвечает за основной фрагмент таблицы с идентификатором «bdfceefb-5ebe-4ca6-b946-869178c51f93». Далее мы переместим этот осколок в * rethink1 *. Это называется закреплением:

pin shard test.testShards -inf-+inf --master rethink1

Общая форма команды:

pin shard  --master

Если вы теперь запустите + ls rethink1 +, вы увидите, что осколок перенесен на эту машину. Как только каждый осколок был перемещен из * rethink2 * в * rethink1 *, вы должны выйти из оболочки администратора:

exit

Теперь безопасно остановить RethinkDB на нежелательном сервере. Важно: запустите это на машине, которую вы хотите remove. В этом примере мы запустим это на * rethink2 *:

sudo service rethinkdb stop

В следующий раз, когда вы посетите веб-консоль управления, RethinkDB отобразит ярко-красное предупреждение. Нажмите * Решить проблемы *.

изображение: https: //assets.digitalocean.com/articles/RethinkDB_Ubuntu14/4.png [список проблем RethinkDB]

Если показанная проблема похожа на описанную выше, а основные обязанности отсутствуют, нажмите * Навсегда удалить *. Это удалит машину из кластера. Если в нем перечислены основные обязанности, включите RethinkDB (+ sudo service rethinkdb start +) и убедитесь, что вы перенесли все первичные фрагменты с этого сервера.

Примечание. Если вы попытаетесь повторно добавить компьютер в кластер, вы увидите сообщения о компьютере-зомби. Вы можете удалить каталог данных, чтобы исправить эту проблему:

sudo rm -r /var/lib/rethinkdb/cluster_instance/
sudo service rethinkdb restart
Related