为什么要搭建高可用,为什么要搭建负载均衡?
流量红利的时代,做了网站没有流量就是摆设,但是流量大了怎么办,单机顶不住怎么办上双机,但是双机怎么更好的利用呢?本文从项目亲身经验一一道来。
首先项目采用keepalived+nginx +mysql+redis+rsync 进行项目的技术架构选型。
Keepalived是干什么的 ?
Keepalived的作用是检测服务器的状态,在另一方面VRRP实现了高可用协议。如果有一台web服务器宕机,或工作出现故障,Keepalived自动剔除与加入,这些工作全部自动完成,不需要人工干涉,极大的提高了系统的可用性。
nginx 双机高可用是通过飘IP方法来实现的双机高可用方法目前分为两种:
1)nginx+keepalived 双机主从模式:即使用两台服务器,一台主服务器和一台备服务器,但此种方式最大的特点就是主备服务器在主机器不出现故障的时候,永远处于浪费状态,如果想省钱此种方案不可取,当然土豪请忽略。
2)nginx+keepalived 双机主主模式:即使用两台服务器,互为主备,且都处于活动状态,此种方式既省钱又合理。
怎么搭建呢?
环境准备:
操作系统:centos7.2 64位
master 192.168.2.10 nginx+keepalived-master
backup 192.168.2.11 nginx+keepalived-backup
VIP: 192.168.2.12 //域名解析到这个VIP上
环境安装:
首先在主备机上执行
yum install -y keepalived nginx
安装完后我们编辑对应的配置
1. ! Configuration File for keepalived
2. global_defs {
3. router_id LVS_12 #lvs id,在一个网络内唯一最好保持与虚IP后缀一致
4. }
5. vrrp_instance VI_1 {
6. state BACKUP #角色:MASTER主,BACKUP备 此处为了实现非独占主备都是BACKUP 用优先级来确定
7. interface em1 #网卡接口
8. virtual_router_id 60 #虚拟路由编号,主备一致
9. priority 100 #定义优先级,数字越大优先级越高,主优先级大于备
10. nopreempt #非独占
11. advert_int 1 #检查间隔,默认1s
12. authentication {
13. auth_type PASS
14. auth_pass 111111
15. }
16. interface em1
17. virtual_ipaddress { #vip虚拟两个VIP
18. 192.168.2.12/24 dev em1
19. }
20. notify_master "/etc/init.d/realserver stop" #切到主 后执行的脚本
21. notify_backup "/etc/init.d/realserver start" #切到备 后执行的脚本
22. notify_fault "/etc/init.d/realserver fault" #意外终止 后执行的脚本
23. notify_stop "/etc/init.d/realserver fault" #keep停止后 后执行的脚本
24.
25. }
26. #定义LVS的VIP port
27. virtual_server fwmark 1 {
28. delay_loop 3 #设置健康检查时间,单位秒
29. lb_algo wrr #设置负载调度算法
30. lb_kind DR #设置LVS实现负载的机制(NAT/TUN/DR)
31. persistence_timeout 0 #会话保持时间
32. protocol TCP #TCP方式
33. #定义real server的IP地址
34. real_server 192.168.2.10 80 {
35. weight 3 #配置节点权重,越大权重越高
36. notify_up "/etc/keepalived/scripts/send.sh '192.168.2.10 nginx 80端口服务恢复' '192.168.2.10 nginx 80服务恢复,请检查机器和服务' "
37. notify_down "/etc/keepalived/scripts/send.sh '192.168.2.10 nginx 80端口服务挂掉' '192.168.2.10 nginx 80服务挂掉,请检查机器和服务' "
38. TCP_CHECK {
39. connect_timeout 10 #连接10s如果没响应认为DOWN
40. delay_before_retry 3 #在重试钱先delay3s
42. connect_port 80 #检查的端口
43. }
44. }
45. real_server 192.168.2.11 80 {
46. weight 3 #配置节点权重,越大权重越高
47. notify_up "/etc/keepalived/scripts/send.sh '192.168.2.11 nginx 80端口服务恢复' '192.168.2.11 nginx 80服务恢复,请检查机器和服务' "
48. notify_down "/etc/keepalived/scripts/send.sh '192.168.2.11 nginx 80端口服务挂掉' '192.168.2.11 nginx 80服务挂掉,请检查机器和服务' "
49. TCP_CHECK {
50. connect_timeout 10
51. delay_before_retry 3
52. connect_port 80
53. }
54. }
realserver是什么?
realserver 脚本是用来调度对应的主备机以及做一些切换的。
1.SNS_VIP=192.168.2.12 #自定义VIP
2./etc/rc.d/init.d/functions
3.case "$1" in
4.start)
5. #绑定lo:0
6. ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
7. /sbin/route add -host $SNS_VIP dev lo:0
8.
9. #arp响应相关如有不懂可留言或者自行百度
10. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
11. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
12. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
13. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
14. sysctl -p >/dev/null 2>&1
15. #清空mark标记,使得LVS负载均衡对所有请求不生效
16. iptables -F -t mangle
17. echo "RealServer Start OK"
18. echo "RealServer Start" >/tmp/2222
19. `/etc/keepalived/scripts/send.sh 'KeepAlived服务切换为BACKUP' 'KeepAlived服务切换为BACKUP请检查机器和服务' `#发送告警
20. /etc/keepalived/scripts/inotify_backup.sh #将inotify变成从
21. `/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.2.11 6379 'Root!!2020Redis'` #设置redis为从
22. ;;
23.stop)
24. ifconfig lo:0 down
25. ifconfig lo:1 down
26. route del $SNS_VIP >/dev/null 2>&1
27. route del $SNS_VIP_NET >/dev/null 2>&1
28. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
29. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
30. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
31. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
32. #LVS负载均衡只对mark标记的请求有效
33. iptables -F -t mangle
34. #增加mark标记对应keepalived fwmark 1 2 此处牵涉到LVS 为了解决主备相互发送负载均衡需要对请求做标记来标记本机和其他机器
35. iptables -t mangle -A PREROUTING -d $SNS_VIP -p tcp --dport 80 -j MARK --set-mark 1
36. iptables -t mangle -A PREROUTING -d $SNS_VIP_NET -p tcp --dport 80 -j MARK --set-mark 2
37. #iptables -t mangle -A PREROUTING -d $SNS_VIP -p tcp --dport 3306 -j MARK --set-mark 2
38. #iptables -t mangle -A PREROUTING -d $SNS_VIP -p tcp --dport 8089 -j MARK --set-mark 3
39. echo "RealServer Stoped"
40. echo "RealServer Stoped" >/tmp/1111
41. `/etc/keepalived/scripts/send.sh 'KeepAlived服务切换为MASTER' 'KeepAlived服务切换为MASTER请检查机器和服务' `
42. /etc/keepalived/scripts/inotify_master.sh
43. `/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.2.11 6379 'Root!!2020Redis'`
44. ;;
66.esac
67.exit 0
nginx配置
server {
charset utf-8;
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;
proxy_ignore_client_abort on;
proxy_connect_timeout 36000;
proxy_read_timeout 36000;
proxy_send_timeout 36000;
proxy_buffer_size 4096k;
proxy_buffers 32 256k;
proxy_busy_buffers_size 4096k;
proxy_temp_file_write_size 4096k;
#对应e开头
listen 80; ## listen for ipv4
#添加如下配置,访问nginx状态
location /nginx-status {
stub_status on;
access_log off;
}
server_name 127.0.0.1;
root /home/site/www/;
access_log /home/site/logs/access.log main;
error_log /home/site/logs/error.log;
expires 0;
if (!-e $request_filename) {
rewrite ^/index/(.*)$ /index.php?act=$1 last;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_connect_timeout 36000;
fastcgi_read_timeout 36000;
fastcgi_send_timeout 36000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
location ~* /. {
deny all;
}
}
配置完后启动对应的nginx服务然后service keepalived start 启动keepalived,我们在主备机上可以看到 em1上已经有vip了 同时备机上的 lo上也有了VIP了
然后我们测试下curl vip 可以看到对应的接口 一会master 一会slave,至此简单的 nginx+keepalived 结束,故障测试大家可以试下哦
写在最后
负载均衡技术对于一个服务来说是至关重要的!做好负载均衡架构,可以实现故障自动转移保证服务高可用环境,避免单点故障,保证网站健康持续运行。