Построение High Performance Cluster на DB2

Date December 30th, 2009 Author Vitaly Agapov

db2 В этой статье я опишу процесс построения кластера DB2 с разделением нагрузки. Описывать процесс я буду для своего случая, в котором необходимо построить кластер на двух компьютерах. Один работает под управлением CentOS 5, другой – под Ubuntu 9.10. Но принципиальных отличий для других Линуксов быть не должно.
Поддержка механизма load-balancing реализована в самом ПО DB2 Enterprise или Workgroup Edition (в бесплатном Express Edition эта поддержка отсутствует). А это означает, что кроме дистрибутива DB2 никакого дополнительного софта нам не потребуется. Встроенный кластер работает по принципу shared nothing, то есть серверы в составе кластера не имеют одновременного доступа к одним и тем же данным, а каждый из серверов работает со своим отдельным разделом (partition) БД. Поэтому весь этот механизм (характерный именно для DB2) носит название partitioning. DB2 позволяет разделять базы данных на разделы (partitions или nodes), располагающиеся на разных серверах. Запросы по извлечению или изменению данных автоматически разбиваются на под-запросы и выполняются параллельно на соответствующих серверах. Для клиента эта процедура происходит прозрачно — обращение происходит к любому из серверов, который в свою очередь дальше занимается обработкой запроса и координированием под-запросов ко всем остальным узлам в кластере.

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

02fig08

Стоит, наверное, сделать небольшую ремарку: 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) и третья колонка – номер ноды на данном хосте.

Теоретически всё. Осталось сделать

Настройка 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: , ,
Category: DB2 | No comments »

Comments

Leave a comment

 Comment Form 

Rich Text Editor, comment