mysql + lvs 读数据库压力大的问题

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

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

msyq数据库读压力大的问题
参考:https://www.10qianwan.com/articledetail/362533.html
           https://blog.csdn.net/qq_41056224/article/details/105904220

服务器信息

主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

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
fi

slave_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 -udba_monitor -p123456 -h192.168.182.222 -e"show variables like 'server_id'"; 

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

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

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

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

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

然后我们再来查询ipvs状态 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值