上一篇關於負載均衡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)
測試完成!!!