• 1. 10/25/2018集群与MySQL
  • 2. 10/25/2018 集群培训内容集群分类及应用场景 lvs NAT 方式的特点 lvs DR 方式的特点 常见的集群算法 lvs的运维 lvs常见故障处理 lvs数据包分析 系统的参数优化 rhcs与开源集群的介绍
  • 3. 10/25/2018为什么用集群?
  • 4. 10/25/2018集群的特点 高效 可伸缩性(scale-out) 可用性 低成本 ...
  • 5. 10/25/2018集群用在什么场景?
  • 6. 10/25/2018什么是集群?负载型集群,用于承载用户大量压力 高可用集群用来快速故障切换 对于ops 有什么意义?
  • 7. 10/25/2018常用集群类型负载集群(LB)   dns lvs haproxy nginx RHCS 高可用集群(HA)   heartbeat keepalived 高性能集群(HPC)   Beowulf
  • 8. 10/25/2018 lvs 中服务器的角色Director DGW realserver VIP DIP RIP
  • 9. 10/25/2018lvs 的连接方式 nat dr tun
  • 10. 10/25/2018nat方式director收到用户请求包后,将请求包中VIP地址转换为某个选定的realserver 的RIP地址,转给realserver realserver将应答包发给director director将应答包中RIP转为director的VIP地址 回送给用户
  • 11. 10/25/2018nat 注意的问题所有realserver与director在同一个子网中 rip真实服务器ip地址为私有地址,仅用于集群节点之间使用 客户端的请求响应都要经过director ripserver 网关指向dip 可以实现端口映射 realserver可以是任何操作系统 dirctor可能成为系统瓶颈
  • 12. 10/25/2018dr 方式DR(Direct Routing)直接路由模式。 Director收到请求包后,将请求包中目标MAC地址转换为某个选定RS的MAC地址后将包转发出去 realserver收到请求包后 ,可直接将应答内容传给用户。 此时要求LB和所有RS都必须在一个物理段内 且Director与realserver共享一个虚拟IP。
  • 13. 10/25/2018dr需要注意的问题集群节点必须在一个物理网络上(mac) rip可以需要公网地址 director处理入站请求 realserver网关不指向director 不支持端口映射 大多数操作系统支持realservers dr dirctor 比nat director性能优越
  • 14. 10/25/2018基于lvs 实现linux 四层负载NAT方式
  • 15. 10/25/2018nat方式实现关键过程 1 在director 和 rs上,加载此模块 modprobe iptable_nat 2拓扑图 <-----<--- [client] CIP: | | DGW 机房GataWay(router) | | VIP: [Director]分发器 | DIP: | --------+------------ | | | [S1] [S2] [S3] real server RIP:
  • 16. 10/25/2018nat方式实现关键过程  3 Director分发器: yum install ipvsadm   net.ipv4.ip_forward = 1 modprobe iptable_nat 4 ipvs   ipvsadm -A -t 220.0.0.1:80 -s rr ipvsadm -a -t 220.0.0.1:80 -r 192.168.1.185 -m   ipvsadm -a -t 220.0.0.1:80 -r 192.168.1.184 -m   -A 添加   -t 表示TCP的服务 VIP:PORT   -s 指定调度算法 rr表示round-robin   -a 表示添加real server的地址   -r指定real server的IP地址   -m 表示masquerade 也就是NAT方式的LVS   /etc/init.d/ipvsadm save   5 RealServer: 网关指向DIP: 192.168.1.168
  • 17. 10/25/2018基于lvs 四层负载 DR 方式
  • 18. 10/25/2018dr方式配置主要过程  1, director eth0 DIP eth0:1 VIP ifconfig eth0 192.168.1.254 netmask 255.255.255.0 ifconfig eth0:1 192.168.1.250 netmask 255.255.255.0 检查: ip route show 192.168.1.0/24 dev eth0 proto kernel scope link src DIP 网关: ip route add default via 192.168.1.15 dev eth0   
  • 19. 10/25/2018dr方式配置主要过程  2,ipvsadm ipvsadm -A -t VIP:PORT -s rr ipvsadm -a -t VIP:PORT -r RIP -g    ipvsadm -A -t 192.168.1.250:80 -s rr    ipvsadm -a -t 192.168.1.250:80 -r 192.168.1.188 -g   ipvsadm -a -t 192.168.1.250:80 -r 192.168.1.5 -g   3 RealServer: ifconfig lo:1 VIP netmask 255.255.255.255    作用:关闭ARP转发。 echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce route add default gw 192.168.1.15    ipvsadm -L -n --stats 发现进来的包是有的,但是出去的包为0 InPkts OutPkts 有 0
  • 20. 10/25/2018数据包流向1、 客户端发出数据包 sip:CIP sport:12345 smac:client_mac dip:VIP dport:21 dmac:client_gateway_mac 每经过一个路由器,MAC地址都会改变 2、DGW这的数据包 sip:CIP sport:12345 smac:DGW_mac dip:VIP dport:21 dmac:VIP_mac
  • 21. 10/25/2018数据包流向3、 Director收到的数据包 sip:CIP sport:12345 smac:DGW_mac dip:VIP dport:21 dmac:VIP_mac 改变为 sip:CIP sport:12345 smac:DIP_mac dip:VIP dport:21 dmac:RIP_mac 调度,把目标MAC改为Real Server 的MAC
  • 22. 10/25/2018数据包流向4、RS收到数据包 ifconfig lo:0 VIP netmask 255.255.255.255 5、RS给CLIENT回数据包,如下: sip:VIP sport:21 smac:RIP_mac dip:CIP dport:12345 dmac:DGW_mac 并且打开一个 大于1024 随机端口。告知给CLIENT,让其过来取数据 ,那么这样一个数据包的 IP /PORT分别是多少呢? IP应该是VIP (因为客户端请求的地址是VIP) PORT应该是大于1024
  • 23. 10/25/2018内核参数arp_announce : INTEGER 默认为0 对网络接口上本地IP地址发出的ARP回应作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送
  • 24. 10/25/2018内核参数arp_ignore : INTEGER 默认为0 定义对目标地址为本地IP的ARP询问不同的应答模式 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应) all/ 和{interface}/ 下两者同时比较,取较大一个值生效.
  • 25. 10/25/2018dr 方式相关的问题问题1:DR方式为什么Director要有两个IP ? 核心:Director改数据包的目标MAC地址为RIP网卡对应的MAC(Director必须得知道RIP的MAC地址。通过ARP广播查询) Director上发送的arp广播 : srcip: VIP??还是DIP srcmac: DIP_mac 如果这里源IP是VIP的话,那么,实际上real server的lo接口上也配置了vip,包将不会回应 给Director。所以需要源IP是另外一个IP,也就是DIP dstip: RIP dstmac: 0xffff
  • 26. 10/25/2018dr 方式相关的问题问题2:real server为什么是要有公网IP VIP是公有IP,所以 DGW的内部接口(与VIP接口相连的)是公有IP,而Real server需要把包直接交给DGW,所以Real server的IP是公网地址!
  • 27. 10/25/2018dr 方式相关的问题问题3:VIP为什么要配置在eth0:0上?而不配置在eth0上 ---因为 要保证数据包arp找real server的MAC时,数据包的源IP是DIP。见问题1 [root@localhost networks]# ifconfig eth0:0 VIP [root@localhost networks]# ifconfig eth0 DIP [root@localhost networks]# ip route show 192.168.1.0/24 dev eth0 proto kernel scope link src DIP 如果把VIP配置到eth0接口上,将会看到这样的一条路由条目192.168.1.0/24 dev eth0 proto kernel scope link src VIP 这样就出问题了!
  • 28. 10/25/2018dr 方式相关的问题问题4:为什么real server不在eth1接口上配置VIP,而在lo接口上配置VIP呢,为什么配置的子网掩码是255.255.255.255? 首先配置在lo接口上是因为方便,如果有第二块网卡,配置在eth1网卡接口上也是可行的。但是eth1接口不能响应对VIP的mac地址的ARP查询。必须要通过arptables加规则,规则如下: rpm -q arptables_if arptables -A IN -d 220.0.0.2 -j DROP 子网掩码是32位,意味着不会在路由表中添加到相应网络的路由,这里并不需要路由条目,只需要直接走默认路由(把包交给DGW就行)(路由表有名为main,default表。)
  • 29. 10/25/2018dr 方式相关的问题问题5:VS/DR方式时,如果Director上是双网卡eth0(用于连接DGW) 、 eth1(用于连接real server) 此时,见问题1 。需要确保路由条目为 ,并且在最上面(生效): Real Server的网段 dev eth0 proto kernel scope link src DIP 由于eth0,eth1上都 是公有IP,如果在同一网段,才需要把eth0到达网络的路由删除(以避免路由顺序不对带来的问题)!
  • 30. 10/25/2018Lvs支持算法1 round robin ---- rr 在服务器池中无穷的循环中遍历 2 Weighted Round Robin --- wrr 基于集群节点可以处理多少来分配给每个节点一个权重值。权重值为2的服务器将收到权重值为1的服务器的两倍的连接数量。如果服务器的权重为0 ,则不允许到服务器的新连接(但当前活动的连接将不会丢失) 3 Least-Connection ---- lc 当新的请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器。 director将集群节点目前的活动连接数量x256 再加上不活动的连接数量,得到节点的开销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中) 4 Weighted Least-Connection ---- wlc 先如上算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。 5 Locality-Based Least-Connection ----lblc 6 Locality-Based Least-Connection with Replication ---- lblcr 7 dh - Destination Hashing 8 sh - Source Hashing 9 sed - Shortest Expected Delay 10 nq - Never Queue
  • 31. 10/25/2018ipvsadm运维ipvsadm -L -n ipvsadm -C ipvsadm -L -n --stats ipvsadm -L -n --rate ipvsadm -L -n -c 参数备忘 -L|-l --list 显示内核虚拟服务器表 -Z --zero 虚拟服务表计数器清零(清空当 前的连接数量等) -C --clear 清除内核虚拟服务器表中的所有 记录。 --stats 显示统计信息 --rate 显示速率信息 -c --connection 显示LVS 目前的连接
  • 32. 10/25/2018tcpdumptcpdump -i eth0 tcpdump -i eth0 -v -n -v 显示包含有TTL,TOS值等等更详细的信息 -n不要做IP解析为主机名 -nn不做名字解析和端口解析 更有针对性的抓包: 针对IP,网段,端口,协议
  • 33. 10/25/2018tcpdump tcpdump -i eth0 -vnn host 192.168.0.154 tcpdump -i eth0 -vnn net 192.168.0.0/24 tcpdump -i eth0 -vnn port 22 tcpdump -i eth0 -vnn udp tcpdump -i eth0 -vnn icmp tcpdump -i eth0 -vnn arp tcpdump -i eth0 -vnn ip
  • 34. 10/25/2018tcpdump tcpdump -i eth0 -vnn src host 192.168.0.154 tcpdump -i eth0 -vnn dst host 192.168.0.154 tcpdump -i eth0 -vnn src port 22 tcpdump -i eth0 -vnn src host 192.168.0.253 and dst port 22 tcpdump -i eth0 -vnn src host 192.168.0.154 or port 22 tcpdump -i eth0 -vnn src host 192.168.0.154 and not port 22
  • 35. 10/25/2018tcpdump tcpdump -i eth0 -vnn \( src host 192.168.0.2 and dst port 22 \) or \( src host 192.168.0.65 and dst port 80 \) tcpdump -ieth0 -vnn -r /tmp/fil1 tcp tcpdump -ieth0 -vnn -r /tmp/fil1 host 192.168.0.58 tcpdump -ieth0 -vnn -r /tmp/fil1 tcp tcpdump -ieth0 -vnn -w /tmp/fil1 -c 100 rpm -qa |grep wireshark wireshark-gnome-1.0.3-4.el5_2 wireshark-1.0.3-4.el5_2
  • 36. 10/25/2018系统参数调整 too many open files !!!
  • 37. 10/25/2018/etc/security/limits.conf * hard nofile 409600 /proc/sys/fs/file-max 最大文件句柄数目 /proc/sys/fs/file-nr 已分配文件句柄的数目 分配但是未使用文件句柄的数目 最大文件句柄数目 该文件是只读的,仅用于显示信息。 lsof -n|awk ‘{print $2}’|sort|uniq -c |sort -nr|more number PID ps -ef | grep PID # 获得占用FD最多的程序
  • 38. 10/25/2018TIME_WAIT状态的意义: 主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间 这个是TCP/IP必不可少的,也就是“解决”不了的。 也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以 主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。 TIME_WAIT 并不会占用很大资源的,除非受到攻击。
  • 39. 10/25/2018
  • 40. 10/25/2018
  • 41. 10/25/2018net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收 net.ipv4.tcp_tw_reuse = 1 表示开启重用 net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  • 42. 10/25/2018net.ipv4.tcp_keepalive_time = 600 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为10分钟 net.ipv4.ip_local_port_range = 10240 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10240到65000 net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数 net.ipv4.tcp_max_tw_buckets = 5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000
  • 43. 10/25/2018/proc/sys/net/ipv4/tcp_mem 有3个值: net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力. net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段. net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket. 上述内存单位是页
  • 44. 10/25/2018net.ipv4.ip_local_port_range = 1024 65000 调整滑动窗口大小 net.ipv4.tcp_rmem = 8192 87380 8738000 TCP读buffer net.ipv4.tcp_wmem = 4096 65536 6553600 TCP读buffer net.core.rmem_max = 16777216 最大socket读buffer net.core.wmem_max = 16777216 最大socket写buffer
  • 45. 10/25/2018
  • 46. 10/25/2018使用rhcs套件piranha配置带健康检查的负载集群 可用性年停机时间系统类别   99.9 8.8小时可用系统   99.99 52.6分钟高可用系统   99.999 5.3分钟抗故障系统   99.9999 32秒容错系统
  • 47. 10/25/2018其他的集群解决方案lvs + haproxy / lvs+ varnish/ lvs + nginx lvs + keepalived / lvs + heartbeat F5-BigIP ...
  • 48. 10/25/2018
  • 49. 10/25/2018Thank you !