在群集 01 上:

在群集 01 上:

我们有一些要求,请解释一下这里。我们尝试满足他们的需求,但没有成功。以下是简要信息:

以下是要求:

  1. 高可用性
  2. 负载均衡

当前配置:

服务器 #1:每个 10.17.243.11 对应一个静态(真实)IP 服务器 #2:每个 10.17.243.12 对应一个静态(真实)IP 集群(虚拟且在所有服务器之间共享)IP:10.17.243.15

我尝试使用 CLUSTERIP 通过以下方式获取集群 IP:

on the server #1
iptables -I INPUT -i eth0 -d 10.17.243.15 -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5E:00:00:20 --total-nodes 2 --local-node 1

on the server #2  
iptables -I INPUT -i eth0 -d 10.17.243.15 -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5E:00:00:20 --total-nodes 2 --local-node 2  

当我们尝试 ping 10.17.243.15 时,没有回复。并且 Web 服务(端口 8080 上的 tomcat)也无法访问。但是,我们设法使用 TCPDUMP 在两台服务器上获取数据包。

一些有用的信息:
iptables roules(iptables -L -n -v):

Chain INPUT (policy ACCEPT 21775 packets, 1470K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 CLUSTERIP  all  --  eth0   *       0.0.0.0/0            10.17.243.15         CLUSTERIP hashmode=sourceip clustermac=01:00:5E:00:00:20 total_nodes=2 local_node=1 hash_init=0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 14078 packets, 44M bytes)
 pkts bytes target     prot opt in     out     source               destination

日志消息:

... kernel: [    7.329017] e1000e: eth3 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
... kernel: [    7.329133] e1000e 0000:05:00.0: eth3: 10/100 speed: disabling TSO
... kernel: [    7.329567] ADDRCONF(NETDEV_CHANGE): eth3: link becomes ready
... kernel: [   71.333285] ip_tables: (C) 2000-2006 Netfilter Core Team
... kernel: [   71.341804] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
... kernel: [   71.343168] ipt_CLUSTERIP: ClusterIP Version 0.8 loaded successfully
... kernel: [  108.456043] device eth0 entered promiscuous mode
... kernel: [  112.678859] device eth0 left promiscuous mode
... kernel: [  117.916050] device eth0 entered promiscuous mode
... kernel: [  140.168848] device eth0 left promiscuous mode

ping 时执行 TCPDUMP:

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:11:55.335528 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.17.243.1 >     10.17.243.15: ICMP echo request, id 16162, seq 2390, length 64
12:11:56.335778 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)              
    10.17.243.1  >     10.17.243.15: ICMP echo request, id 16162, seq 2391, length 64
12:11:57.336010 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
    10.17.243.1  >     10.17.243.15: ICMP echo request, id 16162, seq 2392, length 64
12:11:58.336287 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 
    10.17.243.1  >     10.17.243.15: ICMP echo request, id 16162, seq 2393, length 64

ARP 缓存:

Address                  HWtype  HWaddress           Flags Mask            Iface
10.17.243.12             ether   00:90:0B:24:CA:58   C                     ETH01
10.17.243.11             ether   00:90:0B:24:CA:68   C                     ETH01
10.17.243.15                     (incomplete)                              ETH01

正如我所说,没有 ping 回复。有人知道我错过了哪一部分吗?
提前谢谢。

更新:为了解决 ARP 缓存中集群 IP 的“不完整”HWaddress,我们手动添加了该条目。

答案1

虽然我遵循了网上所有大致相同的说明,但显然有一个步骤缺失。我不确定这是因为我的系统(包括软件或硬件规格)。无论如何,根据我在网上找到的 Michael Schwartzkopff 的说明(林旭杂志),需要在两台机器上运行以下命令(至少在我的情况下):

ip addr add 10.17.243.15/24 dev eth0

如果您按照网络上的说明 + 额外的步骤进行操作,ARP 缓存中就不会出现“不完整”的条目,并且一切都正常运行。

感谢 Michael Schwartzkopff :)

答案2

我们想要做与您同样的事情:为两台服务器分配一个虚拟 IP。

我们在 CentOS 7 上运行。

因此我们这样做:

  1. 集群01:10.10.10.11
  2. 集群02:10.10.10.12
  3. 虚拟IP:10.10.10.10

在群集 01 上:

iptables -I INPUT -i ens160 -d 10.10.10.10 -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5E:00:00:20 --total-nodes 2 --local-node 1
ip addr add 10.10.10.10/24 dev ens160

在群集 02 上:

iptables -I INPUT -d 10.66.66.10 -i ens160  -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5E:00:00:20 --total-nodes 2 --local-node 2
ip addr add 10.10.10.10/24 dev ens160

我们可以 ping 通 VirtualIP(但只能从 Cluster01 和 Cluster02 ping)。我们在 arp 缓存中手动添加硬件地址:

arp -i ens160 -s 10.10.10.10 01:00:5E:00:00:20 


# iptables -L -n -v

    Chain INPUT (policy ACCEPT 2221 packets, 151K bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 CLUSTERIP  all  --  ens160 *       0.0.0.0/0            10.10.10.10          CLUSTERIP hashmode=sourceip clustermac=01:00:5E:00:00:20 total_nodes=2 local_node=2 hash_init=0

    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination

    Chain OUTPUT (policy ACCEPT 1536 packets, 1412K bytes)
     pkts bytes target     prot opt in     out     source               destination

在两台服务器上我们都有文件/proc/net/ipt_CLUSTERIP/10.10.10.10

从我的工作站,我可以访问 Cluster01 和 Cluster02 上的网页,但在 VirtualIP 上它不起作用...

相关内容