= bubbalog =Дневникът на моето стадо

UildShiiP Cluster Project: модул2 – MySQL HA Cluster

Sunday 04.10.2009 02:21 EEST · Публикувано от в = Cluster =, = FreeBSD =, = HA-cluster =

В тази статия ще опиша как се създава master-master репликация на MySQL (всеки е мастер и слейв за другия) с CARP, като какво точно е CARP и как работи няма да споменавам тук, допра отправна точка за това е http://en.wikipedia.org/wiki/Common_Address_Redundancy_Protocol.

Като начало е добре да се започне с инсталацията и подготовката на CARP и MySQL за работа.

1. Инсталация и конфигурация на CARP

Когато инстлирате FreeBSD ядрото с което идва инсталацията няма подръжка на CARP, ето защо е нужно за прекомпилирате кърнъла на системата. За да направите това трябва да сте инсталирали от дистрибуциите /src/sys компонента, ако не сте – направете следното:

#sysinstall

и изберете configure->distributions->src->sys. Следващата стъпка е да прекомпилирате ядрото. Тъй като тази статия е насочена към друго, няма да се спирам на това защо и как се прави това и направо давам поредицата от команди за целта:

# cd /usr/src/sys/i386/conf
# cp GENERIC GENERIC-CARP
# echo „device carp“ >> GENERIC-CARP
# config GENERIC-CARP
# cd ../compile/GENERIC-CARP
# make cleandepend && make depend
# make
# make install clean

настройвате да се свалят всички CARP интерфейси, ако някой от физическите падне, за да може друга машина да поеме трафика

sysctl net.inet.carp.preempt=1

а после просто се добавят 2 реда в /etc/rc.conf

cloned_interfaces=“carp0″
ifconfig_carp0=“vhid 1 advskew 100 pass <parola> 192.168.100.200/24″

където vhid е номер на виртуалната мрежа в която работи интерфейса, advskew е приоритета на дадената машина (колкото по-малък номер – толкова по-висок приоритет има), <parola> се заменя с парола, с която да се автентикират съответните машини, и накрая – виртуалното IP и префикса на което ще отговаря интерфейса.
След което разбира се трябва да се рестартира всяка от машините, за да се приемат всички настройки

# reboot

Тук трябва да се отбележи, че редовете в /etc/rc.conf трябва да са еднакви при всички машини, като се променя номера за приоритет на всяка от тях. Ако искате да добавите повече  виртуални интерфейси просто трябва да ги изброите и да прибавите съответните редове за тях в /etc/rc.conf

cloned_interfaces=“carp0 carp1 carp2 … carpN“
ifconfig_carp0=…
ifconfig_carp1=…
ifconfig_carp2=…

ifconfig_carpN=…

За целта на нашето занятие съм избрал следните адреси:

  • мастер1/слейв2     – 192.168.100.201/24
  • мастер2/слейв1     – 192.168.100.202/24
  • виртуално IP    – 192.168.100.200/24

В случая когато сме избрали CARP за fileover маме 3 положения на работа на системата:

master работи
backup работи
-> няма проблем, слейв машината е синхронизирана с мастера и и пази гърба.

master работи
backup не работи
-> няма проблем, мастера работи и когате слейва се дигне пак се синхронизира с мастера

master не работи
backup работи
-> проблем! Именно тук сработва механизма и слейва поема работата на мастера. Когато мастера се вдигне заема обратно своята позиция, а текущия мастер минава отново в бекъп режим.

2. Инсталация и подготовка на MySQL

Отидете в директорията на mysql50-server в портовете:

#cd /usr/ports/databases/mysql50-server

Настройте опциите за порта: (отнема АДСКИ много време – на 266MHz/128RAM отидоха около 5 часа)

#make BUILD_OPTIMIZED=yes BUILD_STATIC=yes

Инсталирайте:

#make install clean

Отворете /etc/rc.conf с предпочитания от вас едитор и прибавете следния ред. Това ще стартира MySQL сървъра заедно със стартиране на системата.

mysql_enable=“YES“

Стартирайте mysql ръчно, за да не се налага да рестартирате сега цялата система:

#/usr/local/etc/rc.d/mysql-server start

Направете парола за MySQL на root потребителя като използвате следната команда. В случая не става дума за истинския root потребител на системата. Потребителите в MySQL се отнасят само за самата база данни:

#/usr/local/bin/mysqladmin -uroot password ‘new-password’

С това инсталацията на MySQL е завършена.

3. Конфигуриране на репликация master-master

Следващия етап е конфигуриране на самата репликация. Следващите стъпки от тук натам са еднакви и за двете машини и при възможност ми се струва не е зле да се правят паралелно.

3.1. Създаване на потребител с права за репликиране на всеки от двата сървъра

мастер1/слейв2

#mysql -u root -p
mysql> grant replication slave on *.* to ‘replica’@192.168.100.202 identified by ‘slave’;
mysql> exit

мастер2/слейв1

#mysql -u root -p
mysql> grant replication slave on *.* to ‘replica’@192.168.100.201 identified by ‘slave’;
mysql> exit

рестарт на mysql сървърите

3.2. Копиране на my.cnf

FreeBSD няма при инсталация този файл и използва настройки по подразбиране, поради което е нужно той да се копира на нужното за целта място. Първото което трябва да се направи е да се копира подходящия за вашата система конфигурациоен файл за MySQL. Тъй като при FreeBSD няма заложен my.cnf файл за целта избираме и копираме един от следните предоставени файлове от /usr/local/share/mysql

#cd /usr/local/share/mysql/

самите файлове са предвидени за работа според вида и натоварването на машината на която ще работи сървъра:

  • my-small.cnf – за системи с много малко RAM (<=64MB), на които MySQL ще се използва от време на време и най-важното е mysql демона да не отнема много ресурси
  • my-medium.cnf – за системи с малко RAM (32MB-64MB), където MySQL играе важна роля или системи с минимум 128MB RAM, на които сървъра споделя системата с друг сървър – например уеб сървър
  • my-large.cnf – за системи с минимум 512MB RAM на които работи основно MySQL
  • my-huge.cnf – за системи с 1GB-2GB RAM на които работи основно MySQL

Изберете файла който ви е нужен, като всеки от файловете може да се копира в следните директории

  • /etc/my.cnf – за глобално конфигуриране на опциите
  • /var/db/mysql/my.cnf – за конфигуриране на специфични за сървъра опции
  • ~/.my.cnf – за конфигуриране на специфични оприи според потребителя

Горните 3 дестинации са грубо преведени от самия конфигурационен файл, затова може да има някои несъответствия. Аз лично ползвах първия път и my-medium.cnf

#cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf

Трябва да отбележа нещо много важно – файла my.cnf трябва да е задължително с мод 444 в противен случай няма да бъде използван. Затова профилактично сменяме мода

#chmod 444 /etc/my.cnf

За проверка дали MySQL сървъра работи четейки вече копирания нов файл може да смените порта на който работи сървъра и да рестартирате MySQL, като проверите резултата с netstat:

#ee /etc/my.cnf
#/usr/local/etc/rc.d/mysql-server restart
#netstat -anp tcp

след което върнете порта по подразбиране и рестартирайте отново сървъра.

3.3. Редактира се my.cnf

#ee /etc/my.cnf

прибавяне на user = mysql в секцията [mysqld]

намерете следните редове и ги декоментирайте/коригирайте както следва:

за мастер1/слейв2 –

log-bin=mysql-bin
server-id       = 1                    #идентификация на сървъра
master-host     =   192.168.100.202    #адрес на мастер машината (мастер2/слейв1)
master-user     =   replica            #потребителско име към мастера (мастер2/слейв1)
master-password =   slave              #парола към мастера (мастер2/слейв1)

за мастер2/слейв1 –

log-bin=mysql-bin
server-id       = 2                    #идентификация на сървъра
master-host     =   192.168.100.201    #адрес на мастер машината (мастер1/слейв2)
master-user     =   replica            #потребителско име към мастера (мастер1/слейв2)
master-password =   slave              #парола към мастера (мастер1/слейв2)

останалите опции не са важни на този етап, а за тяхното значение може да потърсите в мрежата. Рестартирайте двата MySQL сървъра.

3.4. Проверка на мастер и слейв статуса на всеки сървър

mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000002 |       98 |              |                  |
+——————+———-+————–+——————+

1 row in set (0.04 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.202
Master_User: replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: s1-relay-bin.000005
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.04 sec)

5. Тестване дали работи цялата система. След като настроите всичко е време за най-забавната част на занятието – да проверите дали всечко направено до тук работи като хората и така както се очаква. За целта се логнете във всеки от сървърите (ако не се го направили) и се пригответе за малко тестчета и писане.

#mysql -u root -p

Първата стъпка е да проверите дали всеки от сървърите изпълнява коректно ролята на бекъп машина. Това може много лесно да се напрви и проследи при съсдаването на нова база данни или талица към съществуваща баз данни на всеки от сървърите и проверка дали съществъва тя на другата машина. Времето за репликация е почити нулево за тази процедура, ака че ако не я видите веднага на бекъп машината нещо не е наред

мастер1/слейв2

mysql> create database mammamia;
Query OK, 1 row affected (0.02 sec)

мастер2/слейв1

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| mammamia           |
| mysql              |
| test               |
+——————–+

4 rows in set (0.00 sec)

Втората и малко по бавна работа е да се провери дали когато едната машина е неработеща ще приеме и се ъпдейтне от другата, когато се вдигне в работещ режим. В случая при работа с CARP Ттова е особенно важно за машината с по-малък advskew, защото при проблем с нея, когато се вдигне, я измества моментния мастер и започва да изпълнява неговата функция, което предполага колкото се може по-скоро да се ъпдейтне, като това се отнася до всички съществуващи или междувременно създадени или променени бази данни, таблици и данни. За целта просто дръпваме мрежовия кабел симулирайки проста кабелна повреда и започваме малко работа по втората машина.
Първо създаваме една нова база данни

mysql> create database mammamia;
Query OK, 1 row affected (0.02 sec)

после в нея създаваме нова таблица с автоматично увеличаващ се id номер

mysql> use mammamia;
Database changed
mysql> create table bambina (id int not null auto_increment primary key, data varchar(100) );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into bambina (data) values (‘babinata ti trankina’);
Query OK, 1 row affected (0.00 sec)
mysql> select * from bambina;
+—-+———————-+
| id | data                 |
+—-+———————-+
|  1 | babinata ti trankina |
+—-+———————-+

1 row in set (0.00 sec)

Следва проверка дали всичко ще сработи. Преди да влючите мрежовия кабел проверете и се убедете, че новата таблица я няма по горе описания начин. След това включете и започнете периодично да проверявате и ако всичко е наред, след около няколко секунди всичко трябва да си дойде на мястото.

P.S.: Всичко това обяснено по последната точка зависи обаче от това, колко ще е натоварен сървъра ви и дали времето от половин секунда за сработването на CARP до 10-15-те секунди които могат да станат доста повече при упдейтването на една огромна база данни в реални условия) за ъпдейтване са критични и дали няма да си причините повече главоболия при използването му, но това са въпроси неаkсаещи конкретната статия и няма да се спиирам на това сега. Сега мисля да се отдам на малко заслужена почивка след цялото това главоболие, глупости и проблеми които си причиних с този модул за тези няколко седмици.

Остави коментар

Писането на кирилица е задължително!
Коментари, които не са на кирилица ще бъдат изтрити без предупреждение.
Всеки коментари съдържащи 1 или повече линка, ще бъдат публикувани след одобрение.