Consul + Nginx实现自动扩容平台
几个月没有更新博客了,已经长草了,特意来除草。之前基于nginx反向代理使用的是:nginx + confd + etcd的存储方式,最近发现部门DBA同事使用consul + redis + 哨兵实现的主从自动选举切换,不影响业务的方式,还有看到有些公司分享的consul + mha的方式,觉得不错,于是研究了下consul,本案例是基于consul + consul-template + nginx + flask + mysql构成的。既然consul这么传神,我们先来看看consul是什么:
consul是HashiCorp公司(曾经开发过vgrant) 推出的一款开源工具, 基于go语言开发, 轻量级, 用于实现分布式系统的服务发现与配置。 与其他类似产品相比, 提供更“一站式”的解决方案。 consul内置有KV存储, 服务注册/发现, 健康检查, HTTP+DNS API, Web UI等多种功能。官网: https://www.consul.io/其他同类服务发现与配置的主流开源产品有:zookeeper和ETCD。
consul的优势:
1. 支持多数据中心, 内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障, zookeeper和 etcd 均不提供多数据中心功能的支持
2. 支持健康检查. etcd 不提供此功能.
3. 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂,etcd 只支持 http 协议. 有DNS功能, 支持REST API
4. 官方提供web管理界面, etcd 无此功能.
5. 部署简单, 运维友好, go二进制文件解压即用。批量部署方便
Consul和其他服务发现工具的对比表:
主要架构:
架构说明:
Consul Cluster由部署和运行了Consul Agent的节点组成。 在Cluster中有两种角色:Server和 Client。
Server和Client的角色和Consul Cluster上运行的应用服务无关, 是基于Consul层面的一种角色划分.
Consul Server: 用于维护Consul Cluster的状态信息, 实现数据一致性, 响应RPC请求。官方建议是: 至少要运行3个或者3个以上的Consul Server。 多个server之中需要选举一个leader, 这个选举过程Consul基于Raft协议实现. 多个Server节点上的Consul数据信息保持强一致性。 在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯。Consul Client: 只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。
Consul 支持多数据中心, 多个数据中心要求每个数据中心都要安装一组Consul cluster,多个数据中心间基于gossip protocol协议来通讯, 使用Raft算法实现一致性
基础介绍到这里,下面直接进入我们主题,环境介绍(生产环境建议构建consul server的集群):
consul:192.168.113.174 nginx:192.168.113.174 反向代理服务器: 192.168.113.175:8080 192.168.113.176:8080
1、consul 与consul-template安装:
安装非常容易,到官方https://www.consul.io/downloads.html下载相关包,解压之后放到/usr/local/bin/ 目录下即可。
2、启动一下consul server:
[root@master ~]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -bind 0.0.0.0 -client 0.0.0.0 -ui
##然后我们打开一下web:192.168.113.174:8500界面,即可看到相关的服务注册信息:
3、下面我们准备一下consul模板,然后再注册服务。
[root@master ~]# cat item.consul.ctmpl {{range services}} {{$name := .Name}} {{$service := service .Name}} upstream {{$name}} { zone upstream-{{$name}} 64k; {{range $service}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } {{end}} {{range services}} {{$name := .Name}} server { listen 80; server_name www.{{$name}}.com; index index.html index.htm index.php; ## send request back to apache ## location / { proxy_pass http://{{$name}}; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } } {{end}}
4、观察一下nginx的配置信息,首先我们确认下配置文件自目录下没有信息:
[root@master conf.d]# pwd /etc/nginx/conf.d [root@master conf.d]# ls
5、启动模板文件:
[root@master ~]# consul-template -consul 127.0.0.1:8500 -template item.consul.ctmpl:default.conf:"/usr/sbin/nginx -s reload"
##根据注册信息与模板生成一个default.conf的文件,具体语法可以查看相关模板文档:
[root@master ~]# consul-template -consul 127.0.0.1:8500 -template item.consul.ctmpl:/etc/nginx/conf.d/default.conf:"/usr/sbin/nginx -s reload"
6、往里面注册服务信息:
[root@master conf.d]# curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat1", "Address":"192.168.113.175","Service": {"Id" :"192.168.113.175:8080", "Service": "tomcat","tags": ["dev"], "Port": 8080}}' [root@master conf.d]# curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat2", "Address":"192.168.113.176","Service": {"Id" :"192.168.113.176:8080", "Service": "tomcat","tags": ["dev"], "Port": 8080}}'
7、web界面我们查看一下是否已经注册了服务:
8、看一下配置文件是否已经生成:
upstream tomcat { zone upstream-tomcat 64k; server 192.168.113.175:8080 max_fails=3 fail_timeout=60 weight=1; server 192.168.113.176:8080 max_fails=3 fail_timeout=60 weight=1; } server { listen 80; server_name www.consul.com; index index.html index.htm index.php; ## send request back to apache ## location / { proxy_pass http://consul; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } } server { listen 80; server_name www.tomcat.com; index index.html index.htm index.php; ## send request back to apache ## location / { proxy_pass http://tomcat; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
9、到这一步似乎已经完成了,不过像这种东西能不能平台话呢,看一下我构建的平台添加虚拟主机部分:
10、添加后端转发地址:
11、下面我们把添加的后端地址同步到consul,然后查看一下域名的变化:
12、看一下web ui我们会发现已经添加了一个域名:
13、再看一下nginx的配置文件:
总结:到此一个简单的运维管理平台已经构建完成了,那么其实我们还能够在扩展,比如做lvs,haproxy都是可以的,当然基于Docker的也有相关的注册发现机制,我们可以随意发挥,要构建一个漂亮的nginx管理平台,监控必不可少,有时间我们加上图像再展示。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
记一次负载均衡+NFS博客站点搭建的总结
起因 原本是打算搭建个小博客站点做实验,突然想起之前遇到的一次负载均衡失效的经历,便打算做一次实验重现当初的情况并记录下来,防止日后再遇到类似的情况懵逼。 复现流程 架构体系 原环境:前端依赖nginx做负载均衡的调度器,web端是httpd+php-fpm分离,分别处理动态和静态页面,后端mariadb数据库做数据存储,NFS服务器提供站点文件作出共享,防止,web端出现站点文件不一致的情况。 模拟环境:nginx做负载均衡器,httpd和php-fpm共存在同一主机,NFS和mariadb分处2台主机,整个模拟一共使用5台主机。 软件环境与架构图 前提:所有节点主机全部关闭selinux,清空防火墙规则。 系统 httpd php nginx maiadb CentOS 7 httpd2.4 5.4.14 1.10.2 10.2.15 架构图 配置各个节点 配置nginx节点 1.安装nginx yum install nginx -y 2.编辑nginx配置文件 vim /etc/nginx/conf.d/upstream.co...
- 下一篇
记一次安装多版本php的四个雷区,你踩着了吗
记一次安装多版本的php的四个雷区,你踩着了吗 需求:公司需要在同一台服务器上安装不同版本的php,而这一台的服务上已经安装了php.7.1,现需要同时存在两个版本,而另一个版本为php5.6、 原版本的php是使用一键安装工具oneinstack来装的 工具下载可参考官网:https://oneinstack.com/install/ (以下安装都是以oneinstack来安装) 一、安装另一个版本php5.6 注意以下是正确的安装,遇到的坑下面再说 1、 安装php5.6 因为以前的php也是使用oneinstack安装的所以启动文件是是php-fpm,我们需要修改php-fpm文件名,防止再次安装被覆盖。 停止本地的php7.1 #servicephp-fpmstop 更改php-fpm启动文件名 #mv/etc/init.d/php-fpm/etc/init.d/php-fpm.bk 2、修改oneinstack的options.conf文件。 使用oneinstack工具安装,每次都会读取options.conf这跟文件,然后再安装,所以需要修改该文件的php路径,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7