LVS-DR VIP和RIP不同網段的配置方法

fengzhanhai發表於2015-03-03

在網上流傳的很多文章中,LVS-DR模式都要求VIP和RIP在同一網段,很少有在不同網段配置成功的案例。但章文嵩博士已經在官網上明

確回答了是可以在不同網段的(見),負載排程器只要有一個網口和真實伺服器是透過不分

段的網路連線起來就可以,真實伺服器可以透過自己的路由器將響應報文傳送給客戶。也就是說Director至少要有兩個網口才滿足VIP和RIP

不在同一網段。
LVS-HOWTO()也說明了LVS-DR的要求。
從realserver到client路由,可以是另外的,也可能透過director,但要使用director做路由必須對director的核心打forward_shared

補丁,不然director不會轉發源IP是自已的包(見)。
如果使用另外的路由,則只要求能從realserver到client就行了,不需要得到client的響應,因此realserver可以放在防火牆後面。
下面是具體的配置過程:

[@more@]

director有兩塊網路卡:
eth0 192.168.2.254 用於跟realserver連線
eth1 61.180.79.110 外網IP,VIP也繫結到此網路卡

director的配置
1、安裝ipvsadm
ipvsadm是用來管理lvs設定的命令列工具,可以用來檢視當前狀態。
yum install ipvsadm

2、安裝keepalived
keepalived可以用於雙機熱備的自動故障轉移,也可以管理lvs的realserver列表,自動對realserver做健康檢查。

wget -c
tar zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/usr --sysconfdir=/etc

如果最後顯示
Use IPVS Framework : No
IPVS sync daemon support : No

請指定核心原始碼目錄再執行configure
./configure --prefix=/usr --sysconfdir=/etc --with-kernel-dir=/usr/src/kernels/linux-2.6.35.9

make && make install
將keepalived加入服務中
chkconfig --add keepalived
chkconfig --level 35 keepalived on

修改配置檔案
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.old
vi /etc/keepalived/keepalived.conf

填入以下內容

! Configuration File for keepalived
global_defs {
notification_email {
#需要本機SMTP服務
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER #備份伺服器上將MASTER改為BACKUP
interface eth1 #HA監測網路介面(繫結VIP的網口)
virtual_router_id 1 #主、備機的virtual_router_id一定要相同,必須相同!!!
priority 100 #主、備機取不同的優先順序,主機值較大,備份機值較小
advert_int 1 #VRRP Multicast廣播週期秒數
authentication {
auth_type PASS #VRRP認證方式
auth_pass 1111 #VRRP口令字
}
virtual_ipaddress {
61.180.79.18 #LVS虛擬地址,可寫多個VIP,一行一個VIP
}
}

virtual_server 61.180.79.18 80 {
delay_loop 2 #延時等待時間
lb_algo wrr #輪詢演算法
lb_kind DR #傳輸模式
persistence_timeout 0 #單一連結重連保持時間秒
protocol TCP

real_server 192.168.2.11 80 {
weight 1 #權重
TCP_CHECK { #realserve的狀態檢測設定部分,單位是秒
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.2.12 80 {
weight 1 #權重
TCP_CHECK { #realserve的狀態檢測設定部分,單位是秒
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

realserver的配置
rs1和rs2的IP分別是192.168.2.11 192.168.2.12
1、安裝nginx用於測試
wget -c
tar zxvf nginx-0.8.54.tar.gz
cd nginx-0.8.54
./configure --prefix=/usr/local/nginx
make && make install
啟動nginx
/usr/local/nginx/sbin/nginx

2、繫結VIP到lo
ifconfig lo:0 61.180.79.18 broadcast 61.180.79.18 netmask 255.255.255.255 up

3、將繫結VIP的網路卡設定為no_arp
vi /etc/sysctl.conf
增加
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
使之生效
sysctl -p

4、設定realserver能到達client的路由閘道器
route add default gw 192.168.2.1

我開始測試的時候,使用一個tp-link的無線寬頻路由器,一直配置不成功,後來用tcpdump分析才發現,這個路由器就是不轉發從

realserver到client的資料包,不知道什麼原因,但直接ping client又是通的,後來直接用一臺linux做路由就可以了

(net.ipv4.ip_forward = 1,而且這臺路由啟用NAT也不影響)。


如果要使用director做realserver到client的閘道器,就需要給director的核心打補丁,我是使用最新的核心編譯的,過程如下:
wget -c
tar -xjvf linux-2.6.35.9.tar.bz2
mv linux-2.6.35.9 /usr/src/kernels

為核心打forward_shared補丁
cd /usr/src/kernels
wget -c /usr/src/kernels/linux-2.6.35.9
patch -p1 < ../forward_shared-2.6.34-2.diff

cd

為了方便編譯配置,將boot目錄下的配置檔案複製到 /usr/src/kernels/linux-2.6.35.9
cp /boot/config-2.6.18-194.32.1.el5 /usr/src/kernels/linux-2.6.35.9/.config

make menuconfig 選擇 Load an Alternate Configuration 回車確認載入


預設情況下啟動時會提示如下錯誤:
mount: could not find filesystem ‘/dev/root’
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init!

解決方法:
執行完make menuconfig後,修改/usr/src/kernels/linux-2.6.35.9/.config

將#CONFIG_SYSFS_DEPRECATED_V2 is not set
預設被註釋掉的,將其改為y。即修改為
CONFIG_SYSFS_DEPRECATED_V2=y


根據需要再選擇編譯選項;
make (這個過程相當的漫長,起碼半個小時以上)

如果沒有錯誤,執行模組編譯安裝
make modules_install

編譯核心安裝
make install

sh /usr/src/kernels/linux-2.6.35.9/arch/x86/boot/install.sh 2.6.35.9 arch/x86/boot/bzImage
System.map "/boot"
看到如上提示表示編譯成功,


如果沒有看到錯誤,可以修改啟動項 讓 centos 啟動時載入 新核心, (如有編譯錯誤請勿修改啟動配置,否則啟動失敗)

vi /boot/grub/grub.conf
default=0 (修改為0 即可)

不知為什麼這個核心啟動的時候會報錯
insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists
解決辦法如下:

1、解壓initrd檔案
[root@vhost ~]# cp /boot/initrd-2.6.35.4.img /tmp
[root@vhost ~]# cd /tmp/
[root@vhost tmp]# ls
initrd-2.6.35.4.img
[root@vhost tmp]# mkdir newinitrd
[root@vhost tmp]# cd newinitrd/
[root@vhost newinitrd]# zcat ../initrd-2.6.35.4.img |cpio -i
11282 blocks
釋放之後看到如下內容
[root@vhost newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot
2、下邊就是編輯init,刪掉其中重複的四行中的兩行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3、重新打包initrd
[root@vhost newinitrd]# find .|cpio -c -o > ../initrd
11282 blocks
[root@vhost newinitrd]# cd ..
[root@vhost tmp]# gzip -9 < initrd > initrd.img
[root@vhost tmp]# ls
initrd-2.6.35.4.img initrd initrd.img newinitrd
initrd.img就是重新打包的initrd了,然後把initrd.img複製到/boot
[root@vhost tmp]# mv /boot/initrd-2.6.35.4.img /boot/initrd-2.6.35.4.img.bak
[root@vhost tmp]# mv initrd.img /boot/initrd-2.6.35.4.img
[root@vhost tmp]# reboot
這樣“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists” 就不會有了

使用新核心重啟後
vi /etc/sysctl.conf
修改或增加
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.forward_shared = 1
net.ipv4.conf.all.forward_shared = 1

sysctl -p
注意檢視forward_shared選項是否成功設定

這樣,就可以將realserver的閘道器改為192.168.2.254了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25723371/viewspace-1446935/,如需轉載,請註明出處,否則將追究法律責任。

相關文章