- 论坛徽章:
- 0
|
- 使用keepalived 实现MYSQL 高可用
-
keepalived 下载地址:http://www.keepalived.org/download.html
-
-
master:192.168.215.80
-
slave :192.168.215.28
-
VIP :192.168.215.34
-
-
安装 keepalived
-
#=======================================================================
-
1:#wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz
-
2:#tar zxvf keepalived-1.1.20.tar.gz
-
3:#cd keepalived-1.1.20
-
4:#./configure
-
在这一步,可能看到的是如下:
-
#========================================================================
-
Keepalived configuration
-
------------------------
-
Keepalived version : 1.1.20
-
Compiler : gcc
-
Compiler flags : -g -O2
-
Extra Lib : -lpopt -lssl -lcrypto
-
Use IPVS Framework : No
-
IPVS sync daemon support : No
-
Use VRRP Framework : Yes
-
Use Debug flags : No
-
#==========================================================================
-
出现3个NO,一个YES。解决的办法是编译时带上内核文件夹重新编译
-
# ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-194.26.1.el5-x86_64/
-
Keepalived configuration
-
------------------------
-
Keepalived version : 1.1.20
-
Compiler : gcc
-
Compiler flags : -g -O2
-
Extra Lib : -lpopt -lssl -lcrypto
-
Use IPVS Framework : Yes
-
IPVS sync daemon support : Yes
-
Use VRRP Framework : Yes
-
Use Debug flags : No
-
#==========================================================================
-
5:#make && make install
-
#=======================================================================
-
到这里,安装完成。下面写配置文件。
-
-
配置 keepalived(master,192.168.215.80)
-
#=======================================================================
-
#mkdir /etc/keepalived #默认的配置文件获取的路径
-
#vi /etc/keepalived/keepalived.conf #配置文件的名称(把下面复制即可)
-
! Configuration File for keepalived
-
global_defs { #全局定义
-
notification_email { #告警邮件地址组(故障发邮件在这里没有测试,我把它放到健康检查脚本里面了)
-
brucezuo@msn.cn #发生故障,发告警的邮件地址,一般不用,可以随便写
-
}
-
notification_email_from brucezuo@msn.cn #邮件发送地址
-
smtp_server 127.0.0.1 #SMTP服务器IP
-
smtp_connect_timeout 30 #邮件服务器连接超时最长时间
-
router_id MySQL-ha #路由标识。在全局定义里只有这个是必须的,其他都可以不要。
-
}
-
vrrp_script check_mysql_alived { #检查MYSQL状态的函数(注意这里的花括号和名称之间有空格)
-
script "/root/mysql-moniter.sh" #这里定义脚本,注意本行需要缩进,我原来没注意,在这上面整了很长时间。可以在这个脚本里检查MYSQL是否还活着,服务器的负载是否过高等,以及什么条件做什么操作。
-
interval 1 #运行上面检查脚本的时间间隔,单位为妙。keepalive的守护进程执行这个脚本
-
weight 5 #本脚本的运行权重,权重越高的,越优先检查(只有一个检查脚本,就无所谓了)
-
}
-
vrrp_instance VI_1 {
-
state BACKUP #两台配置此处均是BACKUP,一台宕机,另外一台把VIP抢过去。
-
interface eth1 #在这里要注意,虚拟IP用的是哪个网卡进行通讯。我这里机器上的eth1是内网的,eth0是外网的。
-
virtual_router_id 51 #虚拟路由ID。这个标识是同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同时在整个vrrp内是唯一的。
-
#keepalived通过发送和接受组广播包中的同一个virtual_router_id中的成员的存活,来确定对方的不可用,一旦检测到对方不可用,立即切换他的备份角色为主。
-
priority 100 #权重,数值越大,权重越大,Master必须大于Slave。另一台改为90。
-
advert_int 1 #Master和Slave负载均衡器之间同步检查的时间间隔,单位:秒
-
#nopreempt #抢占,在MASTER恢复后,把VIP抢过来。在SLAVE端也一样,如果MASTER出问题了,SLAVE就把VIP抢过来。
-
authentication { #Master和Slave之间认证的方式
-
auth_type PASS
-
auth_pass 1111 #认证的密码
-
}
-
track_script{ # 使用的VRRP脚本(检查健康脚步),上面是定义,这里是使用。
-
check_mysql_alived
-
}
-
virtual_ipaddress { #VIP的地址
-
192.168.215.34
-
}
-
}
-
-
virtual_server 192.168.215.34 3306 {
-
lb_algo wrr #LVS算法
-
lb_kind DR #LVS模式
-
persistence_timeout 60 #会话保持时间,单位为秒,当用户从远程帐号过行登陆网站时,有了这个会话保持功能,就能把用户的请求转发到同一个应用服务器
-
protocol TCP
-
real_server 192.168.215.80 3306 { #真实IP(每台机器必须指定各自的真实IP)
-
TCP_CHECK {
-
connect_timeout 10 #连接超时时间
-
nb_get_retry 3 #重连次数
-
delay_before_retry 3 #重连间隔时间
-
connect_port 3306 #健康检查端口
-
}
-
}
-
}
-
#==========================================================================
-
MATER端配置到此结束。
-
编写健康服务检测的脚本
-
#==========================================================================
-
[root@l10ntermwiki bruce]# cat mysql-moniter.sh
-
#monitor mysql service status and server load
-
#!/bin/bash
-
function Send_Email() #发邮件的函数。
-
{
-
ADMIN="brucezuo@msn.cn"
-
MESSAGE_FILE="/tmp/monitor.log" #邮件里面带上本机IP地址和时间,信息更明确。
-
echo "VIP has been changed AT `date`,IP:`cat /etc/hosts |grep -v "127.0.0.1"|awk '{print $1}'`,please check it. Message:$1" > $MESSAGE_FILE
-
/bin/mail -s "VIP has been changed" $ADMIN < $MESSAGE_FILE
-
rm -r $MESSAGE_FILE
-
}
-
-
CPU_NUMBER=`cat /proc/cpuinfo |grep processor |wc -l` #获取CPU个数。
-
MAX_LOAD=`echo $CPU_NUMBER*2|bc` #最大负载认为是CPU*2。设置成CPU个数更好。
-
-
if [ `service mysql status |awk '{print $2}'` = 'running' ] #检查mysql是否活着,这里用mysql作为服务名称,有些用mysqld作为服务名称。
-
then
-
LOAD=`uptime`
-
LOAD=${LOAD##* }
-
# if [ `expr $LOAD \< $CPU_LOAD` = 1 ] # another method,compare integer and decimal
-
if [ `echo "$LOAD > $MAX_LOAD" | bc` = 1 ] #如果负载过高。
-
then
-
pkill keepalived # if load is greater than max load then kill keepalived,take VIP point to another server.
-
Send_Email "Mysql is alived,Average load is busy,so kill keepalived"
-
fi
-
else #mysql服务挂了,VIP漂移走。
-
pkill keepalived # if mysql service is not running ,then kill keepalived,take VIP point to another server.
-
Send_Email "Mysql service is not alived,so kill keepalived."
-
fi
-
echo `date`>>/tmp/pk.log #这里只是为了检查脚本是否被正常执行,实际使用删除掉。
-
#健康检查脚本完毕。
-
#chmod +x /home/bruce/MySQL.sh #分配执行权限
-
-
#==========================================================================
-
启动keepalvice
-
#==========================================================================
-
[root@ldc2095 keepalived-1.1.20]# keepalived -D #-D参数,会把日志记录到/var/log/message里面
-
[root@ldc2095 keepalived-1.1.20]# ps aux |grep keep
-
root 10862 0.0 0.0 35844 624 ? SNs 21:34 0:00 keepalived -D
-
root 10863 0.0 0.0 37936 1548 ? SN 21:34 0:00 keepalived -D
-
root 10864 0.0 0.0 37936 1016 ? SN 21:34 0:00 keepalived -D
-
root 24121 0.0 0.0 61180 776 pts/0 SN+ 21:40 0:00 grep keep
-
-
#===========================================================================
-
另外一个机器的配置和上面的一样。除了修改修改的几个地方。
-
健康检查脚本也一致。
|
|