mysql主备切换[高可用]

到这一步的时候, 是主备部署已经处理好, 请关注:mysql主备部署[高可用]

这次使用的是keepalived-1.2.22.tar.gz版, 官网地址:keeplived官网

笼统知识请自行查询百度下面开始步骤

第一步:安装keepalived-1.2.22

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
解压
tar -zxvf keepalived-1.2.22.tar.gz
 
编译
cd keepalived-1.2.22
./configure --prefix=/usr/local/keepalived/(新建文件夹喔)
安装
make && make install
 
服务脚本
cp /usr/local/etc/rc.d/init.d/keepalived  /etc/init.d/keepalived
配置文件
cp /usr/local/keepalived/etc/keepalived.conf /etc/keepalived/keepalived.conf
服务
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
 
加入服务
chkconfig --add keepalived
chkconfig keepalived on
 
service keepalived start   #启动服务
service keepalived stop    #停止服务
service keepalived restart #重启服务

上面的额操作主备机器都需要安装

第二步:配置文件

master: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
! Configuration File for keepalived
 
global_defs {
   router_id HA_MySQL
}
 
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.88.88
    }
}
 
virtual_server 192.168.88.88 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 192.168.75.61 3306 {
        weight 3
        notify_down /etc/keepalived/down.sh
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

slave: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
! Configuration File for keepalived
 
global_defs {
   router_id HA_MySQL
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.88
    }
}
 
virtual_server 192.168.88.88 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 192.168.75.62 3306 {
        weight 3
#        echo"62....1"
        notify_down /etc/keepalived/down.sh
#        notify_up /etc/keepalived/up.sh
#        echo"62....2"
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

down:down.sh

1
2
#!/bin/bash
pkill keepalived

第三步:测试

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
主:192.168.75.61
备:192.168.75.62
 
主:
[root@qwzs08 log]#service mysqld start
[root@qwzs08 log]#service keeplived start
 
保证已经启动成功!
[root@qwzs08 log]#ip addr
 
会显示出下面的vip(我上面配置文件把master放在61)
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN qlen 1000
    link/ether 00:50:56:89:a3:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.61/24 brd 192.168.75.255 scope global eth0
    inet 192.168.88.88/32 scope global eth0
    inet6 fe80::250:56ff:fe89:a328/64 scope link
       valid_lft forever preferred_lft forever
 
表示vip正常
 
此时在备机
[root@qwzs07 log]#ip addr
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN qlen 1000
    link/ether 00:50:56:89:cb:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.62/24 brd 192.168.75.255 scope global eth0
    inet6 fe80::250:56ff:fe89:cba6/64 scope link
       valid_lft forever preferred_lft forever
 
 
是没有vip的, 恭喜您!配置成功!

第四步:漂移

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
模拟主机宕机
ps aux | grep mysqld
 
root      1176  0.0  0.0  11336  1408 ?        S    15:38   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql3306.pid
mysql     1591  7.1  1.8 2736136 597708 ?      Sl   15:38   3:19 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/mysql3306.err --pid-file=/usr/local/mysql/data/mysql3306.pid
root      1978  0.0  0.0 103248   844 pts/0    S+   16:24   0:00 grep mysql
 
kill -9 1176 1591
 
此时,主机的mysql挂掉了,您怎么确定是有没有漂移呢?
查一下vip
ip addr
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN qlen 1000
    link/ether 00:50:56:89:cb:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.61/24 brd 192.168.75.255 scope global eth0
    inet6 fe80::250:56ff:fe89:cba6/64 scope link
       valid_lft forever preferred_lft forever
 
已经没有了
再去备机查一下vip
ip addr
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN qlen 1000
    link/ether 00:50:56:89:a3:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.62/24 brd 192.168.75.255 scope global eth0
    inet 192.168.88.88/32 scope global eth0
    inet6 fe80::250:56ff:fe89:a328/64 scope link
       valid_lft forever preferred_lft forever
 
look, 漂过来了
 
现在切换到主机把的mysql和keeplived开启
 
此时主机的服务已经开起来了, 但是vip并没有漂过去, 这就是nopreempt的作用, 防止脑裂
 
这时候加入备机slave挂掉, vip就会漂移到主机master, 实现高可用主从切换

此时如果能实现漂移就是成功了, 下面是我遇到的问题

1.keepalived执行后日志狂刷, 2.脚本并没有执行(down.sh),具体情况就是mysql挂掉后,keeplived并没有自杀,导致vip漂移失败, 但是手动关闭keeplived后会实现漂移, 原因就在于down脚本没有得到执行。

日志报错:

1
2
3
4
5
6
7
8
Nov 21 16:05:27 qwzs08 abrt[13378]: Not saving repeating crash in '/usr/sbin/keepalived'
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.75.62 added
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.75.62 added
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Registering Kernel netlink reflector
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Registering Kernel netlink command channel
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Nov 21 16:05:27 qwzs08 Keepalived_healthcheckers: Configuration is using : 9635 Bytes

很纠结,经过排查,原因是ip_vs模块系统默认没有自动加载

执行命令:

1
2
3
4
5
6
7
8
查看
lsmod | grep ip_vs
(如果没有任何输出则表示ip_vs模块并没有被内核加载)
 
手动加载
modprobe ip_vs
 
modprobe ip_vs_wrr

然后再看日志已经恢复正常

此时再查看ip_vs

1
lsmod | grep ip_vs
1
2
3
4
ip_vs_wrr               2179  1
ip_vs                 115643  3 ip_vs_wrr
libcrc32c               1246  1 ip_vs
ipv6                  321422  68 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6

ok!

 

posted @   扶苏公子x  阅读(6307)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战
· AI工具推荐:领先的开源 AI 代码助手——Continue

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示