#### 一,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
}
~~~
- 前言
- 服务器开发设计
- Reactor模式
- 一种心跳,两种设计
- 聊聊 TCP 长连接和心跳那些事
- 学习TCP三次握手和四次挥手
- Linux基础
- Linux的inode的理解
- 异步IO模型介绍
- 20个最常用的GCC编译器参数
- epoll
- epoll精髓
- epoll原理详解及epoll反应堆模型
- epoll的坑
- epoll的本质
- socket的SO_REUSEADDR参数全面分析
- 服务器网络
- Protobuf
- Protobuf2 语法指南
- 一种自动反射消息类型的 Protobuf 网络传输方案
- 微服务
- RPC框架
- 什么是RPC
- 如何科学的解释RPC
- RPC 消息协议
- 实现一个极简版的RPC
- 一个基于protobuf的极简RPC
- 如何基于protobuf实现一个极简版的RPC
- 开源RPC框架
- thrift
- grpc
- brpc
- Dubbo
- 服务注册,发现,治理
- Redis
- Redis发布订阅
- Redis分布式锁
- 一致性哈希算法
- Redis常见问题
- Redis数据类型
- 缓存一致性
- LevelDB
- 高可用
- keepalived基本理解
- keepalived操做
- LVS 学习
- 性能优化
- Linux服务器程序性能优化方法
- SRS性能(CPU)、内存优化工具用法
- centos6的性能分析工具集合
- CentOS系统性能工具 sar 示例!
- Linux性能监控工具集sysstat
- gdb相关
- Linux 下如何产生core文件(core dump设置)