a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 146|回复: 2

[红旗认证] Linux操作系统下的集群工作原理及实践经历

[复制链接]
发表于 2012-8-4 12:16:06 | 显示全部楼层 |阅读模式
一、集群和Linux上的集群解决方案) }: r5 d/ R' s5 |1 X6 ?' F
  集群系统主要解决下面几个问题:/ b0 w8 e7 b1 K
  高可靠性(HA)6 r5 w8 d2 g9 f( i
  利用集群治理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
3 B& @5 d8 U/ a  高性能计算(HP)
* R+ y' Z. w" J- n4 S  即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。) D; n. N, v6 j' D$ a
  负载平衡
" F5 M1 p& @1 l# {  [. X5 |4 X  即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。! R2 l; K  J! i5 S/ Y
  基于Linux的集群解决方案可谓百花齐放。在实际应用中,最常见的情况是利用集群解决负载平衡问题,比如用于提供WWW服务。在这里主要展示如何使用LVS来实现实用的WWW负载平衡集群系统。3 W0 l; F* I3 j" ?- I5 Z
  二、LVS简介
4 H$ p8 W$ v# C, I  LVS是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如RedHat的Piranha,TurboLinux公司的Turbo Cluster等,都是基于LVS的核心代码的。在现实的应用中,LVS得到了大量的部署,请参考http: //www.linuxvirtualserver.org/deployment.html。关于Linux LVS的工作原理和更具体的,请参考linuxvirtualserver.org/">http://www.linuxvirtualserver.org。% @+ P) S, [5 k4 I( a, y: M
  三、LVS配置实例! S/ c; }: Q1 R
  通过Linux LVS,实现WWW,Telnet服务的负载平衡。这里实现Telnet集群服务仅为了测试上的方便。
* c  a  E; d' \1 |, _: `  LVS有三种负载平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最为常用的是DR方式,因此这里只说明DR方式的LVS负载平衡。为测试方便,4台机器处于同一网段内,通过一交换机或者集线器相连。实际的应用中,最好能将虚拟服务器vs1和真实服务器rs1, rs2置于于不同的网段上,即提高了性能,也加强了整个集群系统的安全性。
. ^9 v4 L5 z. D; u' t8 r  服务器的软硬件配置' X; X/ c- V5 R7 M2 G7 S( `4 I1 ?
  首先说明,虽然本文的测试环境中用的是3台相同配置的服务器,但LVS并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载情况,调整负载分配策略,充分利用集群环境中的每一台服务器。. i* ^' C; h$ W  C( K# t" Z
  这3台服务器中,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问请求转发到集群内部的rs1,rs2,然后由rs1,rs2分别处理。client为客户端测试机器,可以为任意操作系统。 4台服务器的操作系统和网络配置分别为:
/ |' y7 n2 ]1 _* L( Q! E  vs1: RedHat 6.2, Kernel 2.2.19
; v* l( D# |$ |& m' J; t! V  vs1: eth0 192.168.0.10 r0 Y2 i$ ]3 j' M! _( u
  vs1: eth0:101 192.168.0.1019 A1 s. T$ m! u: I* ~; E, Q
  rs1: RedHat 6.2, Kernel 2.2.14
0 b9 Q7 e- k7 D& Y9 G) E  rs1: eth0 192.168.0.3$ t1 W6 X6 v7 U( E1 i# P6 D7 e# s
  rs1: dummy0 192.168.0.101
0 I3 T, H+ @8 D  rs2: RedHat 6.2, Kernel 2.2.14
& r9 [3 }, I4 Z* l0 `$ M1 ~  rs2: eth0 192.168.0.4# k2 t* P( d/ i0 A: m; ~" u
  rs2: dummy0 192.168.0.101
0 q) Q: V$ p+ h1 ^  v) d) u  client: Windows 2000* Q% W& @/ T9 u$ a4 j
  client: eth0 192.168.0.2000 j& T3 b- c* r
  其中,192.168.0.101是答应用户访问的IP。
- o' u* I3 k( x, E; Y. Q( S  虚拟服务器的集群配置
- y. T5 J# N: _) l8 e1 p  大部分的集群配置工作都在虚拟服务器vs1上面,需要下面的几个步骤:
- p! v2 z" [$ O2 K" u, M  重新编译内核。
* p' W" ?  x) Z- y) ]1 t; E  首先,最新的Linux内核,版本号为2.2.19,地址为:http://www.kernel.org/,解压缩后置于/usr/src/linux目录下。
, W- j0 P4 [/ F# p2 I* S* f  其次需要LVS的内核补丁,地址为:http://www.linuxvirtualserver.org/software/ipvs- 1.0.6-2.2.19.tar.gz。这里注重,假如你用的Linux内核不是2.2.19版本的,请相应版本的LVS内核补丁。将ipvs- 1.0.6-2.2.19.tar.gz解压缩后置于/usr/src/linux目录下。7 d: b3 U9 z2 d3 ?8 ?
  然后,对内核打补丁,如下操作:7 s' t$ ]4 u6 T* e
  [root@vs2 /root]# cd /usr/src/linux6 P! c( S' s2 W2 j- B
  [root@vs2 linux]# patch -p1 ipvs-1.0.6-2.2.19/ipvs-1.0.6-2.2.19.3 b1 j8 H. p# {) F% p* `3 e
  patch1 `) P9 I: V; K" W0 @' a" I
  下面就是重新配置和编译Linux的内核。非凡注重以下选项:
" ~2 c/ s- j4 Y  e& f4 T  1 Code maturity level options——* I, p% c5 u; n1 f- g, B
  Prompt for development and/or incomplete code/drivers
/ \. q& G7 L) D/ @2 z: A% o! z  2 Networking部分:; W$ `5 ]' R1 X% }
  Kernel/User netlink socket, ^3 R7 P* P- O  \
  Routing messages
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:16:07 | 显示全部楼层

Linux操作系统下的集群工作原理及实践经历

  Netlink device emulation! W3 ^/ J/ a& S5 q) ^3 |8 U
  Network firewalls2 L% ]1 {# b2 Y9 b5 d
  Socket Filtering" E) i; L7 a" [2 \$ a+ U; x3 b+ s
  Unix domain sockets
- u* }6 z& U2 O7 [* r  TCP/IP networking9 l$ A9 s, `' s  H' l4 @: l9 I
  IP: multicasting, i, {4 b$ h, ~$ r; i8 h. }9 F
  IP: advanced router
! f  s* G$ V+ t  [ ] IP: policy routing2 m* s2 R; ]& K0 |9 [
  [ ] IP: equal cost multipath
% K8 }+ R. ^- X/ L% j  [ ] IP: use TOS value as routing key
0 g+ [' H$ y# Z$ T4 O. ?  [ ] IP: verbose route monitoring7 {+ ]! X9 ?$ o
  [ ] IP: large routing tables$ m% I" I( O) T$ p% K0 n- d  G
  [ ] IP: kernel level autoconfiguration! U* `/ O# Y/ E/ `- {
  IP: firewalling( }& \3 |# p" W: f
  [ ] IP: firewall packet netlink device7 u) n- S2 t$ H  ]* \/ I
  IP: transparent proxy support: ~' u; @6 U9 U0 P& @, D) v
  IP: masquerading
( X# \- k) I% e  —— Protocol-specific masquerading support will be built as modules.
& |$ a0 b' J2 `  R) J& ]  IP: ICMP masquerading* e, T0 ~! E1 ~+ G6 ~& [+ s
  —— Protocol-specific masquerading support will be built as modules.
' O6 i  A) W; Y* e/ r2 d5 J  IP: masquerading special modules support
6 b% B# X: l3 b" I& Q  IP: ipautofw masq support' p! M6 M% \1 f$ o% q* m. D" E: V; R
  IP: ipportfw masq support# N7 g5 B# ^, v8 Y. c
  IP: ip fwmark masq-forwarding support7 _; n& k/ i2 A- p' C% X
  IP: masquerading virtual server support4 M9 W1 i+ j; o. a
  IP Virtual Server debugging ——最好选择此项,以便观察LVS的调试
6 j$ u7 S/ _. x; H# T: f1 b: ^% S  IP masquerading VS table size
* g1 {2 t1 @1 i1 d$ v* L* n  IPVS: round-robin scheduling
" ~6 X# m7 c2 O3 v! C- }& z/ r  IPVS: weighted round-robin scheduling
$ I; |3 v; N% {2 X4 T# }& i  L  IPVS: least-connection scheduling( ~! S3 q% }# M, T
  IPVS: weighted least-connection scheduling. G& }: D2 I7 i& c. Z
  IPVS: locality-based least-connection scheduling
3 ?: L: }, R# A' B) E  IPVS: locality-based least-connection with replication scheduling
$ C% }5 C/ ^5 N' {* Z  IP: optimize as router not host
/ z0 Y9 N! e, q4 Q) V8 V  IP: tunneling
" R/ f/ _, {6 A  IP: GRE tunnels over IP+ @5 Z! O& i. [6 x$ p3 k" _
  IP: broadcast GRE over IP
% Y  a4 w, m0 {& S0 x9 l' `  IP: multicast routing2 `' ?( @5 x+ J, h
  IP: PIM-SM version 1 support
( v/ R4 H/ Q; `$ |1 d5 I- C8 p  IP: PIM-SM version 2 support! d! @, n# g* O- N: V- [
  IP: aliasing support
! Z% Q  {0 M2 L+ x  [ ] IP: ARP daemon support
$ t1 Q8 M% `/ r1 U4 V; D  IP: TCP syncookie support
2 t. L0 B( d$ N& m3 j  ——6 R; j0 k& T9 i% {
  IP: Reverse ARP
- q$ S; Y& Z4 r2 D  IP: Allow large windows# s, X# y* R, E0 h4 y: P$ q
  The IPv6 protocol
, g" v+ x; h  @( ?0 K  C; w  上面,带号的为必选项。然后就是常规的编译内核过程,不再赘述。
. ^- O( d5 \5 D, g  在这里要注重一点:假如你使用的是RedHat自带的内核或者从RedHat的内核版本,已经预先打好了LVS的补丁。这可以通过查看/usr/src/linux/net/目录下有没有几个ipvs开头的文件来判定:假如有,则说明已经打过补丁。
) m# A6 H% J9 G* S$ {  编写LVS配置文件,实例中的配置文件如下:
6 T$ q; j  |9 a  #lvs_dr.conf Joseph Mack mack@ncifcrf.gov
& _4 M5 h, o- g  LVS_TYPE=VS_DR
3 i$ H  {" h: b$ A, U  INITIAL_STATE=on
( W( N* E& o5 b4 C' Q, I- j( c- O2 ]
 VIP=eth0:101 192.168.0.101 255.255.255.0 192.168.0.0( L8 K$ Q% K2 @2 a  V6 v
  DIRECTOR_INSIDEIP=eth0 192.168.0.1 192.168.0.0 255.255.255.0 192.168.0. 255; p! w. O+ }* q# L& a
  SERVICE=t telnet rr rs1:telnet rs2:telnet
, l& ^! b: {% K" [  SERVICE=t www rr rs1:www rs2:www
; n8 y# ]' h8 B, T1 j  SERVER_VIP_DEVICE=dummy0
5 I  u% U' l3 u- b6 Z8 j  SERVER_NET_DEVICE=eth0$ V' v: l0 S) }7 _; _
  #——end lvs_dr.conf——
3 r9 |3 d2 {$ a( Y5 [  将该文件置于/etc/lvs目录下。
0 @! v1 Z+ }) `2 {' V: y# a4 Q  使用LVS的配置脚本产生lvs.conf文件。该配置脚本可以从http: //www.linuxvirtualserver.org/Joseph.Mack/configure-lvs_0.8.tar.gz 单独,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含脚本configure的使用方法:" G  ?2 Y" M6 }; _- _  |
  [root@vs2 lvs]# configure lvs.conf5 q9 ?0 r, v1 \
  这样会产生几个配置文件,这里我们只使用其中的rc.lvs_dr文件。修改/etc/rc.d/init.d/rc.local,增加如下几行:) ]6 g/ H5 \0 k9 ~# B# u' Z
  echo 1 /proc/sys/net/ipv4/ip_forward
1 x8 p) ?, G- k  echo 1 /proc/sys/net/ipv4/ip_always_defrag
- N& B. M+ v( M1 F! L$ c+ A  # 显示最多调试
2 l8 y" c# r% p1 j3 ~6 O, u$ A" _  echo 10 /proc/sys/net/ipv4/vs/debug_level
9 H- h$ k( ^: a* ]- `, S6 I" }  配置NFS服务。这一步仅仅是为了方便治理,不是必须的步骤。假设配置文件lvs.conf文件放在/etc/lvs目录下,则/etc/exports文件的内容为:, {) ~* H- D& R: H# o; N- L6 m" j" F
  /etc/lvs ro
) f8 R: W6 A  h2 V  P1 {  然后使用exportfs命令输出这个目录:$ S8 b/ b0 x; c) ~0 C7 y  ~& }
  [root@vs2 lvs]# exportfs: W% f0 G' j/ S0 r
  假如碰到什么麻烦,可以尝试:
/ K8 V. [& l0 F5 R9 Z- N  S) L) E  [root@vs2 lvs]# /etc/rc.d/init.d/nfs restart9 Y( S9 z; @7 F! i) s3 Y
  [root@vs2 lvs]# exportfs3 u% h, R9 |" q9 E3 F# ]
  这样,各个real server可以通过NFS获得rc.lvs_dr文件,方便了集群的配置:你每次修改lvs.conf中的配置选项,都可以即可反映在rs1,rs2的相应目录里。 修改/etc/syslogd.conf,增加如下一行: kern. /var/log/kernel_log。这样,LVS的一些调试就会写入/var/log/kernel_log文件中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:16:08 | 显示全部楼层

Linux操作系统下的集群工作原理及实践经历

  Real Server的配置
& R% g9 r9 w6 \* u: `/ \' }  Real Server的配置相对简单,主要是是以下几点:
4 }/ Z9 |( A# @  配置telnet和WWW服务。telnet服务没有需要非凡注重的事项,但是对于www服务,需要修改httpd.conf文件,使得apache在虚拟服务器的ip地址上监听,如下所示:7 g  d7 p% l8 \. L( k# N
  Listen 192.168.0.101:80. z* ^. i* M( r. x* y3 p
  关闭Real Server上dummy0的arp请求响应能力。这是必须的,具体原因请参见 ARP problem in LVS/TUN and LVS/DR关闭dummy0的arp响应的方式有多种,比较简单地方法是,修改/etc/rc.d/rc.local文件,增加如下几行:% h5 i! k5 K! E4 s, ?7 q8 H# N( M
  echo 1 /proc/sys/net/ipv4/conf/all/hidden
' k' j( W7 v8 S8 \+ a  ifconfig dummy0 up2 y# u" U/ L3 V' {7 z! L
  ifconfig dummy0 192.168.0.101 netmask 255.255.255.0 broadcast 192.168. 0.0 up" E; a' @: D' I( y' A- p5 Y
  echo 1 /proc/sys/net/ipv4/conf/dummy0/hidden
8 a  b' D7 y: o: k$ J  再次修改/etc/rc.d/rc.local,增加如下一行:(可以和步骤2合并)
6 k( m/ u- h* S$ ]& ~" I; ^# |  echo 1 /proc/sys/net/ipv4/ip_forward( i  k2 j6 `  A4 _9 O# K
  四、LVS的测试
3 a* N2 C0 W, [1 Y  好了,经过了上面的配置步骤,现在可以测试LVS了,步骤如下:
! z) R! b# L, p& |/ W% s  分别在vs1,rs1,rs2上运行/etc/lvs/rc.lvs_dr。注重,rs1,rs2上面的/etc/lvs目录是vs2输出的。假如您的 NFS配置没有成功,也可以把vs1上/etc/lvs/rc.lvs_dr复制到rs1,rs2上,然后分别运行。确保rs1,rs2上面的 apache已经启动并且答应telnet。! I  ?% W! Z7 C9 k6 W; z
  然后从client运行telnet 192.168.0.101,假如登录后看到如下输出就说明集群已经开始工作了。(假设以guest用户身份登录)' }7 d# ?9 f' V' @
  [guest@rs1 guest]$——说明已经登录到服务器rs1上。( g/ B' `0 [2 R8 Q+ ^1 O
  再开启一个telnet窗口,登录后会发现系统提示变为:# O- \* _3 A* {. ^. G4 j
  [guest@rs2 guest]$——说明已经登录到服务器rs2上。( F' m; R* y/ q% [* s' ~' B
  然后在vs2上运行如下命令:
& H- T: b+ Z# U  [root@vs2 /root]ipvsadm
9 k, N0 H5 O/ }4 l  运行结果应该为:
; f& z0 L9 z! L) o' c  IP Virtual Server version 1.0.6* C" p. J( A" n( }1 v& i# c
  Prot LocalAddress:Port Scheduler Flags
8 o0 W9 h5 e+ ]' K! A' F5 i  - RemoteAddress:Port Forward Weight ActiveConn InActConn
8 b1 Q# @8 P( ?& Z  TCP 192.168.0.101:telnet rr
9 b, _# n2 x+ ^& q3 p( H" C  - rs2:telnet Route 1 1 03 @5 x: R3 p% R2 O% m
  - rs1:telnet Route 1 1 0. B7 @$ d+ Y" ]' j. S# K% V
  TCP 192.168.0.101:www rr
0 y8 [7 h' H# H( t' P1 ]: R% m& O  - rs2:www Route 1 0 0/ y' _/ x3 z0 W% r& n6 g  `6 p
  - rs1:www Route 1 0 0
& B; P5 O2 m+ d" H- T' d) Y  至此已经验证telnet的LVS正常。然后测试一下WWW是否正常:用你的浏览器查看http://192.168.0.101/是否有什么变化?为了更明确的区别响应来自那个Real Server,可以在rs1,rs2上面分别放置如下的测试页面:
. |. \% |7 y1 K9 D0 d  我是real server #1 or #2$ ~: d0 \2 e: a: n1 g/ Q
  然后刷新几次页面(http://192.168.0.101/test.html),假如你看到“我是real server #1”和“我是real server #2”交替出现,说明www的LVS系统已经正常工作了。  t. \9 o/ b  r1 ]1 j
  但是由于Internet Explore 或者Netscape本身的缓存机制,你也许总是只能看到其中的一个。不过通过ipvsadm还是可以看出,页面请求已经分配到两个Real Server上了,如下所示:! W+ }* d+ V0 W4 E0 O$ @9 d* }" }
  IP Virtual Server version 1.0.6. ~1 K6 J3 A* e+ H
  Prot LocalAddress:Port Scheduler Flags
; R4 W" S4 R1 d4 j  - RemoteAddress:Port Forward Weight ActiveConn InActConn
. l* N( Y2 `! g6 h* t6 ]6 U  TCP 192.168.0.101:telnet rr& u3 b) d) A$ x+ l4 f
  - rs2:telnet Route 1 0 0
. u) [  @0 I. q! c  - rs1:telnet Route 1 0 08 V* ?; M( i) l- c9 V" m+ x+ d
  TCP 192.168.0.101:www rr7 ~* R9 C4 B: R+ z5 M% j0 `8 F
  - rs2:www Route 1 0 5
# O) D' G  C9 Z: F7 t3 n* s8 K  - rs1:www Route 1 0 4+ i9 V& T# |. @( W; m; t! h( @/ o
  或者,可以采用linux的lynx作为测试客户端,效果更好一些。如下运行命令:
5 x2 q, y  c- |; V- {  [root@client /root]while true; do lynx -dump1 s, y% J8 r" i% f5 `
  http://10.64.1.56/test.html; sleep 1; done
% Z" x! N. h/ n: {1 @' l  这样,每隔1秒钟“我是realserver #1”和“我是realserver #2”就交替出现一次,清楚地表明响应分别来自两个不同的Real Server。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-3 03:42 , Processed in 0.250580 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表