Мы — долго запрягаем, быстро ездим, и сильно тормозим.
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        *:*

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






 

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

© lissyara 2006-10-24 08:47 MSK

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