使用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
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 -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已被剔除