发新话题
打印

FreeBSD6.1 +CARP+IPVS双机热备份负载均衡

FreeBSD6.1 +CARP+IPVS双机热备份负载均衡

FreeBSD6.1 +CARP+IPVS双机热备份负载均衡 : J8 ]" T& {3 z: I: u5 g" M
作者 @kang 7 c9 A( v, J# I3 _! w

1 a+ b: E$ n& ?, n6 Q* V经过一个星期的找资料….测试….找资料….再测试……,终于测试成功Freebsd6.1+IPVS+CARP,实现双机热备份和负载均衡功能。其中:
* }9 `0 T5 r( Y% @1 tIPVS: 实现负载均衡功能 , {- g- v1 p  C) V9 d$ v
CARP: 实现双机热备份
: d: O4 ~' V2 I3 t
2 v6 y" C7 a' N8 h5 Y一 系统环境
: i* A9 r1 E0 o2 ^2 Z  r7 x( L
) Y. M! B9 `; OFreeBSD 6.1 Release 最小化安装(完全安装也可以) + Kernel Source (ALL) ' v7 E- g- L& A. x7 C# X0 @, ]

) x8 d  A9 \& Y, m* j3 YSRV01 192.168.2.133 255.255.255.0 (双机热备 主)
: L% B% l) B+ ^, M+ USRV02 192.168.2.130 255.255.255.0 (双机热备 辅)   G* }: x9 q( F/ P0 s) p7 o4 G
Share IP 192.168.2.144 255.255.255.0 (主辅机器共享) # L+ [5 ?! s* @, r0 p" M9 U; H8 c( E

$ Q/ x, H. D+ \8 X二 安装过程 , p) w" s/ f" `6 y
. Z+ m9 _9 }4 o' b. N1 |) v
a.在核心配置文件中添加对CARP的支持和options NF_SOCKOPT(ipvs需要) 选项 ! Q3 }* F- l" s6 k; H8 R: K
Srv01# cd /usr/src/sys/i386/conf/ 8 `# ~% v3 O% I9 N3 M# f
Srv01# cp GENERIC LVS
. i, L* }; T% Q' s; fSrv01# vi LVS   r: V% h8 ?! x, \. b( I% U- W' M
添加以下选项:
7 U5 ?6 _" R% y) G8 C& J9 O4 uoptions NF_SOCKOPT + D+ i% o% w/ M4 k0 r+ q
device carp 8 S! E* n; A( i& t! \6 O

" n$ |3 b) J! X* R0 j5 l3 ~* L$ E( vb. Freebsd6.1 的uipc_socket.c中没有#include "opt_nfsockopt.h" ,需手动添加否则编译将出错。
$ Z, {7 a$ \7 k4 @; H9 K6 |( M  {vi /usr/src/sys/kern/uipc_socket.c
8 t2 {. g+ c8 i找到#include "opt_compat.h"这一行,在下面加上 #include "opt_nfsockopt.h"
/ A/ m" X" X. X' [# N7 a' j
  \+ C" q" e, x8 n8 p" G- K5 r1 {" Nc. 打ipvs for freebsd6.1补丁(patch)。 - [$ [# j0 ~& k0 i* f
Srv01# cd /usr/ports/net/ipvs + I+ G, E9 V5 h( f2 u
Srv01# make patch-system #具体说明可以查看当前目录下的Makefile
  p6 i* O- q# C# J0 S7 G) i: q' l" a- ^: T
d. 编译核心
) B) M1 Q7 K) C/ rSrv01# cd /usr/src/sys/i386/conf
. M% _' v" T! j" PSrv01# config LVS 4 u8 G) c: R* l* a
Srv01# cd ../compile/LVS 4 B) O& L4 {3 R* W* c
Srv01# make depend
2 g3 K% M$ f2 A2 H& ]- o/ DSrv01# make . h" i& s& U# i7 y$ S
Srv01# make install 5 ^' }; [! ^4 i- U$ y1 @
Srv01# reboot
& _) e% a( D% K6 U- k& E' v
* I& @8 B  G0 `5 s以上操作在srv02上同样做一遍
% R6 b- j- X: e' ^4 k% X+ C  n7 [( @0 B
三 具体配置 / N; s$ s. M& `4 @! v! e9 b3 y

* o$ H- [: j6 X) p6 [# x9 h* dCARP 部分 (如果只需双机备份功能只配这部分就可以了) , f5 a6 L8 Q  m* T2 H% K2 O% }
SRV01
! o) N* h( ^& t: D. |5 Vsrv01# sysctl net.inet.carp.preempt=1 & ]: O2 u5 @9 N0 R3 {
srv01# ifconfig carp0 create 9 u$ M& s. s2 R% [% }
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up #password随便输入,但srv01和srv02必需一致。 & N. c3 M( L4 C: c
SRV02 - X( {$ \" ?2 G1 |' [3 A8 n) y0 ]2 ^
srv02# sysctl net.inet.carp.preempt=1 4 h! A) V* M" K3 V9 t8 u& k
srv02# ifconfig carp0 create
8 o/ c2 k, y- B+ \$ Xsrv02# ifconfig carp0 vhid 1 advskew 100 pass yourpassword 192.168.2.144/24 up % ^! Z' d) n$ Z$ j5 H

; y1 o- b8 i) f8 |% SIPVS 部分   H6 }8 Y" Q. E- D' T  \

, T2 A% K: W* T/ E- ssrv01# kldload /boot/modules/ipvs.ko : S! \3 l! {/ ]0 f8 T- u/ ]% P
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
4 e0 t. C" a! h7 c: ksrv01# ipvsadm –A –t 192.168.2.144:80 -s rr 2 p( V2 t+ @# N1 p  ^
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g 7 q4 p6 H; V0 V4 l, g
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.1.130:80 –g ) ~0 E6 F' p3 g' f2 A& t# R

5 |4 J0 D& D1 x& z$ U* rsrv01# ipvsadm –A –t 192.168.2.144:22 -s rr
. Y4 C4 I1 W6 n/ X) n" psrv01# ipvsadm -a -t 192.168.2.144:22 -r 192.168.2.133:22 -g $ j0 ?! e6 f* d2 N. c
srv01# ipvsadm -a -t 192.168.2.144:22 -r 192.168.1.130:22 -g
+ o, G8 E$ E) F- c- ~这里我只测试了http(80)和ssh(22)服务,其它的服务配置方法一样。 9 N0 N5 Y6 W1 Y; e% D0 G" x

) t- ?) S8 [2 M* l" k$ N以上操作在srv02上同样做一遍
' Y5 O; E: ^1 u% O
+ ~8 F7 \" M+ t( @+ ~1 V# m
. N* U% S% t% E: n: ?( L. K' T3 S清除 IPVS配置命令如下: ; u  l% l) q) t2 |
: M& c5 ~' a2 n8 y- y9 k* U8 I
srv01# ./ipvsadm -C . p/ H- }5 b% X. ?) l$ ?
srv01# kldunload ip_vs_rr
/ X9 S) F; g7 q8 {" u0 osrv01# kldunload ipvs 0 s- _4 [, N$ A' g4 ]9 L. J
3 l5 H% P; n' Y* e6 I; e  P8 b

, E1 T- T& ]! ^# u/ V四 测试
+ R8 S3 v6 ^1 WSrv01# ifconfig / S3 \; r9 V, p3 d% W2 w/ M

( g& F7 s* j* C+ T! }sk0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
0 {+ e2 S, w: S' N- moptions=8<VLAN_MTU>
6 s' a0 _1 P9 h4 t- e0 b+ qinet6 fe80::217:31ff:fe62:be1b%sk0 prefixlen 64 scopeid 0x1 2 Y% I1 o( [3 v5 V1 B$ O4 L$ ]
inet 192.168.2.133 netmask 0xffffff00 broadcast 192.168.2.255
( h! {& m! C! I3 j% |) eether 00:17:31:62:be:1b
: I% z. D4 o% h2 W( n5 V; tmedia: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>) , A9 D* M$ u7 R" [# A/ i
status: active 0 C% T  w0 o1 P, U+ S* m
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
- o$ |/ l. K5 c2 [& T+ ulo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 * c/ @& d( I1 ~" r5 Z* A# F
inet6 ::1 prefixlen 128 # [3 h- B( ]  Y5 t8 m  G4 Q# c
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
9 k! `/ J. n3 \$ Cinet 127.0.0.1 netmask 0xff000000 / k7 d9 i6 k5 `7 `" ]3 q5 n; L% @4 v
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
1 \+ O( R7 Q3 ^1 n# minet 192.168.2.144 netmask 0xffffff00
7 L  x4 H$ r5 w5 w# bcarp: MASTER vhid 1 advbase 1 advskew 0 / V2 t3 L/ t: g6 q- Z2 Q% S
$ U; A2 W  b. o* j7 L
Srv02# ifconfig , A8 E% l! i0 r! G( Q9 ^* f

% X. l& s4 P0 L+ G9 v& irl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
" x; C' N, a  u1 w2 o3 Z' Joptions=8<VLAN_MTU>
, M* w6 E4 v' O$ j* g- \2 einet6 fe80::217:31ff:fe62:be1b%sk0 prefixlen 64 scopeid 0x1 7 U% G0 ^' C4 p0 i9 L; e
inet 192.168.2.130 netmask 0xffffff00 broadcast 192.168.2.255
$ U  J6 y: r" p4 jether 00:17:31:62:be:1b
7 a2 H: H& v# p% J$ J3 }media: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>) ; X8 g, X4 l6 I- G5 J
status: active
4 M; p" x8 n# E& y" k; ?plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500 7 C, J  n* z/ y
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
5 m! l; Y1 E* V3 Minet6 ::1 prefixlen 128
4 i/ E3 i9 I; A5 f3 e9 V% Y! Finet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
( S0 H" q' N4 \: j1 l8 Sinet 127.0.0.1 netmask 0xff000000
( l5 z4 G  {( ?# J9 I" U0 o' @carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
/ x. D' K' X# v  c6 U% T/ ainet 192.168.2.144 netmask 0xffffff00 & Z% U4 {& Y5 h  t3 o( p
carp: BACKUP vhid 1 advbase 1 advskew 100 . l/ E& |5 F+ h
从ifconfig结果可以看到srv01 为master,srv02为backup.
2 t0 o% D, V( d7 `3 C5 O' E
; E* J; M6 k- q; [IPVS 测试 5 x: M) X) L1 w! Q! S1 A
6 m4 z5 v: \% v1 W  r2 b' B
客户端访问 http://192.168.2.144 时,不停刷新web页面时,web页面会在srv01,srv02上切换(为使切换效果明显srv01,srv02用内容不同的主页),说明负载均衡功能已成功。
6 e  [( ^9 m; V) x8 \客户端访问 192.168.2.144:22 (ssh) 每次连接一台不同Server(srv01,srv02)。 ( u* z% J. k8 ^. h/ [
6 P3 R% u! s. \+ h  R
CARP 测试
) ~0 i+ o7 A: a& I) D3 n5 X4 q( v. x0 w; ]- {/ r4 T
用ssh 到 192.168.2.144 可以看到主机名应为 srv01 。 7 E$ U7 I4 l  V( ~$ |( B
在客户端上ping 192.168.2.144 –t 拔除 srv01 的网线,在丢失1个包后重新连通。 - v; O4 c. G! T5 ?. s
再次ssh 到 192.168.2.144 可以看到主机名应为 srv02,并且srv02自动提升为Master。
( h9 j5 O3 r$ j3 O. h! R3 B当重新连上srv02的网线时,srv02自动降为Backup。
+ r/ \8 M7 b7 y9 ~& u这时说明双机热备份功能已经成功。

TOP

发新话题