使用KeepAlived搭建MySQL高可用环境

 



使用KeepAlived搭建MySQL的高可用环境。
首先搭建MySQL的主从复制
在Master开启binlog,创建复制帐号,
然后在Slave输入命令
 
2016年7月25日
  配置安装技巧:
  1,使用yum install 安装keepAlived  
  2,安装完后,配置/etc/keepalived/keepalived.conf配置文件,一开始配置名字取错了,老有问题
  3,配置keepalived.conf好后要/root/shutdown.sh配置shell脚本,配置关闭本机的keepalived让其切换虚拟IP,不关闭keepalived
       不会切换IP
        service  keepalived stop
  
  1. change master to
  2. master_host='192.168.1.70',
  3. master_port=3306,
  4. master_user='xx',
  5. master_password='xx';
然后使用start slave开启复制。

然后编译安装KeepAlived
进入keepalived-1.2.12目录
然后使用
./configure
make && make install

然后在Master服务器编辑KeepAlived的配置文件
vim /etc/keepalived/keepalived.conf
复制代码
global_defs {
     router_id HA_MySQL
}

vrrp_script check_mysql {                   ######定义监控mysql的脚本  
     script "/root/check_mysql.sh"  
     interval 2                             ######监控时间间隔  
     weight 2                               ######负载参数  

}  
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 100
     advert_int 1
     nopreempt
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
            192.168.113.215
     }
}

track_script {                              ######执行监控mysql进程的脚本  
     check_mysql  
}  

virtual_server 192.168.113.215 3306 {
     delay_loop 2
     lb_algo wrr
     lb_kind DR
     persistence_timeout 60
     protocol TCP
     real_server 192.168.113.145 3306 {
         weight 3
         notify_down /root/shutdown.sh
         TCP_CHECK {
             connect_timeout 10
             nb_get_retry 3
             delay_before_retry 3
             connect_port 3306
         } 
     }
}
复制代码

 


然后编辑Slave的配置文件
vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
global_defs {
     router_id HA_MySQL
}
 
vrrp_script check_mysql {                   ######定义监控mysql的脚本 
     script "/root/check_mysql.sh" 
     interval 2                             ######监控时间间隔 
     weight 2                               ######负载参数 
 
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 100
     advert_int 1
     nopreempt
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
            192.168.113.215
     }
}
 
track_script {                              ######执行监控mysql进程的脚本 
     check_mysql 
 
virtual_server 192.168.113.215 3306 {
     delay_loop 2
     lb_algo wrr
     lb_kind DR
     persistence_timeout 60
     protocol TCP
     real_server 192.168.113.142 3306 {
         weight 3
         notify_down /root/shutdown.sh
         TCP_CHECK {
             connect_timeout 10
             nb_get_retry 3
             delay_before_retry 3
             connect_port 3306
         }
     }
}

 check_mysql.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MYSQL=/usr/local/mysql/bin/mysql 
MYSQL_HOST=localhost 
MYSQL_USER=root 
MYSQL_PASSWORD=cc.123 
   
   
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1 
#$mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1 
if [ $? == 0 ] 
then 
    echo " $host mysql login successfully " 
    exit
else 
    #echo " $host mysql login faild" 
    /etc/init.d/keepalived stop 
    exit
fi

 shutdown.sh

1
2
3
#!/bin/bash
#pkill keepalived
service keepalived stop

  

其中
priority                      表示优先级
virtual_ipaddress      虚拟的IP地址(VIP)
delay_loop                每个2秒检查一次real_server状态
notify_down              检测到服务down后执行的脚本 
connect_timeout      连接超时时间
nb_get_retry             重连次数
delay_before_retry   重连间隔时间
connect_port            健康检查端口

shutdown.sh 可以考虑加入邮件告警的功能。

  1. #!/bin/bash
  2. pkill keepalived

在两个服务器上启动MySQL和KeepAlived服务
service mysql start
service keepalived start

Master的server_id为1
Slave的server_id为2

然后 连接VIP的MySQL,可以看到已经连接到了Master服务器(server_id为1)



如果kill掉Master的MySQL,KeepAlived会自动转移到Slave

在Master服务器上执行
killall mysqld

然后再次查看server_id,
短暂的失去连接之后,再次连接上VIP,server_id已经变为2,说明VIP已经指向了Slave




nopreempt参数表示Master恢复正常之后,是否将VIP继续指向Master
这样的话,会再次引发切换。

两台服务器的KeepAlived会有心跳检测,
如果Master的MySQL服务挂了(3306端口挂了),那么他会选择自杀.
Slave的KeepAlived通过心跳检测发现这个情况,就会将VIP的请求接管。


KeepAlived还有很多参数没有明白是什么意思
生产环境的切换脚本,在Slave提升为Master之后,应该等待所有的中继日志应用完毕,否则可能丢失数据
 
 配置备注:
     virtual_router_id 51   这个51在局域网里不要重复
     配置过程的文本,不能少{},关键字也不能少,不然配置不成功,错误信息也没有错误提示
    这里的eth0 是网卡名称,如果提示找不到,需要通过 IP addr 查看,改成对应的名称
posted @   zping  阅读(1005)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2008-07-22 SQL Server 2005 排序order by对查询性能的影响(2)
2008-07-22 SQL Server 2005 扫描计数产生原因分析(2)
2008-07-22 SQL Server 2005 扫描计数产生原因分析(1)
2008-07-22 SQL Server 2005 分页研究和优化(4)
点击右上角即可分享
微信分享提示