路漫漫其修远兮
吾将上下而求索

mysql学习:mysql双主热备+lvs+keepalived配置

下面要介绍的是如何通过Keepalived+LVS方式来是实现MySQL的高可用性,利用LVS实现MySQL的读写负载均衡,Keepalived避免节点出现单点故障。

此测试是在博文:mysql+keepalived双主高可用配置  的基础上进行测试的,要先将mysql主主同步环境搭建好,然后进行下面的测试

测试环境
LVS_Master:           192.168.220.72  centos7.2
LVS_Backup:           192.168.220.73  centos7.2
MySQL1 Real Server:   192.168.220.70  centos6.9
MySQL2 Real Server:   192.168.220.71  centos6.9
VIP:                  192.168.220.74

采用lvs-dr模式,rr调度算法

防火墙设置:可以设置严格条件(注意多播地址),这里4台机器每台机器设置源ip为其他三台机器的都放行。lvs机器需将客户机的ip放行,允许访问

关于lvs和keepalived相关的介绍,需看前面的博文,此处只列出具体的配置,以及注意的地方

在:192.168.220.72和192.168.220.73机器上面安装好keepalived软件,此处使用rpm包安装,此处使用keepalived可抢占式配置,也可以将其都配置为backup非抢占式配置

[root@rtb-72 /etc/keepalived]#cat keepalived.conf
global_defs {
   notification_email {
       root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lvs-mysql
   vrrp_mcast_group4 224.0.100.0
}

vrrp_script chk_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"  #down文件在,返回1。不在返回0
    interval 1    #1秒钟调用一次,当上面的脚本执行返回1的时候会执行下面的操作
    weight -20    #当down文件存在,这个vs的节点的优先级-20,如果这个节点的优先级低于其他的vs主机,
                       #这个主机就会处于维护模式,ip被其他优先级高的主机夺走。
}

vrrp_instance rtb_mysql {
    state MASTER
    interface bond0
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2345
    }
    virtual_ipaddress {
        192.168.220.74/24 dev bond0
    }
    
    track_script {
        chk_down
    }
    
}


virtual_server 192.168.220.74 3306 {
    delay_loop 3
    lb_algo rr 
    lb_kind DR
    protocol TCP


    real_server 192.168.220.70 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            connect_port 3306
        }
    }

    real_server 192.168.220.71 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            connect_port 3306
        }
    }
}


#启动keepalived
[root@rtb-72 ~]#systemctl restart keepalived
[root@rtb-72 ~]#systemctl is-enabled keepalived
disabled
[root@rtb-72 ~]#systemctl enable keepalived    
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.

[root@rtb-73 /etc/keepalived]#cat keepalived.conf 
global_defs {
   notification_email {
       root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lvs-mysql
   vrrp_mcast_group4 224.0.100.0
}

vrrp_script chk_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"  #down文件在,返回1。不在返回0
    interval 1    #1秒钟调用一次,当上面的脚本执行返回1的时候会执行下面的操作
    weight -20    #当down文件存在,这个vs的节点的优先级-20,如果这个节点的优先级低于其他的vs主机,
                       #这个主机就会处于维护模式,ip被其他优先级高的主机夺走。
}

vrrp_instance rtb_mysql {
    state BACKUP
    interface bond0
    virtual_router_id 20
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2345
    }
    virtual_ipaddress {
        192.168.220.74/24 dev bond0
    }
    
    track_script {
        chk_down
    }    
    
}


virtual_server 192.168.220.74 3306 {
    delay_loop 3
    lb_algo rr 
    lb_kind DR
    protocol TCP


    real_server 192.168.220.70 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            connect_port 3306
        }
    }

    real_server 192.168.220.71 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            connect_port 3306
        }
    }
}

#启动keepalived
[root@rtb-73 ~]#systemctl restart keepalived
[root@rtb-73 ~]#systemctl is-enabled keepalived
disabled
[root@rtb-73 ~]#systemctl enable keepalived    
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.

下面是后端rs配置文件,两个rs配置相同

[root@RTB-70 /data/lvs_dr]#cat lvs_dr_slave.sh 
#!/bin/bash
#
vip=192.168.220.74
mask='255.255.255.255'
gw_ip="192.168.220.1"

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $mask broadcast $vip up
    route add -host $vip dev lo:0    #vip必须从lo网卡进来,从lo网卡出去
    
    route del default 
    route add default gw $gw_ip
    ;;
stop)
    ifconfig lo:0 down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ;;
*) 
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac

先启动后端的rs服务,lo网卡配置上vip

[root@RTB-70 /data/lvs_dr]#echo "bash /data/lvs_dr/lvs_dr_slave.sh" >> /etc/rc.d/rc.local  #加入开机启动
[root@RTB-70 /data/lvs_dr]#bash lvs_dr_slave.sh start
[root@RTB-70 /data/lvs_dr]#ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:A9:FE:EC  
          inet addr:192.168.220.70  Bcast:192.168.220.255  Mask:255.255.255.0

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

lo:0      Link encap:Local Loopback  
          inet addr:192.168.220.74  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

[root@RTB-71 /data/lvs_dr]#echo "bash /data/lvs_dr/lvs_dr_slave.sh" >> /etc/rc.d/rc.local           
[root@RTB-71 /data/lvs_dr]#bash lvs_dr_slave.sh start
[root@RTB-71 /data/lvs_dr]#ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:A9:4A:AE  
          inet addr:192.168.220.71  Bcast:192.168.220.255  Mask:255.255.255.0

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

lo:0      Link encap:Local Loopback  
          inet addr:192.168.220.74  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

经过测试,调度机宕机一台,可以正常访问,可以正常切换

经过测试,后端mysql宕机一台,可以正常访问,不影响业务

关于keepalived的实时漂移,可以通过/var/log/message文件实时查看过程,这里不再赘述,可看前面博文

lvs的调度以及连接数可以通过下面的命令查看

[root@rtb-72 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.220.74:3306 rr
  -> 192.168.220.70:3306          Route   1      0          0         
  -> 192.168.220.71:3306          Route   1      1          0

如果其他网段需要连接此网段的lvs上面的mysql,需要授权其他网段可以访问。

如果其他网段访问此网段lvs上的mysql,linux主机作为网关,注意设置内核参数,不然ip和mac地址对不上的包会被丢弃

[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter

#0 就是对进来的包完全不作检查,这样有被dos 攻击的风险。
#1 就是严格检查,只要不是这个interface 的包,就不返回。
#2 就是不太严格,只要本机配置了这个ip ,还是可以返回的。
#对于lvs 来说,用2 也是可以的。

如果其他网段主机访问此网段的lvs上的mysql,默认网段不能出网,可能涉及到默认网关问题

可在keepalived配置文件中调用脚本来发送邮件通知或者处理其他事情

注意lvs以每个会话作为单独的调度,一个终端进入mysql后,在这个终端会话会全部调度到其中一台机器,所有操作都会在这台机器完成,所有插入语句id都是奇数。当又有一个终端会话的时候,全部调度到另外一台机器,所有操作都在这台机器完成,所有插入语句id都是偶数

当某台机器有vip的时候,不能从这台机器连接vip

未涉及到的地方,可查看前面博文或参考资料

参考文档:http://www.cnblogs.com/kevingrace/p/5570500.html

未经允许不得转载:江哥架构师笔记 » mysql学习:mysql双主热备+lvs+keepalived配置

分享到:更多 ()

评论 抢沙发

评论前必须登录!