Понадобилось мне поднять сервер RADIUS, который работает с mysql, да причём так, что mysql работает в кластере по схеме master-slave. Так как нужно сделать на одной виртуалке, пришлось думать, как это реализовать. Естественно, всё уже давно придумано за нас и существует такая штука как mysqld_multi, которая создана для управления несколькими инстансами mysqld на одном сервере.
Сначала переделаем my.cnf для работы с несколькими серверами mysql.
Как мы видим, вместо пункта [mysqld] появились [mysqld1] и [mysqld2] для мастера и слейва, к которым можно подключиться при помощи разных сокетов или портов.
Далее создаём папку для слейва
Теперь настроим репликацию
На обеих нодах:
На мастере смотрим
Теперь на слейве делаем
Процессы можно посмотреть при помощи
Теперь напишем простенький инит-скрипт, чтобы сервер запускался автоматически. Однако я тут не предусматривал, что при каждой загрузке нужно прописывать файл вручную в параметрах слейва.
/etc/init.d/mysqld_multi
Сначала переделаем my.cnf для работы с несколькими серверами mysql.
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
[mysqld1]
datadir=/var/lib/mysql
port=3306
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# replication
log_bin=mysql-bin
server_id=1
log-error=/var/log/mysqld1.log
pid-file=/var/run/mysqld/mysqld1.pid
[mysqld2]
datadir=/var/lib/mysql-slave
socket=/var/lib/mysql-slave/mysql.sock
port=3307
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# replication
log_bin=mysql-bin
server_id=2
log_slave_update=1
log-error=/var/log/mysqld2.log
pid-file=/var/run/mysqld/mysqld2.pid
Как мы видим, вместо пункта [mysqld] появились [mysqld1] и [mysqld2] для мастера и слейва, к которым можно подключиться при помощи разных сокетов или портов.
Далее создаём папку для слейва
mysql_install_db --user=mysql --datadir=/var/lib/mysql-slave/
Теперь настроим репликацию
На обеих нодах:
create user 'rep_user2'@'%' identified by 'rep_user2'; create user 'rep_user2'@'localhost' identified by 'rep_user2'; grant replication slave on *.* to 'rep_user2'@'%'; grant replication slave on *.* to 'rep_user2'@'localhost';
На мастере смотрим
show master status;Определяем файл и позицию. После чего на слейве настраиваем.
change master to master_log_file='mysql-bin.000009', master_log_pos=98, master_host='localhost', master_port=3306, master_user='rep_user2', master_password='rep_user2';
Теперь на слейве делаем
start slave;и смотрим, подключилась ли Mysql к мастеру.
SHOW SLAVE STATUS\GЕсли у нас всё хорошо, то должен быть статус вроде "Waiting for master to send event" и в процессах как на мастере, так и на слейве должен висеть процесс соединения.
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: rep_user2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 334
Relay_Log_File: mysqld2-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: No
Процессы можно посмотреть при помощи
SHOW PROCESSLIST\G
Теперь напишем простенький инит-скрипт, чтобы сервер запускался автоматически. Однако я тут не предусматривал, что при каждой загрузке нужно прописывать файл вручную в параметрах слейва.
/etc/init.d/mysqld_multi
#!/bin/bash
#
# mysqld_multi This shell script takes care of starting and stopping
# the multi instances of MySQL daemons (mysqld_multi).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my.cnf
# pidfile: /var/run/mysqld/mysqld1.pid
# pidfile: /var/run/mysqld/mysqld2.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
prog="MySQL Multi"
start(){
/usr/bin/mysqld_multi start 1 > /dev/null
/usr/bin/mysqld_multi start 2 > /dev/null
ret=$?
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
else
action $"Starting $prog: " /bin/false
fi
return $ret
}
stop(){
/usr/bin/mysqld_multi stop $* > /dev/null
ret=$?
if [ $ret -eq 0 ]; then
action $"Stopping $prog: " /bin/true
else
ret=1
action $"Stopping $prog: " /bin/false
fi
return $ret
}
restart(){
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
/usr/bin/mysqld_multi report
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit $?
Комментариев нет:
Отправить комментарий