среда, 19 октября 2011 г.

четверг, 17 февраля 2011 г.

MySQL из исходников на Ubuntu


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

Сперва создаем/добавляем нового пользователя:
groupadd mysql
useradd -g mysql mysql

Если есть лишнее поправьте, но мне понадобилось все:
apt-get install make build-essential g++ ncurses-dev
apt-get install nscd
apt-get install c++

Выбираем исходники, качаем, и ...:
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.52.tar.gz/from/http://mirrors.dedipower.com/www.mysql.com/
mv ./index.html ./mysql-5.1.52.tar.gz
tar xzvf mysql-5.1.52.tar.gz
cd mysql-5.1.52

Подсмотреть дополнительные опции/настройки можно так:
./configure --help > configure-man
cat configure-man|less

Мне хватило этого:
./configure \
--sysconfdir=/NFS/mysql/conf \
--enable-assembler \
--with-mysqld-ldflags=-all-static \
--prefix=/NFS/mysql \
--localstatedir=/NFS/mysql/db \
--with-unix-socket-path=/NFS/mysql/socket/mysqld.sock

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

Полный путь к сокету должен быть следующим /var/run/mysqld/mysqld.sock
Некоторые люди не рекомендуют изменять путь к сокету, так как многие программы работаюшие с сокетами ожидают найти сокет именно по этому адресу.
Но я не послушался и сделал так, верно или нет, я не знаю:
mkdir -p /var/run/mysqld
ln -s /NFS/mysql/socket/mysqld.sock /var/run/mysqld/mysqld.sock

Продолжаем:
make
make install

Продолжаем, по прежнему находясь в папке с исходниками:
scripts/mysql_install_db

Тут обратите внимание на путь, который указали здесь:
--localstatedir=/NFS/mysql/db

И делаем так:
chown -R mysql /NFS/mysql/db
chgrp -R mysql /NFS/mysql

Манипуляция с конфигом, правим по необходимости:
mkdir -p /NFS/mysql/conf
cp support-files/my-medium.cnf /NFS/mysql/conf/my.cnf
ln -s /NFS/mysql/conf/my.cnf /etc/my.cnf

И запускаем!
/NFS/mysql/bin/mysqld_safe --user=mysql &

Проверяем:
ps ax|grep mysql

Мне этого было достаточно и у меня все заработало.

Обязательно устанавливаем пароль:
/NFS/mysql/bin/mysqladmin -u root password 'new-password'

Обратиие внимание, что команду выполняю с полным путем:
/NFS/mysql/bin/mysqladmin

Если доставляет дискомфорт, то либо симлинки, либо обьявить /NFS/mysql/bin в глобальной переменной.
Этим вопросом, я не задавался, да и не нужно оно мне))))

ЗЫ: Пока все, жду критики и пожеланий...

Строим кластер DRBD+Pacemaker+Corosync+KVM+Nginx+PHP-FPM+Zabbix


DRBD+Pacemaker+Corosync+KVM+Nginx+PHP-FPM+Zabbix
(позже дооформлю...)
Чисти обязательно!!!
> /root/.ssh/known_hosts
> /home/borodatych/.ssh/known_hosts
Или сразу удаляем!!!
rm -rf /root/.ssh/known_hosts
rm -rf /home/borodatych/.ssh/known_hosts
Pre-Installation
aptitude update
aptitude upgrade
Правим хост файл
cat /etc/hosts
echo '192.168.8.11 sifon' >> /etc/hosts
echo '192.168.8.12 boroda' >> /etc/hosts
echo '192.168.8.20 nodez' >> /etc/hosts
echo '10.10.10.11 drbd1' >> /etc/hosts
echo '10.10.10.12 drbd2' >> /etc/hosts
Конфигурируем сетевые интерфейсы
> /etc/network/interfaces
echo 'auto lo' >> /etc/network/interfaces
echo 'iface lo inet loopback' >> /etc/network/interfaces
echo '' >> /etc/network/interfaces
echo 'auto eth0' >> /etc/network/interfaces
echo 'iface eth0 inet manual' >> /etc/network/interfaces
echo '' >> /etc/network/interfaces
echo 'auto br0' >> /etc/network/interfaces
echo 'iface br0 inet static' >> /etc/network/interfaces
echo ' address X.Y.Z.x1' >> /etc/network/interfaces
echo ' network X.Y.z.x2' >> /etc/network/interfaces
echo ' netmask 255.255.255.x3' >> /etc/network/interfaces
echo ' broadcast X.Y.Z.x4' >> /etc/network/interfaces
echo ' gateway X.Y.Z.x5' >> /etc/network/interfaces
echo ' bridge_ports eth0' >> /etc/network/interfaces
echo ' bridge_stp off' >> /etc/network/interfaces
echo ' bridge_fd 0' >> /etc/network/interfaces
echo ' bridge_maxwait 0' >> /etc/network/interfaces
echo '' >> /etc/network/interfaces
echo 'auto eth1' >> /etc/network/interfaces
echo 'iface eth1 inet static' >> /etc/network/interfaces
echo ' address 10.10.10.12' >> /etc/network/interfaces
echo ' netmask 255.255.255.0' >> /etc/network/interfaces
/etc/init.d/networking restart
Проверяем. На всех машинах
ping sifon -c 1
ping boroda -c 1
ping nodez -c 1
ping drbd1 -c 1
ping drbd2 -c 1
Добавим гугловский ДНС
cat /etc/resolv.conf
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
KVM
Устанавливаем необходимые пакеты
apt-get install virtinst
aptitude install qemu-kvm
aptitude install libvirt-bin
Это гуи для дескопа
aptitude install virt-manager
Проверяем все ли установилось
При положительном результате, вернет пустую строчку
virsh -c qemu:///system list --all
DRBD
Устанавливаем
apt-get install drbd8-utils
Приступаем к конфигурации
Тут мы правим глобальные переменные
cp /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.2
> /etc/drbd.d/global_common.conf
nano /etc/drbd.d/global_common.conf
global { usage-count yes; }
common { protocol C;
syncer { rate 3072M; }
handlers {
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
}
startup { wfc-timeout 15; degr-wfc-timeout 60; }
disk { fencing resource-only; on-io-error detach; no-disk-flushes; no-md-flushes; }
net { cram-hmac-alg sha1; shared-secret "amAteIcHik"; ping-timeout 20; max-buffers 8000; max-epoch-size 8000; sndbuf-size 0; }
}
Проверяем наличие ниже приведенных строчек в
nano /etc/drbd.conf
include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/\*.res";
Это блочное устройство у нас отведено под тестовый KVM машины
nano /etc/drbd.d/drbd0.res
resource drbd0 {
on sifon {
device /dev/drbd0;
disk /dev/md2;
address 10.10.10.11:25600;
meta-disk internal;
}
on boroda {
device /dev/drbd0;
disk /dev/md2;
address 10.10.10.12:25600;
meta-disk internal;
}
Это наш релиз. Запоминаем и осторожничаем в будущем))))
nano /etc/drbd.d/drbd5.res
resource drbd5 {
on sifon {
device /dev/drbd5;
disk /dev/sdc5;
address 10.10.10.11:25605;
meta-disk internal;
}
on boroda {
device /dev/drbd5;
disk /dev/sdc5;
address 10.10.10.12:25605;
meta-disk internal;
}
Создаем необходимы каталоги
Первый для релиза, остальные два под тестовые KVM-ки
mkdir /mnt/rkvm
mkdir -p /mnt/skvm/sys
mkdir -p /mnt/skvm/iso
Не знаю как обозвать эту секцию, помогайте
/etc/init.d/drbd start
dd if=/dev/zero of=/dev/sdc5 bs=1M count=128
drbdadm create-md drbd0
drbdadm create-md drbd5
drbdadm up drbd0
drbdadm up drbd5
mkfs.ext4 /dev/drbd0
mkfs.ext4 /dev/drbd5
drbdadm -- --overwrite-data-of-peer primary drbd0
drbdadm -- --overwrite-data-of-peer primary drbd5
drbdadm connect drbd5
watch cat /proc/drbd
watch /etc/init.d/drbd status
/etc/init.d/drbd stop
update-rc.d -f drbd remove
Corosync
apt-get install pacemaker
Разрешаем запуск
cat /etc/default/corosync
> /etc/default/corosync
echo 'START=yes' >> /etc/default/corosync
Генерируем ключ и копируем его на остальные сервера
Тут соль в том что в момент генерации нужно топтать батон или дергать маус, хз почему так
corosync-keygen
scp -i ~/.ssh/amatei /etc/corosync/authkey root@192.168.8.12:/etc/corosync/authkey
scp -i ~/.ssh/amatei /etc/corosync/authkey root@192.168.8.20:/etc/corosync/authkey
chmod 400 /etc/corosync/authkey
Правим конфиг
nano /etc/corosync/corosync.conf
token: 5000
token_retransmits_before_loss_const: 20
join: 1000
consensus: 7500
bindnetaddr: 192.168.8.0 (На свою подсеть)
Что бы не проделывать монотонную работу, просто скопируем конфиг на оставшиеся машины
scp -i ~/.ssh/amatei /etc/corosync/corosync.conf root@192.168.8.12:/etc/corosync/corosync.conf
scp -i ~/.ssh/amatei /etc/corosync/corosync.conf root@192.168.8.20:/etc/corosync/corosync.conf
Перезагружаем corosync
/etc/init.d/corosync stop
/etc/init.d/corosync start
Если идут блуды с автозагрузкой, то переназначим старт
update-rc.d -f corosync remove
update-rc.d corosync start 90 S . stop 07 0 1 6 .
CRM
Сперва рекомендую произвести очистку, если остались следы от прошлых конфигов
Или если хотите сделать переконфигурацию примитив, но сперва тормозните corosync
cd /var/lib/heartbeat/crm
rm -rf ./cib
Устанавливаем редактор по умолчанию nano, дефолтный vi, мне не нра)))
export EDITOR=/bin/nano
echo "export EDITOR=/bin/nano" >> .bashrc
crm configure edit
!!! Самое главное, если убрали сервер из кластера, удалите его примитивы, что бы не было глюков!!!
Обратить внимание!!! - target-role="started"
В каком порядке добавляете примитивы в таком они выводятся в crm_mon

Создаем примитив для релиза
Тут даем команду на поднятия мастер блока сперва на sifon, потом на boroda, но ни в коем случае не на nodez
crm configure
primitive DRBD ocf:linbit:drbd params drbd_resource="drbd5" drbdconf="/etc/drbd.conf" op start timeout=240s op stop timeout=120s
ms msDRBD DRBD meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
location loc_msDRBD_sifon msDRBD 200: sifon
location loc_msDRBD_boroda msDRBD 100: boroda
location loc_msDRBD msDRBD -inf: nodez
property stonith-enabled=false
configure property no-quorum-policy="ignore"
bye
Тут по аналогии только для другого блока, отведенного под тесты
crm configure
primitive DRBD0 ocf:linbit:drbd params drbd_resource="drbd0" drbdconf="/etc/drbd.conf" op start timeout=240s op stop timeout=120s
ms msDRBD0 DRBD0 meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
location loc_msDRBD0_sifon msDRBD0 100: sifon
location loc_msDRBD0_boroda msDRBD0 200: boroda
location loc_msDRBD0 msDRBD0 -inf: nodez
bye
Создадим примитив для автоматического поднятия релизной KVM-ки на мастер блоке, отведенного для этих нужд
СПЕРВА СОЗДАЕМ KVM-ку, а потом уже примитив!!!
Так что отвлекаемся на раздел **KVM**, после возвращаемся
crm configure
primitive rKVM ocf:heartbeat:VirtualDomain params config="/etc/libvirt/qemu/rKVM.xml" hypervisor="qemu:///system" meta allow-migrate="false" op start timeout="120s" op stop timeout="120s" op monitor depth="0" timeout="30" interval="10"
colocation rKVM_on_drbd inf: rKVM msDRBD:Master
order rKVM_after_drbd inf: msDRBD:promote rKVM:start
bye
Делаем маунт нашего тест раздела
crm configure
primitive mount_sKVM ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/skvm" fstype="ext4" op monitor interval=40s timeout=40s op start timeout=240s op stop timeout=120s
colocation mount_sKVM_on_master inf: mount_sKVM msDRBD0:Master
order mount_sKVM_after_master inf: msDRBD0:promote mount_sKVM:start
bye
Рестартуем демон и проверяем
/etc/init.d/corosync stop
/etc/init.d/corosync start
ps -afe | grep coro
killall -9 corosync
Nginx
apt-get install gcc make
apt-get install libpcre3-dev
apt-get install libssl-dev
wget http://sysoev.ru/nginx/nginx-0.8.53.tar.gz
tar -xzvf nginx-0.8.53.tar.gz
cd nginx-0.8.53
http://sysoev.ru/nginx/docs/install.html
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.10.tar.gz
tar -xzvf pcre-8.10.tar.gz
wget http://prdownloads.sourceforge.net/libpng/zlib-1.2.5.tar.gz
tar -xzvf zlib-1.2.5.tar.gz
apt-get install openssl
cd ..
mkdir -p /PATH/nginx
Подсмотреть опции можно так:
./configure --help > configure-man
cat configure-man
./configure --prefix=/PATH/nginx --sbin-path=/PATH/nginx/nginx --conf-path=/PATH/nginx/nginx.conf --pid-path=/PATH/nginx/nginx.pid --error-log-path=/PATH/nginx/error.log --http-log-path=/PATH/nginx/access.log --with-http_ssl_module --with-pcre=/SRC/pcre-8.10 --with-zlib=/SRC/zlib-1.2.5
make clean
make
make install
PATH/nginx/sbin/nginx
killall -9 nginx
ps axu | grep nginx
php-fpm
Не юзал. У Николая есть информация. Никола, с тебя данные!!!

KVM
aptitude install virtinst
aptitude install qemu-kvm libvirt-bin
Это для дэскопа!
apt-get install virt-manager
virsh -c qemu:///system list --all
virsh net-list --all
virt-install --help
Вход в систему
virsh --connect qemu:///system
Показать имеющиеся KVM
virsh -c qemu:///system list --all
Посмотреть имеющиеся хранилища
virsh --connect qemu:///system pool-list --all
Посмотреть образы в выбраном хранилище
virsh --connect qemu:///system vol-list sKVM
Команды для создание KVM
Сперва качаем образ нужной нам системы
ХОТЬ КУДА ТОЛЬКО НЕ В ROOT!!!
cd /home
wget http://mirror.yandex.ru/ubuntu-releases/10.10/ubuntu-10.10-server-amd64.iso
Создание KVM в существующее хранилище
virt-install --name=rKVM --ram=8192 --vcpus=4 --disk path=/dev/drbd5 --accelerate --noautoconsole --connect=qemu:///system --vnc --hvm --os-type=linux --os-variant=generic26 -w bridge:br0 --import
Создание с автозапуском с cdrom-а
virt-install --name=rKVM --ram=8192 --vcpus=4 --disk path=/dev/drbd5 --accelerate --noautoconsole --connect=qemu:///system --vnc --hvm --os-type=linux --os-variant=generic26 --cdrom=/home/ubuntu-10.10-server-amd64.iso -w bridge:br0
Создание шаблона с образом жесткого диска в 4Gb и ОЗУ 1Gb
virt-install --name=tmplKVM --ram=1024 --vcpus=1 --disk path=/mnt/skvm/sys/tmpl.img,size=4 --accelerate --noautoconsole --connect=qemu:///system --vnc --hvm --os-type=linux --os-variant=generic26 --cdrom=/mnt/skvm/iso/ubuntu-10.10-server-amd64.iso -w bridge:br0
Моя KVM-ка отведенная под изучение Gentoo, тут идет сразу создание самого образа
virt-install --name=brdKVM --ram=2047 --vcpus=1 --disk path=/mnt/skvm/sys/brd.img,size=8 --accelerate --noautoconsole --connect=qemu:///system --vnc --hvm --os-type=linux --os-variant=generic26 --cdrom=/mnt/skvm/iso/install-amd64-minimal-20101118.iso -w bridge:br0 --prompt
Создаем под Zabbix
На том сервере, где у нас mount_sKVM
Копия делается с tpmlKVM, tmpl.img дублируется в zabbix.img
Поэтому ни tmplKVM.xml ни tmpl.img как файлы не трогаем и не редактируем
Соответственно без полного осознания, что оно надо)))
virt-clone -o tmplKVM -n zabbix --file=/mnt/skvm/sys/zabbix.img
virsh --connect qemu:///system vol-list sKVM
> /etc/hostname
echo 'zabbix' >> /etc/hostname
passwd root
**********
userdel tmplkvm
useradd zabbix
passwd zabbix
**********
nano /etc/network/interface
static
address 192.168.8.101
/etc/init.d/networking restart
ssh root@192.168.8.101
cat /etc/resolv.conf
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
Манипуляция с ключами SSH в ручную, пока не автоматизировал)))
И моно уже так:
ssh -i ~/.ssh/amatei root@192.168.8.101
...Дальше zabbix...

Zabbix
Server configuration
apt-get install zabbix-server-mysql zabbix-agent zabbix-frontend-php
MySQL root password
Правим конфиг:
nano /usr/share/zabbix/conf/zabbix.conf.php
$DB["SERVER"] = "127.0.0.1";
$ZBX_SERVER = '192.168.8.101';
admin/zabbix

nano /etc/php5/apache2/php.ini
date.timezone = "Asia/Yekaterinburg"
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
/etc/init.d/apache2 restart
Настройка web:
nano /etc/zabbix/apache.conf
ps axu | grep zabbix

/etc/init.d/zabbix-server restart

Настраиваем уведомление на почту:
nano /etc/zabbix/zabbix_server.conf
ListenPort=10051
DBHost=127.0.0.1
cd /etc/zabbix/alert.d
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar -xvzf sendEmail-v1.56.tar.gz
cd sendEmail-v1.56
mv ./sendEmail /etc/zabbix/alert.d/
cd ..
rm -rf /etc/zabbix/alert.d/sendEmail-v1.56
rm -rf /etc/zabbix/alert.d/sendEmail-v1.56.tar.gz
clear
touch /etc/zabbix/alert.d/zabbix_sendemail
chmod 755 /etc/zabbix/alert.d/zabbix_sendemail
nano /etc/zabbix/alert.d/zabbix_sendemail
#!/bin/sh
export smtpemailfrom=КОМУ@ДОМЕН.ru
export zabbixemailto="$1"
export zabbixsubject="$2"
export zabbixbody="$3"
export smtpserver=smtp.gmail.com
export smtplogin=ОТ_КОГО@ДОМЕН.ru
export smtppass=ПАРОЛЬ

export metod="tls=yes"
#export metod="ssl=yes"
export port=587
#export port=465
/etc/zabbix/alert.d/sendEmail -f $smtpemailfrom -t $zabbixemailto -u $zabbixsubject -m $zabbixbody -s $smtpserver:$port -xu $smtplogin -xp $smtppass -o $metod
Agent configuration
apt-get install zabbix-agent
nano /etc/zabbix/zabbix_agent.conf
Server=192.168.8.101
nano /etc/zabbix/zabbix_agentd.conf
Server=192.168.8.101
ServerPort=10051
Hostname=192.168.8.101
/etc/init.d/zabbix-agent restart

Строим кластер на связке DRBD+Pacemaker+OpenVZ+NFS+Zabbix


Все это чудо будет крутиться на Debian 64
Сперва подготавливаем систему:
aptitude update
aptitude upgrade
apt-get install psmisc ntp ntpdate ssh
Включаем форвард:
nano /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
Создаем общую папку, куда будет монтироваться DRBD устройство и от куда по NFS клиенты будут забирать данные:
mkdir /NFS
В роли OpenVZ я решил использовать Proxmox. Его вебку тупо не нужно допиливать)))
Открываем sources.list:
nano /etc/apt/sources.list
И добавляем вот эти строчки:
# PVE packages provided by proxmox.com
deb http://download.proxmox.com/debian lenny pve
Теперь нам необходимо получить ключик:
wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
Делаем апдейт:
aptitude update
Так как Proxmox поставляет свое ядро, то сперва ищем последнюю версию:
aptitude search pve
Устанавливаем:
aptitude install pve-kernel-2.6.32-4-pve
aptitude install pve-headers-2.6.32-4-pve
То же самое проделываем с вебкой:
aptitude search proxmox
aptitude install proxmox-ve-2.6.32
Не забываем поправить груб:
nano /boot/grub/grub.cfg (old version: nano /boot/grub/menu.lst)
Перезагружаемся в наше ядро 2.6.32-4-pve

Настраиваем наши сетевые интерфейсы:
nano /etc/network/interfaces
# network interface settings
auto lo
iface lo inet loopback

#auto eth0
#iface eth0 inet static
iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
          address 192.168.0.11
          netmask 255.255.255.0
          gateway 192.168.0.72
          bridge_ports eth0
          bridge_stp off
          bridge_fd 0

auto venet0
iface venet0 inet static
        address  192.168.2.11
        netmask  255.255.255.0

auto eth1
iface eth1 inet static
    address 192.168.1.11
    netmask 255.255.255.0
Перезагружаем сервис:
/etc/init.d/networking restart
Proxmox установлен, вот основные команды:
pveca -l                   - Показать состояния кластера
pveca -c                   - Создать новый кластер, а ноду на которой выполнили команду сделать мастером
pveca -s -h IPmaster - Синхронизироваться с мастером
pveca -d ID               - Удалить ноду из кластера
pveca -a -h IPmaster - Добавить ноду в кластер
pveca -m                 - Сделать мастером
В первом файле конфигурация кластера, во втором ключи доступа:
nano /etc/pve/cluster.cfg
nano /root/.ssh/known_hosts
Устанавливаем DRBD:
apt-get install drbd8-utils
Чистим конфиг:
> /etc/drbd.conf
И приступаем к настройке:
nano /etc/drbd.conf
Содержание моего drbd.conf:
global { usage-count yes; }
common { syncer { rate 200M; } }
resource drbd0 {
protocol C;
startup {
                    wfc-timeout 15;
                    degr-wfc-timeout 60;
}
net {
                    cram-hmac-alg sha1;
                    shared-secret "ВАШ_ПАРОЛЬ";
                    ping-timeout 20;
}
on node1 {
                    device /dev/drbd0;
                    disk /dev/sdb5;
                    address 192.168.0.11:7789;
                    meta-disk internal;
}
on node2 {
                    device /dev/drbd0;
                    disk /dev/sdb5;
                    address 192.168.0.12:7789;
                    meta-disk internal;
}
disk {
                    on-io-error   detach;
}
handlers {
                    fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
}
Либо копируем drbd.conf на вторую ноду или делаем все тоже самое.

Затираем разделы, если есть необходимость:
dd if=/dev/zero of=/dev/sdb5 bs=1M count=128
Стартуем на обоих нодах:
/etc/init.d/drbd start
На обоих нодах:
drbdadm create-md drbd0
drbdadm up drbd0
На ноде, которую решили сделать мастером:
drbdadm -- --overwrite-data-of-peer primary drbd0
Наблюдаем за процессом любой из команд:
watch cat /proc/drbd
watch /etc/init.d/drbd status
По необходимости:
mkfs.ext3 /dev/drbd0
Останавливаем DRBD на обеих нодах, так как дальше им будет управлять Pacemaker:
/etc/init.d/drbd stop
И удаляем DRBD с автозагрузки по той же причине, что и чуть выше:
update-rc.d drbd remove
Устанавливаем сам Pacemaker:
apt-get install pacemaker
Обязательно включаем Corosync:
nano /etc/default/corosync
START=yes
Генерируем ключ. Для генерации необходимо жать на клавиши или двигать мышку.
corosync-keygen
Копируем с генерированный ключ на все ноды, которые будут в кластере:
(Не забываем про добавляемые ноды уже в готовый кластер)
scp /etc/corosync/authkey root@192.168.0.1X:/etc/corosync/authkey
chmod 400 /etc/corosync/authkey
На всех нодах в corosync.conf изменить нужные строки, как показано ниже:
nano /etc/corosync/corosync.conf
token:          5000
token_retransmits_before_loss_const: 20
join:           1000
consensus:      7500
bindnetaddr: 192.168.0.0 # На свою подсеть, класс С, вида Х.Х.Х.0
Запускаем Corosync на всех нодах
/etc/init.d/corosync start
Может я и переборщил, но я банально шлепаю в начало в тот скрипт, который использую вот такие строчки, что бы не ругался на не установку:
nano /usr/lib/ocf/resource.d/linbit/drbd
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf

nano /usr/lib/ocf/resource.d/heartbeat/IPaddr2
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf

nano /usr/lib/ocf/resource.d/heartbeat/Filesystem
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf
#OCF_RESKEY_device=/dev/drbd0
#OCF_RESKEY_directory=/NFS
#OCF_RESKEY_fstype=ext3

nano /usr/lib/ocf/resource.d/heartbeat/nfsserver
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf
DEFAULT_INIT_SCRIPT="/etc/init.d/nfs-kernel-server"

nano /usr/lib/ocf/resource.d/heartbeat/.ocf-binaries
PATH="$PATH:/usr/lib/ocf"
Практически закончили....
Сейчас будем описывать что, где, когда и при каких условиях должно стартовать.

Сперва установим редактор по умолчанию, если нравиться vi можете пропустить это:
export EDITOR=/bin/nano
echo "export EDITOR=/bin/nano" >> .bashrc
После выполнение следующей команды появится пустой файл:
crm configure edit
Выходим и ждем секунд двадцать...

Снова выполняем эту команду:
crm configure edit
И видим что то типо этого:
node node1
node node2
property $id="cib-bootstrap-options" \
                    dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
                    cluster-infrastructure="openais" \
                    expected-quorum-votes="2"
Если что то подобное, то все пока идет отлично....

Маленько забегу наперед. Возможно вы повнимательнее меня, но все же!
Нужно обратить внимание вот на такую примерно запись:
target-role="started"
И если за место "started" стоит "stoped", то ресурс не стартанет, соответственно.
Либо удаляем эту строчку либо меняем "stoped" на "started"
Опять же обращаем внимание на тонкость иначе вас не выпустит с конфига...

Не правильное описание ресурса:
property $id="cib-bootstrap-options" \
                    dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
                    cluster-infrastructure="openais" \
                    expected-quorum-votes="2" \
Правильное описание ресурса:
property $id="cib-bootstrap-options" \
                    dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
                    cluster-infrastructure="openais" \
                    expected-quorum-votes="2"
Символ "\" означает перевод строки и ожидание продолжения.

Если кому то принципиально дальнейший поряд вывода на мониторе ресурсов, то добавляем примитивы в нужной последовательности.

Далее пошли мои примитивы. Имена можно менять. Событиями варьировать))))
crm configure
primitive resDRBD ocf:linbit:drbd params drbd_resource="drbd0" drbdconf="/etc/drbd.conf" op start timeout=240s op stop timeout=100s
ms msDRBD resDRBD meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
location loc_msDRBD_3 msDRBD -inf: node3
location loc_msDRBD_4 msDRBD -inf: node4
property stonith-enabled=false
configure property no-quorum-policy="ignore"
bye
Вот эти строчки по идеи лишнии:
location loc_msDRBD_3 msDRBD -inf: node3
location loc_msDRBD_4 msDRBD -inf: node4
У меня просто DRBD пытался запуститься на этих нодах, на которых DRBD вообще не сконфигурирован.
crm configure
primitive resFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/NFS" fstype="ext3" op start timeout=60s op stop timeout=60s
colocation fs_on_master inf: resFS msDRBD:Master
order fs_after_drbd inf: msDRBD:promote resFS:start
bye
...Небольшое отступление....
Устанавливаем NFS на ноды где поднят DRBD:
apt-get install nfs-kernel-server
update-rc.d nfs-kernel-server remove
update-rc.d nfs-common remove
Правим этот файлик так же на обоих нодах, где установлен DRBD:
nano /etc/exports
/NFS/ 192.168.0.0/255.255.255.0(rw,no_root_squash,no_all_squash,sync)
...Продолжаем...
crm configure
primitive NFSserver ocf:heartbeat:nfsserver params nfs_init_script="/etc/init.d/nfs-kernel-server" nfs_notify_cmd="/sbin/rpc.statd" nfs_shared_infodir="/var/lib/nfs/" nfs_ip="192.168.0.10" op start timeout=40s
colocation nfs_on_master inf: NFSserver msDRBD:Master
order nfss_after_vipp inf: vIPp:start NFSserver:start
bye
Этот ресурс я выделил отдельно от стальных нод, все таки это DRBD Slave, мне так захотелось))
crm configure
primitive NFSclient ocf:heartbeat:Filesystem params device="192.168.0.10:/NFS" directory="/NFS" fstype="nfs" options="nolock" op start timeout=60s op stop timeout=60s
colocation mnt_nfsc_slave inf: NFSclient msDRBD:Slave
order slave_after_master inf: NFSserver:start NFSclient:start
bye
Единственно "НО", для вновь добавляемой ноды придется создавать отдельный ресурс:
crm configure
primitive NFSnodeX ocf:heartbeat:Filesystem params device="192.168.0.10:/NFS" directory="/NFS" fstype="nfs" options="nolock" op start timeout=60s op stop timeout=60s
location loc_nfsnX NFSnodeX inf: nodeX
order nfsnX_after_nfss inf: NFSserver:start NFSnodeX:start
bye
...где х - это номер ноды...

Если есть необходимость, вдруг что то не запустилось, перезагружаем Corosync:
/etc/init.d/corosync stop
/etc/init.d/corosync start
На DRBD мастере выполняем:
mv /var/lib/nfs/ /NFS/
ln -s /NFS/nfs/ /var/lib/nfs
mv /etc/vz/conf /NFS/vz/conf
ln -s /NFS/vz/conf /etc/vz/conf
mv /etc/vz/dists /NFS/vz/dists
ln -s /NFS/vz/dists /etc/vz/dists
mv /etc/vz/names /NFS/vz/names
ln -s /NFS/vz/dists /etc/vz/dists
На остальных нодах:
rm -fr /var/lib/nfs/
ln -s /NFS/nfs/ /var/lib/nfs
rm -fr /var/lib/vz/
ln -s /NFS/vz/ /var/lib/vz
rm -fr /etc/vz/conf
ln -s /NFS/vz/conf /etc/vz/conf
rm -fr /etc/vz/dists
ln -s /NFS/vz/dists /etc/vz/dists
rm -fr /etc/vz/names
ln -s /NFS/vz/names /etc/vz/names
Далее, использую основные команды Proxmox, настраиваем наш кластер:
pveca -l                   - Показать состояния кластера
pveca -c                   - Создать новый кластер
pveca -s -h IPmaster - Синхронизироваться с мастером
pveca -d ID               - Удалить ноду из кластера
pveca -a -h IPmaster - Добавить ноду в кластер
pveca -m                   - Сделать мастером
...Тут мастером можно сделать любой компьютер - это не принципиально...

Кластер готов, настроен, и работает. Осталось настроить систему мониторинга...
Мне приглянулся Zabbix поэтому буду использовать его...

На сервере, а так как он на одном из DRBD устройств - на обоих DRBD устройств выполняем:
apt-get install zabbix-server-mysql zabbix-agent zabbix-frontend-php
На других нодах достаточно:
apt-get install zabbix-agent
Удаляем на DRBD устройствах с автозагрузки Zabbix сервер, так как стартовать будем через Pacemaker:
update-rc.d zabbix-server remove
И останавливаем соответственно тоже на обоих DRBD устройствах:
/etc/init.d/zabbix-server stop
Теперь самое сложное, для меня по крайней мере. Так как я не силен в написание скриптов, то пришлось прибегнуть к небольшой хитрости. Смотрим ниже:
cp -f /usr/lib/ocf/resource.d/heartbeat/pingd /usr/lib/ocf/resource.d/heartbeat/zabbix-server
nano /usr/lib/ocf/resource.d/heartbeat/zabbix-server
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf
В самое начало соответствующих функций добавляем свои команды на стар и стоп Zabbix сервера:
pingd_start() {
/etc/init.d/zabbix-server start
Оставляем родной код
}
pingd_stop() {
/etc/init.d/zabbix-server stop
Оставляем родной код
}

А теперь опишем наш ресурс в Pacemaker:
crm configure
primitive Zabbix ocf:heartbeat:zabbix-server params dampen="60s" host_list="127.0.0.1" op monitor interval="20s" timeout="120s"
colocation zabbix_on_master inf: Zabbix resFS
order zabbix_after_fs inf: resFS:start Zabbix:start
bye
А теперь маленький тюнинг:
nano /etc/php5/apache2/php.ini
date.timezone = "Asia/Yekaterinburg"
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
max_execution_time = 600
max_input_time = 600

Теперь переносим Zabbix на DRBD устройство:
Создаем папку:
mkdir /NFS/zabbix
На DRBD мастере:
mv /var/lib/mysql/zabbix /NFS/zabbix/db
ln -s /NFS/zabbix/db /var/lib/mysql/zabbix
mv /usr/share/zabbix /NFS/zabbix/web
ln -s /NFS/zabbix/web /usr/share/zabbix
На DRBD слейве:
rm -fr /var/lib/mysql/zabbix
ln -s /NFS/zabbix/db /var/lib/mysql/zabbix
rm -fr /usr/share/zabbix
ln -s /NFS/zabbix/web /usr/share/zabbix
ОБЯЗАТЕЛЬНО проделайте следующие команды на DRBD устройствах для удовлетворения симлинком в zabbix-frontend:
ln -s /usr/share/javascript /NFS/zabbix/javascript
ln -s /usr/share/fonts /NFS/zabbix/fonts
Следующие строчки вообще ни как не повлияли на процесс, но я их выполнил:
nano /NFS/zabbix/web/conf/zabbix.conf.php
$ZBX_SERVER = '192.168.0.10';
Осталось настроить уведомление о событиях:
touch /NFS/zabbix/alert.d/zabbix_sendemail
chmod 755 /NFS/zabbix/alert.d/zabbix_sendemail
nano /NFS/zabbix/alert.d/zabbix_sendemail
Вот родной пример настройки: http://www.zabbix.com/forum/showpost.php?p=25993&postcount=3
Тут переведенный, я просто не буду описывать весь процесс: http://habrahabr.ru/blogs/sysadm/81630/
Мой скрип:
#!/bin/sh
export smtpemailfrom=ИМЯ@ДОМЕН.ru
export zabbixemailto="$1"
export zabbixsubject="$2"
export zabbixbody="$3"
export smtpserver=smtp.gmail.com
export smtplogin=ИМЯ@ДОМЕН.ru
export smtppass=ПАРОЛЬ
export metod="tls=yes"
export port=587
/NFS/zabbix/alert.d/sendEmail.pl -f $smtpemailfrom -t $zabbixemailto -u $zabbixsubject -m $zabbixbody -s $smtpserver:$port -xu $smtplogin -xp $smtppass -o $metod
Учтите одно но:
zabbixemailto="$1" - ПРАВИЛЬНО
zabbixemailto=$1 - НЕ ПРАВИЛЬНО
Не забываем кавычки, без них тупо не работает!!!
Качаете скрип отправки с офсайта: http://caspian.dotconf.net/menu/Software/SendEmail/
Распаковываем зипчик и переносим, нам только он нужен, sendEmail.pl в /NFS/zabbix/alert.d/
Вроде бы все. Сервер готов. Осталось настроить агентов на всех серверах.
Так как у меня сервер может быть на одном из трех адресов, ну малоли общий IP не поднимется по каким то причинам, сделал вот такие манипуляции:
nano /etc/zabbix/zabbix_agent.conf
Server=192.168.0.10
nano /etc/zabbix/zabbix_agentd.conf
Server=192.168.0.10,192.168.0.11,192.168.0.12
Hostname=192.168.0.10,192.168.0.11,192.168.0.12
Следующий шаг можно пропустить. Я захотел даже агентов поместить в Pacemaker:
cp -f /usr/lib/ocf/resource.d/heartbeat/pingd /usr/lib/ocf/resource.d/heartbeat/zabbix-agent
nano /usr/lib/ocf/resource.d/heartbeat/zabbix-agent
OCF_ROOT=/usr/lib/ocf
export OCF_ROOT=/usr/lib/ocf
В начало секции:
pingd_start() {
/etc/init.d/zabbix-agent start
Оставляем родной код
}
pingd_stop() {
/etc/init.d/zabbix-agent stop
Оставляем родной код
}
Описываем наш примитив:
crm configure
primitive ZabbixA ocf:heartbeat:zabbix-agent params dampen="60s" host_list="127.0.0.1" op monitor interval="20s" timeout="120s"
clone ZabbixAgent ZabbixA
colocation zabbix_on_master inf: ZabbixAgent resFS
order zabbixagent_after_fs inf: resFS:start ZabbixAgent:start
bye
Ну и, соответственно, удаляем агента с автозагрузки:
update-rc.d zabbix-agent remove
Пока все...
Жду вопросов, дополнений и критики...
Все учту и добавлю в статью!

PS: Особую благодарность выражаю человеку с ником VanDyke с форуме sysadmins.ru за очень активное участие, основное даже так скажу)))
PSS: Если тема кому то интересна, то милости просим: http://sysadmins.ru/topic270287.html