Keepalived+Nginx 高可用集群(主从模式)

image.png
image.png

  1. 1、条件准备
  2. 1)需要两台 nginx 服务器
  3. 2)需要 keepalived
  4. 3)需要虚拟 ip
  5. 2、配置高可用的准备工作
  6. 1)需要两台服务器 192.168.17.129 192.168.17.131
  7. 2)在两台服务器安装 nginx
  8. 3)在两台服务器安装 keepalived
  9. 3、在两台服务器安装 keepalived
  10. 1)使用 yum 命令进行安装
  11. yum install keepalived y
  12. 2)安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf
  13. 4、完成高可用配置(主从配置)
  14. 1)修改/etc/keepalived/keepalivec.conf 配置文件(替换成如下配置即可)
  15. global_defs {
  16. notification_email {
  17. acassen@firewall.loc
  18. failover@firewall.loc
  19. sysadmin@firewall.loc
  20. }
  21. notification_email_from Alexandre.Cassen@firewall.loc
  22. smtp_server 192.168.17.129
  23. smtp_connect_timeout 30
  24. router_id LVS_DEVEL #LVS_DEVEL为路由映射标识 须在etc/host文件下配置 127.0.0.1映射为LVS_DEVEL
  25. }
  26. vrrp_script chk_http_port {
  27. script "/usr/local/src/nginx_check.sh"
  28. interval 2 #(检测脚本执行的间隔)
  29. weight 2
  30. }
  31. vrrp_instance VI_1 {
  32. state BACKUP # 如果是备份服务器上则将 MASTER 改为 BACKUP
  33. interface ens33 //网卡 使用命令ifconfig 可查看
  34. virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
  35. priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
  36. advert_int 1
  37. authentication {
  38. auth_type PASS #校验类型为密码类型
  39. auth_pass 1111
  40. }
  41. virtual_ipaddress {
  42. 192.168.17.50 // VRRP H 虚拟地址
  43. }
  44. }
  45. 2)在/usr/local/src 添加检测脚本
  46. #!/bin/bash
  47. A=`ps -C nginx –no-header |wc -l`
  48. if [ $A -eq 0 ];then
  49. /usr/local/nginx/sbin/nginx
  50. sleep 2
  51. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  52. killall keepalived
  53. fi
  54. fi
  55. 3)把两台服务器上 nginx keepalived 启动
  56. 启动 nginx:./nginx
  57. 启动 keepalivedsystemctl start keepalived.service

最终测试
在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
image.png
image.png
(2)把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50
image.png
image.png

Nginx 的原理

image.png
image.png

master-workers 的机制的好处:
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

设置 worker 数量。
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。如果是4核的cpu则设置成4 8核的设置成8
worker_cpu_affinity 0001 0010 0100 1000

work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000

连接数 worker_connection(默认配置为1024
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections worker_processes /2,而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

image.png

  1. 一个 master 和多个 woker 有好处
  2. 1)可以使用 nginx s reload 热部署,利用 nginx 进行热部署操作
  3. 2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,
  4. 继续进行争抢,实现请求过程,不会造成服务中断
  5. 设置多少个 woker 合适
  6. worker 数和服务器的 cpu 数相等是最为适宜的
  7. 连接数 worker_connection
  8. 第一个:发送请求,占用了 woker 的几个连接数?
  9. 答案:2 或者 4 如果是访问静态资源则是两个 如果是访问动态资源则是4 因为要经过tomcat做反向代理
  10. 第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的
  11. 最大并发数是多少?
  12. 普通的静态访问最大并发数是: worker_connections * worker_processes /2
  13. 而如果是 HTTP 为反向代理来说,最大并发数量应该是 worker_connections *
  14. worker_processes/4