IT-Service - Настройка кластера PostgreSQL в Ubuntu
Понедельник, 24 Сентябрь 2012 04:47

Настройка кластера PostgreSQL в Ubuntu

Автор 
Оцените материал
(2 голосов)

Введение

Цель: Построить отказоустойчивый кластер базы данных для 1С на основе PostgreSQL

Что мы имеем: 2 одинаковых сервера с конфигурацией:

Дисковый массив - 18 гиг для системы, 18 гиг для файл подкачки, ~ 280 гиг для базы данных
Оперативная память - 8 гиг
Процессор - 2 * AMD Apteron 2.2 ггц

dbnode1 - имя 1 узла кластера

dbnode2 - имя 2 узла кластера

 

После установки базовой системы Ubuntu, сетевые интерфейсы будут выглядеть так

dbnode1:

eth0 192.168.30.52/24 gw 192.168.30.1
eth1 10.0.0.1/24

dbnode2:

eth0 192.168.30.72/24 gw 192.168.30.1
eth1 10.0.0.2/24

Настройка Ubuntu

Послу установки необходимо обновить систему

aptitude update
aptitude full-upgrade

И установить необходимые для работы пакеты

apt-get install mc ssh console-cyrillic libxslt1.1 drbd8-utils heartbeat-2 libreadline5

Настройка DRBD

Перед настройкой DRBD нужно убедится, что никаких разделов на 280 гиговом разделе (sdb не создано) Посмотреть можно командой fdisk -l /dev/sdb

root@dbnode2:~# fdisk -l /dev/sdb

Disk /dev/sdb: 293.9 GB, 293995544576 bytes
255 heads, 63 sectors/track, 35742 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

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

dd if=/dev/zero of=/dev/sdb bs=1M count=1

Конфиг DRBD /etc/drbd.conf

Приводим его к такому виду на обоих узлах кластера

resource r0 {
    protocol C;
    startup {
    wfc-timeout 20;
    degr-wfc-timeout 20;
        }
    net {
    after-sb-1pri violently-as0p;
    after-sb-2pri violently-as0p;
    rr-conflict violently;
    }
    syncer {
        rate 100M;
    }
    on dbnode1
    {
        device /dev/drbd0;
        disk /dev/sdb;
        address 192.168.30.52:7792;
        meta-disk internal;
    }
    on dbnode2
    {
        device /dev/drbd0;
        disk /dev/sdb;
        address 192.168.30.72:7792;
        meta-disk internal;
    }
}

Чтобы избежать проблем с разименовыванием узлов кластера, необходимо добавить записи о dbnode1 и dbnode2 в dns-сервер

Или прописать в файл /etc/hosts

127.0.0.1 localhost localhost.localdomain
192.168.30.52 dbnode1 dbnode1.youdomen.local
192.168.30.72 dbnode2 dbnode2.youdomen.local

Запуск синхронизации

Останавливаем службу DRBD на обоих узлах кластера

/etc/init.d/drbd stop

Выполняем инициализацию дисков в DRBD на обоих узлах кластера.

modprobe drbd
drbdadm create-md all
/etc/init.d/drbd start

Выбирем один главный узел, с которого будем выполнять синхронизацию и выполним на нем команду:

drbdsetup /dev/drbd0 primary -o

Дальше пойдет синхронизация дисков, будет она идти очень долго. 200 гигабайт, часа за 3

Смотреть за процессом можно одним из удобных вам способом. Третий способ удобнее всего

/etc/init.d/drbd status
cat /proc/drbd
watch cat /proc/drbd

После синхронизации необходимо отформатировать диск.

Форматирование

Теперь устройства sdb не используем, иначе синхронизация не будет работать. Используем только устройство drbd

mke2fs -j /dev/drbd0

Heartbeat

Создадим каталог /cluster на обоих узлах кластера

mkdir /cluster

Работаем с 3 файлами конфигурации

/etc/ha.d/authkeys — файл авторизации кластеров

/etc/ha.d/ha.cf — файл настройка кластера

/etc/ha.d/haresources — файл с настройками ресурсов кластера

/etc/ha.d/authkeys

/etc/ha.d/authkeys — одинаковый на обоих узлах

auth 1
1 crc

/etc/ha.d/haresources

/etc/ha.d/haresources — одинаковый на обоих узлах (даже имя компьютера, должно быть одно и то же, опеределяет, кто будет главный)

dbnode1 drbddisk::r0 IPaddr::192.168.30.202/24/eth0/ Filesystem::/dev/drbd0::/cluster::ext3 pgsql cron
dbnode1 MailTo::7912XXXXXXX@sms.ural.mts.ru MailTo::7912XXXXXXX@sms.ural.mts.ru

/etc/ha.d/ha.cf

/etc/ha.d/ha.cf — изменяем ип для каждого нода. Ип прописываем нода, которого будем пинговать (на нод1 пишем ип нод2 и наоборот)

ucast eth0 192.168.30.52
node dbnode1
node dbnode2
warntime 3
deadtime 10
initdead 30
keepalive 2

/etc/ha.d/resource.d/pgsql

/etc/ha.d/resource.d/pgsql - Скрипт для запуска службы postgresql (делаем на обоих узлах)

touch /etc/ha.d/resource.d/pgsql
chmod +x /etc/ha.d/resource.d/pgsql

И вставить этот код в него

nano /etc/ha.d/resource.d/pgsql
#!/bin/sh -e

PGVERSION=8.3.8
PGMAJORVERSION=`echo "$PGVERSION" | sed 's/^\([0-9]*\.[0-9]*\).*$/\1/'`
PGENGINE=/usr/bin
PGPORT=5432
PGDATA=/cluster/var/lib/pgsql/data
LC_ALL=ru_RU.UTF-8
SU=su
PGLOG=/cluster/var/lib/pgsql/pgstartup.log
SERVNAME=postgresql
NAME=postgresql

start(){
  $SU -s /bin/sh -l postgres -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null
  sleep 2
  pid=`pidof -s "$PGENGINE/postmaster"`
  if [ $pid ] && [ -f "$PGDATA/postmaster.pid" ]
  then
    if [ -d /var/lock/subsys ] ; then 
      touch /var/lock/subsys/${NAME}
    else
      mkdir -p /var/lock/subsys
      touch /var/lock/subsys/${NAME}
    fi
    head -n 1 "$PGDATA/postmaster.pid" > "/var/run/postmaster.${PGPORT}.pid"
  fi
}

stop(){
  $SU -l -s /bin/sh -c "$PGENGINE/pg_ctl stop -D $PGDATA -m fast" postgres > /dev/null 2>&1 < /dev/null
  rm -f /var/run/postmaster.${PGPORT}.pid > /dev/null 2>&1
  rm -f /var/lock/subsys/${NAME} > /dev/null 2>&1
  rm -f $PGDATA/postmaster.pid > /dev/null 2>&1
  echo
}

restart(){
  stop
  start
}

reload(){
  if [ -e /var/lock/subsys/${NAME} ] ; then
    $SU -l -s /bin/sh -c "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" postgres > /dev/null 2>&1 < /dev/null
  fi
}

status() {
  $SU -l -s /bin/sh -c "$PGENGINE/pg_ctl status -D '$PGDATA' -s" postgres
}

case "$1" in
  start)
    echo "*  Starting PostgreSQL server ..."
    start
    return 0
    ;;
  stop)
    echo "*  Stoping service PostgreSQL ..."
    stop
    return 0
    ;;
  status)
    status
    return 0
    ;;
  restart)
    restart
    return 0
    ;;
  reload|force-reload)
    reload
    return 0
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
    exit 1
esac
exit 0

PostgreSQL

Установка PostgreSQL

Скачиваем и устанавливаем postgresql

На обоих узлах кластера

mkdir /root/postgresql
cd /root/postgresql
wget ftp://updates.etersoft.ru/pub/Etersoft/Postgre@Etersoft/stable/x86_64/Ubuntu/10.04/libpq5.2-8.4eter_8.4.4-eter1.1ubuntu_amd64.deb
wget ftp://updates.etersoft.ru/pub/Etersoft/Postgre@Etersoft/stable/x86_64/Ubuntu/10.04/postgresql-8.4eter-contrib_8.4.4-eter1.1ubuntu_amd64.deb
wget ftp://updates.etersoft.ru/pub/Etersoft/Postgre@Etersoft/stable/x86_64/Ubuntu/10.04/postgresql-8.4eter-server_8.4.4-eter1.1ubuntu_amd64.deb
wget ftp://updates.etersoft.ru/pub/Etersoft/Postgre@Etersoft/stable/x86_64/Ubuntu/10.04/postgresql-8.4eter_8.4.4-eter1.1ubuntu_amd64.deb
dpkg -i postgresql-8.3*

Убераем из автозапуска службы, их будет запускать heartbeat

update-rc.d -f postgresql remove
update-rc.d -f cron remove

Настройка системы для запуска postgresql

Значение 8589934592 - это объем оперативной памяти в байтах

  • Настройка файла /etc/sysctl.conf
echo "kernel.shmmax = 8589934592" >> /etc/sysctl.conf
echo "kernel.shmall = 8589934592" >> /etc/sysctl.conf
sysctl -p
  • Проверяем, примонтирован ли каталог /cluster на главном узле кластера
mount

Если в выводе есть такая строчка, значит каталог уже примонтирован

/dev/drbd0 on /cluster type ext3 (rw)

Если нету, то на главном узле кластера выполняем команду

mount /dev/drbd0 /cluster

На главном узле кластера слудующие действия

  • Переносим каталок /var/lib/pgsql в каталог /cluster, который синхронизируется по сети
mkdir /cluster/var/lib/pgsql -p
chown postgres:postgres /cluster/var/lib/pgsql -R
cp -R /var/lib/pgsql /cluster/var/lib/pgsql

На обоих узлах кластера

Заходим в /etc/init.d/postgresql и приводим к такому виду 2 переменные

PGDATA=/cluster/var/lib/pgsql/data

...

PGLOG=/cluster/var/lib/pgsql/pgstartup.log

На главном узле кластера

Запускаем службу

/etc/init.d/postgresql start
  • Создаем пользователя и пароль PostgreSQL

Заходим в файл /cluster/var/lib/pgsql/data/pg_hba.conf

Ищем строчку:

host         all         all         0.0.0.0/0         md5

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

host         all         all         0.0.0.0/0         trust

Перезапускаем службу

/etc/init.d/postgresql restart

Теперь создаем пользователя

psql -h localhost -U postgres template1
template1=# ALTER USER postgres WITH PASSWORD 'secret';

Мы только что создали пользователя postgres с паролем secret

Теперь необходимо закрыть доступ всем без авторизации, для этого заходим в файл /var/lib/pgsql/data/pg_hba.conf

Ищем строчку:

host         all         all         0.0.0.0/0         trust

Меняем ее на такую, для того чтобы пускало только с авторизацией

host         all         all         0.0.0.0/0         md5

Перезапускаем службу

/etc/init.d/postgresql restart

Система готова к работе

Перезагружаемся и проверяем все ли работает

ping 192.168.30.202

Обмен пакетами с 192.168.30.202 по 32 байт:
Ответ от 192.168.30.202: число байт=32 время<1мс TTL=64
Ответ от 192.168.30.202: число байт=32 время<1мс TTL=64
Ответ от 192.168.30.202: число байт=32 время<1мс TTL=64
Ответ от 192.168.30.202: число байт=32 время<1мс TTL=64
Статистика Ping для 192.168.30.202:
   Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
Приблизительное время приема-передачи в мс:
   Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

По ssh заходим на 192.168.30.52 и проверяем что примонтирован каталог /cluster

mount
/dev/drbd0 on /cluster type ext3 (rw)

Смотрим ifconfig, и проверяем что появился интерфейс eth0:0

eth0:0    Link encap:Ethernet  HWaddr 00:40:F4:98:77:C5  
          inet addr:192.168.30.201  Bcast:192.168.30.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:177 Base address:0x4c00 

И смотрим что запущем процесс postgresql

ps ax |grep postmaster

Решение проблем

  • 1с спрашивает английскую локаль, но зовет он её неправильным именем - "en_US", и возникает ошибка: "lc_messages en_US"

А в убунте нет локали с таким именем, поэтому мы сделаем символьные ссылки на правильные имена На обоих узлах кластера:

ln -s /usr/lib/locale/en_US.utf8/ /usr/lib/locale/en_US
ln -s /usr/share/locale/en_US.UTF-8/ /usr/share/locale/en_US
Прочитано 7847 раз Последнее изменение Вторник, 02 Октябрь 2012 11:01
Другие материалы в этой категории: « Ubuntu Tweak Терминальный сервер FreeNX »
Авторизуйтесь, чтобы получить возможность оставлять комментарии