上一篇关于负载均衡lvs介绍的文章中已经讲解了lvs-dr的原理,这篇文章主要介绍其在mysql应用上的实现过程:
测试环境:4台虚拟机都是centos6的操作系统,使用系统自带的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 = 1@" /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 root@'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 root@'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回应的网络接口来进行发送.
测试
[root@localhost ~]# 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) [root@localhost ~]# mysql -uroot -h172.16.16.2 -p123456 //再测试一次 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | node2 | | test | +--------------------+ 4 rows in set (0.00 sec)
测试完成!!!