Linux下keepalived+mysql 实现高可用
2016-03-11 13:40
609 查看
Linux下keepalived+mysql实现高可用
首先在搭建前分析,想用keepalived实现mysql高可用,那么先的对keepalived+lvs跟mysql主主复制有所了解。因为mysql+keepalived架构是在keepalived+lvs跟mysql主主复制的基础上实现的lvs+keepalived跟mysql主主复制,在前面的博文中已经介绍过了这里不啰嗦了。
lvs+keepalived链接:http://duyunlong.blog.51cto.com/1054716/1118447,
mysql主主复制链接:/article/4379871.html
我们的目标是,两台mysql服务器如果其中有一台mysql服务器挂掉后,另外一台能立马接替其进行工作。因此我们就必须保证两台mysql数据库的数据完全一样,而且当挂掉的那一台重新启动的话,不再会被客户端继被访问,而是会充当备机跟现在工作的mysql进行数据同步,一直到提供服务的那台挂掉后再接替其工作。如此周而复始的实现了mysql的高可用。在通常情况下实现这种模式的keepalived无疑是最好的选择。因为有虚拟IP的原因,如果有一台mysql挂掉了,keepalived会从服务器群中剔除,而客户端访问会被切换到另外一台接替其工作的机器上。
在搭建的时候一些注意事项,mysql主主复制跟lvs+keepalived搭建的注意事情前面博文已经提高这里就不再啰嗦。在搭建完毕后,因为arp的原因不能够实现自由切换。这就是要注意的重点。
添加完后保存退出,并执行:sysctl -p使其生效
下面具体操作,首先有两台mysql机器已经搭建好了mysql的主主复制
vip:192.168.5.55
mysql-ha1:192.168.5.234
mysql-ha2:192.168.5.155
在两台mysql机器上都安装ipvsadm,keepalived,首先在mysql-ha1(192.168.5.234)安装
在mysql-ha2(192.168.5.155)也同样进行安装
然后我们编辑keepalived配置文件,下面是mysql-ha1(192.168.5.234)上的配置文件内容
这里需要注意的是,notify_down /usr/local/mysql/bin/mysql.sh这个选项,这个是是在keepalived检测不到mysql的时候要执行的脚本,从上面的配置文件来看real服务器只有本机。那么,keeaplived如果启动,客户端也只是访问本机的mysql。nopreempt这个选下也得注意,这个是不抢占资源在优先级高的机器上配置就可以。
看下这个脚本的内容:
脚本内容就一条命令:pkill keepalived,主要作用是如果本机的mysql挂掉了,那么同时会杀死本机的keepalived,这样另外一台就会接替他工作,虚拟IP也会被另一台接管,如果不杀死keepalived虚拟IP不会被另一台接管,mysql访问也就不会切换过去。
测试下如果,mysql服务器挂掉,脚本是否可以杀死keepalived
可以看到当mysqld服务器挂掉后,脚本生效同时杀死本机keepalived使得mysql故障转移。这时另一台keepalived会接替它工作。
同样看下mysql-ha2(192.168.5.155)上keepalived配置文件
配置完毕后可以查看下keealived有没有检测到本机的mysql。(启动的时候先启动mysql在启动keepalived,要不mysql没起来启动keepalived会被脚本杀死。)
先看下mysql-ha1(192.168.5.234)
然后再看下mysql-ha1(192.168.5.155)
测试只开启mysql-ha1(192.168.5.234)mysql服务跟keepalived用客户端链接虚拟ip
mysql-ha2(192.168.5.155)
然后用客户端:192.168.5.10连接
然后把mysql-ha1(192.168.5.234)mysql服务关掉,开启mysql-ha2(192.168.5.155)上的mysql服务跟keepalived。然后不退出mysql,继续查看数据库:
mysql-ha1(192.168.5.234)
mysql-ha2(192.168.5.155)
客户端:192.168.5.10
切换很快,大概在2到3秒之间!
利用LVS+Keepalived实现MySQL高可用
ln -s /usr/src/kernels/2.6.32-279.14.1.el6.x86_64/ /usr/src/linux
tar zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install
Keepalived源码安装
安装依赖包
yum -y install popt-devel
安装Keepalived
点击(此处)折叠或打开
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
点击(此处)折叠或打开
chkconfig --add mysqld
chkconfig --add keepalived
chkconfig mysqld on
chkconfig keepalived on
Keepalived配置文件keepalived配置文件/etc/keepalived/keepalived.conf,主库为例
点击(此处)折叠或打开
global_defs {
router_id LVS_1
}
vrrp_sync_group test {
group {
mysql_ha
}
}
vrrp_instance mysql_ha {
state BACKUP ## 主备库都是BACKUP,防止主库重启后,抢夺VIP资源
interface eth0 ## HA地址网卡
virtual_router_id 61
priority 150 ## 优先级,主库比备库高
nopreempt ## 非抢夺,在主库上配置,表示不抢夺VIP
advert_int 1 ## 主备心跳检查间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ## VIP,主备库一样
10.0.0.76
}
## 以下脚本是Keepalived改变状态时触发的动作,分别是变为backup、master、fault状态
## 这是个简单的报警脚本而已
notify_backup "/usr/local/keepalived_script/keepalived_notify.sh BACKUP"
notify_master "/usr/local/keepalived_script/keepalived_notify.sh MASTER"
notify_fault "/usr/local/keepalived_script/keepalived_notify.sh FAULT"
notify "/usr/local/keepalived_script/keepalived_notify.sh "
}
virtual_server 10.0.0.76 3306 {
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout 20
protocol TCP
real_server 10.0.0.77 3306 { ## keepalived的realserver,主备库都取自身的mysql服务
weight 3
notify_down "/usr/local/keepalived_script/keepalived_notify.sh MYSQL_DOWN" ## 检测到realserver服务不可用时的动作
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
keepalived down
mysqld down
网络故障
机器宕机
测试步骤和结果
keepalived down
步骤:kill master上的keepalived进程
结果:
>>slave的keepalived通知切换为master
mysqld down
步骤:kill master上的mysqld进程,或者提高master服务器的负载
结果:
>>master的keepalived通知因为mysqld
down而停止keepalived
>>slave的keepalived通知切换为master
网络故障
步骤:master上ifconfig eth0 down,或者service
network restart
结果:
>>master的keepalived通知变为fault状态
>>slave的keepalived通知切换为master
机器宕机
步骤:master机器重启
结果:
>>slave的keepalived通知切换为master
有的环境测试,keepalived切换为master时,没有成功发送arping,导致VIP不同。所以给出了arping脚本
2,重启网卡,master变为fault状态,但没继续变为backup状态。
检查日志发现有错误信息
Keepalived_vrrp: Netlink: filter function error
Keepalived_healthcheckers: Netlink: filter function error
查找网络资料得知,keepalive不支持网络设备热插拔。ip link可以看出设备id变化了。
此时需要reload keepalived或者直接restart。
办法:网卡发生重启后,需检查keepalived是否正常
3,keepalived异常终止,VIP没有解除绑定,导致及时重启keepalived后,这个VIP也不能正常绑定和解除绑定
猜测原因是异常终止keepalived后,VIP没解除绑定,重启以后keepalived不识别未解除绑定的VIP。
办法:机器发生重启后需检查keepalived是否正常
4,ipvsadm使用yum安装,keepalived使用源码安装,keepalived不能启动healthchecker进程
keepalived安装时指定kernel目录:./configure --prefix=/usr/local/keepalived
--with-kernel-dir=/usr/src/kernels/2.6.18-308.1.1.el5-x86_64
5,关于virtual_router_id
virtual_router_id用来标识一对keepalived主从机的身份,不同keepalived对的这个id不能一样。取值范围1~255。如果不同组keepalived配置了同一个id,则会有如下报错:
6,端口转发
virtual_server配置的端口,与real_server配置的端口必须一样?
首先在搭建前分析,想用keepalived实现mysql高可用,那么先的对keepalived+lvs跟mysql主主复制有所了解。因为mysql+keepalived架构是在keepalived+lvs跟mysql主主复制的基础上实现的lvs+keepalived跟mysql主主复制,在前面的博文中已经介绍过了这里不啰嗦了。
lvs+keepalived链接:http://duyunlong.blog.51cto.com/1054716/1118447,
mysql主主复制链接:/article/4379871.html
我们的目标是,两台mysql服务器如果其中有一台mysql服务器挂掉后,另外一台能立马接替其进行工作。因此我们就必须保证两台mysql数据库的数据完全一样,而且当挂掉的那一台重新启动的话,不再会被客户端继被访问,而是会充当备机跟现在工作的mysql进行数据同步,一直到提供服务的那台挂掉后再接替其工作。如此周而复始的实现了mysql的高可用。在通常情况下实现这种模式的keepalived无疑是最好的选择。因为有虚拟IP的原因,如果有一台mysql挂掉了,keepalived会从服务器群中剔除,而客户端访问会被切换到另外一台接替其工作的机器上。
在搭建的时候一些注意事项,mysql主主复制跟lvs+keepalived搭建的注意事情前面博文已经提高这里就不再啰嗦。在搭建完毕后,因为arp的原因不能够实现自由切换。这就是要注意的重点。
vip:192.168.5.55
mysql-ha1:192.168.5.234
mysql-ha2:192.168.5.155
在两台mysql机器上都安装ipvsadm,keepalived,首先在mysql-ha1(192.168.5.234)安装
然后我们编辑keepalived配置文件,下面是mysql-ha1(192.168.5.234)上的配置文件内容
看下这个脚本的内容:
测试下如果,mysql服务器挂掉,脚本是否可以杀死keepalived
同样看下mysql-ha2(192.168.5.155)上keepalived配置文件
先看下mysql-ha1(192.168.5.234)
mysql-ha1(192.168.5.234)
利用LVS+Keepalived实现MySQL高可用
MySQL架构
MySQL的高可用,由一对互为主从的MySQL服务器组成,平时只有主库提供服务,备库不提供服务。当主库停止服务时,服务自动切换到备库。主备库通过双向复制,保证数据一致性。主备库以VIP对外统一服务接口。Keepalived
MySQL对外服务接口的VIP,由Keepalived来实现心跳检查和动态漂移。因此MySQL和Keepalived部署在同一台服务器上,每台Keepalived配置的realserver即自身机器的MySQL服务。环境安装
MySQL安装
两台服务器都安装MySQL,搭建主主复制架构。具体搭建略。LVS+Keepalived安装
LVS源码安装ln -s /usr/src/kernels/2.6.32-279.14.1.el6.x86_64/ /usr/src/linux
tar zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install
Keepalived源码安装
安装依赖包
yum -y install popt-devel
安装Keepalived
点击(此处)折叠或打开
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
添加自启动
mysqld和keepalived自启动点击(此处)折叠或打开
chkconfig --add mysqld
chkconfig --add keepalived
chkconfig mysqld on
chkconfig keepalived on
Keepalived配置
IP配置
这里的主备库IP配置如下库 | IP | 服务VIP |
主 | 10.0.0.77 | 10.0.0.76 |
备 | 10.0.0.78 |
点击(此处)折叠或打开
global_defs {
router_id LVS_1
}
vrrp_sync_group test {
group {
mysql_ha
}
}
vrrp_instance mysql_ha {
state BACKUP ## 主备库都是BACKUP,防止主库重启后,抢夺VIP资源
interface eth0 ## HA地址网卡
virtual_router_id 61
priority 150 ## 优先级,主库比备库高
nopreempt ## 非抢夺,在主库上配置,表示不抢夺VIP
advert_int 1 ## 主备心跳检查间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ## VIP,主备库一样
10.0.0.76
}
## 以下脚本是Keepalived改变状态时触发的动作,分别是变为backup、master、fault状态
## 这是个简单的报警脚本而已
notify_backup "/usr/local/keepalived_script/keepalived_notify.sh BACKUP"
notify_master "/usr/local/keepalived_script/keepalived_notify.sh MASTER"
notify_fault "/usr/local/keepalived_script/keepalived_notify.sh FAULT"
notify "/usr/local/keepalived_script/keepalived_notify.sh "
}
virtual_server 10.0.0.76 3306 {
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout 20
protocol TCP
real_server 10.0.0.77 3306 { ## keepalived的realserver,主备库都取自身的mysql服务
weight 3
notify_down "/usr/local/keepalived_script/keepalived_notify.sh MYSQL_DOWN" ## 检测到realserver服务不可用时的动作
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
测试
测试效果
从以下4个方面测试HA效果keepalived down
mysqld down
网络故障
机器宕机
测试步骤和结果
keepalived down
步骤:kill master上的keepalived进程
结果:
>>slave的keepalived通知切换为master
mysqld down
步骤:kill master上的mysqld进程,或者提高master服务器的负载
结果:
>>master的keepalived通知因为mysqld
down而停止keepalived
>>slave的keepalived通知切换为master
网络故障
步骤:master上ifconfig eth0 down,或者service
network restart
结果:
>>master的keepalived通知变为fault状态
>>slave的keepalived通知切换为master
机器宕机
步骤:master机器重启
结果:
>>slave的keepalived通知切换为master
问题分析
1,keepalived切换为master时,arping失败有的环境测试,keepalived切换为master时,没有成功发送arping,导致VIP不同。所以给出了arping脚本
2,重启网卡,master变为fault状态,但没继续变为backup状态。
检查日志发现有错误信息
Keepalived_vrrp: Netlink: filter function error
Keepalived_healthcheckers: Netlink: filter function error
查找网络资料得知,keepalive不支持网络设备热插拔。ip link可以看出设备id变化了。
此时需要reload keepalived或者直接restart。
办法:网卡发生重启后,需检查keepalived是否正常
3,keepalived异常终止,VIP没有解除绑定,导致及时重启keepalived后,这个VIP也不能正常绑定和解除绑定
猜测原因是异常终止keepalived后,VIP没解除绑定,重启以后keepalived不识别未解除绑定的VIP。
办法:机器发生重启后需检查keepalived是否正常
4,ipvsadm使用yum安装,keepalived使用源码安装,keepalived不能启动healthchecker进程
keepalived安装时指定kernel目录:./configure --prefix=/usr/local/keepalived
--with-kernel-dir=/usr/src/kernels/2.6.18-308.1.1.el5-x86_64
5,关于virtual_router_id
virtual_router_id用来标识一对keepalived主从机的身份,不同keepalived对的这个id不能一样。取值范围1~255。如果不同组keepalived配置了同一个id,则会有如下报错:
Apr 7 14:31:11 localhost Keepalived_vrrp[22980]: ip address associated with VRID not present in received packet : 10.0.0.94 Apr 7 14:31:11 localhostKeepalived_vrrp[22980]: one or more VIP associated with VRID mismatch actual MASTER advert Apr 7 14:31:11 localhost Keepalived_vrrp[22980]: bogus VRRP packet received on eth0.181 !!! Apr 7 14:31:11 localhost Keepalived_vrrp[22980]: ------------- 使用keepalived搭建mysql主从备份、切换 2013-09-12 15:11:59 标签:mysql keepalived 主从切换 master/master 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/article/4389115.html mysql master/slave结构最大的缺点:当master宕机时不能切换到slave,这样就影响了业务的运行。为了弥补这个缺陷,我采用了keepalived+master/master结构。如图: 关于mysql的配置请参考:/article/4389085.html 安装keepalived 配置上注意priority的值,192.168.110.128是master,优先级要高。 preempt表示抢占服务,当192.168.110.128恢复后,重新把服务抢过来。 keepalived默认网卡eth0和自身服务出现问题时才会切换。 通过编写脚本来监控mysql的状态进而控制keeepalived服务 通过监控mysql服务状态来控制keepalived服务,这里mysql停掉则kill掉keepalived。 分别在两台机器上执行下面命令 测试: > ip addr >killall mysqld 查看192.168.110.137 此时192.168.110.137充当临时服务器。 恢复192.168.110.128上的业务后查看 此时业务被192.168.110.128抢占过来,192.168.110.137充当备份、临时服务器。 遗留的问题: 1、本来在keepalived使用vrrp_script和strack_script来监控这个脚本,但是测试过几遍脚本都不运行。网上很多人都谈到这个问题,我不知道其他人怎么成功的。 2、当写入数据时主服务器宕机,从服务器来不及同步数据。此时造成用户数据写入但不能读取。缓解这个问题可以采用同步或者半同步。 3、主从切换时会造成业务闪断。 4、对于第一个问题可以结合lvs来解决。 5、主键冲突问题 参考文档 http://bbs.ywlm.net/thread-855-1-1.html http://bbs.ywlm.net/thread-845-1-1.html http://bbs.ywlm.net/thread-790-1-1.html - VRRP_Instance(mysql_ha) ignoring received advertisment... |
virtual_server配置的端口,与real_server配置的端口必须一样?
相关文章推荐
- 开发--CentOS 6.4 图文安装教程(有些设置大部分教程没出现过)
- eclipse远程调试linux下的weblogic
- Linux驱动相关命令:
- 线程相关API集合(Linux)
- Linux下实现输入密码以星号显示
- CentOS 下的包管理工具RPM
- CentOS/Ubuntu 下 MySQL 的安装
- CentOS7.1 KVM虚拟化之linux虚拟机安装(2)
- 使用bochs和grub建立可引导硬盘镜像
- linux(centos)搭建svn服务器
- Linux论坛
- linux下U盘文件系统类型的识别以及挂载
- win上传Linux文件乱码问题解决办法
- Linux进程通信的几种方式
- linux编程之GDB调试
- Linux 2.6 中的页面回收与反向映射
- SELinux 的启动、关闭与查看
- Linux
- Linux通过sar命令查看网卡流量
- 【原创】linux mint 17.3 kvm 安装windows7虚拟机