close

引用網址:http://showerlee.blog.51cto.com/2047005/1188549

系统环境:CentOS 6.3 x64
MySQL版本:mysql-5.6.10

Keepalived版本:keepalived-1.2.7

 

 
MySQL-VIP:192.168.7.253
MySQL-master1:192.168.7.201

MySQL-master2:192.168.7.249

 

 

首先关闭iptables和SELINUX

# service iptables stop

# setenforce 0

# vi /etc/sysconfig/selinux

---------------

SELINUX=disabled

---------------

注: 若线上需要开启iptables,需加一条规则使keepalived的vrrp通行

# iptables -A INPUT -p vrrp -j ACCEPT

 

 

1.在MySQL-master1:192.168.7.201服务器上keepalived安装及配置

 

 
编译安装,实际以本机kernel版本为准
 
# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
# tar zxvf keepalived-1.2.7.tar.gz
# cd keepalived-1.2.7
# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64

# make && make install

 

设置keepalived开机启动脚本

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

# chkconfig keepalived on

 

 
新建一个配置文件,默认keepalived启动会去/etc/keepalived目录下寻找配置文件
 
# mkdir /etc/keepalived
 
# vi /etc/keepalived/keepalived.conf
------------------
global_defs {
 
notification_email {
 
lzyangel@126.com
 

}

##当主、备份设备发生改变时,通过邮件通知

 
notification_email_from lzyangel@126.com
 
smtp_server stmp.126.com
 
smtp_connect_timeout 30
 
router_id MySQL-ha
 
}
 
vrrp_instance VI_1{
 
# 在初始化状态下定义为主设备
 
state BACKUP
 
# 注意网卡接口
 
interface eth0
 
virtual_router_id 51
 
# 优先级,另一台改为90
 
priority 100
 
advert_int 1
 
# 不主动抢占资源
 
nopreempt
 

authentication {

# 认证方式,可以是PASS或AH两种认证方式

 

auth_type PASS

# 认证密码

 
auth_pass 1111
 
}
 

virtual_ipaddress {

# 虚拟IP地址,随着state的变化而增加删除

 
192.168.7.253
 
}
 
}
 
 
 
virtual_server 192.168.7.253 3306 {
 
# 每个2秒检查一次real_server状态
 
delay_loop 2
 
# LVS算法
 
lb_algo wrr
 
# LVS模式
 
lb_kind DR
 
# 会话保持时间
 
persistence_timeout 60
 
protocol TCP
 

real_server 192.168.7.201 3306 {

# 权重

 
weight 3
 
# 检测到服务down后执行的脚本
 
notify_down /etc/rc.d/keepalived.sh
 
TCP_CHECK {
 
# 连接超时时间
 
connect_timeout 10
 
# 重连次数
 
nb_get_retry 3
 
# 重连间隔时间
 
delay_before_retry 3
 
# 健康检查端口
 
connect_port 3306
 
}
 

}

}

----------------------

 

 
 
编写检测服务down后所要执行的脚本
 
# vi /etc/rc.d/keepalived.sh
 
-------------
#!/bin/sh
/etc/init.d/keepalived stop
-------------
 
# chmod +x /etc/rc.d/keepalived.sh
 
注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态。
当发现real_server服务故障时,便触发此脚本.
我们可以看到,脚本就一个命令:
通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移.

另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP.

 

以上脚本是为了在测试环境实现VIP切换功能,生产环境建议使用如下脚本

---------------------------------

 

#!/bin/bash

 

# 环境变量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

 

# 暂停5秒执行,防止数据库人工正常重启

sleep 5

 

# mysql_id(存活=1 死掉=0)

mysql_id=`ps -C mysqld --noheader |wc -l`

 

# 判断mysql_id若死掉,则重启mysql一次,若仍然无法启动mysql则杀掉keepaliaved进程实现VIP切换

if [ $mysql_id -eq 0 ];then

/etc/init.d/mysqld restart

sleep 5

if [ $mysql_id -eq 0 ];then

/etc/init.d/keepalived stop

fi

fi

---------------------------------

 

 
启动keepalived

# /etc/init.d/keepalived start

 

查看连接状态
# ps -aux | grep keepalived
返回:
---------------
 

root 1387 1 0 21:13 ? 00:00:00 keepalived -D

root 1390 1387 0 21:13 ? 00:00:00 keepalived -D

root 1391 1387 0 21:13 ? 00:00:00 keepalived -D

root 1976 1911 0 21:16 pts/0 00:00:00 grep keepalived

 

--------------------

 

测试

查看VIP信息

# ip addr

--------------------------

............

inet 192.168.7.201/24 brd 192.168.7.255 scope global eth0

inet 192.168.7.253/32 scope global eth0

inet6 fe80::20c:29ff:feb2:9199/64 scope link

valid_lft forever preferred_lft forever

--------------------------

注:如果出现主从在切换VIP时,主的VIP未自动关闭,从的正常开启,导致都获取到VIP,造成互相冲突的情况,可手动输入如下命令删除一方的VIP地址

# ip addr del "虚拟ip" dev eth0

但此方法只是一个临时的解决方案,当手动删除VIP后,重启keepalived服务会无法正常开启vip,需要重启服务器方能恢复。

 

查看vrrp通信

# tcpdump vrrp

-------------------------

.....

18:10:56.365730 IP 192.168.7.201 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 52, prio 40, authtype simple, intvl 1s, length 20

18:10:57.366825 IP 192.168.7.201 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 52, prio 40, authtype simple, intvl 1s, length 20

18:10:58.367914 IP 192.168.7.201 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 52, prio 40, authtype simple, intvl 1s, length 20

-------------------------

注:如果主keepalived挂掉,这里的日志会切换到备keeplived的信息

 

 
找一台局域网PC,然后去ping MySQL的VIP,这时候MySQL的VIP是可以ping的通的
 
停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本,去kill掉keepalived进程
# service mysqld stop
# ps -aux | grep keepalived

无返回结果

 

 
 
2.在MySQL-master2:192.168.7.249服务器上keepalived安装及配置
 
编译安装,实际以本机kernel版本为准
 
# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
# tar zxvf keepalived-1.2.7.tar.gz
# cd keepalived-1.2.7
# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-
279.el6.x86_64

# make && make install

 

设置keepalived开机启动脚本

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

# chkconfig keepalived on

 

 
新建一个配置文件,默认keepalived启动会去/etc/keepalived目录下寻找配置文件
 
# mkdir /etc/keepalived
 
# vi /etc/keepalived/keepalived.conf
------------------
global_defs {
 
notification_email {
 
lzyangel@126.com
 
}
 
notification_email_from lzyangel@126.com
 
smtp_server stmp.126.com
 
smtp_connect_timeout 30
 
router_id MySQL-ha
 
}
 
vrrp_instance VI_1{
 
# 两台配置此处均是BACKUP
 
state BACKUP
 
# 注意网卡接口
 
interface eth0
 
virtual_router_id 51
 
# 优先级,另一台改为100
 
priority 90
 
advert_int 1
 
# 不主动抢占资源
 
nopreempt
 
authentication {
 
auth_type PASS
 
auth_pass 1111
 
}
 
virtual_ipaddress {
 
192.168.7.253
 
}
 
}
 
 
 
virtual_server 192.168.7.253 3306 {
 
# 每个2秒检查一次real_server状态
 
delay_loop 2
 
# LVS算法
 
lb_algo wrr
 
# LVS模式
 
lb_kind DR
 
# 会话保持时间
 
persistence_timeout 60
 
protocol TCP
 
real_server 192.168.7.249 3306 {
 
weight 3
 
# 检测到服务down后执行的脚本
 
notify_down /etc/rc.d/keepalived.sh
 
TCP_CHECK {
 
# 连接超时时间
 
connect_timeout 10
 
# 重连次数
 
nb_get_retry 3
 
# 重连间隔时间
 
delay_before_retry 3
 
# 健康检查端口
 
connect_port 3306
 
}
 

}

}

----------------------

 

编写检测服务down后所要执行的脚本
 
# vi /etc/rc.d/keepalived.sh
 
-------------
#!/bin/sh
/etc/init.d/keepalived stop
-------------
 

# chmod +x /etc/rc.d/keepalived.sh

 

 
启动keepalived

# /etc/init.d/keepalived start

 

查看连接状态
# ps -aux | grep keepalived
返回:
---------------
 

root 1387 1 0 21:13 ? 00:00:00 keepalived -D

root 1390 1387 0 21:13 ? 00:00:00 keepalived -D

root 1391 1387 0 21:13 ? 00:00:00 keepalived -D

root 1976 1911 0 21:16 pts/0 00:00:00 grep keepalived

 

--------------------

 

 
至此配置完成,网站后台只需要配置MySQL-VIP:192.168.7.253虚拟地址即可

这里实际连接的master数据库,以哪台master先开mysql服务为准。

 

 

当master1:192.168.7.201 mysql端口挡掉或者服务器异常关闭,keepalived会自动跳转到master2:192.168.7.249.

 

因为两台数据库的数据时同步的,用户访问的是MySQL-VIP:192.168.7.253虚拟地址,所以网站数据连接会无缝透明转接到master2服务器,实现双机热备+数据同步功能。保证网站数据库的实时可用性。
 

注:当某一台master服务器挂掉恢复后,需同时打开MYSQL服务和keepalived服务,保证另一台服务器如果挂掉会无缝转接。

 

所以建议mysql与keeplived设置服务开机启动。
# chkconfig mysqld on

# chkconfig keepalived on

 

----------大功告成------------

arrow
arrow
    創作者介紹
    創作者 龍之家族 的頭像
    龍之家族

    龍之家族

    龍之家族 發表在 痞客邦 留言(0) 人氣()