设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 7973|回复: 12

[高可用性] 常见负载均衡器禁(启)用成员汇总[原创]   [复制链接]

Rank: 7Rank: 7Rank: 7

签到
613
注册时间
2009-1-17
最后登录
2017-9-21
在线时间
582 小时
阅读权限
100
积分
58491
帖子
159
主题
27
精华
5
UID
1039
发表于 2011-5-10 08:52:56 |显示全部楼层
本帖最后由 phpcool 于 2011-5-10 08:58 编辑

       在我们日常运维工作中,经常会碰到负载均衡器后端应用代码更新、临时剔除后端服务器、排查一主机应用故障等,往往我们会选择比较粗鲁的做法,直接停止或重启应用服务,让负载均衡器探测服务不可用将其剔除。这样带来的坏处是用户与服务器已经建立的连接会被中止,开发人员无法对已经停止服务的主机进行调试。现介绍一种较为温柔的做法,即通过禁用/启用成员的方式来达到目的。本文针对目前最为流行的负载均衡器逐一进行介绍。包括LVS、Haproxy、F5在命令行模式下的实现(方便与其它管理平台对接,实现自动化维护)。当然,Haproxy与F5都提供了人性化管理界面,不过只依赖手工来进行操作。

一、LVS负载均衡器
原理
使用LVS自带的管理工具来实现。

环境说明
Disable VIP:192.168.100.11:80
Disable REAL SERVER:192.168.100.78

实施步骤
1、初始状态
[devuser@lvsserver ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.11:80 rr persistent 60
  -> 192.168.100.74:80            Route   3      462        464        
  -> 192.168.100.75:80            Route   3      420        440      
  -> 192.168.100.76:80            Route   3      431        400
  -> 192.168.100.77:80            Route   3      430        432
  -> 192.168.100.78:80            Route   3      435        438

2、禁用成员
[devuser@lvsserver ~]# ipvsadm -d -t 192.168.100.11:80 -r 192.168.100.78

3、当前状态
[devuser@lvsserver ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.11:80 rr persistent 60
  -> 192.168.100.74:80            Route   3      462        464        
  -> 192.168.100.75:80            Route   3      420        440      
  -> 192.168.100.76:80            Route   3      431        400
  -> 192.168.100.77:80            Route   3      430        432

4、启用成员
[devuser@lvsserver ~]#ipvsadm -a -t 192.168.100.11:80 -r 192.168.100.78

5、当前状态
[devuser@lvsserver ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.11:80 rr persistent 60
  -> 192.168.100.74:80            Route   3      462        464        
  -> 192.168.100.75:80            Route   3      420        440      
  -> 192.168.100.76:80            Route   3      431        400
  -> 192.168.100.77:80            Route   3      430        432
  -> 192.168.100.78:80            Route   3      435        438

二、Haproxy负载均衡器
原理
使用Haproxy的socket admin通道来实现。

环境说明
Disable backend:test.tianya.cn
Disable REAL SERVER:192.168.100.78

实施步骤
1、修改haproxy.cfg配置
#vi /usr/local/haproxy/etc/haproxy.cfg
在global域添加socket admin支持并重启Haproxy服务
global
... ...
   stats socket /usr/local/haproxy/HaproxySocket level admin
... ...

#service haproxy restart

2、安装socat(在任意的两个socket管道之间建立一个通道,在该通道中交换两端的数据。)
wget http://www.dest-unreach.org/socat/download/socat-2.0.0-b3.tar.gz
./configure --disable-fips
make;make install

注:disable OpenSSL FIPS support  "--disable-fips",在没有安装fips包的情况下make时会提示:
FIPSLD_CC=gcc fipsld -O -D_GNU_SOURCE  -Wall -Wno-parentheses -DHAVE_CONFIG_H -I.  -I.   -c -o socat.o socat.c
/bin/sh: fipsld: command not found
make: *** [socat.o] Error 127

3、禁用成员
#echo "disable server test.tianya.cn/192.168.100.78" | socat stdio /usr/local/haproxy/HaproxySocket


4、启用成员
#echo "enable server test.tianya.cn/192.168.100.78" | socat stdio /usr/local/haproxy/HaproxySocket


三、F5-LTM负载均衡器[separator]
原理
使用F5-iControl开发包Pycontrol对F5设备进行管理。

环境说明
Disable POOL:test.tianya.cn
Disable SERVER:192.168.100.42:80 192.168.100.43:80 192.168.100.44:80

实施步骤
1、部署运行环境
#mkdir -p /home/install;cd /home/install
安装python环境(略),要求py2.5或以上。
1.1、安装SUDS模块
#wget https://fedorahosted.org/release ... n-suds-0.3.8.tar.gz
#tar xvfz python-suds-0.3.8.tar.gz
#cd python-suds-0.3.8
#python setup.py install

1.2、安装PYCONTROL模块
#wget http://trungale.net/pycontrol.tar.gz
#tar xvfz pycontrol.tar.gz
#cd trunk
#python setup.py install

1.3、校验安装结果
#python
  1. >>> import suds
  2. >>> import pycontrol.pycontrol as pc
  3. >>> suds.__version__
  4. '0.4'
  5. >>> suds.__build__
  6. 'GA R699-20100913'
  7. >>> pc.__version__
  8. '2.0.1'
  9. >>> pc.__build__
  10. 'r83'
  11. >>>
复制代码


2、编写LB_member.py代码
  1. # -*- coding: utf-8 -*-
  2. """
  3. ----------------------------------------------------------------------------
  4. Disable/Enable F5-LTM POOL member
  5. Name:        LB_member.py
  6. Author:      Liu tian si
  7. Email:       liutiansi@gamil.com
  8. Created:     2011/05/08
  9. Version:     1.0
  10. Blog:        http://blog.liuts.com
  11. Copyright:   (c) 2011
  12. ----------------------------------------------------------------------------
  13. """

  14. import sys
  15. import time
  16. import string
  17. import pycontrol.pycontrol as pc

  18. """
  19. ----------------------------------------------------------------------------
  20. F5-LTM Disable/Enable Pool member Class
  21. ----------------------------------------------------------------------------
  22. __init__() -Initialization F5-BIG object
  23. set_pool_member() -Initialization pool and member object
  24. member_factory() -Create a pool member object (Common.IPPortDefinition)
  25. session_state_factory() -Create a session state object (LocalLB.PoolMember.MemberSessionState)
  26. disable_member() -Disable menber methods
  27. enable_member() -Enable menber methods
  28. ----------------------------------------------------------------------------
  29. """

  30. class F5_LB_menber():

  31.     def __init__(self,_hostname,_username,_password):
  32.         self.b = pc.BIGIP(
  33.         hostname = _hostname,
  34.         username = _username,
  35.         password = _password,
  36.         fromurl = True,
  37.         wsdls = ['LocalLB.PoolMember'])
  38.         self.sstate_seq = self.b.LocalLB.PoolMember.typefactory.create('LocalLB.PoolMember.MemberSessionStateSequence')


  39.     def set_pool_member(self,pool,members):
  40.         self.POOL=pool
  41.         self.members=members
  42.         self.sstate_seq.item = self.session_state_factory()

  43.     def member_factory(self, member):
  44.         ip,port = member.split(':')
  45.         pmem = self.b.LocalLB.PoolMember.typefactory.create('Common.IPPortDefinition')
  46.         pmem.address = ip
  47.         pmem.port = int(port)
  48.         return pmem


  49.     def session_state_factory(self):
  50.         session_states = []
  51.         for x in self.members:
  52.             sstate = self.b.LocalLB.PoolMember.typefactory.create('LocalLB.PoolMember.MemberSessionState')
  53.             sstate.member = self.member_factory(x)
  54.             session_states.append(sstate)
  55.         return session_states

  56.     def disable_member(self):
  57.         for x in self.sstate_seq.item:
  58.             x.session_state = 'STATE_DISABLED'
  59.         try:
  60.             self.b.LocalLB.PoolMember.set_session_enabled_state(pool_names =
  61.                 [self.POOL], session_states = [self.sstate_seq])

  62.         except Exception, e:
  63.             print e

  64.     def enable_member(self):
  65.         for x in self.sstate_seq.item:
  66.             x.session_state = 'STATE_ENABLED'
  67.         try:
  68.             self.b.LocalLB.PoolMember.set_session_enabled_state(pool_names = [self.POOL],
  69.                 session_states = [self.sstate_seq])
  70.         except Exception, e:
  71.             print e

  72. if __name__ == "__main__":
  73.     if len(sys.argv) < 4:
  74.         print "Usage %s POOL MEMBER:port[,member1:80,member2:80,member3:80] enable|disable" % sys.argv[0]
  75.         print "Examples: python LB_member.py app.domain.com 192.168.0.10:80,192.168.0.11:80,192.168.0.12:80 disable"
  76.         sys.exit()

  77.     #F5 administrator info
  78.     hostname="192.168.100.2"
  79.     username="adminuser"
  80.     password="adminpass"

  81.     App=F5_LB_menber(hostname,username,password)

  82.     #init F5 pool and member
  83.     CommandParameters = sys.argv[1:]
  84.     pool=CommandParameters[0]
  85.     members=string.split(CommandParameters[1],',')

  86.     App.set_pool_member(pool,members)
  87.     if CommandParameters[2]=="enable":
  88.         App.enable_member()
  89.     elif CommandParameters[2]=="disable":
  90.         App.disable_member()
  91.     else:
  92.         print "opt parameters error!"
  93.         sys.exit()
复制代码



3、源码分析:
3.1、创建一个池成员对象,将用户传入的成员列表转成规范的pool成员,见member_factory()方法;
3.2、创建一个会话状态对象,追加成员对象到会话状态当中,见session_state_factory()方法;
3.3、创建一个队列,将会话状态对象添加到队列子项中,同时修改所处状态,见__init__()、set_pool_member()、disable_member()/enable_member()方法。

4、禁用成员
#python LB_member.py test.tianya.cn 192.168.100.42:80,192.168.100.43:80,192.168.100.44:80 disable


5、启用成员
#python LB_member.py test.tianya.cn 192.168.100.42:80,192.168.100.43:80,192.168.100.44:80 enable


参考文章
http://devcentral.f5.com/wiki/default.aspx/iControl.CodeShare

原文地址:http://blog.liuts.com/post/227/
已有 1 人评分积分 收起 理由
dennis + 12 Thanks for share

总评分: 积分 + 12   查看全部评分

技术BLOG:http://blog.liuts.com

Rank: 8Rank: 8

注册时间
2009-11-17
最后登录
2015-9-26
在线时间
361 小时
阅读权限
90
积分
56805
帖子
518
主题
25
精华
1
UID
6686
发表于 2011-5-10 09:13:29 |显示全部楼层
精华,沙了个发

使用道具 举报

Rank: 1

注册时间
2011-5-7
最后登录
2011-5-12
在线时间
3 小时
阅读权限
1
积分
22
帖子
8
主题
2
精华
0
UID
13527
发表于 2011-5-10 09:24:53 |显示全部楼层
绝对精华,真的很不错!phpcool偶像

使用道具 举报

金牌会员

明日之星

Rank: 6Rank: 6

注册时间
2011-4-27
最后登录
2013-3-22
在线时间
189 小时
阅读权限
70
积分
3851
帖子
163
主题
11
精华
1
UID
13391
发表于 2011-5-10 09:42:18 |显示全部楼层
很不错,收藏了

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-26
最后登录
2017-9-11
在线时间
627 小时
阅读权限
100
积分
93417
帖子
450
主题
18
精华
1
UID
618
发表于 2011-5-10 09:51:45 |显示全部楼层
天斯发文,必出精品呀!!

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-2-23
最后登录
2012-9-26
在线时间
343 小时
阅读权限
90
积分
19843
帖子
304
主题
66
精华
0
UID
12131
发表于 2011-5-10 10:00:12 |显示全部楼层
顶啊~~~~大牛

使用道具 举报

Rank: 4

注册时间
2011-4-21
最后登录
2015-7-24
在线时间
14 小时
阅读权限
50
积分
1713
帖子
2
主题
0
精华
0
UID
13293
发表于 2011-5-10 10:06:29 |显示全部楼层
刘老大的每次都这么精典

使用道具 举报

论坛元老

小运维——知我罪我,其惟UNIX-like

Rank: 8Rank: 8

注册时间
2010-11-12
最后登录
2016-8-4
在线时间
1122 小时
阅读权限
90
积分
91360
帖子
477
主题
21
精华
0
UID
11131
发表于 2011-5-10 10:10:11 |显示全部楼层
精华帖,整理的好用心!多谢phpcool!
天道酬勤——UNIX真美!GNU/Linux更美!
子曰:君子务本,本立而道生!

使用道具 举报

禁止发言

运维中的小学生

注册时间
2010-4-29
最后登录
2019-3-12
在线时间
131 小时
阅读权限
0
积分
8906
帖子
334
主题
246
精华
0
UID
8756
发表于 2011-5-10 11:09:10 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2010-7-3
最后登录
2015-5-15
在线时间
267 小时
阅读权限
100
积分
46000
帖子
340
主题
21
精华
1
UID
9704
发表于 2011-5-23 20:21:09 |显示全部楼层
很不错。

使用道具 举报

论坛元老

LT fans

Rank: 8Rank: 8

注册时间
2011-5-31
最后登录
2019-7-22
在线时间
220 小时
阅读权限
90
积分
30041
帖子
243
主题
23
精华
0
UID
13960
发表于 2011-6-21 13:05:18 |显示全部楼层
绝对是精品啊

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-7-29
最后登录
2019-7-22
在线时间
22 小时
阅读权限
70
积分
9137
帖子
63
主题
17
精华
0
UID
9950
发表于 2011-10-21 22:23:47 |显示全部楼层
精品,一定要顶!

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-10-6
最后登录
2014-12-5
在线时间
43 小时
阅读权限
70
积分
5608
帖子
21
主题
1
精华
0
UID
10534
发表于 2012-5-14 09:23:57 |显示全部楼层
这个必须顶。。

使用道具 举报

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

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-9-16 00:27 , Processed in 0.033869 second(s), 15 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部