none
windows 2008 r2 负载平衡问题-------------socket RRS feed

  • 问题

  • A:192.168.1.5  

    B:192.168.1.6

    C:集群IP 192.168.1.100

    现在已经搭建好负载平衡了,也可以正常访问(web--iis)。

    我用C#开发一个Socket服务端,分别放在 A 、B服务器上了  --A服务器Socket:192.168.1.5:9809     B服务器Socket:192.168.1.6:9809    端口一样的。



    我在客户端使用Socket连接  C集群IP:9809 不行!

    错误信息:  由于目标计算机积极拒绝,无法连接。 192.168.1.100:9809



    请问一下,我的端口都一样,集群IP也设置了,为什么不能通过访问呀?





    windows 2008 r2 负载平衡问题--------------------------socket

    书是人类进步的阶梯

    2012年7月24日 8:16

答案

全部回复

  • 你直接连A或B的IP+Port都能通吗?
    2012年7月24日 8:20
  • 你直接连A或B的IP+Port都能通吗?
    对,可以通

    书是人类进步的阶梯

    2012年7月24日 8:37
  • 你的客户端IP是多少?也是同一个192.168.1网段的吗?

    若是,arp -a看下192.168.1.100的MAC是多少?

    2012年7月24日 8:39
  • 对,也是在一个网段内。

    书是人类进步的阶梯

    2012年7月24日 8:51
  • 你的客户端IP是多少?也是同一个192.168.1网段的吗?

    若是,arp -a看下192.168.1.100的MAC是多少?

    100的Mac :192.168.1.100          03-bf-c0-a8-01-0f     动态

    书是人类进步的阶梯

    2012年7月24日 8:53
  • 哦,你这用的是多播。

    那Arp -a里,两实体机IP的MAC显示为什么呢?

    2012年7月24日 8:56
  • 嗯,看起来是多播的

    那arp -a里,A和B的MAC又是什么呢?

    2012年7月24日 9:00
  • 接口: 192.168.1.123 --- 0xb--客户端
      Internet 地址         物理地址              类型
      192.168.1.5           00-1d-09-0f-70-ac     动态
      192.168.1.100          03-bf-c0-a8-01-0f     动态

    接口: 192.168.1.6 --- 0xb
      Internet 地址         物理地址              类型
      192.168.1.5           00-1d-09-0f-70-ac     动态
      192.168.1.6           00-1d-09-0f-6f-71     动态

    接口: 192.168.1.5 --- 0x11
      Internet 地址         物理地址              类型
      192.168.1.6           00-1d-09-0f-6f-71     动态
      192.168.1.100          00-15-5d-01-05-01     动态


    书是人类进步的阶梯

    2012年7月24日 9:25
  • 接口: 192.168.1.123 --- 0xb--客户端
      Internet 地址         物理地址              类型
      192.168.1.5           00-1d-09-0f-70-ac     动态
      192.168.1.100          03-bf-c0-a8-01-0f     动态

    接口: 192.168.1.6 --- 0xb
      Internet 地址         物理地址              类型
      192.168.1.5           00-1d-09-0f-70-ac     动态
      192.168.1.6           00-1d-09-0f-6f-71     动态

    接口: 192.168.1.5 --- 0x11
      Internet 地址         物理地址              类型
      192.168.1.6           00-1d-09-0f-6f-71     动态
      192.168.1.100          00-15-5d-01-05-01     动态


    书是人类进步的阶梯

    为什么100会出现两个不同MAC?这个00-15-5d-01-05-01是谁的MAC?不会是你网络里就有一台真机配了100地址吧?
    2012年7月24日 10:03
  • 没有,我就是想知道,我这样操作可以实现吗?

    Socket 这种方式访问


    书是人类进步的阶梯

    2012年7月24日 15:04
  • 没有,我就是想知道,我这样操作可以实现吗?

    Socket 这种方式访问


    书是人类进步的阶梯

    当然可以,NLB是在2层实现的,对上层是透明无影响的,你做的程序是4层TCP Socket Listener,当然可以啊。

    另外,你没回答这个问题(这个00-15-5d-01-05-01是谁的MAC)

     192.168.1.100          00-15-5d-01-05-01     动态

    不过,就算你不回答,我也查出来了,你一定是在Hyper-V里两台虚拟机在做NLB吧?

    如果这样,那的确有个注意点:你必须先enable spoofing of MAC address

    Deploying Network Load Balancing (NLB) and Virtual Machines on Windows Server 2008 R2

    http://blogs.msdn.com/b/clustering/archive/2010/07/01/10033544.aspx

    • 已编辑 Finy 2012年7月25日 1:27
    2012年7月25日 1:24
  • 非常感谢 Finy  的热情回答。 谢谢您!

    对,我是的Hyper-V里做的(公司),但我昨天晚上回家在本子上有VM有安装了3个虚拟机,都是windows server 2008 r2 64的,实验了,还是不行呀。


    书是人类进步的阶梯

    2012年7月25日 1:50
  • 你是说你又换到VMWare环境做了相同实验吧?我相信(甚至依稀记得)VMWare也有地方需要特殊设置才能使Windows NLB工作。

    先看看你的Hyper-V里的问题能不能随着这个enable spoofing of MAC address而解决吧?

    2012年7月25日 2:03
  • 下图IP:192.168.1.5

    arp -a 如下:



    书是人类进步的阶梯

    2012年7月25日 2:11

  • 下图是:192.168.1.11虚拟机

    arp -11


    书是人类进步的阶梯

    2012年7月25日 2:11
  • 未能解决问题呀,socket连接还是不行。


    书是人类进步的阶梯

    2012年7月25日 2:22
  • Finy  可否留下联系方式呀?  进一步请教您!

    MSN?QQ?


    书是人类进步的阶梯

    2012年7月25日 2:37
  • web可以正常是用这个负载平衡,为什么socket不行呢

    书是人类进步的阶梯

    2012年7月25日 2:54
  • 我怀疑就  端口的问题

    书是人类进步的阶梯

    2012年7月25日 3:09
  • 你的NLB里有没有做Port Rule?

    2012年7月25日 5:38
  • 0-65535  我没有动呀

    书是人类进步的阶梯

    2012年7月25日 6:23
  • 我发现了,只有固定端口可以使用 如:80这样的

    只要我自定义端口都不能访问。nnd


    书是人类进步的阶梯

    2012年7月25日 6:28
  • 你的程序是监听单个固定端口的吗?

    是否还会主动反连?或动态再监听一个新端口来接受连接?

    2012年7月25日 7:02
  • 对,程序是监听固定端口。

    书是人类进步的阶梯

    2012年7月25日 7:10
  • 程序都没有问题,自其它机器上测试(socket)都可以正常使用的。

    书是人类进步的阶梯

    2012年7月25日 7:11
  • 麻烦的问题啊。。。

    在3台机器上抓包看一下吧

    2012年7月25日 7:17
  • 我在A 、B 机器上开着Socket:Prot 

    C集群IP

    在D机器上使用Socke连接C集群IP:Port     提示          由于目标计算机积极拒绝,无法连接。 192.168.1.15:9809

    然后我用arp -a分别在A、B机器发现有D的IP跟MAC   这说明Socket其实已经访问到了,对吧


    书是人类进步的阶梯

    2012年7月25日 7:26
  • 我在A 、B 机器上开着Socket:Prot 

    C集群IP

    在D机器上使用Socke连接C集群IP:Port     提示          由于目标计算机积极拒绝,无法连接。 192.168.1.15:9809

    然后我用arp -a分别在A、B机器发现有D的IP跟MAC   这说明Socket其实已经访问到了,对吧


    书是人类进步的阶梯

    这种方法不准确,还不如看Windows防火墙Log,看有没有Recieve到SYN过来

    当然更准确地分析的话就是抓包看了,这个一抓就很清楚。

    2012年7月25日 7:31
  • Fiddler.exe  工具抓取不到数据信息呀?

    防火墙我关了呀


    书是人类进步的阶梯

    2012年7月25日 7:36
  • 晕啊。。。Fiddler是个用于抓WinHTTP的Proxy,它只能抓经WinHTTP接口调用的HTTP通信。。。

    抓包工具推荐用Wireshark或微软自己的netmon

    2012年7月25日 7:40
  • 谢谢呀,我试一试。

    Finy真热情。


    书是人类进步的阶梯

    2012年7月25日 12:00
  • 呵呵,不客气。

    抓包后有何发现吗?

    2012年7月26日 2:43
  • 找不到数据包呀(TCP)


    书是人类进步的阶梯

    2012年7月26日 3:48
  • 三台(Client+2 Server)同时抓。

    先别做TCP Port的过滤,因为三次握手前还必须有ARP过程,一般NLB问题都出在2层

    2012年7月26日 3:50
  • 两台Server都已经抓取到数据包了。但client还是    由于目标计算机积极拒绝,无法连接。 192.168.1.15:9809


    书是人类进步的阶梯

    2012年7月26日 6:02
  • 把你同时抓的3个包拿出来,我们一起看一下吧。

    最好是抓之前,3台机器都刚arp -d过的!

    2012年7月26日 6:04

  • 书是人类进步的阶梯

    2012年7月26日 6:05
  • 你理解错我的意思了,我希望你把抓包文件上传上来。。。

    你这截图,显示的是三次握手的第一步SYN,后续是否是谁RST了连接看不到。。。(从“由于目标计算机积极拒绝,无法连接”这句话来看,应该是个Reset)

    不过也很奇怪,你这截图抓包,是在那台不响应该请求的NLB节点或客户端上抓的吧?因为我看到前一个包是3秒前,相同的SYN,你标识的那个报文应该是客户端重传的SYN报文,也就是说当时客户端还没收到RST(不报错,等超时,重传)。。。

    你还是把抓包文件传上来给大家一起看看吧


    • 已编辑 Finy 2012年7月26日 6:17
    2012年7月26日 6:13
  • ......
    • 已编辑 server126 2012年7月27日 8:13 太长了,页面
    2012年7月26日 6:28
  • 这样的数据信息,对吗?

    书是人类进步的阶梯

    2012年7月26日 6:30
  • errerrerr
    • 已编辑 server126 2012年7月28日 8:28 err
    2012年7月26日 6:34
  • 抓取包

    这是一个包,在哪台上抓的?另两台的呢?

    初看了下,328,331;335,336;339,340这3对就是3对SYN和RST。。。

    请提供另两台机器的抓包(必须是同时抓的哦)

    另补充一下,你检查一下两台节点的TCP/IP里的NLB属性,是不是一台单播一台多播了?

    另,你是不是Hyper-V里那个设置,是两台虚拟机都改了吗

    我看到NLB心跳两个源MAC一个是Hyper-V的类型,一个是Dell类型。。。

    00:15:5d:01:05:01
    00:1d:09:0f:70:ac

    并且,改动后,有没有重搭NLB?还是继续用?




    • 已编辑 Finy 2012年7月26日 6:55
    2012年7月26日 6:44


  • 书是人类进步的阶梯


    • 已编辑 server126 2012年7月28日 8:27 s
    2012年7月26日 7:04
  • 192.168.1.6客户端出了点问题,现在把客户端改成192.168.1.4了,传上client数据包



    书是人类进步的阶梯


    • 已编辑 server126 2012年7月28日 8:27 sss
    2012年7月26日 7:15
  • 两台server包

    书是人类进步的阶梯

    这里的3个包,不是同时抓的。。。client的是晚抓的(用的是192.168.1.4去访问NLB)。。。server1和2倒是同时抓的(当时访问者是192.168.1.6)。。。

    这样信息还是对应不起来。。。能准确做一次吗?一定是3台一起抓包,然后先arp -d,再从Client分别做到节点1的端口访问,到节点2的端口访问,到NLB IP的端口访问,这三个过程。

    另外,从Server2抓包里看到,是它reset了连接,你能先把这个节点临时关机掉吗?看看访问群集IP是否就通呢?


    • 已编辑 Finy 2012年7月26日 7:23
    2012年7月26日 7:21

  • 灰常感谢Finy  朋友热心帮助!


    书是人类进步的阶梯


    • 已编辑 server126 2012年7月28日 8:27 ssss
    2012年7月26日 7:37
  • 这次包总算全了,哈哈。可惜你没做“从Client分别做到节点1的端口访问,到节点2的端口访问”,你只做了“Client到NLB IP的端口访问”。。。

    我先看看包吧。

    另外,你先做这几件事:

    0. 确认两台虚拟机里的windows防火墙都已关闭

    1. 确认两台虚拟机的属性里都enable MAC spoofing

    2. 重建NLB,并使用单播模式

    另外,你随便找个其他小的TCP Server程序,甚至可以使用微软MSDN的Winsock的c/c++ Sample Code Server application去试试看监听,看它有没有问题?




    • 已编辑 Finy 2012年7月26日 8:11
    2012年7月26日 8:03
  • 0   防火墙关了

    1 确定

    2 为什么要使用“单播模式”   ???我现在是“多播模式”的


    书是人类进步的阶梯

    2012年7月26日 8:34
  • 2 为什么要使用“单播模式”   ???我现在是“多播模式”的


    只是测试一下,并不代表“多播”不工作,同时,也确保你重建了一次NLB。

    另外,我突然想到一个问题:你的c#程序是不是只bind到了实IP?而没带虚IP?若是,能否先尝试bind到0.0.0.0?

    2012年7月27日 2:16
  • 对,bind(集群IP)  不是正在的server -ip 

    书是人类进步的阶梯

    2012年7月27日 8:11
  • 2 为什么要使用“单播模式”   ???我现在是“多播模式”的


    只是测试一下,并不代表“多播”不工作,同时,也确保你重建了一次NLB。

    另外,我突然想到一个问题:你的c#程序是不是只bind到了实IP?而没带虚IP?若是,能否先尝试bind到0.0.0.0?

    若是,能否先尝试bind到0.0.0.0?  ------这个是什么意思呀?请指教!

    书是人类进步的阶梯

    2012年7月27日 8:12
  • 若是,能否先尝试bind到0.0.0.0?  ------这个是什么意思呀?请指教!


    就是bind()时指定IPEndPoint为IPAddress.Any,让它监听在任何本机IP上。试试吧,也许就是这个问题。
    2012年7月27日 9:23
  • Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    var any = IPAddress.Any;
                    clientSocket.Connect(new IPEndPoint(any, myProt));
                   
                }
                catch(Exception ex)
                {
                    Console.WriteLine("连接服务器失败,请按回车键退出!");
                }


    书是人类进步的阶梯

    2012年7月27日 9:59
  • 不不不,是serverSocket里bind到Any...
    • 已标记为答案 server126 2012年7月28日 8:46
    2012年7月27日 10:01
  • 非常非常非常非常非常非常非常非常非常.....感谢 Finy  朋友,您帮我解决了这个问题,太谢谢您了。


    书是人类进步的阶梯

    2012年7月28日 8:46
  • 哈哈,不客气,解决了就好。

    我也长见识了,原来NLB上的Network应用,不能只Bind和Listen在虚IP上。。。

    2012年7月30日 3:04