💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### 一,lvs+keepalived 与HAproxy+keepalived[#](https://www.cnblogs.com/g2thend/p/10996614.html###%E4%B8%80%EF%BC%8Clvs+keepalived-%E4%B8%8Ehaproxy+keepalived) [![](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082121481-1346528555.png)](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082121481-1346528555.png) [![](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082136102-2011786552.png)](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082136102-2011786552.png) #### ##二,实验操做:[#](https://www.cnblogs.com/g2thend/p/10996614.html###%E4%BA%8C%EF%BC%8C%E5%AE%9E%E9%AA%8C%E6%93%8D%E5%81%9A%EF%BC%9A) nfs挂载: nfs挂载,在后端创建用户,用户名及id与服务器nginx一致,并对导出的目录为该用户放开权限 /home/nfstestdir       192.168.222.0/24(rw,sync,all\_squash,anonuid=1000,anongid=1000) ~~~ NFS权限参数配置 ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 secure NFS通过1024以下的安全TCP/IP端口发送 insecure NFS通过1024以上的端口发送 wdelay 如果多个用户要写入NFS目录,则归组写入(默认) no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 hide 在NFS共享目录中不共享其子目录 no_hide 共享NFS目录的子目录 subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) no_subtree_check 和上面相对,不检查父目录权限 all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 no_all_squash 保留共享文件的UID和GID(默认) root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认) no_root_squas root用户具有根目录的完全管理访问权限 anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID ~~~ ### nginx +fpm 配置重点,php-fpm  配置启动用户为nginx  ,这样php可以以相同的用户处理nfs上的文件 配置参考其他博文:[https://www.cnblogs.com/g2thend/p/10884579.html](https://www.cnblogs.com/g2thend/p/10884579.html) lvs+keepalived   keepalived  配置2个vip,一个走网站服务,一个走数据库。和图示不同,只是ip 有改动,注意所有ip 为同一局域网下 ``` `cat` `/etc/keepalived/keepalived``.conf` `! Configuration File``for``keepalived` `global_defs {` `notification_email {` `2222@qq.com   ` `}` `notification_email_from  admin@loaclhost` `smtp_server  127.0.0.1` `smtp_connect_timeout 30` `router_id  test73` `vrrp_skip_check_adv_addr` `# vrrp_strict` `vrrp_garp_interval 0` `vrrp_gna_interval 0` `}` `vrrp_instance VI_1 {` `state MASTER` `interface eth1` `virtual_router_id 51` `priority   50` `advert_int 1` `authentication {` `auth_type PASS` `auth_pass 1q2w3e4r` `}` `virtual_ipaddress {` `#    192.168.36.179` `192.168.36.179   dev eth1  label eth1:0` `192.168.36.180   dev eth1  label eth1:1` `}` `}` `virtual_server 192.168.36.180 3306  {    ` `delay_loop   5                      ` `lb_algo rr                         ``#调度算法` `lb_kind  DR                        ``#集群类型NAT|DR|TUN` `nat_mask 255.255.255.0             ``#子网掩码,可选项。` `#persistence_timeout 50               ` `protocol TCP                       ``#|UDP|SCTP` `#sorry_server <IPADDR> <PORT>        ` `real_server  192.168.36.76  3306  {  ``#RS地址和端口` `weight  1                       ` `TCP_CHECK {` `connect_port  3306` `connect_timeout  3` `nb_get_retry 2` `delay_before_retry 1` `} ` `}            ` `}` `virtual_server   192.168.36.179  80  {    ` `delay_loop   5                      ` `lb_algo rr                         ``#调度算法` `lb_kind  DR                        ``#集群类型NAT|DR|TUN` `nat_mask 255.255.255.0             ``#子网掩码,可选项。` `#persistence_timeout 50               ` `protocol TCP                       ``#|UDP|SCTP` `#sorry_server <IPADDR> <PORT>        ` `real_server  192.168.36.74 80  {  ``#RS地址和端口` `weight  1                       ` `HTTP_GET {              ` `url {` `path ``/index``.html                    ` `status_code 200         ` `}                         ` `connect_timeout 3           ` `nb_get_retry 3             ` `delay_before_retry 3       ` `#  connect_ip <IP ADDRESS>     ` `#  connect_port <PORT>         ` `#  bindto <IP ADDRESS>        ` `#  bind_port <PORT>           ` `}` `}` `real_server  192.168.36.75 80  {  ``#RS地址和端口` `weight  1                       ` `HTTP_GET {` `url {` `path ``/index``.html` `status_code 200 ` `}               ` `connect_timeout 3 ` `nb_get_retry 3    ` `delay_before_retry 3` `#  connect_ip <IP ADDRESS>` `#  connect_port <PORT>   ` `#  bindto <IP ADDRESS>   ` `#  bind_port <PORT>      ` `}` `}` `}` ``` ###2,haproxy +keepalived 此时keepalived只是作为单点故障恢复,不做lvs负载均衡,所以不用配置vrrp\_instance. haproxy配置 ~~~ cat /etc/haproxy/haproxy.cfg global maxconn 100000 chroot /usr/local/haproxy stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1 stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2 #仅限本机,根据传送的信号关闭进程等 uid 1990 #nobody /sbin/nologin gid 1990 #useradd -s /sbin/nologin haproxy 更换uid pid daemon nbproc 2 #启动进程数,与cpu保持一致 #nbthread 2 #指定每个haproxy进程开启的线程数,默认为每个进程一个线程 使用版本>v1.8 #看线程 pstree #ulimit-n 65535 #设置每进程所能够打开的最大文件描述符数目 #cpu-map 1 0 #第一个进程绑定到0核心上 #cpu-map 2 1 #cpu-map 3 2 #cpu-map 4 3 pidfile /run/haproxy.pid spread-checks 2 #后端server状态check,随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认0不延迟 log 127.0.0.1 local3 info #没有专门日志 vim /etc/rsyslog.conf #imudp 模块打开 接收端口打开 #local3.* /var/log/haproxy_xxxx.log systemctl restart rsyslog defaults option http-keep-alive #会话保持 option forwardfor #头部添加客户端源地址 ip透传 #后端服务器需要记录客户端真实ip, 需要在HTTP请求中添加”X-Forwarded-For”字段; #haproxy自身的健康检测机制访问后端服务器时, 不应将记录访问日志,可用except来排除127.0.0.0,即haproxy本身 #option httpclose #启http协议中服务器端关闭功能, 每个请求完毕后主动关闭http通道, 使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录 #option dontlognull #如果产生了一个空连接,那这个空连接的日志将不会记录. maxconn 100000 #最大并发 mode http #全局默认转发模式,listen 区域可重写该变量 timeout connect 60s #TCP之前 (请求到后端,不能建立连接 timeout client 600s #空连接时间 timeout server 600s #tcp之后(请求已转发) 后端处理较长,建议设置久时间 timeout check 10s #心跳检测时间 #timeout http-request 10s #默认http请求超时时间 #timeout queue 1m #默认队列超时时间, 后端服务器在高负载时, 会将haproxy发来的请求放进一个队列中 #当与后端服务器的会话失败(服务器故障或其他原因)时, 把会话重新分发到其他健康的服务器上; 当故障服务器恢复时, 会话又被定向到已恢复的服务器上; #还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数 #option redispatch #retries 3 #当haproxy负载很高时, 自动结束掉当前队列处理比较久的链接. #option abortonclose #设置默认的负载均衡方式 #balance source #balnace leastconn listen stats mode http bind 0.0.0.0:9999 stats enable log global #option httplog #日志格式 #maxconn 10 #统计页面默认最大连接 #stats hide-version #隐藏统计页面上的haproxy版本信息 #stats refresh 30s #监控页面自动刷新时间 #stats realm LTC\ Haproxy #统计页面密码框提示文本 stats uri /haproxy-status stats auth haadmin:1q2w3e4r #手工启动/禁用后端服务器, 可通过web管理节点 stats admin if TRUE #设置haproxy错误页面 errorfile 400 /usr/local/haproxy/errorfiles/400.http errorfile 403 /usr/local/haproxy/errorfiles/403.http errorfile 408 /usr/local/haproxy/errorfiles/408.http errorfile 500 /usr/local/haproxy/errorfiles/500.http errorfile 502 /usr/local/haproxy/errorfiles/502.http errorfile 503 /usr/local/haproxy/errorfiles/503.http errorfile 504 /usr/local/haproxy/errorfiles/504.http listen web_port bind *:80 #填写具体的地址端口(可绑定多网卡分流 mode tcp log global #option forwardfor server web1 192.168.36.74:80 weight 2 check port 9000 inter 3000 fall 2 rise 5 #健康检查后端php:9000 server web2 192.168.36.75:80 weight 3 check port 9000 inter 3000 fall 2 rise 5 #健康检查后端php:9000 ~~~ keepalived 主备配置文件需改变  state MASTER  状态,优先级页需要改变,默认为抢占模式,即主故障后备生效,主恢复后备因为优先级再次失效 ~~~ global_defs { notification_email { 2222@qq.com } notification_email_from admin@loaclhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id test73 vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1q2w3e4r } virtual_ipaddress { # 192.168.36.179 192.168.36.179 dev eth1 label eth1:0 192.168.36.180 dev eth1 label eth1:1 } } ~~~ #### keepalived  监控脚本 ~~~ #keepalived 再改变状态即 MASTER 或 BACKUP 时执行脚本 cat /etc/keepalived/notify.sh #!/bin/bash contact='2012@qq.com' notify() { mailsubject="$(hostname) to be $1, vip 转移" mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac 调用方法 vrrp_instance 中调用 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" #判断本机是否可用,对vs权重进行调整,进而改变VIP的位置 (根据第三方文件判断本机服务是否正常) #主配置文件中声明 vrrp_script chk_down { script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 7 || exit 0" #script "/usr/bin/killall -0 nginx" #根据文件是否存在测试进程是否活跃 interval 1 weight -20 fall 3 rise 5 timeout 2 } #vrrp_instance 中调用 track_script { #chk_down chk_nginx } ~~~