欢迎各位兄弟 发布技术文章
这里的技术是共享的
[root@mail ~]# vim health_check4.sh
#!/bin/bash
#
VIP=192.168.0.77
CPORT=80
FAIL_BACK=127.0.0.1 #失败时使用的ip
RS=("192.168.0.45" "192.168.0.55") #rs数组 (rs 表示 real server)
declare -a RSSTATUS #表示rs的状态,表示rs是否在线
RW=("2" "1") # rs weght 表示rs的权重
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() { #增加 rs
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs() { #删除rs
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
checkrs() { #检查rs是否在线
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
initstatus() {
local I
local COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
initstatus
while :; do
let COUNT=O
for I in ${RS[*]}; do
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'` , $I is back ." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'` , $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done
director上
[root@mail ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 wlc
-> 192.168.0.55:80 Route 1 0 0
-> 192.168.0.45:80 Route 2 0 0
[root@mail ~]#
director上
[root@mail ~]# bash -x health_check4.sh
当 rs (192.168.0.55) # service httpd stop 离线的时候
[root@mail ~]# ipvsadm -L -n # rs rs (192.168.0.55) 没有了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 wlc
-> 192.168.0.45:80 Route 2 0 0
[root@mail ~]#
[root@mail ~]# tail /var/log/ipvsmonitor.log #日志里 看到了信息
2020-11-12 13:15:47 , 192.168.0.55 is gone. #看到了信息
[root@mail ~]#
当 rs (192.168.0.55) # service httpd start 服务启动的时候
[root@mail ~]# tail -f /var/log/ipvsmonitor.log
2020-11-12 13:15:47 , 192.168.0.55 is gone.
2020-11-12 13:16:05 , 192.168.0.55 is back . #看到rs 回来了
我们可以把任何一个rs下线(rs上执行 service httpd stop 会自动下线),不会报错,因为 director上执行 ipvsadm -L -n 就看不到这个rs了,不会报错,
也可以把任何一个rs上线(rs上执行 service httpd stop 会自动上线),也不会报错
因为 director上执行 ipvsadm -L -n 又可以看到这个 rs了
有一个小bug, ipvsadm -L -n 为空
假如rs2,本来httpd就处于stop在线状态,,,运行health_check4.sh,,,RSSTATUS[2]=1;;; 那么rs2进行start的时候,就不会加到这个服务里面去(因为 if checkrs $I 为真,但是RSSTATUS[2]=1,所以不执行,,,在 /node-admin/15662 马哥做了修正 )
[root@mail ~]# bash health_check4.sh & 加个与符号 (and 符号,就直接在后台运行了)
DR:
director 上配置VIP,要配置在网卡别名上,最好把广播配置为自己,以免与其它人进行广播通信,还要配置专门的路由信息
real server,调整两个内核参数 arp_ignore 1,arp_announce 2 ;;
还有最好用脚本写网卡别名,路由,ipvsadm规则,免得每次手写
数量:变量阵列
array_name=("" "" "")
declare -a A #变量明确声明数组,表示A就是一个数组 ( -a array )
declare -i I #变量明确声明为数字 ( -i integer )
LVS持久连接
在DH,SH,LBL算法的时候提到的概念,在一定的时间内,能够将来自同一个客户端的请求,始终的定向到同一个real server 上去的机制;;对于LVS来讲,持久连接不关乎调度算法;
无论使用什么算法,LVS持久连接都能实现在一定时间将来自同一个客户端的请求派发至同一个此前选定的 real server
DH算法依赖于TCP会话的超时时间等其它计时器;;LVS持久连接不关乎调度算法(WLC,WRR等等都可以)
持久连接模板(内存缓冲区), 每一个新的客户端来发起连接请求的时候,无论这个客户端的TCP连接是不是已经断开了,只要这个客户端曾经访问过,我们的LVS就会在内存的一个缓冲区当中,叫做持久连接模板(内存缓冲区), 它是个内存区域, (它能够将每一个第一次发起连接请求的客户端的IP和给它的选定的(可能是各种方法rr,wlc等等),,,在一定时间内,只要是这个客户端再次访问,它就会查 持久连接模板 会话表, 只要这个客户端曾经被分配过,且尚未超时,仍然在这个模板里面的话,那么就给它分配到同一个rs里面) 模板里面记录的是(缓存的是) 每一个客户端 及分配给它的RS的映射关系
ipvsadm -L
-c (connection) 连接数
--persistent-conn 持久连接信息
[root@mail ~]# man ipvsadm
[root@mail ~]# ipvsadm -L --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn(显示持久连接数) ActiveConn InActConn
-> RemoteAddress:Port
TCP 192.168.0.77:http wlc
-> 192.168.0.55:http 1 0 0 0
-> www.b.net:http 2 0 0 0
[root@mail ~]#
[root@mail ~]# ipvsadm -L -c #显示模板
IPVS connection entries
pro expire(过期时长) state(当前连接状态) source(源地址) virtual destination(分配的rs?目的地)
[root@mail ~]#
在windows 上 访问集群服务看看 多访问几次
马哥效果
我为什么看到的内容很少
[root@mail ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:01 SYN_RECV 192.168.0.103:5278 192.168.0.77:http 192.168.0.55:http
[root@mail ~]#
ipvsadm -A|E .... 添加集群服务的时候
-p timeout # ( -p persistent )添加持久连接功能 timeout是持久连接的时长,默认为300秒(5分钟) 单位是秒
在基于ssl会话的场景当中,最需要用到持久连接, ssl会话的建立,需要发各种证书,传递协商加密算法, ( 好不容易分配了一个real server ,分配好了,刷新一下,重新分配个rs,加密通信就无法正常进行了,,,,,每一次加密通信,每一次报文都要重新建立一个ssl会话,会相当消耗资源的 ) 所以一般说来,在基于ssl的应用当中,通常用到持久连接
持久连接,能够实现将来自同一个客户端的所有请求都定向到一个rs上去,
两种功能
PPC: Persistent port connections (持久端口连接)能够将同一个客户端的对同一个集群服务 同一个端口的请求,始终定向到此前选一的real server
PCC: Persistent client connections (持久客户端连接)能够将同一个客户端的对所有端口(所以服务)的请求,始终定向到此前选一的real server
把所有端口统统定义为集群服务,一律向RS转发,,,,,(如果rs上没有定义相应的服务,自然会报错的)
PNMPP: Persistent Netfilter Marked Packet Persistence (持久防火墙标记连接) 这是一种特定的机制,它能够定义端口间的姻亲关系
马哥的 health_check4.sh (或者说我的 health_check4.sh还有点bug,
原来是在线的,检查在线成功,状态为1,,但是没有加上去,,,状态也为1,所以永远不会执行加上去
)
[root@mail ~]# ps aux | grep bash
root 8813 0.0 0.1 5028 1488 pts/3 Ss 07:53 0:00 -bash
root 9203 0.0 0.0 4276 696 pts/3 S+ 10:20 0:00 grep bash
[root@mail ~]#
[root@mail ~]# tail /var/log/ipvsmonitor.log
2020-11-12 13:15:47 , 192.168.0.55 is gone.
2020-11-12 13:16:05 , 192.168.0.55 is back .
[root@mail ~]# kill 进程号 #杀死进程
[root@mail ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 wlc
-> 192.168.0.55:80 Route 1 0 0
-> 192.168.0.45:80 Route 2 0 0
[root@mail ~]#
[root@mail ~]# ipvsadm -E -t 192.168.0.77:80 -s rr
[root@mail ~]#
马哥刷新一次 rs 变化一次,,,而我刷新多次 还是同一个rs
[root@mail ~]# ipvsadm -L -n #现在是rr算法
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 rr
-> 192.168.0.55:80 Route 1 0 0
-> 192.168.0.45:80 Route 2 0 0
[root@mail ~]#
[root@mail ~]# ipvsadm -E -t 192.168.0.77:80 -s rr -p 600 # 持久连接600秒
[root@mail ~]# ipvsadm -L -n # 现在支持持久连接的功能了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 rr persistent 600
-> 192.168.0.55:80 Route 1 0 0
-> 192.168.0.45:80 Route 2 0 0
[root@mail ~]#
马哥现在刷新多次是同一个rs,,,我刷新多次当然仍然也是 同一个rs
[root@mail ~]# ipvsadm -L -n --persistent-conn #查看持久连接情况
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 192.168.0.77:80 rr persistent 600
-> 192.168.0.55:80 1 1 (有一个持久连接) 2 4
-> 192.168.0.45:80 2 0 0 0
[root@mail ~]#
在两个rs上 开启telnet服务 (我只记录在一个 rs 上的吧,另一个是一模一样的)
[root@rs1 ~]# chkconfig telnet on
[root@rs1 ~]# service xinetd restart
停止 xinetd: [确定]
启动 xinetd: [确定]
[root@rs1 ~]#
[root@rs1 ~]# netstat -tnlp | grep 23 #看23号端口有没有启用,(telnet是监听在23号端口上的) ( 如果有问题 可以看看 /node-admin/15444 /node-admin/15449 ) (主要是看看 /etc/xinetd.d/telnet 里面的 only_from(客户端只能来自于哪里) 和 bind 参数(绑定在哪个ip上) )
tcp 0 0 192.168.0.45:23 0.0.0.0:* LISTEN 14311/xinetd
[root@rs1 ~]#
telnet不允许root远程登录的,所以要添加一个普通的测试用户
[root@rs1 ~]# useradd hadoop
useradd:用户 hadoop 已存在
[root@rs1 ~]# passwd hadoop
Changing password for user hadoop.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@rs1 ~]#
在 director 上 telnet rs 看看
[root@mail ~]# telnet 192.168.0.45 23 ( 如果有问题 可以看看 /node-admin/15444 /node-admin/15449 ) (主要是看看 /etc/xinetd.d/telnet 里面的 only_from 和 bind 参数;;;同时看看防火墙有没有关掉 )
如果 登录 报 Login incorrect 可能是 用户没有权限登录putty 可以看看 /node-admin/15454 关于 pam_allowgroups 部分
在 director 上 telnet rs 看看 (前面有各种错,下面是正常的)(只测这一个rs 192.168.0.45,另一个rs 就不测了)
[root@mail ~]# telnet 192.168.0.45 23
Trying 192.168.0.45...
Connected to www.b.net (192.168.0.45).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Welcome to
[hadoop@rs1 ~]$ ifconfig
-bash: ifconfig: command not found
[hadoop@rs1 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:3D:B0:3C
inet addr:192.168.0.45 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe3d:b03c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:37562 errors:0 dropped:0 overruns:0 frame:0
TX packets:5146 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3348279 (3.1 MiB) TX bytes:684642 (668.5 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:391 errors:0 dropped:0 overruns:0 frame:0
TX packets:391 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:24249 (23.6 KiB) TX bytes:24249 (23.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs1 ~]$
[hadoop@rs1 ~]$ logout
Connection closed by foreign host.
[root@mail ~]#
上面关于两个rs的telnet测试好了后,
增加集群服务
[root@mail ~]# ipvsadm -A -t 192.168.0.77:23 -s rr
[root@mail ~]#
[root@mail ~]# ipvsadm -a -t 192.168.0.77:23 -r 192.168.0.45 -g -w 2 #(先给个权重吧)
[root@mail ~]# ipvsadm -a -t 192.168.0.77:23 -r 192.168.0.55 -g -w 1
[root@mail ~]#
在 director 上 先禁用 telnet吧 直接 service xinetd stop
马哥 在 director进行 telnet VIP 23 能正常通信
而我在 director 出现问题
[root@mail xinetd.d]# telnet 192.168.0.77 23
Trying 192.168.0.77...
telnet: connect to address 192.168.0.77: Connection refused
telnet: Unable to connect to remote host: Connection refused
[root@mail xinetd.d]#
为什么呢?经查 是在rs(192.168.0.45) /etc/xinetd.d/telnet 里面
only_from = 192.168.0.0/24 (它好像不是产生上面错的原因)
bind = 192.168.0.45 (应该主要就是它出问题,把它删掉就可以了,为什么呢它出问题呢?大约是说报文传输会通过本地回环地址lo:0上即应该改成 bind = 192.168.0.77 也可以吧,,,经测试,改成vip(192.168.0.77)也是可以的,,为了将来有问题 ,还是删掉这两行吧)
我直接把这两行都删掉了(当然 rs 192.168.0.55 也要同样的处理下)
删掉 only_from 和 bind 后,在 rs 上重启下 xinetd ( service xinetd restart )
在第三方客户端 ( 192.168.0.15 ) 测试下
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 09:15:24 from 192.168.0.103
Welcome to
[hadoop@rs1 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:3D:B0:3C
inet addr:192.168.0.45 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe3d:b03c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16560 errors:0 dropped:0 overruns:0 frame:0
TX packets:2639 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1448793 (1.3 MiB) TX bytes:616932 (602.4 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:468 errors:0 dropped:0 overruns:0 frame:0
TX packets:468 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:691265 (675.0 KiB) TX bytes:691265 (675.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs1 ~]$
在第三方客户端 ( 192.168.0.15 ) 再连接一次
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 08:47:54 from 192.168.0.75
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig #两次的ip(这一次是 192.168.0.55 )不一样,所以是负载均衡吧(rr算法)
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:102475 errors:0 dropped:0 overruns:0 frame:0
TX packets:42045 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8660343 (8.2 MiB) TX bytes:47797887 (45.5 MiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:23309 errors:0 dropped:0 overruns:0 frame:0
TX packets:23309 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:47475497 (45.2 MiB) TX bytes:47475497 (45.2 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$
在 director 上
[root@mail xinetd.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.77:80 rr persistent 600
-> 192.168.0.45:80 Route 1 0 0
-> 192.168.0.55:80 Route 1 0 0
TCP 192.168.0.77:23 rr
-> 192.168.0.55:23 Route 1 0 0
-> 192.168.0.45:23 Route 1 0 0
[root@mail xinetd.d]#
在 director 上 把 23端口的集群服务也改成持久连接
[root@mail xinetd.d]# ipvsadm -E -t 192.168.0.77:23 -s rr -p 3600 #持久一个小时
[root@mail xinetd.d]#
在第三方客户端 ( 192.168.0.15 ) 再再连接一次
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 12:36:11 from 192.168.0.15
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig #连的 rs 是 192.168.0.55
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:102635 errors:0 dropped:0 overruns:0 frame:0
TX packets:42102 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8674037 (8.2 MiB) TX bytes:47803116 (45.5 MiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:23309 errors:0 dropped:0 overruns:0 frame:0
TX packets:23309 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:47475497 (45.2 MiB) TX bytes:47475497 (45.2 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$ 退出这个telnet 是 (exit或 logout)
在第三方客户端 ( 192.168.0.15 ) 再再再连接一次
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 12:41:04 from 192.168.0.15
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig #连的 rs 还是 192.168.0.55 ,所以说集群服务telnet也是持久的了
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:102794 errors:0 dropped:0 overruns:0 frame:0
TX packets:42174 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8689361 (8.2 MiB) TX bytes:47809436 (45.5 MiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:23309 errors:0 dropped:0 overruns:0 frame:0
TX packets:23309 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:47475497 (45.2 MiB) TX bytes:47475497 (45.2 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$
以上的其实默认是 PPC 功能,同一个端口的定向持久
马哥为防止这个 health_check.sh 脚本有影响,杀死了这个一直执行的脚本进程
director ( 192.168.0.75 )上 ,清空所有规则
[root@mail ~]# ipvsadm -C
[root@mail ~]#
把 0 端口定义为集群服务,意味着所有的端口请求都为集群服务
[root@mail ~]# ipvsadm -A -t 192.168.0.77:0 -s rr -p 600
[root@mail ~]# ipvsadm -a -t 192.168.0.77:0 -r 192.168.0.45 -g -w 2 #rr情况下,其实权重 -w是不起作用的
[root@mail ~]# ipvsadm -a -t 192.168.0.77:0 -r 192.168.0.55 -g -w 1
[root@mail ~]#
在 windows 上 80 服务选的是rs2 (192.168.0.55)
http://192.168.0.77/index.html
windows上请求telnet服务,也是 rs2 (192.168.0.55)
请求 集群上的 ssh 服务(我们好像没有定义ssh服务为集群服务),依然是 rs2 (192.168.0.55)
[hadoop@rs2 ~]$ ssh 192.168.0.77
The authenticity of host '192.168.0.77 (192.168.0.77)' can't be established.
RSA key fingerprint is ae:fe:80:46:96:5b:2a:94:5e:8e:0c:ec:86:eb:e1:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.77' (RSA) to the list of known hosts.
Nasty PTR record "192.168.0.77" is set up for 192.168.0.77, ignoring
hadoop@192.168.0.77's password:
Last login: Sat Nov 14 14:01:31 2020 from 192.168.0.103
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:110781 errors:0 dropped:0 overruns:0 frame:0
TX packets:42427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9667096 (9.2 MiB) TX bytes:47830399 (45.6 MiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:23393 errors:0 dropped:0 overruns:0 frame:0
TX packets:23393 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:47485529 (45.2 MiB) TX bytes:47485529 (45.2 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$
我们好像没有定义ssh服务为集群服务,但是只要我们使用了PCC,那么集群服务器上所有的端口(所有的服务)都是集群服务
此前的请求被定向到同一个rs上了 下面我的代码执行结果看不明显,下面图一是马哥代码的截图,看得很明显
对于telnet 的话,与web不一样(请求结束会断开),会一直在线,所以状态码与web会不一定完全一样,但是实际上只要是TCP连接,都能够支持TCP状态中的有限状态机中的状态
[root@mail ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state source virtual destination
TCP 05:08 ESTABLISHED 192.168.0.103:11751 192.168.0.77:23 192.168.0.55:23
TCP 00:47 NONE 192.168.0.103:0 192.168.0.77:0 192.168.0.55:0
[root@mail ~]#
图一
director上只定义有限的几个端口服务为集群服务,其它服务不是集群服务,
比如
80: RS1
23: 同一个RS1
很困难,除非把两种服务(两个端口)定义成同一个集群服务
怎么能把两个毫不相干的端口定义成同一个集群服务?这就是 PNMPP 功能
我们不做任何过滤,不影响ipvsadm,在prerouting链上,
对于目标端口为80的,打一个标记,比如标记为10(整数)
对于目标端口为23的,打一个标记,比如也标记为10(整数)
把10定义为集群服务, 这样就实现了定义为同一个集群服务,
如何打标记呢?
标记是0-99之间的整数,此防火墙标记此前尚未使用
先清除ipvs规则
[root@mail ~]# ipvsadm -C
[root@mail ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
[root@mail ~]# service ipvsadm restart
ipvsadm: Clearing the current IPVS table: [确定]
ipvsadm: Unloading modules: [确定]
ipvsadm: Clearing the current IPVS table: [确定]
ipvsadm: Applying IPVS configuration: [确定]
[root@mail ~]#
打防火墙标记,
所有对VIP上的80和23号端口的请求都打上同一个标记
director上
#-t mangle表示mangle表上 -A PREROUTING表示prerouting链上 -i eth0: ( -i interface ) 表示从eth0网卡流入 -j MARK: ( -j jump)表示跳转MARK --set-mark 8 表示设置mark值为 8 (即打上8的标记)
[root@mail ~]# iptables -t mangle -A PREROUTING -d 192.168.0.77 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8 #80端口打上8的标记
[root@mail ~]#
[root@mail ~]# iptables -t mangle -A PREROUTING -d 192.168.0.77 -i eth0 -p tcp --dport 23 -j MARK --set-mark 8 #23端口打上8的标记
将防火墙为8的标记定义为集群服务
[root@mail ~]# man ipvsadm # -f 就是防火墙标记
#添加集群服务
[root@mail ~]# ipvsadm -A -f 8 -s rr #防火墙标记不需要地址和端口号
[root@mail ~]#
#添加rs
[root@mail ~]# ipvsadm -a -f 8 -r 192.168.0.45 -g -w 2
[root@mail ~]# ipvsadm -a -f 8 -r 192.168.0.55 -g -w 5
[root@mail ~]#
ssh 是22 端口,未定义成集群服务,我们试试看
#马哥这里ssh 22 看到的ip是DIP ,也就是director吧
我在另外一个电脑上(192.168.0.15)
我为什么看到的还是rip (应该ssh 不是集群服务呢,应该看到的是dip)
我重启了director 和 两个 rs,,才最终看到 正常的结果 如下图一(通过 ssh 连vip ,看到的是DIP)
为什么要重启呢? 我也不懂其中的原因
在另外一个电脑上(192.168.0.15)
图一
在另外一个电脑上(192.168.0.15)
[root@mail ~]# telnet 192.168.0.77 #telnet 是正常的 ,因为 /sbin/ifconfig 看到的是rip (因为 telnet 23端口已加入了集群服务)此时 /sbin/ifconfig ip可看到 rip2 (192.168.0.55 )
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 14:04:54 from 192.168.0.77
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1897 errors:0 dropped:0 overruns:0 frame:0
TX packets:337 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:241973 (236.3 KiB) TX bytes:34933 (34.1 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5828 (5.6 KiB) TX bytes:5828 (5.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$ logout # 退出,
再登录telnet一次
在另外一个电脑上(192.168.0.15)
[root@mail ~]# telnet 192.168.0.77 #telnet 是正常的 ,因为 /sbin/ifconfig 看到的是rip (因为 telnet 23端口已加入了集群服务),此时 /sbin/ifconfig ip可看到 rip1 (192.168.0.45 )
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 12:17:54 from 192.168.0.15
Welcome to
[hadoop@rs1 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:3D:B0:3C
inet addr:192.168.0.45 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe3d:b03c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2710 errors:0 dropped:0 overruns:0 frame:0
TX packets:364 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:317649 (310.2 KiB) TX bytes:40358 (39.4 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:98 errors:0 dropped:0 overruns:0 frame:0
TX packets:98 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7362 (7.1 KiB) TX bytes:7362 (7.1 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs1 ~]$
web服务是集群服务
[root@mail ~]# ipvsadm -E -f 8 -s rr -p 600 #让集群服务变成持久的了
[root@mail ~]#
web 浏览器看集群服务 始终是 rs1 了
看下 telnet 访问 vip,是不是同一个rs
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 16:57:33 from 192.168.0.15
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig #看到连的是 192.168.0.55 (rs2)主机
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3477 errors:0 dropped:0 overruns:0 frame:0
TX packets:812 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:374112 (365.3 KiB) TX bytes:71780 (70.0 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5828 (5.6 KiB) TX bytes:5828 (5.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$
[hadoop@rs2 ~]$ exit #(或 logout ) 退出
重新 telnet 登录
[root@mail ~]# telnet 192.168.0.77
Trying 192.168.0.77...
Connected to 192.168.0.77 (192.168.0.77).
Escape character is '^]'.
Welcome to our telnet server.....
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
Kernel 2.6.18-371.el5 on an i686
login: hadoop
Password:
Last login: Sat Nov 14 16:58:43 from 192.168.0.15
Welcome to
[hadoop@rs2 ~]$ /sbin/ifconfig #看到连的仍然是 192.168.0.55 (rs2)主机
eth0 Link encap:Ethernet HWaddr 00:0C:29:CB:A5:7F
inet addr:192.168.0.55 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecb:a57f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3647 errors:0 dropped:0 overruns:0 frame:0
TX packets:905 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:387612 (378.5 KiB) TX bytes:79526 (77.6 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5828 (5.6 KiB) TX bytes:5828 (5.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.0.77 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[hadoop@rs2 ~]$
现实中
80,443 定义在一块才有意义
http:
https:
它们同一个real server 才有意义
为什么要持久连接呢?
持久连接会破坏负载均衡的效果的,
但是session,cookie 要求我们要持久连接,
如果各 rs 能够共享session,可以不需要持久连接
RS1: lamp,discuz
RS2: lamp,discuz
好像内核2.6.13之后就支持 inotify ,inotify+ rsync server是为了同步作用的
反正红帽5是支持的,因为红帽5是2.6.18
当主rs更新了,会通知其它rs,这样子其它主机就更新了
其它rs主机上始终运行一个脚本,一旦接到通知,会拉取更新所有数据到本地,
但是这种机制更新速度很慢,对大文件的更新能力有限
文件非常多,而且更新频繁的服务器来讲,inotify+ rsync server是不合适的
sersync(server sync ?金山开发的)能够方便的从主服务器上复制大文件,能够结合接受主服务器上inotify发来的通知机制,sersync是C++开发的,性能好,支持并发多线程复制,对于服务器比较多,支持大文件的场景比较适用
我们只做rsync server, 平时只更新 rsync server,其它主机只需要去同步就行了,平时rsync同步的时候,使用脚本同步,脚本性能太差,于是有了sersync,sersync运行在客户端,到服务器端去同步数据,支持并发多线程同步,C++开发的,性能好,很多中小型企业的解决方案当中,都用了sersync;;;自己摸索实现 sersync
附件使用共用的ntfs,数据库共用mysql
网页文件使用 inotify+ rsync server
先简单配置 inotify+rsync server,再尝试利用搜索引擎帮忙去解决sersync的问题
php 本身是可以把session放在 memcached (键值对服务器)当中,性能好,所有数据保存在内存当中,
memcached 是一个高性能缓存服务器,本身不是服务,是一个编程的api
持久连接时,80 与433 绑定在一起
自建CA的方式来发证书的话,用户请求的是同一个域名(FQDN), 同一个公司名称,地址,意味着要使用同一个证书,随便请求哪个rs,(请求第二个rs时,因为第一个rs已认证通过,所以第二个也会认证通过,只不过ssl会话需要重新连接而已)
dr模型上,lvs架构好的话,lvs性能非常好,2-4个cpu,4-8G内存,并发几十万个没有问题,它已经突破了socket套接字的限制,突破了文件数目的限制,
lvs还支持ftp协议的负载均衡,但是这种场景并不多见,不演示了
高可用集群里的一个模块LDirectorD 做个简单的配置,就能实现对后端rs的健康状况检查,自动生成ipvs规则,它是C开发的,性能好
我们自己写的脚本时长粒度不行,不支持毫秒,性能差,,,,LDirectorD 可做的很好