使用lvs进行读服务器负载均衡
优点:
a)属于四级代理,只进行分发,处理效率更高
b)工作稳定,进行高可用配置
c)无流量,不会对主机的网络io造成影响
缺点:
不能解决读写分离的功能

====================================================================

msyq数据库读压力大的问题
参考:https://www.10qianwan.com/articledetail/362533.html
           

服务器信息

主db:192.168.182.128            
主备db:192.168.182.129           
slavedb:192.168.182.131          
keepalived--->vip:192.168.182.111   
lvs--->    manage:192.168.182.128/129   
lvs--->             vip:  192.168.182.222  

1. 安装lvs管理工具

在128,129上 yum install -y ipvsadm.x86_64

2. 加载ipvs模块

在128 ,129 ,131 上执行 modprobe ip_vs;  加载ipvs模块

3. 在slave 129,131服务器上编写并运行要使用lvs脚本

/etc/init.d/lvsrs 内容:
#!/bin/bash 
 VIP=192.168.182.222  #lvs里面虚拟的VIP地址
 . /etc/rc.d/init.d/functions 
 case "$1" in 
 start) 
 /sbin/ifconfig lo down #lo 接口操作
 /sbin/ifconfig lo up 
 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 
 /sbin/sysctl -p >/dev/null 2>&1 
 /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up 
 /sbin/route add -host $VIP dev lo:0 
 echo "LVS-DR real server starts successfully.\n" 
 ;; 
 stop) 
 /sbin/ifconfig lo:0 down 
 /sbin/route del $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 "LVS-DR real server stopped." 
 ;; 
 status) 
 isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"` 
 isRoOn=`/bin/netstat -rn | grep "$VIP"` 
 if [ "$isLoOn" == "" -a "$isRoOn" == "" ]; then 
 echo "LVS-DR real server has to run yet." 
 else 
 echo "LVS-DR real server is running." 
 fi 
 exit 3 
 ;; 
 *) 
 echo "Usage: $0 {start|stop|status}" 
 exit 1 
 esac 
 exit 0 运行脚本:
     /etc/init.d/lvsrs start;
 查看 ip addr

MySQL计算导致压力增大 数据库压力大_database

4. 修改主服务器上的keepalived.conf文件,通过keepalived,保证lvs的高可用

keepalived.conf 内容
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
 }vrrp_script check_run
 {
     script "/etc/keepalived/mysql_check.sh"
     interval 5
 }
 #为了keepalived的高可用
 vrrp_instance VI_1 {
     state MASTER
     interface ens33
     virtual_router_id 51
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1234
     }
     track_script {
         check_run
     }
     virtual_ipaddress {
        192.168.182.111
     }
 }
 #为了lvs的高可用
 vrrp_instance VI_2 {
     state BACKUP
     interface ens33
     virtual_router_id 201
     priority 99
     advert_int 1
     nopreempt
     authentication {
         auth_type PASS
         auth_pass 1234
     }
    
    virtual_ipaddress {
       #lvs->vip
       192.168.182.222
     }
 }
 virtual_server 192.168.182.222 3306 { 
     delay_loop 5   #健康检查时间间隔5s
     lb_algo rr     #lvs 算法
     lb_kind DR     #设置LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式可选 
     persistence_timeout 120 #(同一 IP 的连接 120 秒内被分配到同一台realserver) 
     protocol TCP
     sorry_server 192.168.182.111 3306 #keepalived->vip  real_server 失效后启用
     real_server 192.168.182.129 3306 { #真实的从服务器ip
       weight 1
       MISC_CHECK {
       misc_path "/etc/keepalived/check_slave.sh -udba_monitor -p123456 -h192.168.182.129 -P3306" #主服务器下检查从服务器的状态,使用的账号信息dba_monitor,密码
       misc_dynamic
       }
     }
     real_server 192.168.182.131 3306 {
     weight 1
     MISC_CHECK {
       misc_path "/etc/keepalived/check_slave.sh -udba_monitor -p123456 -h192.168.182.131 -P3306"
       misc_dynamic
       }
     }
 }check_slave.sh 用来监测slave服务器是否可用,当slave服务器宕机或者slave服务器延迟比较大时,脚本会把此slave服务器从lvs的读列表中去掉
check_slave.sh 内容:
#/bin/bash
 # check_slave.sh
 MYSQL=`which mysql`
 VIP=192.168.182.222 #lvs中虚拟的ip
 VPORT=3306 
 function usage()  
 {  
   echo "usage:"  
   echo "example:# mysql -uroot -p123456 -P3306 -h192.168.182.128"  
   echo "-p, --password[=name]"  
   echo "-P, --port"  
   echo "-h, --host=name"  
   echo "-u, --user=name"  
 }  
   
   
 while getopts "u:p:h:P:" option  
 do  
     case "$option" in  
         u)  
             dbuser="$OPTARG";;  
         p)  
             dbpwd="$OPTARG";;  
         h)  
             dbhost="$OPTARG";;  
         P)  
             dbport="$OPTARG";;  
         \?)  
             usage  
             exit 1;;  
     esac  
 done  
   
 if [ "-$dbuser" = "-" ]; then  
     usage  
     exit 1  
 fi  
   
 if [ "-$dbpwd" = "-" ]; then  
     usage  
     exit 1  
 fi  
   
 if [ "-$dbhost" = "-" ]; then  
     usage  
     exit 1  
 fi  
   
 if [ "-$dbport" = "-" ]; then  
     usage  
     exit 1  
 fi  
   
 $MYSQL -u$dbuser -p$dbpwd -P$dbport -h$dbhost -e "select @@version;" >/dev/null 2>&1
 if [ $? = 0 ] ;then
   MySQL_ok=1
 else
   /sbin/ipvsadm -d -t $VIP:$VPORT -r $dbhost:$VPORT
   exit 1
 fislave_status=$(${MYSQL} -u$dbuser -p$dbpwd -P$dbport -h$dbhost -e 'show slave status \G' | awk ' \
   /Slave_IO_Running/{io=$2} \
   /Slave_SQL_Running/{sql=$2} \
   /Seconds_Behind_Master/{printf "%s %s %d\n",io,sql,$2}') >/dev/null 2>&1 arr=($slave_status)
 io=${arr[0]}
 sql=${arr[1]}
 behind=${arr[2]} if [ "$io" == "No" ]||[ "$sql" == "No" ]; then  
     /sbin/ipvsadm -d -t $VIP:$VPORT -r $dbhost:$VPORT #去除从服务器
     exit 1  
 elif [ $behind -gt 60 ]; then
     /sbin/ipvsadm -d -t $VIP:$VPORT -r $dbhost:$VPORT #去除从服务器
     exit 1
 else
     /sbin/ipvsadm -a -t $VIP:$VPORT -r $dbhost:$VPORT -g
     exit 0  
 fi

5. 创建lvs用于监控后端数据库所使用的数据库账号,就是上一步的检测脚本的用户信息

    grant all privileges on *.* to dba_monitor@'192.168.182.%' identified by '123456';

6. 在使用lvs的manage服务器上编写并运行lvs所需要的脚本

/etc/init.d/lvsdr 内容
#!/bin/bash 
 VIP=192.168.182.222 #lvs->vip
 DEV=ens33
 . /etc/rc.d/init.d/functions 
 case "$1" in 
 start) 
 echo "1">/proc/sys/net/ipv4/ip_forward 
 /sbin/ipvsadm -A -t $VIP:3306 -s rr -p 60 
 /sbin/ipvsadm -a -t $VIP:3306 -r 192.168.182.129:3306 -g  #添加从服务器ip
 /sbin/ipvsadm -a -t $VIP:3306 -r 192.168.182.131:3306 -g  #添加从服务器的ip
 /sbin/ipvsadm --start-daemon 
 echo "LVS-DR server starts successfully.\n" 
 ;; 
 stop) 
 /sbin/route del $VIP >/dev/null 2>&1 
 echo "0" >/proc/sys/net/ipv4/ip_forward 
 /sbin/ipvsadm -C 
 echo "LVS-DR real server stopped." 
 ;; 
 status) 
 isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"` 
 isRoOn=`/bin/netstat -rn | grep "$VIP"` 
 if [ "$isLoOn" == "" -a "$isRoOn" == "" ]; then 
 echo "LVS-DR real server has to run yet." 
 else 
 echo "LVS-DR real server is running." 
 fi 
 exit 3 
 ;; 
 *) 
 echo "Usage: $0 {start|stop|status}" 
 exit 1 
 esac 
 exit 0 
 运行脚本/etc/init.d/lvsdr start;

7. 在128主服务器上查看效果 虚拟的ip是否存在

执行命令 ip addr

MySQL计算导致压力增大 数据库压力大_数据库_02

在从服务器上 mysql -udba_monitor -p123456 -h192.168.182.222 -e"show variables like 'server_id'"; 

MySQL计算导致压力增大 数据库压力大_MySQL计算导致压力增大_03

下面我们在192.168.182.128上查看一下ipvs的状态,命令如下 

[root@root ~]# ipvsadm -l -n 

MySQL计算导致压力增大 数据库压力大_数据库_04

 可以看到 192.168.182.222:3306 对应了两个服务器ip 192.168.182.129 和192.168.182.131

接下来我们模拟其中一个服务器宕机的情况

[root@zhanglichao /]# /etc/init.d/mysqld stop

然后我们再来查询ipvs状态 

MySQL计算导致压力增大 数据库压力大_服务器_05

发现 192.168.182.222:3306 现在只对应了1个服务器ip 192.168.182.129,而192.168.182.131已被剔除