keepalived简介
简单地说,keepalived 就是通过管理 VIP 来实现机器的高可用的,在使用 keepalived 的情况下,只有一台服务器能够提供服务(通过 VIP 来实现),当 Master 主机宕机后,VIP 会自动飘移到另一台服务器
keepalived 采用 Master/Slave 模式, 在 Master 上设置配置文件的 VIP,当 Master 宕机后,VIP 自动漂移到另一台 keepalived 服务器上
keepalived 可以用来做各种软件的高可用集群,它会一直检测服务器的状态,如果有一台服务器宕机,或工作出现故障,keepalived 将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后 keepalived 自动将服务器加入到服务器群中。
Keepalived 运行原理
Mysql 主主复制 ,主节点自动切换。利用 keepalived 软件监控主节点状态,当主节点崩溃,立刻热切换主节点到备份节点从而得到高可用性。
双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。
keepalived安装
Yum 安装
1yum install -y keepalived
源码安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 安装依赖 yum install -y gcc popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel libnfnetlink-devel # 下载安装包 wget http://www.keepalived.org/software/keepalived-2.1.5.tar.gz # 解压并安装 tar -xvz -f keepalived-2.1.5.tar.gz cd keepalived-2.1.5 ./configure --prefix=/usr/local/keepalived make && make install cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
修改配置
Master配置
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
48global_defs { notification_email { xXXXX2@qq.com #报警邮件接收人的地址 } notification_email_from XXX@qq.com smtp_server 127.0.0.1 smtp_connect_timeout 30 } #定义检测脚本 vrrp_script check_mysql_valid { #检测mysql服务是否在运行。检测方式有多种,比如进程,脚本等等。当前项目使用脚本进行检测 #脚本放置到服务器指定目录,并修改下面的路径 script "/etc/keepalived/keepalived_mysql_check.sh" interval 2 #脚本执行间隔时间,每2s检测一次 } vrrp_instance VI_1 { state MASTER interface ens33 #指定虚拟ip的网卡接口 virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的 priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP #的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 advert_int 1 #指定发送VRRP通告的间隔。单位是秒 authentication { auth_type PASS auth_pass XXXX } #指定VIP地址 virtual_ipaddress { 192.168.175.110 dev eth0 scope global } #调用检测脚本 track_script { check_mysql_valid } }
Slave配置
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
48
49
50
51global_defs { notification_email { xXXXX2@qq.com #报警邮件接收人的地址 } notification_email_from XXX@qq.com smtp_server 127.0.0.1 smtp_connect_timeout 30 } #检测mysql服务是否在运行。有很多检测方式,比如进程、脚本等等,本项目使用脚本进行检测 vrrp_script check_mysql_valid { #指定脚本位置 script "/etc/keepalived/keepalived_mysql_check.sh" #脚本执行间隔,每2s检测一次 interval 2 } vrrp_instance VI_1 { state MASTER interface eth0 #指定虚拟ip的网卡接口 virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的 priority 99 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP #的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 advert_int 1 #指定发送VRRP通告的间隔。单位是秒 authentication { auth_type PASS auth_pass XXXX } #变为 MASTER 时执行 notify_master "/bin/bash /etc/keepalived/keepalived_mysql_start.sh" #指定VIP virtual_ipaddress { 192.168.175.110 dev eth0 scope global } #执行检测脚本 track_script { check_mysql_valid } }
配置脚本
Mysql服务是否正常的检测脚本
创建脚本并赋予执行权限:
1/etc/keepalived/keepalived_mysql_check.sh
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89#!/bin/sh # MySQL 检测脚本 MySqlPath=$(cd $(dirname $0); pwd) cd $MySqlPath ThisTime=`date '+%F %T'` #指定脚本执行时,日志输出位置 log_file='/var/log/keepalived_mysql.log' # MySQL 连接方式,根据实际情况调整 export MYSQL_PWD='root' MYSQL_USER='root' MYSQL_SOCKET="/tmp/mysql.sock" mysql_connect="mysql -u${MYSQL_USER} -S${MYSQL_SOCKET} -p{MYSQL_PWD}" # 日志格式化 function formatEcho() { message=$1 message_level=$2 if [ -e $message_level ];then message_level='info' fi echo "`date '+%F %T'` - [${message_level}] $message" >> $log_file } # 检查mysql服务是否正常 正常返回 0,否则返回1 function check { ret=`$mysql_connect -N -e 'select 1 as value'` if [ $? -ne 0 ] || [ $ret -ne '1' ];then return 1 else return 0 fi } #全局设置数据库状态 1为只读 function read_only { param=$1 $mysql_connect -e "set global read_only = ${param}" formatEcho "设置是否只读 read_only ${param}" } # 失效转移操作 function failOver { formatEcho "开始执行失效转移" #停止 keepalived killall keepalived #如果还能执行的话,设为 read_only read_only 1 if [ $? -eq 0 ];then #如果还能执行,关闭所有的连接 $mysql_connect -e "select concat('KILL ',id,';') from information_schema.processlist where user!='root' AND db is not null into outfile '/tmp/kill.txt.${ThisTime}';" if [ $? -eq 0 ];then $mysql_connect -e "source /tmp/kill.txt.${ThisTime};" fi fi formatEcho "失效转移执行完成,当前数据库关闭访问" } # 尝试 3 次检查 for ((i=1; i<=3; i ++)) do #调用检测脚本 check if [ $? -eq 0 ];then formatEcho "MySQL is ok" # 正常退出脚本 exit 0 else formatEcho "Connection failed $i time(s)" sleep 1 fi done formatEcho '无法连接当前数据库' # 失效转移 failOver
切换为master时执行的脚本
创建脚本并赋予执行权限:
/etc/keepalived/keepalived_mysql_start.sh
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89#!/bin/sh # keepalived 变为 Master 时执行 MySqlPath=$(cd $(dirname $0); pwd) cd $MyPath ThisTime=`date '+%F %T'` #脚本执行时输出的日志 log_file='/var/log/keepalived_mysql.log' # MySQL 连接方式,根据实际情况调整 export MYSQL_PWD='root' MYSQL_USER='root' MYSQL_SOCKET="/tmp/mysql.sock" mysql_connect="mysql -u${MYSQL_USER} -S${MYSQL_SOCKET} -p{MYSQL_PWD}" # 日志格式化 function formatEcho() { message=$1 message_level=$2 if [ -e $message_level ];then message_level='info' fi echo "`date '+%F %T'` - [${message_level}] $message" >> $log_file } # 检查mysql是否正常运行, 正常返回 0、否则返回1 function check { ret=`$mysql_connect -N -e 'select 1 as value'` if [ $? -ne 0 ] || [ $ret -ne '1' ];then return 1 else return 0 fi } # 获取 slave status 的信息 function slave_info() { tmp_file=/tmp/slave_info.tmp $mysql_connect -e 'show slave statusG' > /tmp/slave_info.tmp slave_sql=`grep 'Slave_SQL_Running:' $tmp_file | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` seconds_behind_master=`grep 'Seconds_Behind_Master:' $tmp_file | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` master_log_file=`grep 'Master_Log_File:' $tmp_file | head -1 | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` master_log_pos=`grep 'Read_Master_Log_Pos:' $tmp_file | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` relay_master_log_file=`grep 'Relay_Master_Log_File:' $tmp_file | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` exec_master_log_pos=`grep 'Exec_Master_Log_Pos:' $tmp_file | sed 's/s*//g' | tr "A-Z" "a-z" | awk -F":" '{print $2}'` } # 设置是否只读 1为只读 function read_only { param=$1 $mysql_connect -e "set global read_only = ${param}" formatEcho "设置是否只读 read_only ${param}" } # 处理数据同步,如果是数据一致性优先,等待同步完毕。如果是服务可用性优先,可以注销下面的代码 function sync_master() { slave_info if [ $slave_sql == "yes" ];then formatEcho "当前同步位置 Master ${master_log_file} ${master_log_pos}" formatEcho "等待同步到 Master ${master_log_file} ${master_log_pos}" $mysql_connect -e "select master_pos_wait('$master_log_file', $master_log_pos);" > /dev/null formatEcho "同步完毕" fi } formatEcho "当前数据库提升为主库" #调用检测脚本 check if [ $? -ne 0 ];then formatEcho "无法连接当前数据库" exit 1 fi # 等待同步 sync_master # 设为可写 read_only 0
重启keepalived
1systemctl start keepalived
到此配置完成,接下来就可以进行验证了。
1、使用命令 ip addr 查看Master 主机是否多了虚拟IP
2、关闭Master的Keepalived ,查看VIP是否漂移到了 Slave机器
3、然后再测试mysql服务出现故障,VIP是否会自动切换
最后
以上就是高挑乌冬面最近收集整理的关于使用Keepalived实现mysql高可用的全部内容,更多相关使用Keepalived实现mysql高可用内容请搜索靠谱客的其他文章。
发表评论 取消回复