четверг, 18 апреля 2013 г.

Пост 23. Инсталяция Oracle NoSQL Database.

Доброго времени суток! Наверное давно было пора написать о том как инсталировать NoSQL базу данных производства Oracle. Официальнцую документацию можно найти здесь. Документация написана качественно и основательно и должна являться первоисточником для проверки всех догадок и теорий касаемо процесса инсталяции Oracle NoSQL Database. Здесь же я постараюсь изложить квинтэсценцию своего опыта. Итак, для инсталяции мною были взяты 10 серверов. 9 из них были отданы под базу данных, 1 под сервер приложения и management сервер (прим. на этих серверах так же установлен hadoop - отсюда и названия: cdh, datanode1...).

На подготовительном этапе вам предстоит сделать следующее:
1) Обеспечить беспарольный ssh между серверами кластера (не обязательно - но удобно с точки зрения администрирования). В интернете оооочень много статей на данный счет я обычно делаю так:

создаю файл servers.list в который помещаю IP всех серверов с которыми я хочу установить беспарольное соединение, а затем использую нехитрые команды, представленные ниже:

# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
# cat ~/servers.list | while read i ; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@"$i" ; done

2) Скачать и установить pdsh.
3) Я создал для простоты работы я создал в /usr/bin/ файл pdsh_hdfs (как упоминалось ранее здесь так же установлен hadoop, отсюда и название), следующего содержания:
#!/bin/bash
pdsh -w root@192.168.1.[110-120] $*

Теперь команда pdsh_hdfs применяется ко всем серверам кластера.

Теперь мы готорвы к процессу инсталяции:

1) Скачиваем дистрибутив Oracle NoSQL Database и раскидываем его на все сервера 
2) Распаковываем его на всех серверах и создаем переменную окружения $KVHOME, которая указывает на папку с распакованным дистрибутивом (в моем случае на всех серверах это было 
/home/oracle/nosql/kv-2.0.26).
3) Если у нас была инсталяция до этого "подчищаем" ее:
for i in `seq 1 9`; do ssh datanode$i rm -rf $KVHOME/kvroot; done;
for i in `seq 1 9`; do ssh datanode$i "pkill -f 'java -jar'"; done;
4) Создаем папки на всех серверах для базы данных:
do ssh datanode$i mkdir $KVHOME/kvroot; done;
5) Oracle NoSQL Database очень чувствительна к временному расхождению внутри серверов кластера. Если расхождение больше 2 секунд - база данных не раздеплоится.
Используем команду ntpdate, для синхронизации. Я засунул в crontab временую синхронизацию:
 pdsh_hdfs "echo "*/1 * * * * ntpdate ntp.server.my.company.com" >> /var/spool/cron/root"

Прим.: ntpdate не работает поверх proxy (как было в моем случае) - поэтому я использовал ntp server моей компании. Если же есть непроксеванный интеренет - можно использовать публичные ntp сервера.

6) Далее необходимо описать начальную конфигурацию базы данных (создать bootconfig) на каждом из серверов.
Один сервер сделаем admin сервером (т.е.с него мы в последствии и будем осуществлять админские операции):

ssh datanode1 "java -jar /home/oracle/nosql/kv-2.0.26/lib/kvstore.jar makebootconfig -root /home/oracle/nosql/kv-2.0.26/kvroot -host datanode1 -port 5011 -admin 5001 -harange 8100,8101 -config conf1.xml"; done;

7) Создаем конфиги на всех остальных серверах:
for i in `seq 2 9`; do ssh datanode$i "java -jar /home/oracle/nosql/kv-2.0.26/lib/kvstore.jar makebootconfig -root /home/oracle/nosql/kv-2.0.26/kvroot -host datanode$i -port 501$i -harange 8${i}00,8${i}01 -config conf1.xml"; done;

Здесь мне следует остановится и дать некие пояснения по поводу портов указанных в конфигах:
registry port - основной порт, на который "садится" база и по которому она доступна для клиента.
Admin Console port - порт для админконсоли.
HA Range - порты для коммуникации между собой (hand for "replication) узлов кластера.

Эта команда создает конфиг, который будет использоваться на следующем шаге:
<config version="2">
  <component name="params" type="bootstrapParams" validate="true">
    <property name="adminHttpPort" value="0" type="INT"/>
    <property name="hostingAdmin" value="false" type="BOOLEAN"/>
    <property name="storeName" value="FilDB" type="STRING"/>
    <property name="storageNodeId" value="4" type="INT"/>
    <property name="memoryMB" value="2091" type="INT"/>
    <property name="hostname" value="datanode4" type="STRING"/>
    <property name="numCPUs" value="2" type="INT"/>
    <property name="rootDir" value="/home/oracle/nosql/kv-2.0.26/kvroot" type="STRING"/>
    <property name="haPortRange" value="8400,8401" type="STRING"/>
    <property name="registryPort" value="5014" type="INT"/>
  </component>
  <component name="mountPoints" type="bootstrapParams" validate="false">
  </component>
</config>

8) Стартуем на всех серверах экземпляр, используя конфиг, созданный на предыдущем шаге:
for i in `seq 1 9`; do ssh datanode$i "nohup java -jar /home/oracle/nosql/kv-2.0.26/lib/kvstore.jar start -root /home/oracle/nosql/kv-2.0.26/kvroot -config conf1.xml &" && echo $i ; done;

9) Теперь у нас есть материал для конфигурации базы данных (нечто вроде пластилина из которого мы будем лепить что то), создании топологии

Если зайти на datanode1:5001 (админский порт - можно увидеть "пустую" топологию).

Теперь приступим к конфигурации нашей БД. 
Тут у меня будет просьба к читателю пожалуйста освещите в памяти архитектуру БД Oracle NoSQL и понятийный аппарат, который будет использоваться
Из 9 серверов "так и хочется" создать базу данных состоящую из трех шардов с репликационным фактором 3 (шард будет содержать по 3 копии данных).
Сказано - селано.

10) Переходим на сервер, который был скорфигурирован как admin (в моем случае это datanode1)
[root@cdh ~]# ssh datanode1
Last login: Thu Apr 18 13:50

Здесь я создал alias, позволяющий мне одной командой запускать admin консоль:
alias kvadmin='java -jar /home/oracle/nosql/kv-2.0.26/lib/kvstore.jar runadmin -port 5011 -host datanode1'

[root@datanode1 ~]# kvadmin
kv->

11) Создаем базу данных:
kv-> configure -name "FilDB"

12) создаем дата центр, указываем репликационный фактор:
kv-> plan deploy-datacenter -name "FilDC" -rf 3 -wait

13) Создаем storage node, после чего на ней же деплоим админ сервис:
kv-> plan deploy-sn -dc dc1 -host datanode1 -port 5011 -wait
kv-> plan deploy-admin -sn sn1 -port 5001 -wait

14) Создаем остальные storage node
kv-> plan deploy-sn -dc dc1 -host datanode2 -port 5012 -wait
kv-> plan deploy-sn -dc dc1 -host datanode3 -port 5013 -wait
kv-> plan deploy-sn -dc dc1 -host datanode4 -port 5014 -wait
kv-> plan deploy-sn -dc dc1 -host datanode5 -port 5015 -wait
kv-> plan deploy-sn -dc dc1 -host datanode6 -port 5016 -wait
kv-> plan deploy-sn -dc dc1 -host datanode7 -port 5017 -wait
kv-> plan deploy-sn -dc dc1 -host datanode8 -port 5018 -wait
kv-> plan deploy-sn -dc dc1 -host datanode9 -port 5019 -wait

Заглянем после этого в нашу web админ-консоль:


Видим, что "пластелин" приобрел более конкретные очертания:)

15) Создаем пул серверов и "закидываем" туда все 9 нод

kv-> pool create -name FilPool
kv-> pool join -name FilPool -sn sn1
kv-> pool join -name FilPool -sn sn2
kv-> pool join -name FilPool -sn sn3
kv-> pool join -name FilPool -sn sn4
kv-> pool join -name FilPool -sn sn5
kv-> pool join -name FilPool -sn sn6
kv-> pool join -name FilPool -sn sn7
kv-> pool join -name FilPool -sn sn8
kv-> pool join -name FilPool -sn sn9

16) После этого создаем топологию, где указываем колличество партиций (которое не может быть изменено), а так же пул серверов, который бует использоваться.

kv-> topology create -name topo -pool FilPool -partitions 300

17) Конечная команда, котрой развертываем наш пул:

kv-> plan deploy-topology -name topo -wait

Теперь еще раз заходим в web консоль и смотрим, на топологию нашей базы:
Ура! База инсталирована. Если будут вопросы - пишите! В дальнейшем мы проведем несколько экспериментов!

Комментариев нет:

Отправить комментарий