前言本文搭建LVS+Keepalived+Nignx高可用,搭建以前,先看下如下几种方案架设示意图的演进。前端
起初是一个Nginx服务器,可是当Nginx挂掉后,用户就直接访问不了网站,进而演进第二种方案。linux
这个方案经过Keepalived解决了Nginx主节点挂掉后,从节点的Nginx会启用,实现了双机主备,这样虽然解决了第一种方案的弊端,可是高迸发场景下,一个Nginx承受不住,不管有多少从节点,仍是会挂掉,从而演进第三种方案。nginx
经过LVS+Keepalived+Nginx,搭建了Nginx集群,对于LVS使用DR模式,请求转发响应不经过LVS,直接经过Nginx响应给用户,这样LVS负载就更高了,从而提升性能,下面以方案三搭建LVS+Keepalived+Nginx高可用c++
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最先出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此以前的内核版本则须要从新编译内核。web
使用集群技术和Linux操做系统实现一个高性能、高可用的服务器. 很好的可伸缩性(Scalability) 很好的可靠性(Reliability) 很好的可管理性(Manageability)面试
可伸缩网络服务的几种结构,它们都须要一个前端的负载调度器(或者多个进行主从备份)。咱们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有经过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,咱们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,咱们提出了经过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和经过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们能够极大地提升系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。 算法
Keepalived的做用是检测服务器的状态,若是有一台web服务器宕机,或工做出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其余服务器代替该服务器的工做,当服务器工做正常后Keepalived自动将服务器加入到服务器群中,这些工做所有自动完成,不须要人工干涉,须要人工作的只是修复故障的服务器。 数据库
搭建准备4台虚拟机(CentOS 7),用于测试使用vim
主机 | IP | 做用 |
---|---|---|
主机1 | 192.168.232.130 | Nginx1 |
主机2 | 192.168.232.131 | Nginx2 |
主机3 | 192.168.232.132 | Keepalived Master |
主机4 | 192.168.232.133 | Keepalived Backup |
无 | 192.168.232.150 | 虚拟IP(VIP) |
在192.168.232.130和192.168.232.131主机上安装Nginx; 在192.168.232.132和192.168.232.133主机上安装Keepalived设计模式
必定要先安装依赖环境,若是下面安装的过程当中遇到一些错误信息,按照提示安装如下依赖
yum install gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel yum install -y libnl libnl-devel yum install -y libnfnetlink-devel
在192.168.232.130和192.168.232.131主机上安装Nginx,将下载好的Nginx上传到Linux系统,而后解压
#解压命令,版本替换为你本身下载的版本 tar -zxvf nginx-1.61.1.tar.gz
编译以前,先建立nginx临时目录,若是不建立,在启动nginx的过程当中会报错
mkdir /var/temp/nginx -p
在nginx目录中,输入以下命令配置,目的是为了建立makefile文件
./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --with-http_ssl_module --with-http_stub_status_module
而后之行如下命令,进行编译安装
make && make install
进入nginx安装目录下的sbin
#启动nginx ./nginx #中止nginx ./nginx -s stop #从新加载nginx ./nginx -s reload
打开浏览器,访问虚拟机所处内网ip便可打开nginx默认页面,此时表示已经安装成功。
注意事项:虚拟机安装须要关闭防火墙,不然访问不
在192.168.232.132和192.168.232.133主机上安装Keepalived,将下载好的Keepalived安装包上传到Linux系统,而后解压
#解压命令,版本替换为你本身下载的版本 tar -zxvf keepalived-2.0.18.tar.gz #进入到keepalived解压目录 cd keepalived-2.0.18
配置keepalived
./configure --prefix=/usr/local/keepalived --sysconf=/etc
而后之行如下命令,进行编译安装
make && make install
而后到keepalived安装目录
cd /usr/local/keepalived cd sbin #启动keepalived ./keepalived
为了方便启动,将Keepalived注册到Linux系统,进入到解压的keepalived目录(注意:这里是一开始解压的目录,不是keepalived安装目录)
#keepalived目录中有个文件夹keepalived,下面还有个etc,进入 cd keepalived/etc #而后执行,若是提示是否覆盖,输入y覆盖 sudo cp init.d/keepalived /etc/init.d/ sudo cp sysconfig/keepalived /etc/sysconfig/ #使配置生效 systemctl daemon-reload #启动keepalived systemctl start keepalived.service #中止keepalived systemctl stop keepalived.service #重启keepalived systemctl restart keepalived.service
用于查看lvs转发及代理状况的工具,只须要在192.168.232.132和192.168.232.133上安装便可
yum install ipvsadm -y
进入到/etc/sysconfig/network-scripts
cd /etc/sysconfig/network-scripts
拷贝一份ifcfg-lo命名为ifcfg-lo:1
cp ifcfg-lo ifcfg-lo:1
修改里面配置文件
DEVICE=lo:1 IPADDR=192.168.232.150 NETMASK=255.255.255.255
重启网络,就会看到lo下面多个虚拟IP
service network restart
配置ARP
vim /etc/sysctl.conf
添加如下配置
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
刷新文件
sysctl -p
添加一个host,去接收报文交给lo:1处理
#这样添加剧启后会失效 route add -host 192.168.232.150 dev lo:1 #查看 route -n #添加开启自启动 echo "route add -host 192.168.232.150 dev lo:1" >> /etc/rc.local
cd /etc/keepalived vim keepalived.conf
修改配置内容
global_defs { router_id LVS_132 # 设置lvs的id,在一个网络内惟一标识 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写 interface ens33 #网卡id 换成你本身电脑的网卡id,查看:ip addr virtual_router_id 41 #虚拟id,主备要一致 priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR advert_int 1 #检查间隔,默认为1s authentication { #密码主备一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.232.150 #设置虚拟IP(VIP) } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual_server 192.168.232.150 80 { delay_loop 6 #健康检查时间,单位:秒 lb_algo rr # 配置负载均衡的算法,默认为轮询 lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式 persistence_timeout 5 #设置会话持久化的时间 protocol TCP #协议 -t #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.232.130 80 { weight 1 #轮询的默认权重配比设置为1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.232.131 80 { weight 1 #轮询的默认权重配比设置为1 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } }
保存退出,重启keepalived服务
systemctl restart keepalived
cd /etc/keepalived vim keepalived.conf
修改配置内容
global_defs { router_id LVS_133 # 设置lvs的id,在一个网络内惟一标识 } vrrp_instance VI_1 { state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写 interface ens33 #网卡id 换成你本身电脑的网卡id,查看:ip addr virtual_router_id 41 #虚拟id,主备要一致 priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR advert_int 1 #检查间隔,默认为1s authentication { #密码主备一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.232.150 #设置虚拟IP(VIP) } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual_server 192.168.232.150 80 { delay_loop 6 #健康检查时间,单位:秒 lb_algo rr # 配置负载均衡的算法,默认为轮询 lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式 persistence_timeout 5 #设置会话持久化的时间 protocol TCP #协议 -t #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.232.130 80 { weight 1 #轮询的默认权重配比设置为1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.232.131 80 { weight 1 #轮询的默认权重配比设置为1 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } }
保存退出,重启keepalived服务
systemctl restart keepalived
查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的链接
ipvsadm -Lnc
经过访问192.168.232.150,能够正常显示如下两张图
停用主Keepalived
systemctl stop keepalived.service
此时经过192.168.232.150能够正常访问,当把主Keepalived重启启动后,VIP从新回到主Keepalived
测试停用nginx1
绝大多数公司到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题了。假设LVS每秒能处理10w的请求,一天也只能处理80亿的请求(10w秒吞吐量*8w秒),那万一系统的日PV超过80亿怎么办呢?这里补充说明下,可使用DNS轮询,搭建多个虚拟IP(VIP),每一个VIP的配置都和上面的配置同样,这样经过DNS去解析多个VIP,就能够达到更高的负载能力。
一直想整理出一份完美的面试宝典,可是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各类大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传之后,毫无心外的短短半个小时点赞量就达到了 13k,说实话仍是有点难以想象的。
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
因为篇幅限制,详解资料太全面,细节内容太多,因此只把部分知识点截图出来粗略的介绍,每一个小节点里面都有更细化的内容!
须要的小伙伴,能够一键三连,下方获取免费领取方式!