zoukankan      html  css  js  c++  java
  • 第三节:安装Keepalived 实现自动主备切换

     网上没找到合适的图片,自己画一张简单的架构图吧

    想单独讲一个keepalived是因为不止可以实现MYSQL主备的切换,包括nginx、proxysql等需要高可用架构的场景,都可以实现。

    这是部署完成之后的架构图,服务器A会多一个虚拟IP地址。192.168.150.100

    应用程序都会访问这个虚拟IP,

    同时两台服务器上的keepalived软件会保持心跳,检测对方是否存在。

    下面是当服务器A或MySQL 实例A挂跳之后的架构。可以看到,虚拟IP 192.168.150.100 已经飘移到了服务器B,这对应用侧是透明的,应用侧不需要修改数据库连接地址,还能正常访问到数据库

    如果服务器A 或MySQL实例A修复好之后,虚拟IP还用飘移到服务器A吗,如果没有特殊需求,是不用的,毕竟MySQL实例A和MySQL实例B数据是一样的。

    两台机器都要安装

    下载地址:

    https://www.keepalived.org/download.html

    Keepalived for Linux - Version 2.0.20 

    wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz
    
    tar xvf keepalived-2.0.20.tar.gz
    
    cd keepalived-2.0.20/
    
    yum install gcc openssl-devel libnl3-devel pcre-devel -y
    ./configure --prefix=/usr/local/keepalived
    make && make install
    
    
    
    mkdir /etc/keepalived/
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /root/keepalived-2.0.20/keepalived/keepalived.service /etc/systemd/system/
    ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
    ll /usr/sbin/k*
    cp /root/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
    chmod 755 /etc/init.d/keepalived
    systemctl enable keepalived.service
    
    systemctl start keepalived.service
    
    [root@localhost ~]# ps -ef|grep keep
    gdm 8380 8099 0 06:45 ? 00:00:00 /usr/libexec/gsd-housekeeping
    root 13572 1 0 07:33 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
    root 13573 13572 0 07:33 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
    root 13574 13572 0 07:33 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
    root 13593 8592 0 07:33 pts/0 00:00:00 grep --color=auto keep
    [root@localhost ~]# tail -f /var/log/messages 
    May 18 07:33:35 localhost Keepalived_vrrp[13574]: Sending gratuitous ARP on eth0 for 192.168.200.18
    May 18 07:33:36 localhost Keepalived_healthcheckers[13573]: HTTP_CHECK on service [192.168.201.100]:tcp:443 failed after 3 retry.
    May 18 07:33:36 localhost Keepalived_healthcheckers[13573]: Removing service [192.168.201.100]:tcp:443 to VS [192.168.200.100]:tcp:443
    May 18 07:33:36 localhost Keepalived_healthcheckers[13573]: Lost quorum 1-0=1 > 0 for VS [192.168.200.100]:tcp:443
    May 18 07:33:36 localhost Keepalived_healthcheckers[13573]: Remote SMTP server [192.168.200.1]:25 connected.
    May 18 07:34:00 localhost Keepalived_healthcheckers[13573]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
    May 18 07:34:01 localhost Keepalived_healthcheckers[13573]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
    May 18 07:34:03 localhost Keepalived_healthcheckers[13573]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
    May 18 07:34:04 localhost Keepalived_healthcheckers[13573]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
    May 18 07:34:06 localhost Keepalived_healthcheckers[13573]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
    #Keepalived已经正常启动了,现在先停掉服务
    [root@localhost ~]# systemctl stop keepalived.service
    [root@localhost ~]# service mysql stop

    继续在两台服务器做相同配置

    mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    vi /etc/keepalived/keepalived.conf
    
    
    
    global_defs {
    router_id MySQL-HA   #标识,只是一个名字
    }
    
    vrrp_script check_run {
    script "/usr/local/mysql/mysql_check.sh"   #检测脚本地址
    interval 60                    #健康检查周期
    }
    
    
    vrrp_instance VI_1 {
    state BACKUP                  #状态为BACKUP
    interface eth0                  #绑定的网卡
    virtual_router_id 50              #主备服务器必须在一个id内,
    priority 100                  #权重设置
    advert_int 1                    #心跳间隔
    nopreempt                    #非抢占模式
    authentication {
    auth_type PASS                  #用户名 主备要配置为一样
    auth_pass 1234                  #密码 主备要配置为一样
    }
    
    track_script {
    check_run                    #执行的检测脚本
    }
    
    virtual_ipaddress {
    192.168.150.100                  #虚拟IP
    }
    }
    [root@localhost ~]#  vi /usr/local/mysql/mysql_check.sh 
    
    
    
    #! /bin/bash
    
    host=127.0.0.1
    user=root
    passwd=123456
    
    /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1 -P 3306 -e "select 1" >/dev/null 2>/dev/nul
    
    if [ $? != 0 ] ; then
    systemctl stop keepalived.service
    fi
    
    
    
    [root@localhost ~]#  chmod +x /usr/local/mysql/mysql_check.sh

    配置完毕,

    1、启动两个实例的mysql

    [root@localhost ~]# service mysql start
    Redirecting to /bin/systemctl start mysql.service
    [root@localhost ~]# 

    2、启动两个实例的keepalived

    [root@localhost ~]# service keepalived start
    Starting keepalived (via systemctl):                       [  OK  ]
    [root@localhost ~]# 

    3、先启动keepalived的服务器会先拿到虚拟IP,服务器A先启动的,在服务器A看下

    [root@localhost ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:cd:3f:f3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.150.101/24 brd 192.168.150.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet 192.168.150.100/32 scope global eth0        ###可以看到已经有192.168.150.100这个IP了
           valid_lft forever preferred_lft forever
        inet6 fe80::9aea:2ec6:c21c:9e85/64 scope link tentative noprefixroute dadfailed 
           valid_lft forever preferred_lft forever
        inet6 fe80::6b3:ad64:3e31:9979/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
        inet6 fe80::e204:ab19:4112:354e/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:4a:de:09 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:4a:de:09 brd ff:ff:ff:ff:ff:ff
    [root@localhost ~]# 

    模拟一下服务器A数据库宕机的场景,连接服务器A,执行

    [root@host101 ~]# service mysql stop
    Redirecting to /bin/systemctl stop mysql.service

    keepalived的检测脚本会发现,mysql已经无法访问了,会触执行一条命令:

    systemctl stop keepalived.service
    

     也就是将机的keepalived程序停掉,

    1、服务器A的keepalived程序停掉后,无法与服务器B的keepalived程序保持心跳状态,同时也会删掉本机的虚拟IP

    2、服务器B与服务器A的心跳中断之后,会认为服务器A已经宕机了,所以虚拟IP需要由自己来接管。

    3、在服务器B执行,ip a  会发现IP已经在服务器B上边了

    [root@host102 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:80:76:e0 brd ff:ff:ff:ff:ff:ff
        inet 192.168.150.102/24 brd 192.168.150.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet 192.168.150.100/32 scope global eth0    ###192.168.150.100已经在服务器B上了
           valid_lft forever preferred_lft forever
        inet6 fe80::9aea:2ec6:c21c:9e85/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:4a:de:09 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:4a:de:09 brd ff:ff:ff:ff:ff:ff
    [root@host102 ~]# 

    如果此时在服务器A执行

    service mysql start

    service keepalived start
    虚拟IP并不会再抢回来,根据之前keepalived.conf配置文件中,

    state BACKUP
    不会发生抢虚拟IP的行为,只有感知到另一方挂掉之后才会接管虚拟IP。

     如果服务器B的mysql进程挂掉后,192.168.150.100会瓢移到服务器A上边来。

  • 相关阅读:
    BZOJ 4525 二分
    BZOJ 4565 状压DP
    BZOJ 3930 容斥原理
    BZOJ 4562 搜索...
    BZOJ 4563 错排+高精度
    BZOJ 1833 数位DP
    BZOJ 4517 组合数+错排
    python 入门学习(二)
    python 入门学习
    Python 爬虫
  • 原文地址:https://www.cnblogs.com/nanxiang/p/12903151.html
Copyright © 2011-2022 走看看