Высоконагруженный проект (10мл. хостов в сутки) + mysql cluster

440hz

php.ru
Высоконагруженный проект (10мл. хостов в сутки) + mysql cluster

обобщая обе темы:
http://phpclub.ru/talk/showthread.php?s=&threadid=109882&rand=27
http://phpclub.ru/talk/showthread.php?s=&threadid=109965&rand=13
===================================================

получил 4 сервера. сейчас сетаплю.

1. FreeBSD 7.0 amd64
DELL PE1950
2 x Dual Core Xeon 5110
2GB ECC RAM
2 x 73GB SAS (RAID1)

2. FreeBSD 7.0 amd64
DELL PE1950
2 x Quad Core Xeon L5320
2GB ECC RAM
2 x 73GB SAS (RAID1)

3. FreeBSD 7.0 amd64
DELL PE1950
2 x Quad Core Xeon L5320
4GB ECC RAM
4 x 73GB SAS (RAID10)

4. FreeBSD 7.0 amd64
DELL PE1950
2 x Quad Core Xeon L5320
4GB ECC RAM
4 x 73GB SAS (RAID10)

========================

собственно разделяем так:

1. блансер + мастер-нода (изменения в коде сайта и скриптах). ну не дали пока отдельный балансер. потом воткнем.
2. обсчет статистки почасовй (те самые 10 лямов запросов в день) + управление кластером
3-4. ноды кластера + отвечающие веб-сервера (синхронизируется с мастер-нодой rsync раз в час)

========================


буду ставить mysql 5.1 - есть возражения?
что скажем про линукс-треды? оно того стоит? FreeBSD 7.0
 

Wicked

Новичок
Делл, как оказалось, официально не поддерживает фрю, и у нас на похожие делловские сервера, купленные неделю назад, она не встала.
 

440hz

php.ru
node01(440hz):~$>uname -a
FreeBSD node01.*.* 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Thu Sep 4 00:03:36 CEST 2008 440hz@node01.*.*:/usr/obj/usr/src/sys/TORNADO amd64

вот как-то все встает без вопросов... ядро пересобрал. только amd64 платформа? ниразу такого не видел.

Copyright (c) 1992-2008 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 7.0-RELEASE #0: Thu Sep 4 00:03:36 CEST 2008
440hz@node01.*.*/usr/obj/usr/src/sys/TORNADO
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Xeon(R) CPU L5320 @ 1.86GHz (1863.79-MHz K8-class CPU)
Origin = "GenuineIntel" Id = 0x6fb Stepping = 11
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
Features2=0x4e33d<SSE3,RSVD2,MON,DS_CPL,VMX,TM2,SSSE3,CX16,xTPR,PDCM,DCA>
AMD Features=0x20100800<SYSCALL,NX,LM>
AMD Features2=0x1<LAHF>
Cores per package: 4
usable memory = 4277235712 (4079 MB)
avail memory = 4115877888 (3925 MB)
ACPI APIC Table: <DELL PE_SC3 >
FreeBSD/SMP: Multiprocessor System Detected: 8 CPUs
cpu0 (BSP): APIC ID: 0
cpu1 (AP): APIC ID: 1
cpu2 (AP): APIC ID: 2
cpu3 (AP): APIC ID: 3
cpu4 (AP): APIC ID: 4
cpu5 (AP): APIC ID: 5
cpu6 (AP): APIC ID: 6
cpu7 (AP): APIC ID: 7

-~{}~ 04.09.08 13:21:

конфиг ядра для пересборки

node01(root):/usr/src/sys/amd64/conf#>cat TORNADO
#
#
#

include GENERIC
ident TORNADO

### 440hz zone ###

options MAXDSIZ=(1024UL*1024*1024)
options MAXSSIZ=(256UL*1024*1024)
options DFLDSIZ=(1024UL*1024*1024)

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPDIVERT

### 440hz zone ###

#
#
#

master(root):/home/440hz#>limits
Resource limits (current):
cputime infinity secs
filesize infinity kB
datasize 1048576 kB
stacksize 262144 kB
coredumpsize infinity kB
memoryuse infinity kB
memorylocked infinity kB
maxprocesses 5547
openfiles 11095
sbsize infinity bytes
vmemoryuse infinity kB

-~{}~ 04.09.08 13:47:

важный момент - синхронизация времени на серерах. посему:

rc.conf
========================
# TIMESYNC
ntpdate_enable="YES"
ntpdate_flags="-b europe.pool.ntp.org europe.pool.ntp.org europe.pool.ntp.org"

ntpd_enable="YES"
ntpd_config="/etc/ntp/ntp.conf"
ntpd_flags="-l /var/log/ntpd.log -p /var/run/ntpd.pid -f /var/db/ntpd.drift"
ntpd_sync_on_start="YES"

timed_enable="YES"
timed_flags="-t -M"

node01(root):/home/440hz#>cat /etc/ntp/ntp.conf
#
# 440hz
#

server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org

restrict default nomodify notrap

#
#
#

ну и после ребута:
===============

node01(root):/home/440hz#>cat /var/log/ntpd.log
4 Sep 11:27:29 ntpd[554]: logging to file /var/log/ntpd.log
4 Sep 11:27:29 ntpd[554]: ntpd 4.2.0-a Sun Feb 24 09:12:07 UTC 2008 (1)
4 Sep 11:27:29 ntpd[554]: precision = 1.397 usec
4 Sep 11:27:29 ntpd[554]: kernel time sync status 2040
4 Sep 11:27:33 ntpd[554]: synchronized to 78.47.136.197, stratum=2
4 Sep 11:27:35 ntpd[554]: synchronized to 78.47.136.197, stratum=2
4 Sep 11:32:45 ntpd[554]: ntpd exiting on signal 15
4 Sep 11:34:43 ntpd[554]: logging to file /var/log/ntpd.log
4 Sep 11:34:43 ntpd[554]: ntpd 4.2.0-a Sun Feb 24 09:12:07 UTC 2008 (1)
4 Sep 11:34:43 ntpd[554]: precision = 1.396 usec
4 Sep 11:34:43 ntpd[554]: kernel time sync status 2040
4 Sep 11:34:47 ntpd[554]: synchronized to 78.47.136.197, stratum=2
4 Sep 11:38:00 ntpd[554]: synchronized to 78.47.136.197, stratum=2
 

ys

отодвинутый новичок
Я бы всякое IPFIREWALL, IPDIVERT etc. убрал бы из ядра, не дело машинам, обсуживающим WEB сервисы, еще и роутером/файрволом подрабатывать :)
 

440hz

php.ru
Автор оригинала: ys
Я бы всякое IPFIREWALL, IPDIVERT etc. убрал бы из ядра, не дело машинам, обсуживающим WEB сервисы, еще и роутером/файрволом подрабатывать :)
DIVERT лишний. согласен, а фаервол надо оставить что б лишее отсечь. кластер же незащищенная штука, а тачки все наружу торчат. мож в будщем уйдем в серую сеть, но пока так.

p.s. кластер собрал. ща доку пишу. попозже выложу.
 

Long

Новичок
440hz, забей, фря самая серверная ОС. это они завидуют ;)
 

boombick

boombick.org
Long
Особенно эта серверность хорошо себя показывает в SMP =)

440hz
Красношапка имеет круглосуточный саппорт, хотя бы поэтому
 

fixxxer

К.О.
Партнер клуба
в 7ке линукстреды нафиг не надо, там свои лучше.
и smp там уже нормальный, кстати.
 

440hz

php.ru
Установка MySQL Cluster

имеем 4 машины. конфиги машин я описал выше.

1. мастер нода и балансер
2. сервер обсчета статистики
3,4. вебноды (копии мастера) и ноды кластера

на каждой тачке установлена MySQL 5.1 из /usr/ports/databases/mysql51-server/

/etc/make.conf
Код:
#
# 2008 (c) [email][email protected][/email]
#

# GD
WITH_LZW=yes
WITHOUT_X11=yes

# MYSQL
WITH_CHARSET=utf8
WITH_XCHARSET=all
#WITH_COLLATION=utf8_general_ci
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
#WITHOUT_INNODB=yes
WITH_NDB=yes
WITHOUT_IPV6=yes

# SYSTEM
USE_NONDEFAULT_X11BASE=yes
Код:
#>mysql --version
mysql  Ver 14.14 Distrib 5.1.26-rc, for portbld-freebsd7.0 (amd64) using  5.2
1. Устанавко менеджера кластера

на тачке 1 (master) создаем директорию для работы менеджера кластера

Код:
#mkdir -p /var/lib/mysql-cluster/
создаем в этом директории конфигурационный файл
config.ini
Код:
#
# 2008 (c) [email][email protected][/email]
#

[NDBD DEFAULT]
NoOfReplicas=2
TimeBetweenWatchDogCheck=30000
MaxNoOfOrderedIndexes=512

[MYSQLD DEFAULT]

[TCP DEFAULT]

# Managment Server (управляющий сервер)
[NDB_MGMD]
# IP этого сервера
HostName=*.*.*.1
DataDir= /var/lib/mysql-cluster

# Storage Engines (Движки хранилищ)
[NDBD]
# первая нода
HostName=*.*.*.3
DataDir= /var/lib/mysql-cluster

[NDBD]
# вторая нода
HostName=*.*.*.4
DataDir=/var/lib/mysql-cluster

# MySQL API сервера
[MYSQLD]
[MYSQLD]
[MYSQLD]
[MYSQLD]
кладем в /usr/local/etc/rc.d/ файл запуска менеджера

ndb_mgmd.sh
Код:
#!/bin/sh

#
# 2008 (c) [email][email protected][/email]
#

# PROVIDE: ndb_mgmd
# REQUIRE: DAEMON
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="ndb_mgmd"
rcvar=`set_rcvar`
load_rc_config $name

: ${ndb_mgmd_enable="NO"}
: ${ndb_mgmd_cmd="/usr/local/libexec/ndb_mgmd"}
: ${ndb_mgmd_config="-f /var/lib/mysql-cluster/config.ini"}
: ${ndb_mgmd_flags="-d"}

start_cmd=ndb_mgmd_start
stop_cmd=ndb_mgmd_stop

ndb_mgmd_start() {
        echo "Starting $name"
        $ndb_mgmd_cmd $ndb_mgmd_flags $ndb_mgmd_config
}

ndb_mgmd_stop() {
        echo "Stopping $name"
        pids=`pgrep $name`
        pkill $name
        wait_for_pids $pids
}

run_rc_command "$1"
в файл /etc/rc.conf добавляем строки
Код:
# ndb_mgmd
ndb_mgmd_enable="YES"
стартуем ndb_mgmd.sh и проверяем что запустилось

Код:
#/usr/local/etc/rc.d/ndb_mgmd.sh start
Starting ndb_mgmd
#>ps ax | grep ndb_mgmd
63429  ??  Ss     0:00,03 /usr/local/libexec/ndb_mgmd -d -f /var/lib/mysql-cluster/config.ini
63431  p0  S+     0:00,00 grep ndb_mgmd
запускаем консоль управления (до этого мы запускали сам менеджер!) и проверяем что все заработало.

Код:
#>ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: *.*.*.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2 (not connected, accepting connect from *.*.*.3)
id=3 (not connected, accepting connect from *.*.*.4)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @*.*.*.1  (Version: 5.1.26)

[mysqld(API)]   4 node(s)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)

ndb_mgm> quit
#>
пока с этим все.

2. Установка нод

на каждой ноде в /usr/local/etc/rc.d/ создаем ndbd.sh

ndbd.sh
Код:
#!/bin/sh

#
# 2008 (c) [email][email protected][/email]
#

# PROVIDE: ndbd
# REQUIRE: DAEMON
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="ndbd"
rcvar=`set_rcvar`
load_rc_config $name

: ${ndbd_enable="NO"}
: ${ndbd_cmd="/usr/local/libexec/ndbd"}
: ${ndbd_config=""}
: ${ndbd_flags="-d"}
: ${ndbd_nodeid="0"}

start_cmd=ndbd_start
stop_cmd=ndbd_stop

ndbd_start() {
        echo "Starting $name."
        $ndbd_cmd --ndb-nodeid=$ndbd_nodeid $ndbd_flags $ndbd_config
}

ndbd_stop() {
        echo "Stopping $name."
        pids=`pgrep $name`
        pkill $name
        wait_for_pids $pids
}

run_rc_command "$1"
в /etc/rc.conf добавим
Код:
# ndbd
ndbd_enable="YES"
и в /etc/ создаем my.cnf

my.cnf
Код:
#
# 2008 (c) [email][email protected][/email]
#

[mysqld]
ndbcluster
ndb-connectstring='host=*.*.*.1:1186' # IP address of the management server

[mysql_cluster]
ndb-connectstring='host=*.*.*.1:1186' # IP address of the management server

[DB DEFAULT]
DataMemory: 2000M
IndexMemory: 500M
запускаем ноду (НЕ MYSQL!)

Код:
#>/usr/local/etc/rc.d/ndbd.sh start
Starting ndbd.
#>ps ax | grep ndbd
 2043  ??  Ss     0:00,00 /usr/local/libexec/ndbd --ndb-nodeid=0 -d
 2044  ??  S      0:00,18 /usr/local/libexec/ndbd --ndb-nodeid=0 -d
 2046  p0  R+     0:00,00 grep ndbd
делаем тоже самое на второй ноде.

проверяем на менеджере что ноды подключились

Код:
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @*.*.*.3  (Version: 5.1.26, Nodegroup: 0, Master)
id=3    @*.*.*.4  (Version: 5.1.26, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @*.*.*.1  (Version: 5.1.26)

[mysqld(API)]   4 node(s)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
3. Запуск и проверка MySQL API

на всех тачках в /etc/rc.conf добавим
Код:
# mysql
mysql_enable="YES"
заходим на мастер (1 тачка).

копируем (к примеру) настройки конфигурации mysql
Код:
#>cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf
и добавляем в него строки в нужные разделы из приведенного выше my.cnf

это нужно для того что б локально работали еще независимые от кластера базы и таблицы.

запускаем mysql
Код:
master(root):/#>/usr/local/etc/rc.d/mysql-server start
Starting mysql.
проверяем

Код:
ndb_mgm> show
Connected to Management Server at: 78.140.142.21:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @*.*.*.3  (Version: 5.1.26, Nodegroup: 0, Master)
id=3    @*.*.*.4  (Version: 5.1.26, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @*.*.*.1  (Version: 5.1.26)

[mysqld(API)]   4 node(s)
id=4    @*.*.*.1  (Version: 5.1.26)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
так же запускаем mysql на двух нодах и тачке статистки.

в результате имеем:

Код:
ndb_mgm> show
Connected to Management Server at: 78.140.142.21:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @*.*.*.3  (Version: 5.1.26, Nodegroup: 0, Master)
id=3    @*.*.*.4  (Version: 5.1.26, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @*.*.*.1  (Version: 5.1.26)

[mysqld(API)]   4 node(s)
id=4    @*.*.*.1  (Version: 5.1.26)
id=5    @*.*.*.2   (Version: 5.1.26)
id=6    @*.*.*.3   (Version: 5.1.26)
id=7    @*.*.*.4   (Version: 5.1.26)
все запустилось. проверим работу кластера.

4. Проверка работы кластера.

на любой тачке заходим в mysql

Код:
(4) #>mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.26-rc FreeBSD port: mysql-server-5.1.26

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database `cluster`;
Query OK, 1 row affected (0.32 sec)

mysql> use cluster;
Database changed
mysql> quit
Bye
и на любой тачке кроме выбранной проверяем.

Код:
(2) #>mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.26-rc FreeBSD port: mysql-server-5.1.26

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cluster            |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> quit
Bye
вот и все с кластером. сейчас играюсь с таблицами и тонкими настройками. могу писнуть подробнее если это интересно народу.

на всех тачках базы mysql и test разные, а cluster разные и только тип ndbcluster для таблиц сделает их одинаковими и доступными сразу на всех тачках.

5. Непонятки

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



В результате несложных манипуляций имеем работающий кластер. 4 MySQL API на каждой тачке и 1 менеджер. При желании можно поднять менеджер на тачке 2 для страховки.

!!! НЕ ЗАБЫВАЕМ !!! установить пароль для root на mysql !!!


6. Тесты

сейчас готовлю погонять тесты на 1-5 лимонах записей на разных типах таблиц. MySQL, InnoDB и кластер. Результаты выложу.

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

Caesar

Новичок
Автор оригинала: 440hz
а че так все в Линукс то смотрят? есть причины?
Обычно это традиция или корпополитика - на что админ есть, на то и смотрят. (-:

Ну а в случае с деллом - гарантии, т.к. RHES и, соответственно, CentOS встают туда гарантировано, а FreeBSD - только если повезет.

Вот Wicked выше упоминал о таких серверах - это были PE M600 - на которые не становится ни 7.0-RELEASE, ни -STABLE, ни последний снапшот из -CURRENT. Как бы это ни было печально.
 

440hz

php.ru
Caesar
ну значит мне повезло.
я с линуксом пока не очень дружу, хотя FreeBSD vs Linux меня не задевает. я исхожу из того что выгоднее. если будет выгоднее линукс - встану без проблем.
 

fixxxer

К.О.
Партнер клуба
>>если кто посоветует какие тесты прогнать (таблицы, поля, ключи, кол-во записей и т.д.) - то пишите. пока есть время погонять на такой конфигурации.

выборки по индексам (primary key и range) с параллельными insert/update-операциями на _больших_ таблицах
в вариантах "подходит много" и "подходит мало"

по поводу freebsd/linux так надо смотреть сразу какое железо берешь, можно на такое дерьмецо нарваться что туда кроме венды ничего без напильника не встает :)
 

440hz

php.ru
выборки по индексам (primary key и range) с параллельными insert/update-операциями на _больших_ таблицах
в вариантах "подходит много" и "подходит мало"
а поподробнее не распишешь?
 

MiksIr

miksir@home:~$
А мне тут открыли глаза, что NDB умеет патишенинг ;) Да еще вроде сама пытается на основе запросов раскидать данные по нодам... жуть ;) Страшно подумать, как это реально может работать в продакшене, а не в тепличных условиях...
 

fixxxer

К.О.
Партнер клуба
подробнее ээ фиг знает ну представь себе вот этот же форум, комменты постим комменты читаем вот как то так
я хз какие там у тебя задачи но для веба эта помоему самая типичная
достать один пост - по пк
достать посты треда - по индексу
достать посты с такой то даты по такую то - индекс, диапазон

вообще стандартный mysql-bench погоняй для начала:)
 

Caesar

Новичок
Автор оригинала: fixxxer
по поводу freebsd/linux так надо смотреть сразу какое железо берешь, можно на такое дерьмецо нарваться что туда кроме венды ничего без напильника не встает :)
Иногда бывает так, что поставщик железа всего один и выбора среди его железа нет (Dell продает всего одну модель intel-овских blade-серверов). До этого нам, как и 440Hz'у, везло (-:
 
Сверху