我是靠谱客的博主 孤独乌龟,最近开发中收集的这篇文章主要介绍高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
- 前言
- 一、案例拓扑图
- 二、案例环境
- 三、案例搭建
- 3.1 Web服务器
- 3.2 Nginx反向代理服务器-主
- 3.3 Nginx反向代理服务器-从
- 3.4 日志服务器
- 四、案例测试
- 4.1 访问Web服务器
- 4.2 Consual自动发现
- 4.3 VIP地址访问
- 4.4 模仿宕机
- 4.5 查看后台日志
前言
本文介绍了如何搭建一个高可用Web群集架构。
Nginx反向代理服务器特点如下:
- 利用Keepalived实现高可用
- 利用Nginx反向代理服务器实现网页访问的负载均衡以及动静分离
- 利用Consul-Template实现高灵活性Web服务器的搭建,从而使Web服务器使用Docker创建Web容器时,可以自动发现容器,并实现负载均衡
Web服务器特点如下:
- 利用Docker-Compose编排迅速搭建多个Web容器
日志服务器特点如下:
- 群集实现,保证高可用性
- 分别收集主备Nginx反向代理服务器的日志
- 利用Kibana使日志可视化
一、案例拓扑图
二、案例环境
服务器 | 所含服务 | IP地址 |
---|---|---|
Nginx反向代理服务器-主 | Consul,Nginx,Logstash,Keepalived,Consul-Template | 10.0.0.102 |
10.0.0.100(VIP) | ||
Nginx反向代理服务器-备 | Consul,Nginx,Logstash,Keepalived,Consul-Template | 10.0.0.103 |
10.0.0.100(VIP) | ||
Web服务器 | Docker(Nginx,Tomcat),Docker-Compose,Registrator | 10.0.0.104 |
日志服务器 | Elasticsearch,Kibana | 10.0.0.105 |
日志服务器 | Elasticsearch | 10.0.0.106 |
三、案例搭建
注意:
以下只是按照每个服务器搭建
部分服务的搭建有一定顺序要求
- Consual-Agent------>Registrator------>Consul-Template
- Elasticsearch------>Logstash------>Kibana
3.1 Web服务器
Docker服务器环境部署见博文Docker搭建
# 创建相关网页
[root@web ~]# echo "<center>Nginx-1</center>" > /web/1/index.html
[root@web ~]# echo "<center>Nginx-2</center>" > /web/2/index.html
[root@web ~]# echo "<center>Tomcat-1</center>" > /web/3/index.jsp
[root@web ~]# echo "<center>Tomcat-2</center>" > /web/4/index.jsp
# 使用Docker—Compose编排Web相关容器
[root@web ~]# vi compose_web/docker.yml
version: '3'
services:
nginx1:
hostname: nginx
container_name: nginx1
image: nginx:latest
ports:
- 1414:80
networks:
- master
volumes:
- /web/1/:/usr/local/nginx/html
nginx2:
hostname: nginx
container_name: nginx2
image: nginx:latest
ports:
- 1415:80
networks:
- master
volumes:
- /web/2/:/usr/local/nginx/html
tomcat1:
hostname: tomcat
container_name: tomcat1
image: tomcat:latest
ports:
- 1515:8080
networks:
- master
volumes:
- /web/3/:/usr/local/tomcat/webapps/ROOT
tomcat2:
hostname: tomcat
container_name: tomcat2
hostname: tomcat
container_name: tomcat2
image: tomcat:latest
ports:
- 1516:8080
networks:
- master
volumes:
- /web/4/:/usr/local/tomcat/webapps/ROOT
networks:
master:
[root@web ~]# docker-compose -f /root/compose_web/docker.yml up -d
Creating nginx2 ... done
Creating nginx1 ... done
Creating tomcat2 ... done
Creating tomcat1 ... done
[root@web ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec2525280baf tomcat:latest "/usr/local/tomcat/b…" 7 seconds ago Up 5 seconds 0.0.0.0:1515->8080/tcp tomcat1
5c3dfe67c0bf tomcat:latest "/usr/local/tomcat/b…" 7 seconds ago Up 5 seconds 0.0.0.0:1516->8080/tcp tomcat2
582078c6146c nginx:latest "/usr/local/nginx/sb…" 7 seconds ago Up 5 seconds 0.0.0.0:1415->80/tcp nginx2
41afbcc07872 nginx:latest "/usr/local/nginx/sb…" 7 seconds ago Up 5 seconds 0.0.0.0:1414->80/tcp nginx1
# 安装Registrator并实现注册
[root@web ~]# docker run -d
> --name=registrator1
> --net=host
> -v /var/run/docker.sock:/tmp/docker.sock
> --restart=always
> gliderlabs/registrator:latest
> -ip=10.0.0.104
> consul://10.0.0.102:8500
[root@web ~]# docker run -d
> --name=registrator2
> --net=host
> -v /var/run/docker.sock:/tmp/docker.sock
> --restart=always
> gliderlabs/registrator:latest
> -ip=10.0.0.104
> consul://10.0.0.103:8500
3.2 Nginx反向代理服务器-主
Nginx环境搭建见博文Nginx搭建
Logstash环境搭建见博文Logstash搭建
# 创建VIP
[root@master ~]# vi VIP.sh
ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100 netmask 255.255.255.255 up #添加虚拟地址的虚接口
route add -host 10.0.0.100 dev ens33:0
[root@master ~]# sh VIP.sh
# 使用agent代理功能
[root@master ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.0.0.102 -client=0.0.0.0 -node=consul-server02 &>/var/log/consul.log &
# 编辑 template nginx 模板文件
[root@master ~]# vi /root/consul/web.ctmpl
upstream nginx_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
upstream tomcat_backend {
{{range service "tomcat"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 10.0.0.100:80;
server_name 10.0.0.100 localhost;
access_log /var/log/nginx/web-access.log;
index index.html index.php index.jsp;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nginx_backend;
}
location ~.*.jsp$ {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat_backend;
}
}
# 编辑nginx配置并启动
[root@master ~]# vi /usr/local/nginx/conf/nginx.conf
http {
include vhost/*.conf; # 添加
include mime.types;
————————----省略-------------------
[root@master ~]# /usr/local/nginx/sbin/nginx
# 配置consul-template启动
[root@master ~]# consul-template -consul-addr 10.0.0.102:8500 -template "/root/consul/web.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
# 配置Logstash
[root@master ~]# vi /etc/logstash/conf.d/nginx_log.conf
input {
file {
path => "/var/log/nginx/web-access.log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["10.0.0.105:9200"]
index => "web_master_access-%{+YYY.MM.dd}"
}
}
[root@master ~]# logstash -f /etc/logstash/conf.d/nginx_log.conf
# 配置Keepalived高可用
[root@master ~]# yum -y install keepalived
[root@master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 # 需要修改
smtp_connect_timeout 30
router_id LVS_01 # 不同点
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # 不同点
interface ens33 # 需要修改
virtual_router_id 51
priority 100 # 不同点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 # 需要修改
}
}
[root@master ~]# systemctl start keepalived
# 配置 Nginx 检测脚本
[root@master ~]# vi nginx_check.sh
#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
/etc/init.d/keepalived stop
fi
sleep 2
done
[root@master ~]# chmod +x nginx_check.sh
[root@master ~]# nohup /root/nginx_check.sh &
3.3 Nginx反向代理服务器-从
Nginx环境搭建见博文Nginx搭建
Logstash环境搭建见博文Logstash搭建
# 创建VIP
[root@backup ~]# vi VIP.sh
ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100 netmask 255.255.255.255 up #添加虚拟地址的虚接口
route add -host 10.0.0.100 dev ens33:0
[root@backup ~]# sh VIP.sh
# 使用agent代理功能
[root@backup ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.0.0.103 -client=0.0.0.0 -node=consul-server02 &>/var/log/consul.log &
# 编辑 template nginx 模板文件
[root@backup ~]# vi /root/consul/web.ctmpl
upstream nginx_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
upstream tomcat_backend {
{{range service "tomcat"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 10.0.0.100:80;
server_name 10.0.0.100 localhost;
access_log /var/log/nginx/web-access.log;
index index.html index.php index.jsp;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nginx_backend;
}
location ~.*.jsp$ {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat_backend;
}
}
# 编辑nginx配置并启动
[root@backup ~]# vi /usr/local/nginx/conf/nginx.conf
http {
include vhost/*.conf; # 添加
include mime.types;
————————----省略-------------------
[root@backup ~]# /usr/local/nginx/sbin/nginx
# 配置consul-template启动
[root@backup ~]# consul-template -consul-addr 10.0.0.103:8500 -template "/root/consul/web.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
# 配置Logstash
[root@backup ~]# vi /etc/logstash/conf.d/nginx_log.conf
input {
file {
path => "/var/log/nginx/web-access.log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["10.0.0.105:9200"]
index => "web_master_access-%{+YYY.MM.dd}"
}
}
[root@backup ~]# logstash -f /etc/logstash/conf.d/nginx_log.conf
# 配置Keepalived高可用
[root@backup ~]# yum -y install keepalived
[root@backup ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 # 需要修改
smtp_connect_timeout 30
router_id LVS_02 # 不同点
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP # 不同点
interface ens33 # 需要修改
virtual_router_id 51
priority 95 # 不同点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 # 需要修改
}
}
[root@backup ~]# systemctl start keepalived
3.4 日志服务器
日志服务器环境搭建见博文Elasticsearch及Kibana搭建
Elasticsearch
# 修改配置文件
[root@node-1 ~]# vi /etc/elasticsearch/elasticsearch.yml
17: cluster.name: elk-cluster # 集群名称
23: node.name: node-1 ## 当前节点名
33: path.data: /data/elk-data # 数据存储的位置(目录不存在,需要创建)
37: path.logs: /var/log/elasticsearch/ # 日志文件存放的位置
43: bootstrap.memory_lock: false
# true:允许内存中的数据交还给SWAP,flase:不允许内存中的数据交还给SWAP。
选择false,因为swap分区实在硬盘上建立的,如果内存不够,数据溢出,分到硬盘上的话,会影响速度
54: network.host: 0.0.0.0 # 监听地址,0.0.0.0表示所有网段
58: http.port: 9200 # ES端口号,外部通信的端口号 PS:9300是集群内部通信端口
67: discovery.zen.ping.unicast.hosts: ["node-1", "node-2"] # 群集中包含的节点名,也可以用IP地址
# 添加映射
[root@node-1 ~]# vi /etc/hosts
10.0.0.105 node-1
10.0.0.106 node-2
# 创建目录及开启服务
[root@node-1 ~]# mkdir -p /data/elk-data
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk-data/
[root@node1 elasticsearch]# systemctl start elasticsearch.service
Kibana
# 修改配置文件
[root@node-1 ~]# vi /usr/local/kibana/config/kibana.yml
# 2行 kibana打开的端口
server.port: 5601
# 5行 kibana侦听的地址
server.host: "0.0.0.0"
# 12行 和elasticsearch建立联系
elasticsearch.url: "http://10.0.0.105:9200"
# 20行 在elasticsearch中添加.kibana索引
kibana.index: ".kibana"
[root@node-1 ~]# yum -y install screen
[root@node-1 ~]# /usr/local/kibana/bin/kibana
至此,架构搭建完毕。
四、案例测试
4.1 访问Web服务器
4.2 Consual自动发现
[root@web ~]# docker run -d -P nginx
fb4306f4b417d58626b1661e78781686118fc0eec93609d42fa809c227e007f2
[root@web ~]# docker run -d -P tomcat
39939ec10452489350d0e4e842e85ba9e607e9231f1ba99e303b44b6feb14d82
4.3 VIP地址访问
4.4 模仿宕机
仍可以正常访问
4.5 查看后台日志
- 主服务器
- 备服务器
最后
以上就是孤独乌龟为你收集整理的高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试的全部内容,希望文章能够帮你解决高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复