Построение High Performance Cluster на DB2
Date December 30th, 2009 Author Vitaly Agapov
В этой статье я опишу процесс построения кластера DB2 с разделением нагрузки. Описывать процесс я буду для своего случая, в котором необходимо построить кластер на двух компьютерах. Один работает под управлением CentOS 5, другой – под Ubuntu 9.10. Но принципиальных отличий для других Линуксов быть не должно.
Поддержка механизма load-balancing реализована в самом ПО DB2 Enterprise или Workgroup Edition (в бесплатном Express Edition эта поддержка отсутствует). А это означает, что кроме дистрибутива DB2 никакого дополнительного софта нам не потребуется. Встроенный кластер работает по принципу shared nothing, то есть серверы в составе кластера не имеют одновременного доступа к одним и тем же данным, а каждый из серверов работает со своим отдельным разделом (partition) БД. Поэтому весь этот механизм (характерный именно для DB2) носит название partitioning. DB2 позволяет разделять базы данных на разделы (partitions или nodes), располагающиеся на разных серверах. Запросы по извлечению или изменению данных автоматически разбиваются на под-запросы и выполняются параллельно на соответствующих серверах. Для клиента эта процедура происходит прозрачно — обращение происходит к любому из серверов, который в свою очередь дальше занимается обработкой запроса и координированием под-запросов ко всем остальным узлам в кластере.
Если все запросы клиентов направляются на один сервер в кластере, то нагрузка на нем будет выше, чем на остальных.
Стоит, наверное, сделать небольшую ремарку: partitioning в DB2 никак не влияет на общую отказоустойчивость системы и даже ы целом ухудшает её из-за увеличения точек отказа. Для повышения надёжности следует обратить внимание на такие вещи, как HADR, hearbeat, LifeKeeper, Red Hat Cluster Suite и т.д. Но сейчас не об этом…
DB2 Partitioning обладает целым рядом достоинств и недостатков. Из достоинств стоит отметить:
- масштабируемость (при необходимости в кластер легко добавляются новые серверы);
- можно легко управлять кластером, выводить из работы тот или иной сервер (просто монтируя разделы на другие серверы и меняя конфигурацию db2nodes.cfg с рестартом СУБД);
- не требуется загружать процессоры серверов кластера задачами по репликации данных между серверами (любым кластерным софтом вроде drbd).
Недостатки:
- добавление новых серверов требует ручной переразбивки данных (хотя можно с самого начала предусмотреть возможные расширения);
- неравномерное распределение нагрузки (может потребоваться некий механизм распределения запросов между серверами или ручное перераспределение партиций между серверами кластера).
Установка софта
В нашем примере будет использоваться версия DB2 Enterprise 9.5. Хотя особых отличий в процедуре для версии 9.1 я не обнаружил.
Устанавливаем DB2 с помощью запуска скрипта db2_install из распакованного дистрибутива. Если есть графическая оболочка, то можно, конечно, воспользоваться графической Java-based утилитой DB2 Setup. Но это не наш случай. Производим эту процедуру на всех узлах будущего кластера. В моём случае их два, и я буду называть их host1 и host2. Также сразу устанавливаем файл лицензии.
1.
./db2_install.sh
2.
/opt/ibm/db2/V9.5/adm/db2licm -a <path>/db2exp_uw.lic
Для кластерной архитектуры понадобится единый расшаренный дисковый раздел. Что это будет – дисковый массив или раздел на одной из нод, расшаренный по NFS, GFS, SSHFS или чем-то подобным – совершенно не важно. Мы в нашем примере будем использовать NFS. За поддержку NFS на сервере отвечает демон rpc.statd, управлять им можно с помощью скриптов в /etc/init.d (в Red Hat это nfslock, в Ubuntu это nfs-common). Итак, на хосте, откуда будем расшаривать раздел (host1), делаем следующее:
1.
mkdir
/db2sharedhome
2.
echo
"/db2sharedhome *(rw,sync,no_root_squash)"
>> /etc/exports
3.
/usr/bin/exportfs -r
Для проверки расшаренного раздела можно использовать команду showmount -e host1.
А теперь на всех узлах монтируем эту директорию в /db2home:
1.
mkdir
/db2home
2.
echo
"host1:/db2sharedhome /db2home nfs rw,timeo=7,hard,intr,bg,suid,lock"
>> /etc/fstab
3.
mount
/db2home
Как вариант, можно использовать autofs, но это тема для отдельной статейки.
На следующем шаге (если мы не пользовались для установки DB2 графической утилитой DB2 Setup) надо создать необходимых пользователей и группы. Пользователей всего три: владелец инстанса, служебный аккаунт для выполнения хранимых процедур и администратор DAS (DB2 Administration Server):
01.
groupadd -g 990 db2iadm1
02.
groupadd -g 991 db2fadm1
03.
groupadd -g 992 dasadm1
04.
useradd
-u 1001 -g db2iadm1 -d /db2home/db2inst1 db2inst1
05.
useradd
-u 1002 -g db2fadm1 -d /db2home/db2fenc1 db2fenc1
06.
useradd
-u 1003 -g dasadm1 -d /home/dasusr1 dasusr1
07.
passwd
db2inst1
08.
passwd
db2fenc1
09.
passwd
dasusr1
Далее потребуется обеспечить между всеми узлами кластера Remote Shell. Можно использовать ssh с публичными ключами, можно – rsh с файлом .rhosts. В общем, по желанию и по обстановке. Останавливаться на этом не буду.
Настройка
После всех подготовительных операций можно приступать к созданию инстанса. Для этого служит утилита db2icrt:
1.
/opt/ibm/db2/V9.5/instance/db2icrt -s ese -u db2fenc1 db2inst1
Само собой, если у нас дистрибутив WSE, то ключом -s указываем wse.
Если все нормально, то двигаемся дальше. Надо в файле /etc/services на всех узалх прописать порты для DB2:
1.
db2c_db2inst1 50000/tcp
2.
DB2_db2inst1 60000/tcp
3.
DB2_db2inst1_1 60001/tcp
4.
DB2_db2inst1_2 60002/tcp
5.
DB2_db2inst1_END 60003/tcp
Затем указываем в конфигурации DBM какой порт использовать:
1.
sudo
su
- db2inst1
2.
db2 update dbm cfg using SVCENAME db2c_db2inst1
3.
db2SET DB2COMM=tcpip
Указываем транспорт для Remote Shell (в зависимости от того что выбрали ранее):
1.
db2set DB2RSHCMD=/usr/bin/
ssh
Теперь самое важное: надо прописать все ноды в файле db2nodes.cfg (в /db2home/db2inst1/sqllib/):
1.
0 host1 0
2.
1 host2 0
Здесь первая колонка – номер ноды, вторая колонка – её ip-адрес или hostname (кстати, надо не забыть прописать все хостнеймы на всех нодах в /etc/hosts) и третья колонка – номер ноды на данном хосте.
Теоретически всё. Осталось сделать
1.
db2start
Настройка tablespaces
Сразу стоит напомнить о двух полезных в распределённой базе командах: rah и db2_all. rah позволяет выполнить команду на всех физических узлах, входящих в кластер (то есть прописанных в db2nodes.cfg на том сервере, где команда непосредственно запускается). db2_all делает то же самое, но для всех логических узлов, то есть если на одном сервере располагается несколько DB2-нод, то команда будет выполнена для них всех.
Создадим теперь нашу базу данных. Назовём её test и решим, что храниться файлы базы будут в /database.
1.
db2
"CREATE DATABASE test AUTOMATIC STORAGE NO ON '/database' ALIAS test USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM PAGESIZE 4096"
2.
db2
connect
to
test
3.
db2 list tablespaces
Выполнив эти команды, мы увидим стандартные тейблспейсы, созданные на обоих нодах кластера. Причём на разных нодах набор тейблспейсов будет разный – SYSCATSPACE создаётся только на главной ноде:
01.
db2inst1@host1: db2 connect to
test
02.
Database Connection Information
03.
Database server = DB2/LINUXX8664 9.5.0
04.
SQL authorization ID = DB2INST1
05.
Local database
alias
= TEST
06.
db2inst1@host1: db2 list tablespaces
07.
Tablespaces
for
Current Database
08.
Tablespace ID = 0
09.
Name = SYSCATSPACE
10.
Type = System managed space
11.
Contents = All permanent data. Regular table
12.
space.
13.
State = 0x0000
14.
Detailed explanation:
15.
Normal
16.
Tablespace ID = 1
17.
Name = TEMPSPACE1
18.
Type = System managed space
19.
Contents = System Temporary data
20.
State = 0x0000
21.
Detailed explanation:
22.
Normal
23.
Tablespace ID = 2
24.
Name = USERSPACE1
25.
Type = Database managed space
26.
Contents = All permanent data. Large table space.
27.
State = 0x0000
28.
Detailed explanation:
29.
Normal
30.
DB21011I In a partitioned database server environment, only the table spaces
31.
on the current node are listed.
32.
33.
db2inst1@host2: db2 connect to
test
34.
Database Connection Information
35.
Database server = DB2/LINUXX8664 9.5.0
36.
SQL authorization ID = DB2INST1
37.
Local database
alias
= TEST
38.
db2inst1@host2: db2 list tablespaces
39.
Tablespaces
for
Current Database
40.
Tablespace ID = 1
41.
Name = TEMPSPACE1
42.
Type = System managed space
43.
Contents = System Temporary data
44.
State = 0x0000
45.
Detailed explanation:
46.
Normal
47.
Tablespace ID = 2
48.
Name = USERSPACE1
49.
Type = Database managed space
50.
Contents = All permanent data. Large table space.
51.
State = 0x0000
52.
Detailed explanation:
53.
Normal
54.
DB21011I In a partitioned database server environment, only the table spaces
55.
on the current node are listed.
По умолчанию таблицы будут создаваться в табличном пространстве USERSPACE1, распределенном между всеми нодами. Но мы можем создавать и свои тейблспейсы, занимающие любой набор нод. Например, можно сделать отдельное табличное пространство, располагающееся только на одной из нод кластера. Для начала создадим свое табличное пространство MULTISPACE на обеих нодах:
1.
db2_all 'typeset -Z4 DB2NODE;
mkdir
-p $DB2NODE/TEST/MULTISPACE'
2.
db2 connect to
test
3.
db2 "create tablespace MULTISPACE
in
IBMDEFAULTGROUP pagesize 4k MANAGED BY SYSTEM
4.
using ('/db2db/db2inst1/NODE000 $N /TEST/MULTISPACE') on dbpartitionnum (0)
5.
using ('/db2db/db2inst1/NODE000 $N /TEST/MULTISPACE') on dbpartitionnum (1)
6.
extentsize 8 prefetchsize 32"
Здесь мы создали директории для табличного пространства на обеих нодах, а затем подключились к базе и создали табличное пространство MULTISPACE в стандартной группе партиций (partition group) IBMDEFAULTGROUP на обеих партициях. Переменные $DB2NODE и $N используются для автоматической подстановки номера ноды и партиции соответственно (не забываем, что на одной ноде может быть несколько партиций). сами эти значения берутся из файла db2nodes.cfg.
Теперь для полноты картины создадим табличное пространство SINGLRSPACE на одной из нод (например, host1):
1.
mkdir
/db2db/db2inst1/NODE0001/TEST/SINGLESPACE
2.
db2 connect to
test
3.
db2
"create database partition group single_0 on dbpartitionnum (0)"
4.
db2 "create tablespace SINGLESPACE
in
single_0 pagesize 4k MANAGED BY SYSTEM
5.
using ('/db2db/db2inst1/NODE0000/TEST/SINGLESPACE') on dbpartitionnum (0)
6.
extentsize 8 prefetchsize 32"
Здесь мы создали директорию под табличное пространство на сервере, создали partition group, а в нём уже создали табличное пространство, располагающееся целиком на нулевой ноде.
Теперь мы сможем создавать таблицы в любом из этих тейблспейсов:
1.
db2
"CREATE TABLE testtable ( testfield INTEGER NOT NULL) IN MULTISPACE"
На сегодня – всё!
Tags: cluster, DB2, Linux
Category:
DB2 |
No comments »