MySQL的MHA+keepalived+负载均衡+读写分离架构

时间:2023-01-08 04:08:48

之前写过了MySQL的简单MHA环境搭建,但是mha只是保证数据库一致性,对于实现应用访问的固定入口、读写分离、负载均衡需要keepalived、中间件、lvs来解决了。

本次搭建使用四台虚拟机,如下
manger:192.168.1.10
db1 (主):192.168.1.11
db2 (备):192.168.1.12
db3 (从):192.168.1.13

一、环境搭建
1、mha
      前面写过,这里就不说了

2、keepalived
      keepalived通常是用来防止单点故障造成集群失效,本例使用keepalived主要是两个作用,一个是防止单点故障,一个是用两个vip做读写分离,关于配置继续看步骤3。

3、读写分离
      读写分离有两种方式,一种是用keepalived,对外使用两个ip,分别对应写vip读vip;一种是用中间件,对外就是一个ip。
      本例使用keepalived,三台机器的配置文件内容除过红色以外都一样。
      注意:在同一网段内virtual_router_id 值不能相同;priority由优先级从大到小;

global_defs {
   router_id LVS_DEVEL
}

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

virtual_server 192.168.1.21 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 192.168.1.11 3306 {
        weight 1
        notify_down /usr/local/mysql/mysqldown.sh
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.12 3306 {

        weight 1
        notify_down /usr/local/mysql/mysqldown.sh 
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.1.22 3306 {
    delay_loop 2
    #wrr是lvs的均衡算法
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 192.168.1.12 3306 {
        weight 1
        notify_down /usr/local/mysql/mysqldown.sh
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
           }
     }
    real_server 192.168.1.13 3306 {
        weight 1
        notify_down /usr/local/mysql/mysqldown.sh
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
           }
     }
}
注:当192.168.1.11正常时,192.168.1.12用来读;当192.168.1.11宕机时,192.168.1.12用来写,所以在两个vip中192.168.1.12都出现了。


4、读的负载均衡
(1)  安装lvs
[root@localhost]# yum install ipvsadm
(2)  新建realserver.sh并配置
[root@localhost]# vim /etc/rc.d/init.d/realserver.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.1.22
source /etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       /sbin/route add -host $SNS_VIP2 dev lo:1
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0


二、启动
1、 启动Master上的MySQL
service mysql start
2、 启动Slave上的MySQL
service mysql start
3、 启动Master上的realserver脚本
/etc/rc.d/init.d/realserver.sh start
4、 启动Slave上的realserver脚本
/etc/rc.d/init.d/realserver.sh start
5、 启动Master上的keepalived
service keepalived start
6、 启动Slave上的keepalived
service keepalived start

三、测试
1、读写分离
      关于读写分离已经用不同的vip区分,使用不同的vip进行读、写。
2、负载均衡
(1)、查看lvs能否进行负载均衡转发
db1、db2、db3做相同的命令
[root@localhost ~]# 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.1.21:3306 rr
  -> 192.168.1.11:3306              Local   1      4          0         
TCP  192.168.1.22:3306 wrr
  -> 192.168.1.12:3306              Route   1      0          0         
  -> 192.168.1.13:3306              Route   1      0          0

IP使用该机器所用的vip
[root@localhost ~]# ipvsadm -lcn | grep 192.168.1.21
TCP 14:22  ESTABLISHED 192.168.1.56:64934   192.168.1.21:3306    192.168.1.11:3306
TCP 14:23  ESTABLISHED 192.168.1.56:64935   192.168.1.21:3306    192.168.1.11:3306
TCP 14:05  ESTABLISHED 192.168.1.56:64928   192.168.1.21:3306    192.168.1.11:3306
TCP 00:24  ESTABLISHED 192.168.1.56:64457   192.168.1.21:3306    192.168.1.11:3306


3、keepalived
(1)、测试db1宕机后,vip能否正常移动到db2
(2)、测试db1宕机后,db1加入到集群的两种方式
   a、db1以备库的身份加入集群:在db1上执行change master to ... db2;重新启动db1的keepalived
   b、db1以主库的身份加入集群:db1清空之前的binlog,db2、db3上reset slave all并执行change master to ...db1; 重新启动db1的keepalived;重新启动mha管理节点
    注意:b的方式比较繁琐,而且b如果重新为主,mha在重新启动中可能会对db2的binlog文件进行报错,需要较多时间才能正常启动,建议用a的方式;
                使用show VARIABLES like '%server_id%'来确认keepalived的vip在哪台机器上;
                无论a、b方式,有新节点加入集群时,一定要注意数据一致性

-------------------------------------
顺便推荐QQ群,仅供学习和交流,欢迎大家的加入
Java     : 139978466
MySQL: 167209377
大数据  : 181560406
前端     : 139978026
测试     : 299057857
运维     : 139978281