上一篇关于负载均衡lvs介绍的文章中已经讲解了lvs-dr的原理,这篇文章主要介绍其在mysql应用上的实现过程:

测试环境:4台虚拟机都是centos6的操作系统,使用系统自带的mysql包安装测试:

Linux集群-负载均衡lvs-dr实现mysql

如上图所示,vip和rip在同一网段中的情况下使用lvs-dr模型来实现mysql集群服务

director

#!/bin/bash

#!/bin/bash
# auto install lvm-dr
# date 2015-10-10

#close selinux and iptables
sed -i "s/SELINUX=.*/SELINUX=permissive/" /etc/sysconfig/selinux      //关闭selinux
chkconfig iptables off            
service iptables stop &> /dev/null        //停止iptables服务

# ip_forward=1
sed -i "[email protected]_forward = [email protected]_forward = [email protected]" /etc/sysctl.conf && sysctl -p &>/dev/null           //开启转发功能

# install ipvsadm 
rpm -q ipvsadm &> /dev/null                 //安装ipvsadm命令行工具
if [ $? -eq 1 ]; then
    yum install -y ipvsadm &> /dev/null
fi


# define variable
IPVSADM=`which ipvsadm`
VIP=172.16.16.2
RS1=172.16.16.3
RS2=172.16.16.4

#ifconfig eth0:0 vip
ifconfig eth0:0 $VIP/32 broadcast $VIP up

# define lvs-dr
$IPVSADM -C            //清空规则
$IPVSADM -A -t $VIP:3306 -s lblc          //定义mysql集群服务
$IPVSADM -a -t $VIP:3306 -r $RS1:3306 -g      //将node加入mysql集群服务的dr模型中
$IPVSADM -a -t $VIP:3306 -r $RS2:3306 -g

$IPVSADM -L -n


node1

#!/bin/bash
# lvs-nat node define
# 

# define hostname
name=node1                   //定义主机名
hostname $name
sed -i "s/HOSTNAME=localhost/HOSTNAME=$name/" /etc/sysconfig/network

# define ip 
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
vip=172.16.16.2
ifconfig lo:0 $vip/32 broadcast $vip up          //定义vip
route add -host $vip dev lo:0

# yum install mysql-server                  
rpm -q mysql-server &> /dev/null             //安装mysql   
if [ $? -eq 1 ];then
    yum install -y mysql-server &> /dev/null
fi

chkconfig mysqld on
service mysqld start &> /dev/null && ss -tanl | grep 3306 &> /dev/null    //启动mysql服务
if [ $? -eq 0 ]; then
   echo -e "mysqld start \033[32m[OK]\033[0m" 
else
   echo -e "mysqld start \033[31m[fail]\033[0m"
   exit 2
fi
mysql> create database node1;          //创建node1数据库
mysql> grant all on *.* to [email protected]'172.16.%.%' identified by '123456';  //授权远程登录用户
mysql> flush privileges;


node2

#!/bin/bash
# lvs-nat node define
# 

# define hostname
name=node2                  //定义主机名
hostname $name
sed -i "s/HOSTNAME=localhost/HOSTNAME=$name/" /etc/sysconfig/network

# define ip 
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore   
echo 1 > /proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
vip=172.16.16.2
ifconfig lo:0 $vip/32 broadcast $vip up          //定义vip
route add -host $vip dev lo:0

# yum install mysql-server             
rpm -q mysql-server &> /dev/null              //安装mysql   
if [ $? -eq 1 ];then
    yum install -y mysql-server &> /dev/null
fi

chkconfig mysqld on
service mysqld start &> /dev/null && ss -tanl | grep 3306 &> /dev/null  //启动mysql服务
if [ $? -eq 0 ]; then
   echo -e "mysqld start \033[32m[OK]\033[0m" 
else
   echo -e "mysqld start \033[31m[fail]\033[0m"
   exit 2
fi
mysql> create database node2;      //创建node2数据库
mysql> grant all on *.* to [email protected]'172.16.%.%' identified by '123456';  //授权远程登录用户
mysql> flush privileges;


lvs在dr模式下需要修改arp:arp_announce和arp_ignore的值  用来屏蔽arp请求  

arp_ignore

定义对目标地址为本地IP的ARP询问不同的应答模式0 

0 、(默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 

1 、 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 

2 、只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 

3 、 不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应 

4-7 、保留未使用 

8 、不回应所有(本地地址)的arp查询

arp_ignore 设置为1,当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址应答。   


arp_announce

对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 

0 、 (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 

1 、尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 

2 、 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.


测试

[[email protected] ~]# mysql -uroot -h172.16.16.2 -p123456      
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| node2              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

[[email protected] ~]# mysql -uroot -h172.16.16.2 -p123456   //再测试一次
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| node2              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

Linux集群-负载均衡lvs-dr实现mysql

测试完成!!!