负载平衡、高可用

打印 上一主题 下一主题

主题 532|帖子 532|积分 1596

负载平衡

负载平衡(Load Balance):可以使用多个盘算机和组合进行海量哀求处理,从而得到很高的处理服从,也可以用多个盘算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。通过负载平衡使哀求可以在盘算机集群中尽大概平均地分摊处理。每个节点都可以负担肯定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载平衡。
分类

负载平衡根据所接纳的装备对象(软/硬件负载平衡)、应用的OSI网络层次(网络层次上的负载平衡)等来分类。
在现实应用中,比较常见的就是四层负载及七层负载。
四层负载平衡(基于IP+端口的负载平衡)

四层负载平衡,主要通过报文中的目标地址和端口,以及负载平衡装备设置的服务器选择方式,决定最终选择的内部服务器。
  1. 以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的
  2. 服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连
  3. 接建立,即三次握手的建立是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。
复制代码
实现四层负载平衡的软件有:
  1. - F5:硬件负载均衡器,功能很好,但是成本很高。
  2. - lvs:重量级的四层负载软件
  3. - nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
  4. - haproxy:模拟四层转发,较灵活
复制代码
七层的负载平衡(基于假造的URL或主机IP的负载平衡)

在四层负载平衡的基础上,再思量应用层的特性,比如同一个Web服务器的负载平衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别来决定是否要进行负载平衡。
  1. 以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理的服务器和客
  2. 户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的
  3. 特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这
  4. 种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。
复制代码
实现七层负载平衡的软件
  1. - haproxy:天生负载均衡技能,全面支持七层代理,会话保持,访问控制;
  2. - nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
  3. - apache:功能较差
  4. - Mysql proxy:功能尚可。
复制代码
四层负载与七层负载的区别(lvs和nginx的区别)

四层负载平衡(layer 4)七层负载平衡(layer 7)基于基于IP和Port(TCP协议)基于假造的URL或主机IP(HTTP协议)类似于路由器署理服务器握手次数1次2次复杂度低高性能高;无需解析内容中;需要算法识别 URL,Cookie 和 HTTP head 等信息安全性低,无法识别 DDoS等攻击高,可以抵御SYN大水攻击额外功能无会话保持,图片压缩,防盗链等
  1. 四层负载与七层负载最大的区别是效率与功能的区别。
  2. 四层架构简单,无需解析消息内容,在网络吞吐量及处理性能上高于七层。
  3. 七层负载均衡优势在于功能多,控制灵活强大
复制代码
LVS 实现四层负载平衡项目实战

1、LVS 介绍

LVS 是Linux Virtual Server的简称,也就是 Linux 假造服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。如今LVS已经是 Linux尺度内核的一部分,因此性能较高。
LVS 优势与不足

(1)优势

  1. 1.高并发稳定性强:LVS基于内核工作,有超强的承载能力和并发处理能力,而且工作在网络4层之上仅
  2. 作分发之用,这个特点也决定了它的性能最强,稳定性最好,对内存和cpu资源消耗极低。单台LVS负载
  3. 均衡器,可支持上万并发连接。
  4. 2.成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,
  5. 性价比极高。
  6. 3.配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
  7. 4.支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
  8. 5.支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
复制代码
应用范围广:因为LVS工作在4层,以是它几乎可以对所有应用做负载平衡,包括http、数据库、DNS、ftp服务等等
(2)不足

工作在4层,不支持7层规则修改,不适合小规模应用。
2、LVS 核心组件和专业术语

(1)核心组件

  1. LVS的管理工具和内核模块 ipvsadm/ipvs
  2. ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
  3. ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;
复制代码
(2)专业术语

  1. VS:Virtual Server             #虚拟服务器
  2. Director, Balancer               #负载均衡器、分发器
  3. RS:Real Server                #后端请求处理服务器 
  4. CIP: Client IP                      #客户端IP
  5. VIP:Director Virtual IP      #负载均衡器虚拟IP(接收请求的公网IP)
  6. DIP:Director IP                 #负载均衡器IP
  7. RIP:Real Server IP           #后端请求处理服务器IP
复制代码
(3)详细图解


3、LVS负载平衡工作模式

  1. LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器
  2.         (IP负载均衡,修改目标主机的IP地址)  --利用三层功能
  3. LVS/DR  :直接路由模式,只有进站的数据流量经过分发器
  4.         (数据链路层负载均衡,修改目标主机的mac地址)--利用二层功能mac地址
  5. LVS/TUN: 隧道模式,只有进站的数据流量经过分发器​
  6. FULL-NAT模式(了解)
复制代码
LVS 四种工作模式原理、以及优缺点比较

1、NAT模式(VS-NAT)

  
  1. 原理:
  2. (1)客户端访问集群的VIP,请求WEB资源(请求报文:源地址为CIP,目标地址为VIP);
  3. (2)Director(负载均衡器)收到请求后,修改请求报文的目标地址为web服务器IP(RIP),并且将请求根据相应的调度算法送往后端WEB服务器(请求报文:源地址CIP,目标地址为RIP);
  4. (3)WEB服务器收到请求,检查报文是访问自己的而自己也提供WEB服务,就会响应这个请求报文,并发送给Director(响应报文:源地址RIP,目标地址CIP);
  5. (4)Director收到WEB服务器的响应报文,根据内部追踪机制确定该响应是针对哪个客户端的VIP请求,此时会修改源地址为VIP并响应客户端请求(响应报文:源地址VIP,目标地址CIP)。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
  6. 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址(公网IP),减少了 IP 地址的需求。
  7. 缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器,速度就会变慢!一般要求10-20台节点
复制代码

2、直接路由(Direct routing)模式(VS-DR)

VS-DR 是一种高效的负载平衡实现方式,尤其实用于需要高性能且服务器位于同一物理网段的场景。然而,它对于网络拓扑有肯定的要求,这大概限定了其实用范围。
  1. 1. 原理
  2. (1)数据包转发
  3. 负载均衡器 (Director) 和实际服务器 (Real Server, RS) 共享同一个虚拟IP地址 (VIP)。
  4. 客户端向VIP发送请求时,负载均衡器对VIP的ARP请求作出响应,而所有RS对VIP的 ARP 请求保持静默。
  5. 负载均衡器接收到请求后,根据调度算法确定转发给哪个RS,并修改数据包的目标MAC地址为选定RS的MAC地址。
  6. (2)应答包返回
  7. RS处理完请求后,直接使用VIP作为源IP地址将应答包发送回客户端,因为VIP与RS的真实IP地址相同。
  8. 2. 优点
  9. (1)高效的数据包转发:无需额外的封装和解封装过程,提高了数据包转发效率。
  10. (2)灵活的操作系统支持:大多数现代操作系统均能支持 VS-DR 模式。
  11. (3)避免隧道开销:不需要使用隧道技术,降低了网络通信的复杂度和开销。
  12. 3. 不足
  13. (1)物理位置限制:负载均衡器和实际服务器必须位于同一物理网段内。
  14. (2)配置复杂性:需要确保所有RS都不响应VIP的ARP请求,可能增加额外配置步骤。
  15. (3)维护难度:添加或移除实际服务器时可能需要重新配置网络设置。
  16. 4. 使用场景
  17. (1)适合高性能负载均衡:适用于需要直接路由应答包回客户端的情况。
  18. (2)对延迟敏感的应用程序和服务:例如游戏服务器、实时交易系统等。
复制代码
3、IP隧道(Tunnel)模式(VS-TUN)

VS-TUN 模式实用于需要处理大量数据流量且 RS 分布在差别地理位置的场景。它通过淘汰负载平衡器的数据处理负担来进步整体性能,并允许 RS 直接向客户端发送应答,从而实现高效的服务提供。然而,它也要求 RS 具备肯定的配置和技术支持。
  1. 1. 原理
  2. (1)数据包封装
  3. 客户端向虚拟 IP (VIP) 发送请求时,负载均衡器接收请求并选择一个实际服务器 (RS)。负载均衡器将
  4. 原始数据包封装在一个新的IP包中,新包的头部包含实际服务器的IP地址作为目的IP,负载均衡器的 IP 地址作为源 IP。
  5. (2)数据包解封装与应答
  6. RS 收到封装的数据包后,解封装得到原始请求数据包。RS处理请求后,直接将应答包发回客户端,无需再经过负载均衡器。
  7. 2. 优点
  8. (1)减少负载均衡器负担
  9. 负载均衡器只处理请求包,应答包由 RS 直接发送给客户端,减少了负载均衡器的数据流,使其不再是系统瓶颈。
  10. (2)地理分布:通过互联网传输数据包,可以实现跨地域的负载均衡。
  11. (3)高可扩展性:一台负载均衡器能为大量 RS 进行分发,适合处理巨大请求量。
  12. 3. 缺点
  13. (1)IP资源需求:每个 RS 都需要一个合法的 IP 地址。
  14. (2)操作系统兼容性:RS 必须支持 IP Tunneling 协议,这意味着需要运行特定版本的 Linux 或其他支持此功能的操作系统。
  15. (3)额外配置:RS 上需要配置隧道功能,增加了管理复杂性。
  16. 4. 使用场景
  17. (1)跨地域负载均衡:适用于需要在全球范围内提供服务的场景。
  18. (2)高流量应用:适合处理大量请求和大体积应答数据的应用。
  19. (3)高性能要求:适用于需要高性能负载均衡且服务器分布广泛的情况。
复制代码

4、LVS三种模式NAT、DR和TUN的区别

  1. lvs-nat:请求和响应报文都经由Director负载均衡器
  2. lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
复制代码
5、LVS ipvsadm 命令

1、LVS-server安装lvs管理软件

  1. yum -y install ipvsadm
复制代码
2、命令选项

  1. -A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
  2. -a --add-server  #在服务器表中添加一条新的真实主机记录
  3. -t --tcp-service #说明虚拟服务器提供tcp服务
  4. -u --udp-service #说明虚拟服务器提供udp服务
  5. -r --real-server #真实服务器地址
  6. -m --masquerading #指定LVS工作模式为NAT模式
  7. -w --weight #真实服务器的权值
  8. -g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
  9. -s --scheduler #使用的调度算法,默认调度算法是 wlc
  10. 固定调度算法:rr,wrr,dh,sh
  11.             即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
  12. 动态调度算法:wlc,lc,sed,nq,lblc,lblcr
  13.             调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
  14. #常用的算法是:rr、wrr、wlc、lc
  15. -C -clear #清除内核虚拟服务器表中的所有记录。
  16. -S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
  17. -d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
  18. -L|-l –list #显示内核虚拟服务器表
  19. -n  --numeric, :#以数字形式输出地址和端口号
复制代码
4、LVS-DR模式负载平衡集群实战

1. 情况预备

(1)预备假造机

预备 3 台纯净的假造机,两台 web 服务器
(2)LVS-server 安装lvs管理软件

  1. [root@lvs-server ~]# yum -y install ipvsadm
  2. 程序包:ipvsadm(LVS管理工具)
  3. 主程序:/usr/sbin/ipvsadm
  4. 规则保存工具:/usr/sbin/ipvsadm-save  > /path/to/file
  5. 配置文件:/etc/sysconfig/ipvsadm-config
复制代码
(3)LVS/DR 模式

  1. DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。
复制代码
实验说明:1.网络使用NAT模式2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域
所有节点网关均指定真实网关

2. LVS/DR模式实施

预备工作(集群中所有主机)关闭防火墙和selinux
  1. [root@lvs-server ~]# cat /etc/hosts
  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.246.166 lvs-server
  5. 192.168.246.161 real-server1
  6. 192.168.246.162 real-server2
复制代码
Director分发器配置

配置VIP

  1. [root@lvs-server ~]# ip addr add dev ens33 192.168.246.160/32 #设置VIP
  2. [root@lvs-server ~]# yum install -y ipvsadm   #RHEL确保LoadBalancer仓库可用
  3. [root@lvs-server ~]# service ipvsadm start  #启动(RHCL6)
  4. 注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
  5. 需要手动生成文件
  6. [root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
  7. 为什么RS上lo配置的VIP掩码为32位
  8. 这是由于lo设备的特殊性导致, 如果lo绑定VIP/24,则该设备会响应该网段所有IP(192.168.246.0-254)的请求,而不是只响应192.168.246.160这一个地址。,就算是不设置为32也是可以的,只不过会影响访问
复制代码
界说LVS分发计谋

  1. -A:添加VIP
  2. -t:用的是tcp协议
  3. -a:添加的是lo的vip地址
  4. -r:转发到real-serve rip
  5. -s:算法
  6. -L|-l –list #显示内核虚拟服务器表
  7. --numeric, -n:#以数字形式输出地址和端口号
  8. -g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
  9. -S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
  10. rr:轮询算法
  11. 如果添加ip错了,删除命令如下:
  12. # ip addr del 192.168.246.193 dev ens33
  13. [root@lvs-server ~]# ipvsadm -C  #清除内核虚拟服务器表中的所有记录。
  14. [root@lvs-server ~]# ipvsadm -A -t 192.168.246.160:80 -s rr
  15. [root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.161 -g
  16. [root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.162 -g
  17. [root@lvs-server ~]# service ipvsadm save #保存方式一,版本7已不支持
  18. [root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm  #保存方式二,保存到一个文件中
  19. [root@lvs-server ~]# ipvsadm -ln
  20. IP Virtual Server version 1.2.1 (size=4096)
  21. Prot LocalAddress:Port Scheduler Flags
  22.  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  23. TCP  192.168.246.160:80 rr
  24.  -> 192.168.246.161:80           Route   1      0          0        
  25.  -> 192.168.246.162:80           Route   1      0          0        
  26. [root@lvs-server ~]# ipvsadm -L -n
复制代码
所有RS配置

配置好网站服务器,测试所有RS #为了测试效果,提供差别的页面(两台real-server都操作,以下以real-server1为例)
  1. ~]# yum install -y nginx
  2. ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
  3. 两台机器都安装,按顺序添加不同的主机名以示区分
  4. ~]# ip addr add dev lo 192.168.246.160/32   #在lo接口上绑定VIP
  5. ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  #忽略arp广播
  6. ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
  7. ~]# systemctl start nginx
  8. ~]# systemctl enable  nginx
  9. =============================================================================
  10. 因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送
  11. arp广播需找vip时需要让realServer不接受响应.  
  12. 解决:
  13. echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
  14. arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,
  15. 就不做出响应(这个ip在lo上,lo不是接收设备的进口)
  16. echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce   
  17. 使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
复制代码
测试

  1. # yum install -y elinks
  2. # elinks -dump http://192.168.246.160  #--dump:非交互式模式
  3. # elinks -dump http://192.168.246.160  #交互式
复制代码
5、Linux内核模块

  1. 查看linux已加载的内核模块
  2. [root@sql-review ~]# lsmod
  3. 加载与卸载内核模块
  4. [root@sql-review ~]# modprobe ip_vs      
  5.     #动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动项目里面
  6. [root@sql-review ~]# lsmod | grep ip_vs     #过滤模块是否加载成功!
  7. [root@sql-review ~]# modprobe -r ip_vs      #动态卸载ip_vs模块
  8. 查看内核模块信息
  9. [root@sql-review ~]# modinfo ip_vs
  10. 设置开机启动项
  11. [root@sql-review ~]# echo "modprobe ip_vs" >> /etc/rc.local
  12. [root@sql-review ~]# chmod +x /etc/rc.local     切记添加执行权限
  13. 添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。
复制代码
6、LVS-NAT模式实战

LVS-NAT网络拓扑

建议:先在Real Server安装如nginx(两台机器real-server)

  1. [root@real-server1 ~]# yum install -y nginx
  2. [root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
  3. 两台机器都安装,按顺序添加不同的主机名以示区分
复制代码
LVS/NAT模式实施

1、预备工作

(集群中所有主机)[可选]每台机器都需要做
  1. [root@lvs-server ~]# cat /etc/hosts
  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.246.166 lvs-server
  5. 192.168.246.161 real-server1
  6. 192.168.246.162 real-server2
复制代码
2、RS配置

real-server所有服务器---默认网关均指向Directory的DIP
  1. ~]# route add default gw 192.168.246.166  dev ens33
复制代码
最好是将real-server的ip设置成静态ip。网关设置为Directory的Dip。
3、Director分发器配置

先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。
  1. [root@lvs-server ~]# ip addr add dev ens37 192.168.50.128/24   #设置VIP
  2. [root@lvs-server ~]# vim /etc/sysctl.conf #开启路由转发
  3. net.ipv4.ip_forward = 1
  4. [root@lvs-server ~]#sysctl -p #让路由转发生效
  5. #NAT模式是把请求报文的目标VIP修改为RIP,然后转发给real server。所以整个director的
  6. 功能有点像路由器。centos默认是不开启转发功能,所以需要激活ip转发功能。
复制代码
界说LVS的分发计谋
  1. [root@lvs-server ~]# yum install -y ipvsadm  #RHEL确保LoadBalancer仓库可用
  2. [root@lvs-server ~]# service ipvsadm start  #启动
  3. [root@lvs-server ~]# ipvsadm -A -t 192.168.50.128:80 -s rr
  4. [root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.161 -m  
  5. [root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.162 -m  
  6. [root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm  #保存方式一
  7. [root@lvs-server ~]# service ipvsadm save #保存方式二,使用上面的保存方式
  8. [root@lvs-server ~]# ipvsadm -Ln
  9. IP Virtual Server version 1.2.1 (size=4096)
  10. Prot LocalAddress:Port Scheduler Flags
  11.  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  12. TCP  192.168.50.128:80 rr
  13.  -> 192.168.246.161:80           Masq    1      1          3        
  14.  -> 192.168.246.162:80           Masq    1      1          3        
复制代码
4、测试


7、LVS的调度算法

LVS的调度算法分为静态与动态两类。
1、静态算法(4种)

只根据算法进行调度 而不思量后端服务器的现实连接情况和负载情况
①RR:轮询调度(Round Robin)(轮叫)
  1. 将客户端请求平均分发到每台Real Server
复制代码
②WRR:加权轮叫(Weight RR)
  1. 调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
复制代码
③DH:目标地址散列调度(Destination Hash )
  1. 将同样的请求发送给同一个server,一般用于缓存服务器.即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。
复制代码
④SH:源地址 hash(Source Hash)
  1. 源地址散列”调度算法根据请求的源IP地址,
  2. 简单的说就是有将同一客户端的请求发给同一个real server,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。
复制代码
2、动态算法(6种)

前端的调度器会根据后端真实服务器的现实连接情况来分配哀求
① LC:最少链接(Least Connections)
  1. 调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
复制代码
② WLC:加权最少连接(默认接纳的就是这种)(Weighted Least Connections)
  1. 根据Real Server 权重值,选择连接数最少的服务器。
复制代码
③ SED:最短期望延迟调度(Shortest Expected Delay )
  1. 不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。
复制代码
④ NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)
  1. 无需队列。如果有台realserver的连接数=0就直接分配过去,保证不会有一个主机很空间。
复制代码
⑤ LBLC:基于局部性的最少链接(locality-Based Least Connections)
  基于局部性的最少链接”调度算法是针对目标IP地址的负载平衡,目前主要用于Cache集群系统。该算法根据哀求的目标IP地址找出该目标IP地址近来使用的服务器,若该服务器是可用的且没有超载,将哀求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将哀求发送到该服务器。
⑥ LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载平衡,目前主要用于Cache集群系统。它与LBLC算法的差别之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据哀求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将哀求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器参加到服务器组中,将哀求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
keepalived 高可用

1. Keepalived简介

  1. 1.keepalived
  2.     keepalived是一款基于VRRP协议实现高可用性的工具,确保服务在主节点故障时无缝切换到
  3. 备用节点。VRRP通过竞选机制选举Master和Backup,主节点通过发送心跳包保持服务状态,当主节
  4. 点失效,Backup接管服务。
  5. 2.VRRP
  6. VRRP(Virtual Router Redundancy Protocol):虚拟路由冗余协议,解决静态网关单点故障风险,
  7. 它能够保证当个别节点宕机时,整个网络可以不间断地运行。
  8. 3.工作过程
  9. (1)虚拟路由器中的路由器根据优先级选举出Master,Master通过发送ARP报文,将自己的虚拟MAC
  10. 地址发送给其它设备和主机
  11. (2)Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状态
  12. (3)如果Master路由器出现故障, 虚拟路由器的backup路由器根据优先级重新选举新的Master
  13. (4)虚拟路由器状态切换时,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和IP
  14. 地下信息的ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息,网络中的主机感知不到Master的切换
  15. (5)backup路由器优先级高于master路由器时,由backup路由的工作方式(抢占或非抢占方式)决定
  16. 是否重新选举Master
  17. VRRP优先级的取值范围为0-255(数值越大优先级越高),可配置的范围为1到254,优先级0为系统保留
  18. 给路由器放弃master位置时使用,255则是系统保留给IP地址拥有者使用,当路由器为IP地址拥有者时,
  19. 其优先级始终为255,当虚拟路由器拥有虚拟IP地址时,只要其工作正常,则为Master路由器。
  20. 4.工作模块
  21. keepalived三个主要模块:core、check和vrrp。
  22.     core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
  23.     check负责健康检查,包括常见的各种检查方式。
  24.     vrrp模块实现VRRP协议的。
  25. 5.脑裂:
  26. Keepalived的BACKUP主机在收到不MASTER主机报文后会切换成为master,如果是它们之间的通信线
  27. 路出现问题,无法接收到彼此的组播通知,但两个节点实际都处于正常工作状态,这时两个节点均为master
  28. 强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
  29. 原因
  30. 网络故障:网络中断、路由器故障等导致集群的一部分节点无法与其他节点通信。
  31. 网络延迟:极端的网络延迟也可能导致节点之间的通信超时,从而被误认为是节点宕机或网络分区。
  32. 解决方式
  33. a. 添加更多的检测手段,通过其他网络路径(如物理网卡、额外的网络接口)来互相ping对方,或通过
  34. 其他协议(如TCP连接)来进行检测,以减少脑裂的发生概率。(指标不治本,只是提高了检测到的概率);
  35. b. 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信
  36. keepalived两种模式:抢占式(默认)和非抢占式
  37. 抢占模式下,master节点恢复后会重新接管服务,而非抢占模式则保持故障转移后的状态,master节
  38. 点恢复后变为backup。
  39. keepalived默认工作在抢占模式preemp。在抢占模式中,主节点的state设为MASTER,备节点的
  40. state设为BACKUP,主节点的优先级要比备节点的优先级要高。
  41. 非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP,一个节点的优先级要比另一个节
  42. 点的优先级要高,同时高优先级的节点设置nopreempt参数,该参数表示不抢占vip。
复制代码
 keepalived配置详解

  1. # cat /etc/keepalived/keepalive.conf
  2. global_defs {                        #全局定义块
  3.     router_id MySQL-HA-1             #用户标识本节点的名称,主备节点要不一致
  4. }
  5. vrrp_script check_mysql {            #应用状态检查
  6.     script "/etc/keepalived/check_mysql.sh"   #mysql数据库状态检查脚本
  7. interval 30                          #检查间隔时间
  8. }
  9. vrrp_instance VI_1 {          #定义一个vrrp_install实例,名称为VI_1
  10.     state BACKUP              #表示该实例的角色状态,有MASTER和BACKUP两种主备状态。
  11.     interface ens192          #对外提供服务的网络接口,如eth0,ens33,ens192
  12.     virtual_router_id 101     #虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。
  13.     priority 120              #priority表示实例优先级。数字越大,优先级越高。
  14. advert_int 1                  #advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
  15. nopreempt   #nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
  16.     authentication {    #权限认证配置,下方2行参数。
  17.         auth_type PASS
  18.         auth_pass 1111
  19.     }
  20.     virtual_ipaddress {  #虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。
  21.         10.0.0.101 dev ens33
  22.     }
  23.    track_script {     #可以在keepalived.conf文件中定义的脚本,用以实现某个检测功能;
  24.        check_mysql    #此处调用check_mysql中的脚本。
  25.    }
  26. }
  27. MySQL检查脚本:查运行在 3306 端口上的 MySQL 服务器进程是否正在运行
  28. cat /etc/keepalived/check_mysql.sh
  29. #!/bin/bash
  30. mysql_proc_3306=`ps aux | grep -v grep | grep "bin/mysqld" | grep -c "port=3306"`
  31. if [[ $mysql_proc_3306 -eq 1 ]]
  32. then
  33.     exit 0
  34. else
  35.     exit 1
复制代码
2. Nginx+keepalived实现七层的负载平衡(同类服务)

  1. Nginx通过Upstream模块实现七层负载均衡,通过stream模块实现四层负载均衡
复制代码
(1)upstream 支持的负载平衡算法

  
  1. 轮询(默认):可以通过weight指定轮询的权重,权重越大,被调度的次数越多
  2. ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight
  3. fair:可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块
  4. url_hash:按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的url_hash模块
复制代码
(2)nginx负载平衡配置状态参数

  1. down,表示当前的server暂时不参与负载均衡。
  2. backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  3. max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
  4. fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails 可以和 fail_timeout一起使用。
复制代码
  1. 配置安装nginx 所有的机器,关闭防火墙和selinux
  2. [root@nginx-proxy ~]# cd /etc/yum.repos.d/
  3. [root@nginx-proxy yum.repos.d]# vim nginx.repo
  4. [nginx-stable]
  5. name=nginx stable repo
  6. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  7. gpgcheck=0
  8. enabled=1
  9. [root@nginx-proxy yum.repos.d]# yum install yum-utils -y
  10. [root@nginx-proxy yum.repos.d]# yum install nginx -y
  11. 调度到不同组后端服务器
  12. 网站分区进行调度
复制代码
  1. =================================================================================
  2. 拓扑结构
复制代码
  1. ​                            [vip: 20.20.20.20]
  2.                         [LB1 Nginx]     [LB2 Nginx]
  3.                         192.168.1.2     192.168.1.3
  4.         [index]     [milis]      [videos]      [images]       [news]
  5.          1.11        1.21          1.31           1.41         1.51
  6.          1.12        1.22          1.32           1.42         1.52
  7.          1.13        1.23          1.33           1.43         1.53
  8.          ...         ...            ...           ...           ...
  9.          /web     /web/milis    /web/videos     /web/images   /web/news
  10.       index.html  index.html     index.html      index.html   index.html
复制代码
  1. 一、实施过程
复制代码
  1. 1、选择两台nginx服务器作为代理服务器。
  2. 2、给两台代理服务器安装keepalived制作高可用生成VIP
  3. 3、配置nginx的负载均衡
  4. 以上两台nginx服务器配置文件一致
  5. 根据站点分区进行调度
  6. 配置upstream文件
  7. [root@nginx-proxy ~]# cd /etc/nginx/conf.d/
  8. [root@nginx-proxy conf.d]# cp default.conf proxy.conf
  9. [root@nginx-proxy conf.d]# mv default.conf default.conf.bak
  10. [root@nginx-proxy conf.d]# vim upstream.conf
  11.    upstream index {
  12.        server 192.168.246.162:80 weight=1 max_fails=2 fail_timeout=2;
  13.        server 192.168.246.163:80 weight=2 max_fails=2 fail_timeout=2;
  14.       }      
  15. [root@nginx-proxy conf.d]# vim proxy.conf
  16. server {
  17.        listen 80;
  18.        server_name     localhost;
  19.        access_log  /var/log/nginx/host.access.log  main;
  20.        
  21.        location / {
  22.         proxy_pass http://index;
  23.         proxy_redirect default;
  24.         proxy_set_header Host $http_host;
  25.         proxy_set_header X-Real-IP $remote_addr;
  26.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  27.        }
  28. }
  29. 将nginx的配置文件拷贝到另一台代理服务器中:
  30. [root@nginx-proxy conf.d]# scp proxy.conf 192.168.246.161:/etc/nginx/conf.d/
  31. [root@nginx-proxy conf.d]# scp upstream.conf 192.168.246.161:/etc/nginx/conf.d/
复制代码
  1. 二、Keepalived实现调度器HA
复制代码
  1. 注:主/备调度器均能够实现正常调度
  2. 1. 主/备调度器安装软件
  3. ~]# yum install -y keepalived
  4. ~]# yum install -y keepalived
  5. ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  6. ~]# vim /etc/keepalived/keepalived.conf
  7. ! Configuration File for keepalived
  8. global_defs {
  9.   router_id directory1   #辅助改为directory2
  10. }
  11. vrrp_instance VI_1 {
  12.    state MASTER                  #定义主还是备
  13.    interface ens33               #VIP绑定接口
  14.    virtual_router_id 80          #整个集群的调度器一致
  15.    priority 100                  #back改为50
  16.    advert_int 1                  #检查间隔,默认为1s
  17.     nopreempt                     #非抢占模式,默认为抢占式preempt
  18.    authentication {
  19.        auth_type PASS            #主从服务器验证方式
  20.        auth_pass 1111
  21.    }
  22.    virtual_ipaddress {
  23.        192.168.246.16/24 #可以写多个公网ip
  24.    }
  25. }
  26. [root@nginx-porxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  27. [root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
  28. ! Configuration File for keepalived
  29. global_defs {
  30.   router_id directory2
  31. }
  32. vrrp_instance VI_1 {
  33.    state BACKUP                    #设置为backup
  34.    interface ens33
  35.    virtual_router_id 80
  36.    priority 50                   #辅助改为50
  37.    advert_int 1
  38.    authentication {
  39.        auth_type PASS
  40.        auth_pass 1111
  41.    }
  42.    virtual_ipaddress {
  43.        192.168.246.16/24
  44.    }
  45. }
  46. 3. 启动KeepAlived(主备均启动)
  47. [root@nginx-proxy-master ~]# chkconfig keepalived on  #设置自动启动
  48. [root@nginx-proxy-master ~]# service keepalived start
  49. [root@nginx-proxy-master ~]# ip addr
  50. : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
  51.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  52.    inet 127.0.0.1/8 scope host lo
  53.       valid_lft forever preferred_lft forever
  54.    inet6 ::1/128 scope host
  55.       valid_lft forever preferred_lft forever
  56. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  57.    link/ether 00:0c:29:48:07:7d brd ff:ff:ff:ff:ff:ff
  58.    inet 192.168.246.169/24 brd 192.168.246.255 scope global dynamic ens33
  59.       valid_lft 1726sec preferred_lft 1726sec
  60.    inet 192.168.246.16/24 scope global ens33
  61.       valid_lft forever preferred_lft forever
  62.    inet6 fe80::23e9:de18:1e67:f152/64 scope link
  63.       valid_lft forever preferred_lft forever
  64. 到此:
  65. 可以解决心跳故障keepalived
  66. 不能解决Nginx服务故障
  67. 4. 扩展对调度器Nginx健康检查,两台都设置(非抢占式,抢占只需master设置)
  68. 思路:
  69. 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
  70. (1) script
  71. [root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh
  72. #!/bin/bash                                                     
  73. /usr/bin/curl -I http://localhost &>/dev/null   
  74. if [ $? -ne 0 ];then                                            
  75. #   /etc/init.d/keepalived stop
  76.     systemctl stop keepalived
  77. fi                                                                      
  78. [root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
  79. (2). keepalived使用script
  80. ! Configuration File for keepalived
  81. global_defs {
  82.   router_id director1
  83. }
  84. vrrp_script check_nginx {
  85.   script "/etc/keepalived/check_nginx_status.sh"
  86.   interval 5    #调用脚本之间的间隔,默认为1秒
  87.   # weight -20  #失败一次,将自己的优先级 -2
  88. }
  89. vrrp_instance VI_1 {
  90.    state MASTER
  91.    interface ens33
  92.    virtual_router_id 80
  93.    priority 100
  94.    advert_int 1
  95.    authentication {
  96.        auth_type PASS
  97.        auth_pass 1111
  98.    }
  99.    virtual_ipaddress {
  100.        192.168.246.16/24
  101.    }
  102.    track_script {
  103.        check_nginx
  104.    }
  105. }
  106. 注:必须先启动nginx,再启动keepalived
  107. 测试访问:
复制代码
3. KeepAlived实现LVS-DR四层负载


  1. KeepAlived在该项目中的功能:
  2. 1. 管理IPVS的路由表(包括对RealServer做健康检查)
  3. 2. 实现调度器的HA(High Availability高可用性)
  4. http://www.keepalived.org
  5. Keepalived所执行的外部脚本命令建议使用绝对路径
复制代码
  1. 实施步骤:
复制代码
  1. 1. 主/备调度器安装软件
  2. [root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived
  3. [root@lvs-keepalived-slave ~]# yum -y install ipvsadm keepalived
  4. 2. Keepalived
  5. lvs-master
  6. [root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
  7. ! Configuration File for keepalived
  8. global_defs {
  9.   router_id lvs-keepalived-master    #辅助改为lvs-backup
  10. }
  11. vrrp_instance VI_1 {
  12.    state MASTER
  13.    interface ens33                #VIP绑定接口
  14.    virtual_router_id 80         #VRID 同一组集群,主备一致          
  15.    priority 100            #本节点优先级,辅助改为50
  16.    advert_int 1            #检查间隔,默认为1s
  17.    authentication {
  18.        auth_type PASS
  19.        auth_pass 1111
  20.    }
  21.    virtual_ipaddress {
  22.        192.168.246.110/32
  23.    }
  24. }
  25. virtual_server 192.168.246.110 80 {    #LVS配置
  26.     delay_loop 6   #健康检查rs时间间隔
  27.     lb_algo rr     #LVS调度算法
  28.     lb_kind DR     #LVS集群模式(路由模式)
  29.     protocol TCP      #健康检查使用的协议
  30.     real_server 192.168.246.162 80 {
  31.         weight 1
  32.         inhibit_on_failure   #当该节点失败时,把权重设置为0,而不是从IPVS中删除
  33.         TCP_CHECK {          #健康检查
  34.             connect_port 80   #检查的端口
  35.             connect_timeout 3  #连接超时的时间
  36.             }
  37.         }
  38.     real_server 192.168.246.163 80 {
  39.         weight 1
  40.         inhibit_on_failure
  41.         TCP_CHECK {
  42.             connect_timeout 3
  43.             connect_port 80
  44.             }
  45.         }
  46. }
  47. [root@lvs-keepalived-slave ~]# vim /etc/keepalived/keepalived.conf
  48. ! Configuration File for keepalived
  49. global_defs {
  50.   router_id lvs-keepalived-slave
  51. }
  52. vrrp_instance VI_1 {
  53.    state BACKUP
  54.    interface ens33
  55.    virtual_router_id 80
  56.    priority 50
  57.    advert_int 1
  58.    authentication {
  59.        auth_type PASS
  60.        auth_pass 1111
  61.    }
  62.    virtual_ipaddress {
  63.        192.168.246.110/24
  64.    }
  65. }
  66. virtual_server 192.168.246.110 80 {
  67.     delay_loop 6
  68.     lb_algo rr
  69.     lb_kind DR
  70.     protocol TCP
  71.     real_server 192.168.246.162 80 {
  72.         weight 1
  73.         inhibit_on_failure
  74.         TCP_CHECK {
  75.             connect_port 80
  76.             connect_timeout 3
  77.             }
  78.         }
  79.     real_server 192.168.246.163 80 {
  80.         weight 1
  81.         inhibit_on_failure
  82.         TCP_CHECK {
  83.             connect_timeout 3
  84.             connect_port 80
  85.             }
  86.         }
  87. }
  88. 3. 启动KeepAlived(主备均启动)
  89. [root@lvs-keepalived-master ~]# systemctl start keepalived
  90. [root@lvs-keepalived-master ~]# systemctl enable keepalived
  91. [root@lvs-keepalived-master ~]# ipvsadm -Ln
  92. IP Virtual Server version 1.2.1 (size=4096)
  93. Prot LocalAddress:Port Scheduler Flags
  94.  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  95. TCP  192.168.246.110:80 rr persistent 20
  96.  -> 192.168.246.162:80           Route   1      0          0        
  97.  -> 192.168.246.163:80           Route   0      0          0
  98. 4. 所有RS配置(nginx1,nginx2)
  99. 配置好网站服务器,测试所有RS
  100. [root@test-nginx1 ~]# yum install -y nginx
  101. [root@test-nginx2 ~]# yum install -y nginx
  102. [root@test-nginx1 ~]# ip addr add dev lo 192.168.246.110/32 #添加环回接口上的 IP 地址
  103. [root@test-nginx1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
  104.               # arp_ignore 参数控制内核是否忽略对本地 IP 地址的 ARP 请求 ,1为忽视
  105. [root@test-nginx1 ~]# sysctl -p   #内核参数配置加载生效
  106. [root@test-nginx1 ~]# echo "web1..." >> /usr/share/nginx/html/index.html
  107. [root@test-nginx1 ~]# systemctl start nginx
复制代码
4、数据库高可用

  1. 1.两台机器安装mysql
复制代码
  1. [root@mysql-keep-master ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  2. [root@mysql-keep-master ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
  3. [root@mysql-keep-master ~]# yum -y install yum-utils #安装yum工具包
  4. [root@mysql-keep-master ~]# vim /etc/yum.repos.d/mysql-community.repo
复制代码

  1. 安装mysql
  2. [root@mysql-keep-master ~]# yum install -y mysql-community-server
  3. [root@mysql-keep-master ~]# systemctl start mysqld
  4. [root@mysql-keep-master ~]# systemctl enable mysqld
  5. 修改密码
  6. [root@mysql-keep-master ~]# grep pass /var/log/mysqld.log
  7. 2020-02-18T13:54:25.706635Z 1 [Note] A temporary password is generated for root@localhost: %baWi=4!NsT)
  8. [root@mysql-keep-master ~]# mysqladmin -uroot -p'%baWi=4!NsT)' password 'QianFeng@123!'
  9. 制作互为主从:
  10. [root@mysql-keep-master ~]# vim /etc/my.cnf   #编辑配置文件开启gtid
  11. log-bin=m1.log  
  12. server-id=1
  13. gtid_mode = ON    #开启gtid
  14. enforce_gtid_consistency=1  #强制gtid移植性
  15. [root@mysql-keep-master ~]# systemctl restart mysqld
  16. [root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123!'  #登录数据库
  17. mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';  #创建远程登录用户
  18. mysql> flush privileges;
  19. mysql> grant replication  slave,reload,super  on *.*  to  'slave'@'%'  identified by  'QianFeng@123';  ---创建主从授权用户
  20. mysql> flush privileges;  #刷新授权
  21. mysql> \e   #指定主服务器信息
  22. CHANGE MASTER TO
  23. MASTER_HOST='192.168.58.136',      #指定主服务器的ip或者主机名
  24. MASTER_USER='slave',           #授权用户
  25. MASTER_PASSWORD='QianFeng@123',  #授权用户密码
  26. master_auto_position=1
  27. -> ;
  28. 启动slave
  29. mysql> start slave;
  30. [root@mysql-keep-backup ~]# vim /etc/my.cnf
  31. log-bin=m2.log
  32. server-id=2
  33. gtid_mode = ON
  34. enforce_gtid_consistency=1
  35. [root@mysql-keep-backup ~]# systemctl restart mysqld
  36. [root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
  37. mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';
  38. mysql> flush privileges;
  39. mysql> grant replication  slave,reload,super  on *.*  to  'slave'@'%'  identified by  'QianFeng@123';
  40. mysql> flush privileges;
  41. 指定主服务器信息
  42. mysql> \e
  43. CHANGE MASTER TO
  44. MASTER_HOST='192.168.58.135',
  45. MASTER_USER='slave',
  46. MASTER_PASSWORD='QianFeng@123',
  47. master_auto_position=1
  48. -> ;
  49. 启动slave
  50. mysql> start slave;
复制代码
  1. 两台机器验证是否为yes
复制代码
  1. mysql> show slave status\G
复制代码
两台机器安装keepalived
  1. [root@mysql-keep-master ~]# yum -y install keepalived
  2. [root@mysql-keep-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  3. [root@mysql-keep-master ~]# vim /etc/keepalived/keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6.   router_id master1
  7. }
  8. vrrp_instance VI_1 {
  9.    state MASTER
  10.    interface ens33
  11.    virtual_router_id 80
  12.    priority 100
  13.    advert_int 1
  14.    authentication {
  15.        auth_type PASS
  16.        auth_pass 1111
  17.    }
  18.    virtual_ipaddress {
  19.        192.168.58.16/24
  20.    }
  21. }
  22. 将配置文件拷贝到backup机器
  23. [root@mysql-keep-backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  24. [root@mysql-keep-master ~]# scp /etc/keepalived/keepalived.conf 192.168.58.136:/etc/keepalived/
  25. [root@mysql-keep-backup ~]# vim /etc/keepalived/keepalived.conf  #修改如下
  26. ! Configuration File for keepalived
  27. global_defs {
  28.   router_id backup1
  29. }
  30. vrrp_instance VI_1 {
  31.    state BACKUP
  32.    interface ens33
  33.    virtual_router_id 80
  34.    priority 50
  35.    advert_int 1
  36.    authentication {
  37.        auth_type PASS
  38.        auth_pass 1111
  39.    }
  40.    virtual_ipaddress {
  41.        192.168.58.16/24
  42.    }
  43. }
  44. 两台机器启动keepalived
  45. [root@mysql-keep-master ~]# systemctl start keepalived
  46. [root@mysql-keep-backup ~]# systemctl start keepalived
  47. [root@mysql-keep-master ~]# ip a   #vip在master上面
  48. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
  49.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  50.    inet 127.0.0.1/8 scope host lo
  51.       valid_lft forever preferred_lft forever
  52.    inet6 ::1/128 scope host
  53.       valid_lft forever preferred_lft forever
  54. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  55.    link/ether 00:0c:29:92:0a:64 brd ff:ff:ff:ff:ff:ff
  56.    inet 192.168.58.135/24 brd 192.168.58.255 scope global dynamic ens33
  57.       valid_lft 1729sec preferred_lft 1729sec
  58.    inet 192.168.58.16/24 scope global secondary ens33
  59.       valid_lft forever preferred_lft forever
  60.    inet6 fe80::86f4:1d74:ad05:c61c/64 scope link
  61.       valid_lft forever preferred_lft forever
  62. 测试:
  63. [root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16  #登录vip
  64. mysql> create database test1;
  65. Query OK, 1 row affected (0.07 sec)
  66. mysql> show databases;
  67. +--------------------+
  68. | Database           |
  69. +--------------------+
  70. | information_schema |
  71. | mysql              |
  72. | performance_schema |
  73. | sys                |
  74. | test1              |
  75. +--------------------+
  76. 5 rows in set (0.08 sec)
  77. 验证
  78. [root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
  79. mysql> show databases;
  80. +--------------------+
  81. | Database           |
  82. +--------------------+
  83. | information_schema |
  84. | mysql              |
  85. | performance_schema |
  86. | sys                |
  87. | test1              |
  88. +--------------------+
  89. 5 rows in set (0.12 sec)
  90. [root@mysql-keep-master ~]# systemctl stop keepalived #关闭master
  91. [root@mysql-keep-backup ~]# ip a  #vip切换backup机器
  92. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
  93.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  94.    inet 127.0.0.1/8 scope host lo
  95.       valid_lft forever preferred_lft forever
  96.    inet6 ::1/128 scope host
  97.       valid_lft forever preferred_lft forever
  98. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  99.    link/ether 00:0c:29:a2:0f:5c brd ff:ff:ff:ff:ff:ff
  100.    inet 192.168.58.136/24 brd 192.168.58.255 scope global dynamic ens33
  101.       valid_lft 1547sec preferred_lft 1547sec
  102.    inet 192.168.58.16/24 scope global secondary ens33
  103.       valid_lft forever preferred_lft forever
  104.    inet6 fe80::af6e:2eff:e2d1:99cb/64 scope link
  105.       valid_lft forever preferred_lft forever
  106. 测试登录
  107. [root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16
复制代码
四、Haproxy 基础

HAProxy提供高可用性、负载平衡以及基于TCP和HTTP的应用署理,支持假造主机,它是免费、快速并且可靠的一种负载平衡解决方案。适合处理高负载站点的七层数据哀求。类似的署理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。

  1. haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
  2. apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
  3. 7层负载均衡:用的7层http协议,
  4. 4层负载均衡:用的是tcp协议加端口号做的负载均衡
  5. ha-proxy概述
  6. ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与
  7. nginx比起来在负载均衡这件事情上做更好,更专业。
  8. ha-proxy负载均衡软件的优点:
  9. 1.​双层协议支持:
  10.     支持第 4 层 (TCP) 和第 7 层 (HTTP) 负载均衡。
  11. 2.支持8种左右的负载均衡算法:
  12.     支持多种算法,如轮询、最少连接数、源地址散列等,并支持会话保持。
  13. 3.高性能
  14.     单进程设计保证了出色的性能表现。
  15. 4.直观的监控界面
  16.     提供详细的实时统计页面。
  17. 5.灵活的访问控制
  18.     强大的 ACL 支持,便于定制规则。
  19. 6.SSL/TLS 加密支持
  20.     支持客户端和服务端的 SSL/TLS 加密。
  21. 7.多用途应用
  22.     可用于 Web、数据库、邮件和其他服务的负载均衡。
  23. 8.虚拟主机支持
  24.     根据 Host 头字段进行路由,支持多个网站共存。
  25. haproxy算法:
  26. 1.Round Robin (轮询)
  27.     动态分配请求到后端服务器,依据权重进行循环调度。
  28.     后端服务器的权重可以动态调整,每台服务器最多处理 4128 个连接。
  29. 2.Static Round Robin (静态轮询)
  30.     静态方式分配请求。基于权重进行循环调度,运行时调整权重无效,
  31.     对后端服务器的连接数无限制。
  32. 3.Least Connections (最少连接)
  33.     新请求分发给连接数最少的服务器,确保最轻负载的服务器优先接收新连接。
复制代码
1、Haproxy 实现七层负载高可用

  1. Keepalived + Haproxy
  2. =================================================================================
  3. /etc/haproxy/haproxy.cfg
  4. global                              # 关于进程的全局参数
  5.    log      127.0.0.1 local2 info  #日志服务器
  6.    pidfile   /var/run/haproxy.pid  #pid文件
  7.    maxconn    4000                 #最大连接数
  8.    user  haproxy                   #用户
  9.    group  haproxy                  #组
  10.    daemon          #守护进程方式后台运行
  11.    nbproc 1        #工作进程数量  cpu内核是几就写几
  12. defaults 段用于为其它配置段提供默认参数
  13. listen是frontend和backend的结合体
  14. frontend        虚拟服务VIrtual Server
  15. backend        真实服务器Real Server
  16. Keepalived + Haproxy
  17. =================================================================================
  18. 拓扑结构
  19.                             [vip: 192.168.246.17]
  20.                         [LB1 Haproxy]       [LB2 Haproxy]
  21.                         192.168.246.169     192.168.246.161
  22.                        [httpd]                    [httpd]
  23.                     192.168.246.162              192.168.246.163
复制代码
  1. 一、Haproxy实施步骤               
  2. 1. 准备工作(集群中所有主机)
  3. [root@ha-proxy-master ~]# cat /etc/hosts
  4. 127.0.0.1       localhost
  5. 192.168.246.169 ha-proxy-master
  6. 192.168.246.161 ha-proxy-slave
  7. 192.168.246.162 test-nginx1
  8. 192.168.246.163 test-nginx2
  9. 2. RS配置
  10. 配置好网站服务器,测试所有RS,所有机器安装nginx
  11. [root@test-nginx1 ~]# yum install -y nginx
  12. [root@test-nginx1 ~]# systemctl start nginx
  13. [root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html
  14. # 所有nginx服务器按顺序输入编号,方便区分。
  15. 3. 调度器配置Haproxy(主/备)都执行
  16. ~]# yum -y install haproxy
  17. ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
  18. ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #移除空白字符、注释和空行
  19. ~]# vim /etc/haproxy/haproxy.cfg
  20. # 全局设置
  21. global
  22.     # 日志配置,发送到本地主机的 local2 设施上,级别为 info
  23.     log         127.0.0.1 local2 info
  24.     # 进程 ID 文件的位置
  25.     pidfile     /var/run/haproxy.pid
  26.     # 最大连接数(优先级低),当有更高优先级的 maxconn 设置时,该设置会被覆盖
  27.     maxconn     4000
  28.     # 运行 HAProxy 的用户
  29.     user        haproxy
  30.     # 运行 HAProxy 的组
  31.     group       haproxy
  32.     # 使 HAProxy 以后台方式运行
  33.     daemon
  34.     # 设置工作进程的数量,通常建议与 CPU 核心数相同
  35.     nbproc      1
  36. # 默认设置
  37. defaults
  38.     # 工作模式 HTTP,TCP在4层
  39.     mode        http
  40.     # 使用全局日志配置
  41.     log         global
  42.     # 健康检查,3 次连接失败就认为服务器不可用
  43.     retries     3
  44.     # 服务不可用后重定向到其他健康的服务器
  45.     option      redispatch
  46.     # 最大连接数(优先级中)
  47.     maxconn     4000
  48.     # HAProxy 与后端服务器连接超时时间,单位毫秒 ms
  49.     contimeout  5000
  50.     # 客户端数据接收超时时间
  51.     clitimeout  50000
  52.     # 后端服务器响应超时时间
  53.     srvtimeout  50000
  54. # 监听配置 - 管理界面
  55. listen stats
  56.     bind        *:81       # 绑定到所有 IP 的 81 号端口
  57.     stats       enable     # 启用统计信息页面
  58.     stats uri   /haproxy   # 访问统计信息页面的 URI
  59.     stats auth  qianfeng:123   # 设置访问统计信息页面所需的用户名和密码
  60. # 前端监听配置 - web
  61. frontend web
  62.     mode        http           # 工作模式 HTTP
  63.     bind        *:80           # 监听所有 IP 的 80 号端口
  64.     option      httplog        # 开启 HTTP 日志记录
  65.     # 创建一个 ACL,匹配 URL 结尾为 .html 的请求
  66.     acl         html url_reg -i \.html$
  67.     # 如果请求匹配 .html,则使用后端服务器组 httpservers
  68.     use_backend httpservers if html
  69.     # 默认使用后端服务器组 httpservers
  70.     default_backend httpservers
  71. # 后端服务器组配置 - httpservers
  72. backend httpservers
  73.     balance     roundrobin       # 使用轮询算法分配请求
  74.     # 定义第一个服务器,地址为 192.168.246.162:80,最大连接数为 2000,权重为 1,并启用健康检查
  75.     server      http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
  76.     # 定义第二个服务器,地址为 192.168.246.163:80,最大连接数为 2000,权重为 1,并启用健康检查
  77.     server      http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
  78. 将配置文件拷贝到slave服务器
  79. [root@ha-proxy-master ~]# scp  /etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/
  80. 两台机器启动设置开机启动
  81. [root@ha-proxy-master ~]# systemctl start haproxy
  82. [root@ha-proxy-master ~]# systemctl enable haproxy
  83. #check inter 2000          检测心跳频率单位
  84. #rise 2     2 次正确认为服务器可用
  85. #fall 2      2 次失败认为服务器不可用
复制代码
 测试主/备(浏览器访问)
主:

备:

  1. 页面主要参数解释
  2. Queue
  3. Cur: current queued requests //当前的队列请求数量
  4. Max:max queued requests     //最大的队列请求数量
  5. Limit:           //队列限制数量
  6. Errors
  7. Req:request errors             //错误请求
  8. Conn:connection errors          //错误的连接
  9. Server列表:
  10. Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
  11. LastChk:    持续检查后端服务器的时间
  12. Wght: (weight) : 权重
复制代码
  1. 2.测试访问
  2. 通过访问haparoxy的ip地址访问到后端服务器
  3. # curl http://192.168.246.169
  4. 如果出现bind失败的报错,执行下列命令
  5. setsebool -P haproxy_connect_any=1
复制代码
2、Keepalived实现调度器HA

注:主/备调度器均能够实现正常调度


  1. 1. 主/备调度器安装软件
  2. [root@ha-proxy-master ~]# yum install -y keepalived
  3. [root@ha-proxy-slave ~]# yum install -y keepalived
  4. [root@ha-proxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  5. [root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
  6. ! Configuration File for keepalived
  7. global_defs {
  8.   router_id director1
  9. }
  10. vrrp_instance VI_1 {
  11.    state MASTER
  12.    interface ens33
  13.    virtual_router_id 80
  14.    priority 100
  15.    advert_int 1
  16.    authentication {
  17.        auth_type PASS
  18.        auth_pass 1111
  19.    }
  20.    virtual_ipaddress {
  21.        192.168.246.17/24
  22.    }
  23. }
  24. [root@ha-proxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  25. [root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
  26. ! Configuration File for keepalived
  27. global_defs {
  28.   router_id directory2
  29. }
  30. vrrp_instance VI_1 {
  31.    state BACKUP
  32.    interface ens33
  33.    virtual_router_id 80
  34.    priority 50
  35.    advert_int 1
  36.    authentication {
  37.        auth_type PASS
  38.        auth_pass 1111
  39.    }
  40.    virtual_ipaddress {
  41.        192.168.246.17/24
  42.    }
  43. }
  44. 3. 启动KeepAlived(主备均启动)
  45. [root@ha-proxy-master ~]# chkconfig keepalived on
  46. [root@ha-proxy-master ~]# service keepalived start
  47. [root@ha-proxy-master ~]# ip a
  48. 4. 扩展对调度器Haproxy健康检查(可选)
  49. 思路:一台机器做
  50. 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
  51. a. script
  52. [root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh
  53. #!/bin/bash                                                                                /usr/bin/curl -I http://localhost &>/dev/null  
  54. if [ $? -ne 0 ];then                                                                            
  55. #       /etc/init.d/keepalived stop
  56.        systemctl stop keepalived
  57. fi                                                                      
  58. [root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh
  59. b. keepalived使用script
  60. [root@ha-proxy-master keepalived]# vim keepalived.conf
  61. ! Configuration File for keepalived
  62. global_defs {
  63.   router_id director1
  64. }
  65. vrrp_script check_haproxy {
  66.   script "/etc/keepalived/check_haproxy_status.sh"
  67.   interval 5
  68. }
  69. vrrp_instance VI_1 {
  70.    state MASTER
  71.    interface ens33
  72.    virtual_router_id 80
  73.    priority 100
  74.    advert_int 1
  75.    authentication {
  76.        auth_type PASS
  77.        auth_pass 1111
  78.    }
  79.    virtual_ipaddress {
  80.        192.168.246.17/24
  81.    }
  82.    track_script {
  83.        check_haproxy
  84.    }
  85. }
  86. [root@ha-proxy-slave keepalived]# vim keepalived.conf
  87. ! Configuration File for keepalived
  88. global_defs {
  89.   router_id directory2
  90. }
  91. vrrp_script check_haproxy {
  92.   script "/etc/keepalived/check_haproxy_status.sh"
  93.   interval 5
  94. }
  95. vrrp_instance VI_1 {
  96.    state BACKUP
  97.    interface ens33
  98.    virtual_router_id 80
  99.    priority 50
  100.    advert_int 1
  101.    authentication {
  102.        auth_type PASS
  103.        auth_pass 1111
  104.    }
  105.    virtual_ipaddress {
  106.        192.168.246.17/24
  107.    }
  108.    track_script {
  109.        check_haproxy
  110.    }
  111. }
  112. [root@ha-proxy-master keepalived]# systemctl restart keepalived
  113. [root@ha-proxy-slave keepalived]# systemctl restart keepalived
  114. 注:必须先启动haproxy,再启动keepalived
  115. 两台机器都配置haproxy的日志:需要打开注释并添加
  116. [root@ha-proxy-master ~]# vim /etc/rsyslog.conf
  117. # Provides UDP syslog reception  
  118. #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
  119. $ModLoad imudp
  120. $UDPServerRun 514
  121. 找到  #### RULES ####   下面添加
  122. local2.info                       /var/log/haproxy.log
  123. [root@ha-proxy-master ~]# systemctl restart rsyslog
  124. [root@ha-proxy-master ~]# systemctl restart haproxy
  125. [root@ha-proxy-master ~]# tail -f /var/log/haproxy.log
  126. 2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP)
  127. 2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP)
  128. 2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP)
  129. 2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP)
  130. 2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP)
  131. 2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP)
复制代码
3、四层署理mysql

  1. 准备两台机器,关闭防火墙和selinux。
  2. 1.两台机器部署mysql并制作互为主从----略
  3. 2.安装haproxy制作代理
  4. [root@haproxy-server ~]# yum -y install haproxy
  5. [root@haproxy-server ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
  6. [root@haproxy-server ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
  7. [root@haproxy-server ~]# vim /etc/haproxy/haproxy.cfg
  8. global
  9.    log         127.0.0.1 local2
  10.    pidfile     /var/run/haproxy.pid
  11.    maxconn     4000
  12.    user        haproxy
  13.    group       haproxy
  14.    daemon
  15.    nbproc 1
  16. defaults
  17.    mode                    http
  18.    log                     global
  19.    option                  redispatch
  20.    retries                 3
  21.    maxconn                 3000
  22.    contimeout              5000
  23.    clitimeout              50000
  24.    srvtimeout              50000
  25. listen stats
  26.    bind            *:81
  27.    stats                       enable
  28.    stats uri               /haproxy
  29.    stats auth              qianfeng:123
  30. listen mysql
  31.    bind *:3307
  32.    mode tcp
  33.    balance roundrobin
  34.    server mysql1 192.168.198.149:3306 weight 1  check inter 1s rise 2 fall 2
  35.    server mysql2 192.168.198.150:3306 weight 1  check inter 1s rise 2 fall 2
  36. [root@haproxy-server ~]# systemctl start haproxy
  37. [root@haproxy-server ~]# netstat -lntp | grep 3307
  38. tcp        0      0 0.0.0.0:3307            0.0.0.0:*               LISTEN      11866/haproxy
  39. 3.验证:
  40. [root@haproxy-server ~]# mysql -uroot -p'QianFeng@123!' -P 3307
  41. mysql: [Warning] Using a password on the command line interface can be insecure.
  42. Welcome to the MySQL monitor.  Commands end with ; or \g.
  43. Your MySQL connection id is 6
  44. Server version: 5.7.31-log MySQL Community Server (GPL)
  45. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
  46. Oracle is a registered trademark of Oracle Corporation and/or its
  47. affiliates. Other names may be trademarks of their respective
  48. owners.
  49. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  50. mysql> show databases;
  51. +--------------------+
  52. | Database           |
  53. +--------------------+
  54. | information_schema |
  55. | mysql              |
  56. | performance_schema |
  57. | sys                |
  58. +--------------------+
  59. 4 rows in set (0.00 sec)
  60. mysql>
复制代码
  1. 4.制作高可用---作业
复制代码
练习

  1. 1.lvs的优势有哪些?
  2. 2.keepalived基于什么协议实现?工作原理是什么?
  3. 3.lvs有几种工作模式分别是什么?
  4. 4.haproxy的优点有哪些?
  5. 5.列出你知道的负载均衡软件有哪些?
  6. 6.keepalived是一款什么软件?
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表