前一段时间公司要做一个mysql高可用集群:一主一备一从;要求:主宕机会自动切换到备机,从机也跟着自动切换。
我就用了mysql+drbd+keepalived,从机复制的是VIP的二进制日志。时间有点长,下面的和生产环境中的也许有点不同。
一,drbd的安装
安装依赖包
yum -y install gcc kernel-devel kernel-headers flex
下载drbd软件
drbd-8.4.1.tar.gz
tar -zxvf drbd-8.4.1.tar.gz
cd drbd-8.4.1
./configure --prefix=/usr/local/drbd --with-km
make KDIR=/usr/src/kernels/2.6.32-431.29.2.el6.x86_64/
make install
mkdir -p /usr/local/drbd/var/run/drbd
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
cd drbd
make clean
uname –r
make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
cp drbd.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
depmod
查看mod有没有加载成功:
insmod drbd/drbd.ko 或者 modprobe drbd
修改主机名:
cat /etc/hosts
192.168.47.169 drbdm1
192.168.47.170 drbdm2
Fdisk第二块磁盘:
fdisk –l
fdisk /dev/sdb
建立挂载点:
mkdir /data
配置drbd:
cat /usr/local/drbd/etc/drbd.d/global_common.conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}
common {
syncer { rate 200M; }
}
}
cat /usr/local/drbd/etc/drbd.d/r0.res
resource r0 {
protocol C;
net {
# timeout 60;
# connect-int 10;
# ping-int 10;
# max-buffers 2048;
# max-epoch-size 2048;
cram-hmac-alg "sha1";
shared-secret "MySQL-HA";
}
disk {
on-io-error detach;
fencing resource-only;
}
startup {
wfc-timeout 120;
degr-wfc-timeout 120;
}
device /dev/drbd1;
on drbdm1 {
disk /dev/sdb1;
address 192.168.47.169:7788;
meta-disk internal;
}
on drbdm2 {
disk /dev/sdb1;
address 192.168.47.170:7788;
meta-disk internal;
}
}
创建drbd资源:
drbdadm create-md r0
启动drbd
/etc/init.d/drbd start
查看:
Cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2014-10-14 20:09:36
1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:40 nr:124 dw:164 dr:1345 al:2 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
注:2个节点都是secondary
设置主节点:
drbdadm primary all (第一次要运行drbdadm -- --overwrite-data-of-peer primary all)
格式化和挂载:
Mkfs.ext4 /dev/drbd1
Mount /dev/drbd1 /data
注意:切换的顺序:1,主节点先umount /dev/drbd1 2,drbdadm secondary all 3,次节点drbdadm primary all变成主节点,再mount /dev/drbd1 /data
二、keepalived的安装
yum -y install gcc kernel-devel openssl-devel
tar -zxvf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-431.17.1.el6.x86_64/
Make && make install
ln -s /etc/init.d/keepalived /etc/rc.d/rc3.d/S99keepalived
ln -s /etc/init.d/keepalived /etc/rc.d/rc5.d/S99keepalived
ln -s /usr/local/sbin/keepalived /sbin/
配置keepalived:
Cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #备机:BACKUP
interface eth1
virtual_router_id 59
priority 100 #备机:80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.47.250
}
}
启动:/etc/init.d/keepalived start
查看:ip a
查看日志:
Tail -f /var/log/message
三、mysql的安装
Yum install mysql mysql-server
修改数据库路径:
Mkdir /data/mysql
Vi /etc/my.cnf
Datadir=/data/mysql
设置权限:
Chmod –R 777 /data/msql
Chown mysql:mysql /data/mysql
Chkconfig --del mysqld
四、设置mysql主从复制
在mysql从机器上安装mysql:
Yum install mysql mysql-server
Mysql主从配置略
注意:复制的ip是VIP,即是上面的192.168.47.250
五、设置自动切换
修改/etc/keepalived/keepalived.conf
在/usr/local/sbin下新建两个脚本,分别为to-master.sh和to-backup.sh:
Vi /usr/local/sbin/to-master.sh
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #备机:BACKUP
interface eth1
virtual_router_id 59
priority 100 #备机:80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.47.250
}
#加入下面3行:
notify_master "/usr/local/sbin/to-master.sh"
notify_backup "/usr/local/sbin/to-backup.sh"
notify_fault "/usr/local/sbin/to-backup.sh"
#注意:备机只增加notify_master “/usr/local/sbin/to-master.sh”
}
To-master.sh脚本如下
#!/bin/bash
while :
do
drbd_status=`service drbd status|grep Inconsistent | gawk '{print $4}'`
if [ -n "$drbd_status" ]; then
echo "drbd's status is inconsisten,waiting..."
sleep 1
else
echo "drbd's status is ok,namenode will be changing"
break
fi
done
while :
do
if [ -d /data/mysql ]; then
#service mysqld stop
service mysqld start
break
else
drbdadm primary r0
mount /dev/drbd1 /data
sleep 1
service mysqld start
fi
done
drbd_status=`service drbd status|grep StandAlone | gawk '{print $2}'`
if [ -n "$drbd_status" ]; then
vip_status=`ip addr |grep eth0|grep "192.168.47.250"`
if [[ ! -z ${vip_status} ]];then
for i in $(seq 3)
do
drbdadm connect all
sleep 2
done
fi
fi
To-backup.sh脚步如下
#!/bin/bash
if [ -d /data/mysql ];then
service mysqld stop
pkill -9 mysql
sleep 1
fuser -ck /data/
umount -l /dev/drbd1
drbdadm secondary all
else
drbd_status=`service drbd status|grep StandAlone | gawk '{print $2}'`
if [ -n "$drbd_status" ]; then
drbdadm secondary all
fi
fi
修改权限:
Chmod +x to-master.sh
Chmod +x to-backup.sh
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29806344/viewspace-1323086/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29806344/viewspace-1323086/