Мы — долго запрягаем, быстро ездим, и сильно тормозим.



www.lissyara.su —> www.lissyara.su —> MySQL multiple server

несколько серверов MySQL


   Задача вполне тривиальная, нужно сделать создание бэкапов баз раз в сутки.
Казалось бы достаточно средств mysqldump, но здесь есть одно большое НО.
При создании дампа с помощью mysqldump таблица с которой делается дамп лочиться.
То есть что либо писать в неё нельзя. Вроде бы пустяк, а если база большая и в неё активно пишуться данные?
Поиск решения избежать блокировок большого результата не дал, база размером 4 гига, дампилась 3-5 минут,в это время работа стояла.
  Было принято решение настроить репликацию, и уже со второго реплицирующего сервера делать дампы, без простоя.
Возникла новая сложность, баз несколько, все они большие, да и проекты в активной разработке.
  Реплицировать на другой сервер можно было, но не было сервера,а его расположение в этом же датацентре было  призрачной мечтой.
Можно создать виртуальную машину на qemu, на ней поднять mysql сервер и с ним реплицироваться, но это накладные расходы.
Еще немного почитав документацию была разработана следующая схема
1)Поднять несколько mysql серверов на одном хосте, слушать на разных портах
2)Настроить репликацию

Приступим к части №1.

Были мысли сделать запуск нескольких серверов средствами mysql_multi, но толи плохо искал, толи туго соображал, но запустить другие сервера при загрузке не получилось, как вариант поправить rc.d скрипт запуска, но это меня тоже не особо прельщало.
А что будет если создать второй rc.d скрипт, на основе имеющегося ?
#cp /usr/local/etc/rc.d/mysql-server /usr/local/etc/rc.d/mysql_replica-server
#vim /usr/local/etc/rc.d/mysql_replica-server
:%s/mysql_/mysql_replica_/g

Правда изменить mysqld_safe на mysqld_replica_safe, так что правим это руками
В итоге имеем следующее:
#>grep -v "^#" /usr/local/etc/rc.d/mysql_replica-server
. /etc/rc.subr

name="mysql_replica"
rcvar=`set_rcvar`

load_rc_config $name

: ${mysql_replica_enable="NO"}
: ${mysql_replica_limits="NO"}
: ${mysql_replica_dbdir="/var/db/mysql"}
: ${mysql_replica_socket="/tmp/mysql.sock"}

mysql_replica_user="mysql"
mysql_replica_limits_args="-e -U ${mysql_replica_user}"
pidfile=${mysql_replica_pidfile:-"${mysql_replica_dbdir}/`/bin/hostname`.pid"}
command="/usr/sbin/daemon"
command_args="-c -f /usr/local/bin/mysqld_safe --defaults-extra-file=${mysql_replica_dbdir}/my.cnf \
--user=${mysql_replica_user} --datadir=${mysql_replica_dbdir} --socket=${mysql_replica_socket} \
--pid-file=${pidfile} ${mysql_replica_args}"
procname="/usr/local/libexec/mysqld"
start_precmd="${name}_prestart"
start_postcmd="${name}_poststart"
mysql_replica_install_db="/usr/local/bin/mysql_install_db"
mysql_replica_install_db_args="--ldata=${mysql_replica_dbdir}"
mysqladmin="/usr/local/bin/mysqladmin"
mysqladmin_args="-s --socket=${mysql_replica_socket} ping"

mysql_replica_create_auth_tables()
{
	eval $mysql_replica_install_db $mysql_replica_install_db_args >/dev/null
        [ $? -eq 0 ] && chown -R ${mysql_replica_user}:${mysql_replica_user} ${mysql_replica_dbdir}
}

mysql_replica_prestart()
{
	if [ ! -d "${mysql_replica_dbdir}/mysql/." ]; then
		mysql_replica_create_auth_tables || return 1
	fi
	if checkyesno mysql_replica_limits; then
		eval `/usr/bin/limits ${mysql_replica_limits_args}` 2>/dev/null
	else
		return 0
	fi
}

mysql_replica_poststart()
{
	count=0
	while [ $count -lt 10 ] ; do
		eval $mysqladmin $mysqladmin_args >/dev/null
		[ $? -eq 0 ] && return 0
		count=`expr $count + 1`
		sleep 1
	done
	return 1
}
run_rc_command "$1"

Вносим изменения в rc.conf
#>grep -e mysql /etc/rc.conf
mysql_enable="YES"
mysql_dbdir="/var/db/mysql"
mysql_replica_enable="YES"
mysql_replica_dbdir="/var/db/mysql_replica"

По умолчанию mysql ищет конфиг в домашнем папке базы, то есть в dbdir, поэтому создаем конфиги в соответствующих папках

#>cat /var/db/mysql/my.cnf 
[mysqld]
bind-address=127.0.0.1
port=3306
socket=/tmp/mysql.sock
#>cat /var/db/mysql_replica/my.cnf
[mysqld]
bind-address=127.0.0.1
port=3307
socket=/tmp/mysql_replica.sock

Запускаем:
#service mysql-server start
#service mysql_replica-server start

Слушаются ли порты ?
#>sockstat -4 -p 3306-3307
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
mysql    mysqld     72989 13 tcp4   127.0.0.1:3306        *:*
mysql    mysqld     72919 10 tcp4   127.0.0.1:3307        *:*

Первая часть закончена, можно отдохнуть



Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=33063.

оценить статью:


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 12 чел.
За последние 30 мин было: 49 человек
За сегодня было
8253 показов,
748 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0352 секунд
Из них PHP: 46%; SQL: 54%; Число SQL-запросов: 29 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 39794