ChinaUnix首页 > 精华文章 > BSD > 正文

[精华] FreeBSD6.1 +CARP+IPVS双机热备份负载均衡Ver1.0


http://www.chinaunix.net 作者:@kang  发表于:2007-08-14 22:37:01
发表评论】 【查看原文】 【BSD讨论区】【关闭

FreeBSD6.1 +CARP+IPVS双机热备份负载均衡 (花了不少精力,希望可以加為精華!) ,如果有朋友需要轉載請注明出處,謝謝!

经过一个星期的找资料….测试….找资料….再测试……,终于测试成功Freebsd6.1+IPVS+CARP,实现双机热备份和负载均衡功能。其中:
IPVS: 实现负载均衡功能
CARP: 实现双机热备份

一 系统环境

FreeBSD 6.1 Release 最小化安装(完全安装也可以) + Kernel Source (ALL).............[color=Red](经过测试,FreeBSD6.2也完全适用)[/color]

SRV01 192.168.2.133 255.255.255.0 (双机热备 主)
SRV02 192.168.2.130 255.255.255.0 (双机热备 辅)
Share IP 192.168.2.144 255.255.255.0 (主辅机器共享)

二 安装过程

a.在核心配置文件中添加对CARP的支持和options NF_SOCKOPT(ipvs需要) 选项
Srv01# cd /usr/src/sys/i386/conf/
Srv01# cp GENERIC LVS
Srv01# vi LVS
添加以下选项: 
options NF_SOCKOPT
device  carp

[ 本帖最后由 @kang 于 2007-7-21 15:10 编辑 ]

IPVS_CARP.pdf



网络拓扑





 @kang 回复于:2006-11-28 19:26:38

b. Freebsd6.1 的uipc_socket.c中没有#include "opt_nfsockopt.h" ,需手动添加否则编译将出错。
vi /usr/src/sys/kern/uipc_socket.c
找到#include "opt_compat.h"这一行,在下面加上 #include "opt_nfsockopt.h"

c. 打ipvs for freebsd6.1补丁(patch)。
Srv01# cd /usr/ports/net/ipvs
Srv01# make patch-system         #具体说明可以查看当前目录下的Makefile

d. 编译核心
Srv01# cd /usr/src/sys/i386/conf
Srv01# config LVS
Srv01# cd ../compile/LVS
Srv01# make depend
Srv01# make
Srv01# make install
Srv01# reboot

以上操作在srv02上同样做一遍


 @kang 回复于:2006-11-28 19:27:23

三 具体配置

CARP 部分 (如果只需双机备份功能只配这部分就可以了)
SRV01
srv01# sysctl net.inet.carp.preempt=1
srv01# ifconfig carp0 create
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up     #password随便输入,但srv01和srv02必需一致。
SRV02
srv02# sysctl net.inet.carp.preempt=1
srv02# ifconfig carp0 create
srv02# ifconfig carp0 vhid 1 advskew 100 pass yourpassword 192.168.2.144/24 up


 @kang 回复于:2006-11-28 19:28:30

IPVS 部分

srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
srv01# ipvsadm –A –t 192.168.2.144:80 -s rr
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.1.130:80 –g

srv01# ipvsadm –A –t 192.168.2.144:22 -s rr
srv01# ipvsadm -a -t 192.168.2.144:22 -r 192.168.2.133:22 -g
srv01# ipvsadm -a -t 192.168.2.144:22 -r 192.168.1.130:22 -g
这里我只测试了http(80)和ssh(22)服务,其它的服务配置方法一样。

以上操作在srv02上同样做一遍


清除 IPVS配置命令如下:

srv01# ./ipvsadm -C
srv01# kldunload ip_vs_rr
srv01# kldunload ipvs


 @kang 回复于:2006-11-28 19:29:03

四 测试
Srv01# ifconfig

sk0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet6 fe80::217:31ff:fe62:be1b%sk0 prefixlen 64 scopeid 0x1 
inet 192.168.2.133 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:17:31:62:be:1b
media: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
inet 127.0.0.1 netmask 0xff000000 
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
inet 192.168.2.144 netmask 0xffffff00 
carp: MASTER vhid 1 advbase 1 advskew 0


 @kang 回复于:2006-11-28 19:29:35

Srv02# ifconfig

rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet6 fe80::217:31ff:fe62:be1b%sk0 prefixlen 64 scopeid 0x1 
inet 192.168.2.130 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:17:31:62:be:1b
media: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
inet 127.0.0.1 netmask 0xff000000 
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
inet 192.168.2.144 netmask 0xffffff00 
carp: BACKUP vhid 1 advbase 1 advskew 100
从ifconfig结果可以看到srv01 为master,srv02为backup.


 @kang 回复于:2006-11-28 19:30:08

IPVS 测试

客户端访问 http://192.168.2.144 ,不停刷新web页面时,web页面会在srv01,srv02上切换(为使切换效果明显srv01,srv02用内容不同的主页),说明负载均衡功能已成功。
客户端访问 192.168.2.144:22 (ssh) 每次连接一台不同Server(srv01,srv02)。

[ 本帖最后由 @kang 于 2006-11-29 08:54 编辑 ]


 @kang 回复于:2006-11-28 19:30:55

CARP 测试

用ssh 到 192.168.2.144 可以看到主机名应为 srv01 。
在客户端上ping 192.168.2.144 –t 拔除 srv01 的网线,在丢失1个包后重新连通。
再次ssh 到 192.168.2.144 可以看到主机名应为 srv02,并且srv02自动提升为Master。
当重新连上srv02的网线时,srv02自动降为Backup。
这时说明双机热备份功能已经成功。


 @kang 回复于:2006-11-28 19:32:03

有興趣的朋友可以照著試試哦,有問題請留言。


 geel 回复于:2006-11-28 19:37:55

carp是不是就是那个两个机器用同一个 ip的那个东西?似乎只能用c类


 @kang 回复于:2006-11-28 19:41:08

是的,兩台機共用一個虛擬ip,對於客戶端來說是透明的,即他們感覺不到服務的切換。


 llzqq 回复于:2006-11-28 20:41:36

建议LZ整理一下,做成PDF格式的,便于保存。

还有最好给出一个简单的网络拓扑图。说明两台服务器是怎样连接的

[ 本帖最后由 llzqq 于 2006-11-28 20:44 编辑 ]


 大大狗 回复于:2006-11-28 20:48:08

引用:原帖由 llzqq 于 2006-11-28 20:41 发表
建议LZ整理一下,做成PDF格式的,便于保存。

还有最好给出一个简单的网络拓扑图。说明两台服务器是怎样连接的 


支持


 zhangweizj 回复于:2006-11-28 20:56:53

非常好的文章,FB的热备份的文章的确很少,LZ辛苦了


 ezgo 回复于:2006-11-28 21:23:49

謝謝您的無私分享
好東西當然要收藏


 @kang 回复于:2006-11-29 08:46:56

引用:原帖由 llzqq 于 2006-11-28 20:41 发表
建议LZ整理一下,做成PDF格式的,便于保存。

还有最好给出一个简单的网络拓扑图。说明两台服务器是怎样连接的 



請看附圖。







 @kang 回复于:2006-11-29 08:56:19

PDF格式已經貼出了,放在1樓位置。歡迎下載。


 seven007 回复于:2006-11-29 08:58:38

引用:原帖由 @kang 于 2006-11-29 08:46 发表


請看附圖。 


没有使用公用的磁盘阵列吗?
记得好像在windows cluster中还要设置心跳。
这种热备技术用在那些地方比较合适呢?
Web server /Mail server /FTP server ....


 congli 回复于:2006-11-29 09:06:43

感觉CARP那部分还需要改进一下.
有空看看以前的讨论:
http://bbs.chinaunix.net/viewthread.php?tid=730170&extra=&page=5


 congli 回复于:2006-11-29 09:10:36

引用:原帖由 geel 于 2006-11-28 19:37 发表
carp是不是就是那个两个机器用同一个 ip的那个东西?似乎只能用c类 


就是共用一个IP.其实是需要三个同一网段的IP.
不单止C类,更大的也可以.:m01:


 临风轩主 回复于:2006-11-29 09:19:07

学习了


 zbhdpx 回复于:2006-11-29 09:47:53

非常不错,长见识,学习,


 ddcp 回复于:2006-11-29 11:02:30

谢谢,好文!


 @kang 回复于:2006-11-29 11:07:14

引用:原帖由 congli 于 2006-11-29 09:06 发表
感觉CARP那部分还需要改进一下.
有空看看以前的讨论:
http://bbs.chinaunix.net/viewthread.php?tid=730170&extra=&page=5 



好的,呆會去看看。我也還在不斷的測試中,有新的發現會貼出,大家一起探討。


 @kang 回复于:2006-11-29 11:10:47

引用:原帖由 seven007 于 2006-11-29 08:58 发表

没有使用公用的磁盘阵列吗?
记得好像在windows cluster中还要设置心跳。
这种热备技术用在那些地方比较合适呢?
Web server /Mail server /FTP server .... 


我也想用磁盤陣列啊,那樣同步就好做多了。可惜暫時沒那個條件。這種熱備方案比較適合小型網站或小型郵件系統。


 杯莫停 回复于:2006-11-29 11:28:40

非常感谢楼主。


 MackedNice 回复于:2006-11-29 13:15:06

不知道linux下用什么进行双机热备份和负载均衡。

有没有知道么?


 seven007 回复于:2006-11-29 13:31:32

引用:原帖由 MackedNice 于 2006-11-29 13:15 发表
不知道linux下用什么进行双机热备份和负载均衡。

有没有知道么? 


http://bbs.chinaunix.net/forumdisplay.php?fid=74


 剑心通明 回复于:2006-11-29 14:33:49

不错不错,carp还能这样用,还真没试过,呵呵


 newsim 回复于:2006-11-29 18:45:43

学习中。多一点这类的文章


 gxl-cn 回复于:2006-11-29 23:39:28

如何实现多机(两个以上) 负载均衡 的dns??


 @kang 回复于:2006-11-30 08:42:22

引用:原帖由 gxl-cn 于 2006-11-29 23:39 发表
如何实现多机(两个以上) 负载均衡 的dns?? 


多機的原理也是一樣,如下:

CARP 部分
srv01
srv01# sysctl net.inet.carp.preempt=1
srv01# ifconfig carp0 create
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up 
SRV02
srv02# sysctl net.inet.carp.preempt=1
srv02# ifconfig carp0 create
srv02# ifconfig carp0 vhid 1 advskew [color=Red]100[/color] pass yourpassword 192.168.2.144/24 up
SRV03
srv03# sysctl net.inet.carp.preempt=1
srv03# ifconfig carp0 create
srv03# ifconfig carp0 vhid 1 advskew [color=Red]100[/color] pass yourpassword 192.168.2.144/24 up
。。。。。。更多的主機設置類推。



IPVS 部分

srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
srv01# ipvsadm –A –t 192.168.2.144:53 -s rr
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.2.133:53 -g
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.1.130:53 –g
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.1.134:53 –g            //srv03 ip: 192.168.2.134
在每台主機上同樣設置以上的IPVS部分。
這樣就能實現負載均衡。
我只試過3台機,而且都在同一網段。通過路由器的情況還沒試過,CARP好像是不支持路由冗余的。


 xuzhendong 回复于:2006-11-30 09:38:48

长见识了。顶下搂主!


 @kang 回复于:2006-11-30 12:43:11

congli,今天發現一個問題,當我將master重啟後(此時backup機正常運作),sysctl -a |grep carp 顯示如下(原master):
net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.inet.carp.log: 1
net.inet.carp.arpbalance: 0
net.inet.carp.suppress_preempt: 1

原master的 "net.inet.carp.suppress_preempt "值自動變為1,而且此時的角色為backup,原backup機提升為master。如果在原master機上執行ifconfig命令後,"net.inet.carp.suppress_preempt" 值變為0,而此時角色也從backup轉為master。
請問"net.inet.carp.suppress_preempt"這個控制角色搶占的參數是否由ifconfig命令激活呢?


 bhuang 回复于:2006-11-30 12:53:22

可惜没带资源监测,万一httpd死掉,热备和负载均衡也就没意义了。


 congli 回复于:2006-11-30 12:57:02

按照现在的设置,两台机器只能算是热备,至于负载均衡看看下面的链接
http://www.unix-tutorials.com/go.php?id=280


 cnhtml 回复于:2006-11-30 17:21:55

楼主请教一下
我们公司的应用是工业级的,而且有一部分时实数据运算在内存中,。如果按此进行热备,内存中的运算数据怎么处理?

请教了。


 dragonbbc 回复于:2006-12-01 10:04:52

mark一下,有空了学习


 @kang 回复于:2006-12-01 13:24:13

在/var/log/messages中发现一个:arp_rtrequest: bad gateway 192.168.2.144 (!AF_LINK)
查了很久没有找到问题的原因。不过该错误并没有造成其它问题,不影响系统。有没有哪位对该问题有解吗?


 @kang 回复于:2006-12-01 13:30:10

如果要在系统启动时自动设置CARP参数,可以将相关参数写入/etc/rc.conf:
srv01: Master (/etc/rc.conf)
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass password 192.168.2.144/24"

srv02:Backup (/etc/rc.conf)
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass password advskew 100 192.168.2.144/24"

开机时将自动添加carp0。


 alabos 回复于:2006-12-06 17:48:28

双机互备份,那么数据资料如何同步? 这个才是关键!


 @kang 回复于:2006-12-07 10:48:28

引用:原帖由 alabos 于 2006-12-6 17:48 发表
双机互备份,那么数据资料如何同步? 这个才是关键! 


目前我只用雙機備份,就是說:由master主機提供正常的服務,只有當master出現問題無法正常提供服務時才由backup主機提供服務。
數據同步采用rsync工具,具體如下:
master端:
#cd /usr/ports/net/rsync
#make install clean
#rehash
#echo 'rsyncd_enable="YES"' >>/etc/rc.conf       #開機自啟動。
#vi /usr/local/etc/rsyncd.conf       #我只作郵箱及postfix 數據庫同步。其他數據同步類似。

pid file = /var/run/rsyncd.pid
uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5
log file = /var/log/rsync.log

[mailbox]
path = /var/mailbox
comment = Mailbox Sync (approx 1024 MB)
ignore errors = true
uid = vmail
gid = vmail
read only = true
list = false
auth users = Mailboxsync
secrets file = /usr/local/etc/Mailboxsync

hosts allow = 192.168.2.30
hosts deny = ALL
[mbox_bk]
path = /backup/mbox
comment = Mailbox Sync (approx 1024 MB)
ignore errors = true
uid = vmail
gid = vmail
read only = true
list = false
auth users = Mailboxsync
secrets file = /usr/local/etc/Mailboxsync

[mysql_postfix]
path = /var/db/mysql/postfix/
comment = Mailbox Sync (approx 1024 MB)
ignore errors = true
uid = mysql
gid = mysql
read only = true
list = false
auth users = Mailboxsync
secrets file = /usr/local/etc/Mailboxsync

#vi Mailboxsync
Mailboxsync:123456

backup主機端
#vi /usr/local/etc/rsync_mbox              #同步腳本
#!/bin/sh

/usr/local/bin/rsync -vzrlHtopgD --progress --delete-after Mailboxsync@192.168.2.133::mailbox /var/mailbox --password-file=/usr/local/etc/rsync.pw    #同一行
/usr/local/bin/rsync -vzrlHtopgD --progress --delete-after Mailboxsync@192.168.2.133::mbox_bk /backup/mbox --password-file=/usr/local/etc/rsync.pw      ##同一行
/usr/local/bin/rsync -vzrlHtopgD --progress --delete-after Mailboxsync@192.168.2.133::mysql_postfix /var/db/mysql/postfix/ --password-file=/usr/local/etc/rsync.pw      #同一行
killall -1 mysqld

#vi /usr/local/etc/rsync.pw
123456                            #Mailboxsync用戶密碼

#vi /etc/crontab                #設置每5分鐘同步一次。

*/5     *      *     *      *      root       sh /usr/local/etc/rsync_mbox


以上供參考,根據自己的具體情況修改。


 gxl-cn 回复于:2006-12-07 14:48:49

好文呀,如果只用多服务器的负载均衡呢? 比如三个以上,能否单独说说 ipvs??

在freebsd 如何安装,调试?

[ 本帖最后由 gxl-cn 于 2006-12-7 14:51 编辑 ]


 @kang 回复于:2006-12-07 21:00:46

引用:原帖由 gxl-cn 于 2006-12-7 14:48 发表
好文呀,如果只用多服务器的负载均衡呢? 比如三个以上,能否单独说说 ipvs??

在freebsd 如何安装,调试? 


gxl-cn,3台機以上你可以參考31樓的帖:如下:
[
多機的原理也是一樣,如下:

CARP 部分
srv01
srv01# sysctl net.inet.carp.preempt=1
srv01# ifconfig carp0 create
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up 
SRV02
srv02# sysctl net.inet.carp.preempt=1
srv02# ifconfig carp0 create
srv02# ifconfig carp0 vhid 1 advskew 100 pass yourpassword 192.168.2.144/24 up
SRV03
srv03# sysctl net.inet.carp.preempt=1
srv03# ifconfig carp0 create
srv03# ifconfig carp0 vhid 1 advskew 100 pass yourpassword 192.168.2.144/24 up
。。。。。。更多的主機設置類推。



IPVS 部分

srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
srv01# ipvsadm –A –t 192.168.2.144:53 -s rr
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.2.133:53 -g
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.1.130:53 –g
srv01# ipvsadm -a -t 192.168.2.144:53 -r 192.168.1.134:53 –g            //srv03 ip: 192.168.2.134
在每台主機上同樣設置以上的IPVS部分。
這樣就能實現負載均衡。
]

調試過程中有什麼問題,可以貼出來大家一起看看。


 @kang 回复于:2006-12-08 11:48:29

Sorry,剛才IE有點問題,連續帖了3次。


 vepeta 回复于:2006-12-08 13:01:00

可以自己删除。


 @kang 回复于:2006-12-09 08:26:26

關於IPVS,我也只是參考了Readme,如下:

LVS on FreeBSD Version 0.4.0

Install:
   1.        Patch the FreeBSD kernel:
          cp patch/OS-RELEASE/* /usr/src;
          cd /usr/src;
          patch -p0 < uipc_socket.c.patch 
          patch -p0 < ip_input.c.patch
          patch -p0 < socketvar.h.patch
          patch -p0 < sys_conf_options.patch
          patch -p0 < sys_i386_conf_GENERIC.patch 
   2.        Rebuilding FreeBSD kernel:
          cd /usr/src/sys/arch/i386/conf;
          config GENERIC;
          cd ../compile/GENERIC;
          make depend;
          make;
          make install;
   3.        Compile ipvs module:
          cd ipvs/
          make;
          cd ipvsadm/
          make install;
   4.        Compile ipvs scheduler module:
          cd ipvs/
          cd schedulers/
           cd SCHEDULER-NAME/
          make
   5.        Reboot with new kernel:
          reboot;

Let's assume your cluster has the following configuration:
Workstation with address:192.168.1.23 runs as dispatcher(FE:front end),
Workstations with address:192.168.1.33 and 192.168.1.38 run as real server(BE:back
end).
Thay all share address:192.168.1.36,which is saw by client.

Start:

Assume using 'rr' schedule algorithm(optional: dh, lblc, lblcr, lc, nq, rr, 
sed, sh, wlc, wrr).

LVS/DR:
   1.        kldload ./ipvs.ko
   2.        kldload schedulers/rr/ip_vs_rr.ko
   3.        ./ipvsadm -A -t 192.168.1.36:80 -s rr
   4.        ./ipvsadm -a -t 192.168.1.36:80 -r 192.168.1.33:80 -g
   5.        ./ipvsadm -a -t 192.168.1.36:80 -r 192.168.1.38:80 -g

LVS/TUN:
   1.   kldload ./ipvs.ko
   2.        kldload schedulers/rr/ip_vs_rr.ko
   3.   ./ipvsadm -A -t 192.168.1.36:80 -s rr
   4.   ./ipvsadm -a -t 192.168.1.36:80 -r 192.168.1.33:80 -i
   5.   ./ipvsadm -a -t 192.168.1.36:80 -r 192.168.1.38:80 -i

Stop:
   1.        ./ipvsadm -C
   2.        kldunload ip_vs_rr
   3.        kldunload ipvs

Note:Do not use other commands of ipvsadm,for maybe it is not implemented.        
Feedback
--------
Welcome your comments, bug reports, bug fixes, and ideas

Thanks,

Li Wang
[email]dragonfly@linux-vs.org[/email]


 HonestQiao 回复于:2006-12-09 11:31:20

引用:原帖由 cnhtml 于 2006-11-30 17:21 发表
楼主请教一下
我们公司的应用是工业级的,而且有一部分时实数据运算在内存中,。如果按此进行热备,内存中的运算数据怎么处理?

请教了。 




如果有内存实时数据的话,不妨考虑memcached这样子的内存缓存。


 HonestQiao 回复于:2006-12-09 11:34:20

引用:原帖由 @kang 于 2006-11-30 12:43 发表
congli,今天發現一個問題,當我將master重啟後(此時backup機正常運作),sysctl -a |grep carp 顯示如下(原master):
net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1 ... 




可以考虑一下子ucarp,这个不是内核级别的。

我现在没有用ipvs,现在好像不怎么更新了,而且原来打算加入内核的不知道是否没有后果了。
如果以后不支持就不好办了。

ucarp这个可以在检测到master失败之后,把自己变为master,而且同时可以执行对应的处理脚本。
在master恢复之后,也可以通过预先的设置,让原有的master再次抢占主要地位。


 @kang 回复于:2006-12-09 11:57:28

有時間試下ucarp。


 HonestQiao 回复于:2006-12-09 12:02:47

引用:原帖由 @kang 于 2006-12-9 11:57 发表
有時間試下ucarp。 



  不需要时间,又不打系统补丁,5分钟之内即可测试,使用也很简单的。


 HonestQiao 回复于:2006-12-09 12:03:54

引用:原帖由 @kang 于 2006-12-9 11:57 发表
有時間試下ucarp。 



  有没有好的开源的存储方案?
  LB负载均衡这些现在都可实现,就存存储方面我还在苦苦追寻,不知道什么时候她在丛中笑。


 HonestQiao 回复于:2006-12-09 12:05:33

ZFS和本坛精华里面的那个海量文件系统,也不知道什么时候才可以正式使用。


 硬-盘 回复于:2006-12-14 14:15:52

引用:原帖由 @kang 于 2006-11-28 19:27 发表
srv01# sysctl net.inet.carp.preempt=1 


请问楼主,这句有何作用?谢谢。

以下命令
srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
srv01# ipvsadm –A –t 192.168.2.144:80 -s rr
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.1.130:80 –g

机器重启后岂不又要重做?有没有办法让机器重启后自动执行以上命令?谢谢。

[ 本帖最后由 硬-盘 于 2006-12-14 14:19 编辑 ]


 jsn 回复于:2006-12-14 14:43:04

好东东!


 @kang 回复于:2006-12-14 19:03:55

引用:原帖由 硬-盘 于 2006-12-14 14:15 发表

请问楼主,这句有何作用?谢谢。

以下命令
srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
srv01# ipvsadm –A –t 192.168.2.144:80 -s rr
srv01# ipvsadm -a -t  ... 


sysctl net.inet.carp.preempt=1
是指:允許carp搶占,就是說當某台主機的物理網卡故障(down)時,carp interfaces的advskew值將變為240,該主機的角色將被其他主機代替。

[ 本帖最后由 @kang 于 2006-12-14 19:48 编辑 ]


 @kang 回复于:2006-12-14 19:14:29

srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
以上行為加載ipvs相關模塊,如果不加載則ipvsadm命令無法使用。

srv01# ipvsadm –A –t 192.168.2.144:80 -s rr          #在虛擬服務器表中添加一條新的虛擬服務器記錄(httpd服務)
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g
srv01# ipvsadm -a -t 192.168.2.144:80 -r 192.168.1.130:80 –g
以上三行為:在虛擬服務器表中添加一條新的真實服務器記錄,該服務為httpd(80 port)服務。以實現httpd的負載均衡。

srv01#ipvsadm -l            #設定好以後查看虛擬服務器情況。

IP Virtual Server version 1.0.10 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.144:http rr
  -> srv01:http  Route   1      0          0         
  -> srv02:http  Route   1      0          0

[ 本帖最后由 @kang 于 2006-12-14 19:49 编辑 ]


 @kang 回复于:2006-12-14 19:34:21

引用:...机器重启后岂不又要重做?有没有办法让机器重启后自动执行以上命令?... 

建立開機自啟動腳本如下:
srv01#vi /usr/local/etc/rc.d/LVS.sh    #srv01主機

#!/bin/sh

sysctl net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 pass 123456 192.168.2.144/32 up
kldload /boot/modules/ipvs.ko
kldload /boot/modules/ip_vs_rr.ko
ipvsadm -A -t 192.168.2.144:80 -s rr
ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g
ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.130:80 -g

srv01#chmod 555 /usr/local/etc/rc.d/LVS.sh

srv02#vi /usr/local/etc/rc.d/LVS.sh    #srv02主機

#!/bin/sh

sysctl net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 [color=Red]advskew 100 [/color]pass 123456 192.168.2.144/32 up
kldload /boot/modules/ipvs.ko
kldload /boot/modules/ip_vs_rr.ko
ipvsadm -A -t 192.168.2.144:80 -s rr
ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.133:80 -g
ipvsadm -a -t 192.168.2.144:80 -r 192.168.2.130:80 -g

srv02#chmod 555 /usr/local/etc/rc.d/LVS.sh


 @kang 回复于:2006-12-14 19:59:54

ipvsadm的用法和格式如下:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h

命令选项解释:
命令选项长短格式具有相同的意思。在实际使用时,两种都可以。
-A --add-service 在虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器,每个服务为一条记录。
-E --edit-service 编辑虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R选项可读的格式
-a --add-server 在虚拟服务器表里添加一条新的真实服务器记录。
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。它后面可以是master或backup,用来说明LVS Router是master或是backup。在这个功能上也可以采用keepalived的VRRP功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
其它的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp的服务
-u --udp-service service-address 说明虚拟服务器提供的是udp的服务
-f --fwmark-service fwmark 说明是经过iptables标记过的服务类型。
-s --scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout的默认值为300秒。
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器
-g --gatewaying 指定LVS的工作模式为直接路由模式(也是LVS默认的模式)
-i --ipip 指定LVS的工作模式为隧道模式
-m --masquerading 指定LVS的工作模式为NAT模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp的timeout值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP地址和端口的数字形式


 硬-盘 回复于:2006-12-15 10:00:54

谢谢楼主热情回复


 qdmacat 回复于:2006-12-15 11:46:21

這樣的好文,,不得不頂!


 caicheng1015 回复于:2006-12-20 16:42:07

引用:原帖由 @kang 于 2006-12-14 19:14 发表
srv01# kldload /boot/modules/ipvs.ko
srv01# kldload /boot/modules/rr/ip_vs_rr.ko
以上行為加載ipvs相關模塊,如果不加載則ipvsadm命令無法使用。

srv01# ipvsadm –A –t 192.168.2.144:80 -s rr       ... 


我按照你的文章,测试过后,怎么两台电脑全是MASTER呀,还有一个问题就是IPVS,如果在一台机器上加了IPVS命令后,是可以访问网站的,如果两台电脑全加了IPVS命令后,就不能访问网站了。


 @kang 回复于:2006-12-21 20:31:19

引用:原帖由 caicheng1015 于 2006-12-20 16:42 发表

我按照你的文章,测试过后,怎么两台电脑全是MASTER呀,还有一个问题就是IPVS,如果在一台机器上加了IPVS命令后,是可以访问网站的,如果两台电脑全加了IPVS命令后,就不能访问网站了。 


SRV01
srv01# sysctl net.inet.carp.preempt=1
srv01# ifconfig carp0 create
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up     #password随便输入,但srv01和srv02必需一致。
SRV02
srv02# sysctl net.inet.carp.preempt=1
srv02# ifconfig carp0 create
srv02# ifconfig carp0 vhid 1 [color=Red]advskew 100 [/color]pass yourpassword 192.168.2.144/24 up 

注意红色部分,advskew 的值越大优先权越小默认为0。


 @kang 回复于:2006-12-21 20:33:33

如果还是有问题,请把你的设置贴出来看看。


 showsa 回复于:2006-12-23 14:44:18

ipvsadm –A –t 192.168.2.144:80 -s rr

后面的rr是什么意思?


 dcat1 回复于:2006-12-24 10:26:12

unix# cd /usr/src/sys/i386/conf
unix# config LVS
LVS: unknown option "NF_SOCKOPT"


 rhinux 回复于:2006-12-25 14:41:56

引用:原帖由 zhangweizj 于 2006-11-28 20:56 发表
非常好的文章,FB的热备份的文章的确很少,LZ辛苦了 



我9月份的时候也寻求过这个方面的帮助,后来找了好久就看到一篇不错的资料
这是我当时的贴
http://bbs.chinaunix.net/viewthread.php?tid=826516&highlight=rhinux

很惭愧之后没时间整理
现在一直运行4个多月了,相当稳定。


 showsa 回复于:2006-12-25 16:21:17

看了楼主的帖子
激发我在ubuntu下实现了 2台机器的HA+LB

ucarp +ipvs


 995636 回复于:2006-12-25 19:45:30

感谢lz的辛勤劳动。小弟受教了。


 @kang 回复于:2006-12-26 17:08:10

引用:原帖由 dcat1 于 2006-12-24 10:26 发表
unix# cd /usr/src/sys/i386/conf
unix# config LVS
LVS: unknown option "NF_SOCKOPT" 


出錯原因是/usr/src/sys/kern/uipc_socket.c 文件中沒有包含 #include "opt_nfsockopt.h" 。
詳細如下:
a.在核心配置文件中添加对CARP的支持和options NF_SOCKOPT(ipvs需要) 选项
Srv01# cd /usr/src/sys/i386/conf/
Srv01# cp GENERIC LVS
Srv01# vi LVS
添加以下选项: 
options NF_SOCKOPT
device  carp

b. Freebsd6.1 的uipc_socket.c中没有#include "opt_nfsockopt.h" ,需手动添加否则编译将出错。
vi /usr/src/sys/kern/uipc_socket.c
找到#include "opt_compat.h"这一行,在下面加上 #include "opt_nfsockopt.h"

c. 打ipvs for freebsd6.1补丁(patch)。
Srv01# cd /usr/ports/net/ipvs
Srv01# make patch-system         #具体说明可以查看当前目录下的Makefile

d. 编译核心
Srv01# cd /usr/src/sys/i386/conf
Srv01# config LVS
Srv01# cd ../compile/LVS
Srv01# make depend
Srv01# make
Srv01# make install
Srv01# reboot


 @kang 回复于:2006-12-26 17:15:55

引用:原帖由 showsa 于 2006-12-23 14:44 发表
ipvsadm –A –t 192.168.2.144:80 -s rr

后面的rr是什么意思? 


rr 為使用的調度演算法。
有以下幾種調度演算法:

rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq

默認的調度演算法是: wlc.


 @kang 回复于:2006-12-26 17:20:20

引用:原帖由 dcat1 于 2006-12-24 10:26 发表
unix# cd /usr/src/sys/i386/conf
unix# config LVS
LVS: unknown option "NF_SOCKOPT" 



其實你所說的問題,在最前面的幾帖中已經說明清楚,請完整閱讀後在測試,可以少走些彎路。
如果還是有問題,請詳細貼出log。


 caicheng1015 回复于:2006-12-30 15:03:31

引用:原帖由 @kang 于 2006-12-21 20:31 发表

SRV01
srv01# sysctl net.inet.carp.preempt=1
srv01# ifconfig carp0 create
srv01# ifconfig carp0 vhid 1 pass password 192.168.2.144/24 up     #password随便输入,但srv01和srv02必需一致。
SRV02
 ... 


server1:
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
        inet 192.168.0.144 netmask 0xffffff00
        carp: MASTER vhid 1 advbase 1 advskew 0
server2:
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
        inet 192.168.0.144 netmask 0xffffff00
        carp: MASTER vhid 1 advbase 1 advskew 100
总是这样,我也不知道是怎么回事,请你帮帮忙。


 showsa 回复于:2006-12-30 15:27:51

再问个问题

当master作为director的时候,2台机器的weight都是1
那么director的负载是不是比另一台realserver大很多? 还是2台差不多?
如果2台差不过,是不是表示作为banlance 的director消耗资源很少?

谢楼主答复


 @kang 回复于:2006-12-30 17:18:54

引用:原帖由 caicheng1015 于 2006-12-30 15:03 发表

server1:
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
        inet 192.168.0.144 netmask 0xffffff00
        carp: MASTER vhid 1 advbase 1 advskew 0
server2:
carp0: flags=49<UP,LOOP ... 


#把你大carp参数show出来看下.以下是我的master主机的情况.给你参考一下.
#sysctl -a |grep carp 

net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.inet.carp.log: 1
net.inet.carp.arpbalance: 0
net.inet.carp.suppress_preempt: 0

BACKUP主机的情况也是一样.

[ 本帖最后由 @kang 于 2006-12-30 17:25 编辑 ]


 @kang 回复于:2006-12-30 17:22:05

srv01:(master)
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
inet 192.168.2.144 netmask 0xffffffff 
carp: MASTER vhid 1 advbase 1 advskew 0

svr02:(backup)
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
inet 192.168.2.144 netmask 0xffffffff 
carp: BACKUP vhid 1 advbase 1 advskew 100

[ 本帖最后由 @kang 于 2006-12-30 17:24 编辑 ]


 ypingyuan 回复于:2007-01-07 21:02:05

why both SRV01 and SRV02 should be ipvs director, if use a separete director how to set it up ?? thank you


 ypingyuan 回复于:2007-01-07 21:54:27

请教@kang圣骑士,能否给出SRV01和SRV02上执行: netstat -an |grep LISTEN的结果?


 snow888 回复于:2007-01-07 23:43:02

如此好文,不顶对不起楼主了。


 HonestQiao 回复于:2007-01-07 23:47:33

引用:原帖由 ypingyuan 于 2007-1-7 21:54 发表
请教@kang圣骑士,能否给出SRV01和SRV02上执行: netstat -an |grep LISTEN的结果? 



SRV01 主 SRV02 辅
在平常,共用的那个ip是SRV01持有的。
除非SRV01倒闭了,那么就SRV02用上。

如果配置的正确的话,SRV01活过来了,IP再被SRV01抢回去。


 @kang 回复于:2007-01-13 16:30:41

引用:原帖由 ypingyuan 于 2007-1-7 21:54 发表
请教@kang圣骑士,能否给出SRV01和SRV02上执行: netstat -an |grep LISTEN的结果? 


為什麼呢?netstat -an |grep LISTEN 結果對你會有幫助嗎?
SRV01# netstat -an |grep LISTEN

tcp4       0      0  127.0.0.1.10024        *.*                    LISTEN
tcp4       0      0  *.21                   *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp6       0      0  *.22                   *.*                    LISTEN
tcp4       0      0  *.143                  *.*                    LISTEN
tcp6       0      0  *.143                  *.*                    LISTEN
tcp4       0      0  *.110                  *.*                    LISTEN
tcp6       0      0  *.110                  *.*                    LISTEN
tcp4       0      0  127.0.0.1.10025        *.*                    LISTEN
tcp4       0      0  *.25                   *.*                    LISTEN
tcp4       0      0  *.873                  *.*                    LISTEN
tcp6       0      0  *.873                  *.*                    LISTEN
tcp4       0      0  127.0.0.1.783          *.*                    LISTEN
tcp4       0      0  *.3306                 *.*                    LISTEN
tcp46      0      0  *.443                  *.*                    LISTEN
tcp46      0      0  *.80                   *.*                    LISTEN

SRV02一樣


 caicheng1015 回复于:2007-01-13 17:36:34

引用:原帖由 @kang 于 2006-12-30 17:18 发表

#把你大carp参数show出来看下.以下是我的master主机的情况.给你参考一下.
#sysctl -a |grep carp 

net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.inet.ca ... 


我在怀疑有可能是虚拟机的问题,但是我用OpenBSD做的时候又可以的,真是奇怪了。
#sysctl -a | grep carp
net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.inet.carp.log: 1
net.inet.carp.arpbalance: 0
net.inet.carp.suppress_preempt: 1
两台机器都是一样。
现在出现的问题是,advskew 100的机器反而成了master
SERVER1:
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
        inet 192.168.3.144 netmask 0xffffff00
        carp: BACKUP vhid 1 advbase 1 advskew 0
SERVER2:
carp0: flags=49<UP,LOOPBACK,RUNNING> mtu 1500
        inet 192.168.3.144 netmask 0xffffff00
        carp: MASTER vhid 1 advbase 1 advskew 100


 caicheng1015 回复于:2007-01-13 17:53:41

而且现在的master,和backup在两台机器上,相互随机的改变,晕的


 caicheng1015 回复于:2007-01-13 21:02:45

高手们,在那里呀,快出来帮帮我呀


 @kang 回复于:2007-01-15 09:28:16

引用:原帖由 caicheng1015 于 2007-1-13 17:36 发表

我在怀疑有可能是虚拟机的问题,但是我用OpenBSD做的时候又可以的,真是奇怪了。
#sysctl -a | grep carp
net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.in ... 


net.inet.carp.suppress_preempt: 1 這個值等於1是有點問題。這個值是你自己置1的還是系統置1的?如果是你自己設置的,取消該設置。
這個值默認是0(master和backup一樣都是0),只有在網絡連接(網卡故障等)出現問題時由系統自動置1,直到網絡連接恢復正常。


 unicom_2 回复于:2007-01-15 18:43:10

好帖
不知道有没人用FB部署SAN的 ?


 caicheng1015 回复于:2007-01-15 19:06:57

引用:原帖由 @kang 于 2007-1-15 09:28 发表

net.inet.carp.suppress_preempt: 1 這個值等於1是有點問題。這個值是你自己置1的還是系統置1的?如果是你自己設置的,取消該設置。
這個值默認是0(master和backup一樣都是0),只有在網絡連接(網卡故障等)出現 ... 


是系统自己设置,我想改成0的呀,可是系统说是只读的,我不知道怎么改,请你告诉我。

[ 本帖最后由 caicheng1015 于 2007-1-15 23:02 编辑 ]


 @kang 回复于:2007-01-16 17:08:56

我在/etc/sysctl.conf中只設置了:net.inet.carp.preempt=1,查下你的/etc/sysctl.conf設置情況。如果有:net.inet.carp.suppress_preempt=1 把它mark掉或刪除。


 caicheng1015 回复于:2007-01-16 20:37:09

引用:原帖由 @kang 于 2007-1-16 17:08 发表
我在/etc/sysctl.conf中只設置了:net.inet.carp.preempt=1,查下你的/etc/sysctl.conf設置情況。如果有:net.inet.carp.suppress_preempt=1 把它mark掉或刪除。 


我在那个里面就设置了这一个呀net.inet.carp.preempt=1,好像是这样的net.inet.carp.suppress_preempt=1是由系统自己添加的呀,自己修改这个值时说不能修改,是只读的。在我没有添加carp0时net.inet.carp.suppress_preempt值还为0,添加了ifconfig carp0 vhid 1 pass ***** 192.168.1.1 netmask 255.255.255.0时,这个值就修改为1了,如果在添加carp1他就会变成2 ,郁闷呀,可以给我解释一下发?

[ 本帖最后由 caicheng1015 于 2007-1-16 20:38 编辑 ]


 @kang 回复于:2007-01-19 14:28:07

真是奇怪了。有沒試過把backup機關掉,只開主機的情況,是否正常呢?
也許是VM的問題。我沒在VM上試過,有時間試下看。


 @kang 回复于:2007-01-19 14:33:16

另外,我發現在VM(最新版本)上安裝FreeBSD6.x(6.0,6.1,6.2),出現時鐘變慢的情況,大概是每3秒鐘慢一秒,而6.0之前的版本則一切正常。嘗試過調整內核參數,未果。估計是VM與FreeBSD6.x的兼容性問題


 caicheng1015 回复于:2007-01-19 23:59:17

引用:原帖由 @kang 于 2007-1-19 14:28 发表
真是奇怪了。有沒試過把backup機關掉,只開主機的情況,是否正常呢?
也許是VM的問題。我沒在VM上試過,有時間試下看。 


我现在也在怀疑是不是VM的问题,如果把BACKUP down后,master是正常了,可是打开一个网页的速度是非常的慢。


 独孤天血 回复于:2007-01-20 14:42:51

强  好东西   收下了!!


 randykong 回复于:2007-03-26 15:51:30

一台机器当掉了,有没有办法让IPVS把服务全部切到正常运转的机器上来


 caicheng1015 回复于:2007-03-26 16:31:30

呵呵,这个么要看你自己去配置了呀,写个脚本就OK了


 swz36888 回复于:2007-05-23 09:58:24

kldload /boot/modules/rr/ip_vs_rr.ko
kldload: can't load /boot/modules/rr/ip_vs_rr.ko: No such file or directory
这怎么报错啊!!
老大帮帮我呀!!!


 @kang 回复于:2007-05-26 17:22:05

編譯ipvs過程中有沒有錯誤信息?
ls /boot/modules/rr/ 看看有沒有ip_vs_rr.ko文件存在。
如果沒有說明沒有編譯成功。


 qiu521119 回复于:2007-05-29 11:46:04

好孀的啊


 chalizhao 回复于:2007-08-14 22:34:51

in principle I would intend with yours carp/ipvs
Thus I can understand Carp as Failover -. But IPVS are probably Linux of projects, and the FreeBSD haven is a little outdated


 chalizhao 回复于:2007-08-14 22:37:01

+ ldirectord




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=862596
转载请注明作者名及原文出处