lvs+keepalived+nginx实战

################几个名词解释###############

名称
缩写
全拼
说明
VIP
虚拟IP
virtual ip address
VIP为Director用于向客户端计算机提供服务的IP地址,如:www.test.com域名就要解析到vip上提供服务
RIP
真实IP地址
Real Server Ip Address
在集群下面节点上使用的IP地址,物理IP地址
DIP
Director
Director IP Address
用于连接内外网络的IP地址,物理网卡上的IP地址,是负载均衡器上的IP
CIP
客户端主机地址
Client IP address
客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址

2.关于ip_forward:

IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。

首先内网主机向外网主机发送数据包,由于内网主机与外网主机不在同一网段,所以数据包暂时发往内网默认网关GIP处理,而本网段的主机对此数据包不做任何回应。由于内网主机的SIP是私有的,禁止在公网使用,所以必须将数据包的SIP修改成公网上的可用IP,这就是网关收到数据包之后首先要做的事情--IP地址转换。然后网关再把数据包发往外网主机。外网主机收到数据包之后,只认为这是网关发送的请求,并不知道内网主机的存在,更不知道源IP地址是SIP而不是FIP,也没必要知道,目的主机处理完请求,把回应信息发还给网关的FIP。网关收到后,将目的主机返回的数据包的目标IP即FIP修改为发出请求的内网主机的IP地址即SIP,并根据路由表将其发给内网主机。这就是网关的第二个工作--数据包的路由转发。内网主机只要查看数据包的DIP与发送请求的SIP相同,就会回应,这就完成了一次请求。

3.关于Linux Pam:https://www.cnblogs.com/hftian/p/6944133.html

--PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中"插入"所需鉴别功能模块,从而真正实现了"鉴别功能,随需应变"。
--PAM验证模块的配置文件,存放位置 /etc/security中,如pam_limits.so验证模块对应的配置文件limits.conf,pam_group.so验证模块对应的配置文件group.conf。
PAM验证模块和应用程序的对应关系,存放位置/etc/pam.d文件夹。通过修改此文件夹下的配置文件,可以为应用选定具体的验证模块
--要使/etc/security/limits.conf 文件配置生效,必须要确保 PAM验证模块pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中有:
session  required  /lib/security/pam_limits.so
--64位地址是:/lib64/security/pam_limits.so 否则本地即使输入正确密码也无法登陆。

配置文件格式:
语法:Service  model_type  control_flag  model_path  options
--Service :使用PAM验证模块的应用程序,如ftp、telnet、login等。其中other一行指本文件中没有单独列出的其他应用程序;
-----验证模块的类型,主要有以下几种 auth :鉴别类模块   account:账户类模块   session:会话类模块       password:口令类模块
--Control_flag:对模块验证成功或者失败的结果的处理情况
-----Required:该模块验证成功是用户通过鉴别的必要条件。只有当应用程序对应的所有带有required标记的模块全部成功后,该应用程序才能通过 鉴别。同时,如果任何带有         required标记的模块出现了错误,PAM并不立刻将错误信息返回给应用程序,而是在所有模块都调用完毕后,再将错误信息返回给调用它的应用程序。
-----Requisite:与required相似,只有带有此标记的模块返回成功后,用户才能通过鉴别,不同之处在于,一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束。----------Optiona: 即使该模块验证失败,用户仍能通过鉴别。在PAM体系中,带有该标记的模块失败后,将继续处理下一模块。
Limits文件限制用户进程解析
PAM验证模块/lib/security/pam_limits.so主要是限制用户会话过程中对各种系统资源的使用。其对应的配置文件/etc/security/limits.conf其格式为:
Domain  type item
用户名/组名软/硬限制 项目
Domain:指被限制的用户名或组
Soft:当前系统生效的设置值(soft限制不能比hard限制高)
-      :同时设置了soft和hard的值
data——最大数据大小(KB)
memlock——最大可用内存空间(KB)
nofile——最大可以打开的文件数量
stack——最大堆栈空间(KB)
nproc——最大运行进程数
maxlogins——用户可以登录到系统最多次数
环境变量文件/etc/profile的更改也是为了修改对当前用户的进程限制。
-n:设置内核可以同时打开的文件描述符的最大值。
-u:设置用户最多可开启的程序数目。
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited。
虚拟内存:ulimit -v unlimited

(4)ifconfig命令:

---BROADCAST,MULTICAST,UP,LOWER_UP > 是net_device flags,网络设备的状态标识。UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,即网线插着。MTU1500 最大传输单元 MTU 为 1500,这是以太网的默认值。
---网络包是层层封装的。MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。正文里面有 IP 的头、TCP 的头、HTTP 的头。如果放不下,就需要分片来传输。
---

#######################################################

1.ipvsadm安装:

(1)编译环境准备:

yum install libnl* libpopt* -y
yum install popt-static -y

(2)安装:

tar -zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make
make install

(3)使用:https://blog.csdn.net/scape1989/article/details/21085659

ipvsadm:
      1、管理集群服务
           添加:-A -t|u|f service-address [-sscheduler]
                      -t:tcp协议的集群服务
                      -u:udp协议的集群
                      -f:FWM:防火墙标记
           修改:-E
           删除:-D
                      -D -t|u|f service-address    
                   例如:# ipvsadm -A -t 172.16.100.1:80 -s rr
      2、管理集群服务中的RS
           添加:-a -t|u|f service-address -rserver-address [-g|i|m] [-w weight]
                      -t|u|f service-address:事先定义好的某集群服务
                      -r server-address:某RS的地址,在NAT模型中,可以使用IP:PORT事先端口映射
                      [-g|i|m]:LVS类型
                           -g:DR
                           -I:TUN
                           -m:NAT
                      [-w weight]:定义服务器权重
       3、修改:-e
       4、删除:-d -t|u|f service-address -r server-address
                   例如:#ipvsadm -a -t 172.16.100.1:80 -r192.168.10.8 -m
                   例如:#ipvsadm-a -t 172.16.100.1:80 -r 192.168.10.9 -m
       5、查看
                    -L|l[options]
                           -n:数字格式显示主机地址和端口号
                           --stats:统计信息
                           --rate:速率
                           --timeout:显示tcp、tcpfin和udp会话的超时时间值
                           --daemon
                           --sort:跟协议、地址、端口进行排序,默认为升序
                           -c:显示当前ipvs连接状况
       6、删除所有集群服务:
                    -C:清空ipvs规则
       7、保存规则
                    -S:(用输出重定向进行保存)
                    格式:#ipvsadm -s >/path/to/somefile
       8、载入此前的规则:
                    -R
                     格式:#ipvsadm -R </path/to/somefile

2.keepalived安装:至于启动哪一个,主要是依据优先级,然后才根据设定的主备关系进行;

(1)编译环境准备:

yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel libnl libnl-devel

(2)安装:

tar -zxvf keepalived-2.0.12.tar.gz
cd keepalived-2.0.12
./configure
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
systemctl enable keepalived
mkdir  -p  /etc/keepalived
cp /usr/local/sbin/keepalived /usr/sbin/

(3)keepalived.conf配置文件:由于采用dr模式,所以前后端口必须一致;

–master_example

! Configuration File for keepalived
global_defs {
router_id LVS_01 //本服务器的名称
}
vrrp_instance VI_1 { //定义VRRP热备实例
state MASTER //热备状态,MASTER表示主服务器,BACKUP表示从服务器
interface ens33 //承载VIP地址的物理接口
virtual_router_id 51 //虚拟路由器的ID号,每个热备组保持一致
priority 110 //优先级,数值越大优先级越高
advert_int 1 //通告间隔秒数(心跳频率)
authentication { //热备认证信息,每个热备组保持一致
auth_type PASS //认证类型
auth_pass 6666 //密码字符串
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多个
10.101.1.100
}
}
virtual_server 10.101.1.100 8888 { //虚拟服务器地址(VIP)、端口
delay_loop 6 //健康检查的间隔时间(秒)
lb_algo rr //轮询(rr)调度算法
lb_kind DR //直接路由(DR)群集工作模式
persistence_timeout 60 //连接保持时间(秒)
protocol TCP //应用服务器采用的是TCP协议
real_server 10.101.1.70 8888 { //第一个Web服务器节点的地址、端口
weight 1 //节点的权重
TCP_CHECK { //健康检查方式
connect_port 8888 //检查的目标端口
connect_timeout 3 //连接超时(秒)
nb_get_retry 3 //重试次数
delay_before_retry 3 //重试间隔
}
}
real_server 10.101.1.59 8888 { //第二个Web服务器节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

–master

! Configuration File for keepalived
global_defs {
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.101.1.100
}
}
virtual_server 10.101.1.100 8880 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.101.1.59 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.101.1.187 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

–backup

! Configuration File for keepalived
global_defs {
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface em1
virtual_router_id 51
priority 105
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.101.1.100
}
}
virtual_server 10.101.1.100 8880 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.101.1.59 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.101.1.187 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

(4)启动:systemctl start keepalived:

<span style="font-size: 9pt; color: rgb(51, 51, 51); font-family: Monaco;"–<日志:tail -f /var/log/messages:

Feb 13 05:50:32 jumpserver Keepalived[51727]: Starting Keepalived v2.0.12 (01/25,2019), git commit v2.0.11-47-gce6cf748+
Feb 13 05:50:32 jumpserver Keepalived[51727]: Running on Linux 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 (built for Linux 3.10.0)
Feb 13 05:50:32 jumpserver Keepalived[51727]: Command line: '/usr/local/sbin/keepalived' '-D'
Feb 13 05:50:32 jumpserver Keepalived[51727]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived[51728]: Starting Healthcheck child process, pid=51729
Feb 13 05:50:32 jumpserver Keepalived[51728]: Starting VRRP child process, pid=51730
Feb 13 05:50:32 jumpserver systemd: Started LVS and VRRP High Availability Monitor.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering Kernel netlink reflector
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering Kernel netlink command channel
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Assigned address 10.101.1.70 for interface ens33
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Assigned address fe80::a280:336:15f:676 for interface ens33
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering gratuitous ARP shared channel
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: (VI_1) removing VIPs.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: (VI_1) Entering BACKUP STATE (init)
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(11,12)]
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: (Line 30) Unknown keyword 'nb_get_retry'
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: (Line 39) Unknown keyword 'nb_get_retry'
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Gained quorum 1+0=1 <= 2 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Activating healthchecker for service [10.101.1.59]:tcp:8880 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Activating healthchecker for service [10.101.1.187]:tcp:8880 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:36 jumpserver Keepalived_healthcheckers[51729]: TCP connection to [10.101.1.187]:tcp:8880 success.
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Receive advertisement timeout
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Entering MASTER STATE
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) setting VIPs.
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:38 jumpserver Keepalived_healthcheckers[51729]: TCP connection to [10.101.1.59]:tcp:8880 success.
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100

(5)主从同步测试:可以看到VIP在主备之间进行切换;

---停掉master keepalived:
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Backup received priority 0 advertisement
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Receive advertisement timeout
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Entering MASTER STATE
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) setting VIPs.
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
---重新启动master
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) Master received advert from 10.101.1.70 with higher priority 110, ours 105
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) Entering BACKUP STATE
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) removing VIPs.

3.nginx安装:

(1)编译环境准备:

sudo yum check-update || sudo yum update -y
sudo yum groupinstall -y 'Development Tools' && sudo yum install -y vim
sudo yum install -y epel-release
sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel
sudo yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel

(2)安装:

tar -xzf nginx-1.15.7.tar.gz
cd nginx-1.15.7
sed -i -e 's/1.15.7//g' -e 's/nginx\//TDTWS/g' -e 's/"NGINX"/"TDTWS"/g' src/core/nginx.h
./configure --prefix=/usr/local/nginx  --with-http_stub_status_module  --with-http_ssl_module --with-stream --with-stream_ssl_module
make
make install
/usr/sbin/groupadd -f www
/usr/sbin/useradd -g www www

(3)启动:启动前可以用-t参数判断下配置文件是否有问题,或者直接在启动参数中添加-t;修改配置文件可以用./nginx -s reload

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

(4)停止

--从容停止:ps -ef|grep nginx ;kill -QUIT 2072
--快速停止:kill -TERM 2132 或 kill -INT 2132
--强制停止:pkill -9 nginx

(5)管理和升级:

#查看nginx进程
ps -ef|grep nginx
#平滑启动nginx
kill -HUP `cat /var/run/nginx.pid`
或者
nginx -s reload
其中进程文件路径在配置文件nginx.conf中可以找到。
平滑启动的意思是在不停止nginx的情况下,重启nginx,重新加载配置文件,启动新的工作线程,完美停止旧的工作线程。
#完美停止nginx
kill -QUIT `cat /var/run/nginx.pid`
#快速停止nginx
kill -TERM `cat /var/run/nginx.pid`
或者
kill -INT `cat /var/run/nginx.pid`
#完美停止工作进程(主要用于平滑升级)
kill -WINCH `cat /var/run/nginx.pid`
#强制停止nginx
pkill -9 nginx
#检查对nginx.conf文件的修改是否正确
nginx -t -c /etc/nginx/nginx.conf 或者 nginx -t
#停止nginx的命令
nginx -s stop或者pkill nginx
#查看nginx的版本信息
nginx -v
#查看完整的nginx的配置信息
nginx -V

—升级:分为四个步骤,包括软件下载、预编译、编译、配置

wget http://www.nginx.org/download/nginx-1.4.2.tar.gz
获取旧版本nginx的configure选项
/usr/local/nginx/sbin/nginx -V
编译新版本的Nginx
tar  -xvf  nginx-1.4.2.tar.gz
cd nginx-1.4.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --with-stream_ssl_module
make
备份旧版本的nginx可执行文件,复制新版本的nginx这行文件
mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/
测试新版本nginx是否正常
/usr/local/nginx/sbin/nginx -t
平滑重启升级nginx
kill -QUIT `cat /usr/local/nginx/log/nginx.oldbin` ##关闭旧版nginx
验证nginx是否升级成功
/usr/local/nginx/sbin/nginx  -V显示最新编译的版本信息即可。

—重新编译添加新模块:

进入nginx源码目录
cd nginx-1.3.2
以下是重新编译的代码和模块
./configure --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make 千万别make install,否则就覆盖安装了
make完之后在objs目录下就多了个nginx,这个就是新版本的程序了
备份旧的nginx程序
cp /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.bak
把新的nginx程序覆盖旧的
cp objs/nginx /usr/local/nginx/sbin/nginx
测试新的nginx程序是否正确
/usr/local/nginx/sbin/nginx -t
nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
平滑重启nginx
/usr/local/nginx/sbin/nginx -s reload
查看ngixn版本极其编译参数
/usr/local/nginx/sbin/nginx -V

4.dr模式测试:realserver上必须启动脚本,将loIP地址设置成VIP的地址

#!/bin/sh
#LVS Client Server
VIP=192.1.105.200
case  $1  in                                                                                                                                                                                                                     
start)                                                                                                                                                                                                                           
    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
    /sbin/route add -host $VIP dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p >/dev/null 2>&1
    echo "RealServer Start OK"
    exit 0
;;                                                                                                                                                                                                                               
stop)
    ifconfig lo:0 down
    route del $VIP >/dev/null 2>&1
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Stoped OK"
    exit 1
;;
*)
    echo "Usage: $0 {start|stop}"
;;
esac

###############几个问题##############搬运工###################

(1)让lvs server和real server工作在同一台服务器上:https://www.douban.com/note/598634431/

(2)LVS的几个重点知识:http://www.360doc.com/content/14/0918/15/1123425_410457105.shtml

(3)DR原理详细介绍:https://blog.csdn.net/liupeifeng3514/article/details/79038451  https://www.cnblogs.com/leezhxing/p/4613500.html

1.DR数据流向:现在客户端CLient访问www.a.com ,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接(TCP三次握手,只是建立连接没有传送数据),之后客户端发送HTTP请求,LVS在VIP上收到之后,根据hash策略,从后端realserver中选出一台作为此次请求的接受者,假设为RIP1,LVS将请求包的目的mac地址更改为RIP1的mac,然后封装后转发给后端的RIP1,同时将该链接记录在hash表中。RIP1的某一块网卡,比如eth0,接收到这个转发包看到mac地址是自己的,于是就转发给上层的IP层,IP层解开包后,发现目的的IP地址也是自己,因为VIP也配置在我们的一块non-arp的网卡上(比如lo:0),然后根据IP首部的类型字段(这里是TCP),把请求送给TCP,然后TCP根据目的端口80,传给应用层的Apache,Apache处理完请求之后,将数据传给TCP,TCP将源端口更改为80 ,源IP更改为VIP,目的端口更改为客户端的端口,目的IP更改为Client的IP,打包后给IP层,IP层根据目的地址进行路由,然后经过网络返给Client,完成了一次请求,而不经过LB;
2.DR模式的优缺点
优点:
    可扩展性强,ld不会成为业务增长的瓶颈
缺点:
    节点不能跨网段,即real server和ld必须在一个物理网段中,一定程度上可能会使用多个公网IP
    realserver上须有一块网卡不接受arp广播
3.DR模式与arp,由于DR模式使用的是更改目的的mac地址,所以难免要和arp打交道。arp -a可以查看当前服务器上面的arp缓存;https://www.jianshu.com/p/a682ecae9693
一般来说客户端是不会和我们的服务器在同一个网段的,那么请求就会经过我们的服务器所在网段的路由设备上,我们知道在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,所以当请求包到达这路由设备上之后,若路由设备的arp表中没有VIP对应的
MAC,就会广播一个arp请求,在这里我们将LVS和real server上都配置了VIP,那么按照理论他们都会响应这个arp请求,那路由器的arp表就会乱了。所以,我们就需要只让LVS上响应VIP的arp请求,而real server 不响应;Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求; 要防止这样的话,就需要更改下我们的一些内核参数:

    net.ipv4.conf.lo.arp_ignore = 1

    net.ipv4.conf.all.arp_ignore = 1

正常情况下只写第二条就是了,all 是指所有设备的interface,当all和具体的interface比如lo,按照最大的值生效;另外一个linux的特性就是,对于一个从realserver发出的arp请求,其源IP是VIP,而出口不会是lo,这里假设是eth0,那么这个arp请求包里里面,源IP就是VIP,源MAC是eth0的mac,目的IP是网关,那么路由器在接收到这个请求的时候,会将将自己的相应接口的硬件地址放在arp响应包中,同时将请求包中的源IP及MAC放在arp高速缓存中,那这下可就乱套 了,就会使真正的VIP得不到正确的请求了.这是因为,正常的情况下,arp的请求中源IP是出去的所在接口的地址,mac也是出去的接口的mac,但linux在默认情况下却不是这样的,如果一个接口发出的arp请求须经另一个出口出去的时候,源IP就不是所出去接口的IP,那么将内核参数设置为 2 相应的解决了这个问题。

    net.ipv4.conf.lo.arp_announce = 2

    net.ipv4.conf.all.arp_announce = 2
2.PC1的网卡收到bit流,通过网卡解封装,查看数据报文中目的MAC地址为本机的MAC,继续解封装,查看目的IP地址为自己的IP地址,继续解封装,查看TCP报文,通过查看源端口,确定是与PC2连接的端到端连接,在解封装,发现为FTP报文,提交给上层协议进行处理,应用程序通过读取FTP报文,把报文返回到输出界面。

(4)tcpdump抓包:tcpdump -i eth1 port 80 -Xx(注:如果没有tcpdump,就yum -y install tcpdump)   wireshark查看;

(5)关于loopback回环端口,回环接口可以配置,而且是一个网络号,并非主机号,除非把掩码配置为32bits。https://blog.csdn.net/yydcj/article/details/8447567

Loopback接口是虚拟接口,是一种纯软件性质的虚拟接口。任何送到该接口的网络数据报文都会被认为是送往设备自身的。大多数平台都支持使用这种接口来模拟真正的接口。这样做的好处是虚拟接口不会像物理接口那样因为各种因素的影响而导致接口被关闭。事实上,将Loopback接口和其他物理接口相比较,可以发现Loopback接口有以下几条优点:
1.       Loopback接口状态永远是up的,即使没有配置地址。这是它的一个非常重要的特性。    
2.       Loopback接口可以配置地址,而且可以配置全1的掩码,可以节省宝贵的地址空间。    
3.       Loopback接口不能封装任何链路层协议。
IP协议中的loopback地址。RFC2606中明确指出了loopback地址的标准域名为localhost。在IPv4中,其对应的IP地址一直是127.0.0.1;理论上,整个127IP段(127.0.0.0~127.255.255.255)的IP地址都为loopback地址,与localhost对应。在IPv6中,localhost对应的IP地址为0:0:0:0:0:0:0:1,一般写作::1。
在网络设备中,loopback被用来代表某些用于管理目的的虚拟接口,其含义并没有"回环"的意思。loopback虚拟接口会分配到一个IP地址,但是这个IP地址不会对应到实际的物理接口。网络设备中的loopback地址主要用于管理目的,例如设备发出的报警。网络设备中的应用程序(管理程序)使用loopback地址发送可接收数据流,而不是使用实际物理接口的地址。对外部来说,直接使用loopback地址来查看设备对应的信息(如报警信息),与网卡的物理地址无关。。我们也可以把这种地址理解为网络设备提供的服务的地址。
在通信领域,loopback可以用作将接收到的信号或数据直接返回给发送者的测试方法。作为一种测试方法,很多通信设备都可以配置端口的数据发送模式(例如all ones模式),来检测同一个端口上的信号接收。这种测试也叫"回环测试"。

(6)关于手动添加ipvsadm规则删除:http://www.mamicode.com/info-detail-121656.html

#删除vip地址
  /sbin/ifconfig eth0:0 down
#关闭ip转发
  echo 0 > /proc/sys/net/ipv4/ip_forward
#清除ipvsadm 规则
  /sbin/ipvsadm -C
#删除锁文件
  /bin/touch $LOCKFILE
ipvsadm  -A  -t  10.101.1.100:8880  -s  rr
ipvsadm  -a  -t  10.101.1.100:8880  -r  10.101.1.59  -g  -w 2
ipvsadm  -a  -t  10.101.1.100:8880  -r  10.101.1.187  -g  -w 2
ipvsadm  -D  -t  10.101.1.100:8880
ipvsadm  -d  -t  10.101.1.100:8880  -r  10.101.1.59
ipvsadm  -d  -t  10.101.1.100:8880  -r  10.101.1.187

(7)安装配置:https://www.cnblogs.com/a-can/p/123ddd.html   https://www.cnblogs.com/liuyisai/p/5990645.html

(8)采坑专业户:http://baijiahao.baidu.com/s?id=1585299978849584757&wfr=spider&for=pc

(9)抓包分析网络问题:https://www.cnblogs.com/shizouwei/p/9072186.html

(10)网桥工具brctl使用:https://blog.csdn.net/skh2015java/article/details/82466718

(11)dnsmasq服务:http://blog.51cto.com/yanconggod/1977598  haproxy:https://www.linuxidc.com/Linux/2018-04/151871.htm

#################分割线####################遇到问题即解决:

1.报错:./configure: error: the HTTP rewrite module requires the PCRE library.

—sudo yum -y install zlib zlib-devel openssl openssl–devel pcre pcre-devel

2.报错:Nginx错误:[emerg] getpwnam(“www”) failed  原因:没有创建WWW这个用户;

/usr/sbin/groupadd -f www 
/usr/sbin/useradd -g www www

3.查看内核版本: uname -sr

4.报错:ip_vs.h:15:29: fatal error: netlink/netlink.h: No such file or directory

yum install libnl* libpopt* -y
yum install popt-static -y

5.Nginx: Too Many Open Files 错误和解决方案,主要原因是Linux / Unix 设置了软硬文件句柄和打开文件的数目:https://www.cnblogs.com/kevingrace/p/5815592.html

(1)临时生效方法:
--ulimit -n 30000   // 用ulimit -n 30000 修改只对当前的shell有效,退出后失效。
--nginx.conf文件添加:worker_rlimit_nofile 30000;
(2)永久生效:
---修改硬件配置:在nginx服务器可以打开的文件数量受你操作系统的限制,编辑/etc/sysctl.conf 添加如下内容:
    fs.file-max = 70000 保存退出,重新读取系统配置sysctl -p
    再编辑 /etc/security/limits.conf 添加内容:
    * soft nofile 10000
    * hard nofile 30000
    此修改内容需要reboot系统才能生效,所以务必从新启动下服务器。
---修改Nginx系统的文件限制,使用nginx worker_rlimit_nofile Option
    # set open fd limit to 30000
    worker_rlimit_nofile 30000;
    sudo service nginx reload
(3)查看命令:
    ulimit -Hn
    ulimit -Sn
ulimit : 设置最大进程数和最大文件打开数, 这个一般是系统优化的必要手段.
1) 临时修改
为了优化linux性能,可能需要修改这个最大值。临时修改的话ulimit -n 655360就可以了,重启后失效。
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]# ulimit -n 655360
[root@localhost ~]# ulimit -n
655360
2) 永久修改
修改/etc/security/limits.conf文件, 在文件末尾添加
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
=============================
上面配置内容中:
*               代表针对所有用户
noproc     是代表最大进程数
nofile      是代表最大文件打开数
如上修改后重启服务或服务器,如果发现没更改过来, 还需要修改下面梁文文件
在/etc/security/limits.d/90-nproc.conf文件末尾添加
[root@localhost ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 655360
* hard nproc 655360
在/etc/security/limits.d/def.conf文件末尾添加
[root@localhost ~]# vim /etc/security/limits.d/def.conf
* soft nofile 655360
* hard nofile 655360
然后重启后生效

6.主备都有VIP:(VI_1) Received advert from 10.101.1.70 with lower priority 110, ours 115, forcing new election

—抓包发现主备都在进行VRRP广播:tcpdump -i em1 vrrp -n,正常情况下备机进行vrrp广播只可能是没有收到master的心跳包,查看发现备机防火墙将信息拦截了;

—抓包要带上网口-i,否则报错:tcpdump: NFLOG link-layer type filtering not implemented

############################内容跟进###############################################

1.keepalived简介:https://blog.csdn.net/qq_24336773/article/details/82143367

--Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成;
--Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点,后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程;
--VRRP协议与工作原理:在现实的网络环境中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议,熟悉网络的学员对VRRP协议应该不陌生,它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器;VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的;每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送 的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性;
3》Keepalvied的工作原理:上面我们介绍了Keepalived通过VRRP实现高可用性的工作原理,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理;Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:
--在网络层: 我们知道运行这4个重要的协议,互联网络IP协议,互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点;
--在传输层: 提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP 的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉;
--在应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除;
Keepalived 是运行在lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败 切换,提高系统的可用性;

–基本架构:

SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;
Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;
Core componets 这部分主要包含了5个部分;
Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议

–与Heartbeat、Corosync比较:

Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的vrrp虚拟路由冗余协议方式;Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。
  所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。

–配置文件:keepalived.conf:http://outofmemory.cn/wiki/keepalived-configuration

—–global_defs区域主要是配置故障发生时的通知对象以及机器标识:

global_defs {
     notification_email {
         a@abc.com
         b@abc.com
         ...     }
     notification_email_from alert@abc.com
     smtp_server smtp.abc.com
     smtp_connect_timeout 30
     enable_traps
     router_id host163
 }
* notification_email 故障发生时给谁发邮件通知。
* notification_email_from 通知邮件从哪个地址发出。
* smpt_server 通知邮件的smtp地址。
* smtp_connect_timeout 连接smtp服务器的超时时间。
* enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。
* router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

—–static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

—–vrrp_script区域用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。

vrrp_script chk_http_port {
     script "</dev/tcp/127.0.0.1/80"
     interval 1
     weight -10
 }
以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

——vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

——vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

vrrp_sync_group VG_1 {
     group {
         inside_network   # name of vrrp_instance (below)
         outside_network  # One for each moveable IP.
         ...
     }
     notify_master /path/to_master.sh
     notify_backup /path/to_backup.sh
     notify_fault "/path/fault.sh VG_1"
     notify /path/notify.sh
     smtp_alert
 }
 vrrp_instance VI_1 {
     state MASTER
     interface eth0
     use_vmac <VMAC_INTERFACE>
     dont_track_primary
     track_interface {
         eth0
         eth1
     }
     mcast_src_ip <IPADDR>
     lvs_sync_daemon_interface eth1
     garp_master_delay 10
     virtual_router_id 1
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 12345678
     }
     virtual_ipaddress {
         10.210.214.253/24 brd 10.210.214.255 dev eth0
         192.168.1.11/24 brd 192.168.1.255 dev eth1
     }
     virtual_routes {
         172.16.0.0/12 via 10.210.214.1
         192.168.1.0/24 via 192.168.1.1 dev eth1
         default via 202.102.152.1
     }
     track_script {
         chk_http_port
     }
     nopreempt
     preempt_delay 300
     debug
     notify_master <STRING>|<QUOTED-STRING>
     notify_backup <STRING>|<QUOTED-STRING>
     notify_fault <STRING>|<QUOTED-STRING>
     notify <STRING>|<QUOTED-STRING>
     smtp_alert
 }
* notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。
* notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
* smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
* state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
* interface 节点固有IP(非VIP)的网卡,用来发VRRP包。
* use_vmac 是否使用VRRP的虚拟MAC地址。
* dont_track_primary 忽略VRRP网卡错误。(默认未设置)
* track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
* mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
* lvs_sync_daemon_interface 绑定lvs syncd的网卡。
* garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。
* virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
* priority 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
* advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
* authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
* virtual_ipaddress vip,不解释了。
* virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。
* virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。
* nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。
当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。
* preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。

——-virtual_server_group和virtual_server区域:virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。

virtual_server IP Port {
     delay_loop <INT>
     lb_algo rr|wrr|lc|wlc|lblc|sh|dh
     lb_kind NAT|DR|TUN
     persistence_timeout <INT>
     persistence_granularity <NETMASK>
     protocol TCP
     ha_suspend
     virtualhost <STRING>
     alpha
     omega
     quorum <INT>
     hysteresis <INT>
     quorum_up <STRING>|<QUOTED-STRING>
     quorum_down <STRING>|<QUOTED-STRING>
     sorry_server <IPADDR> <PORT>
     real_server <IPADDR> <PORT> {
         weight <INT>
         inhibit_on_failure
         notify_up <STRING>|<QUOTED-STRING>
         notify_down <STRING>|<QUOTED-STRING>
         # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET|SSL_GET {
             url {
                 path <STRING>
                 # Digest computed with genhash
                 digest <STRING>
                 status_code <INT>
             }
             connect_port <PORT>
             connect_timeout <INT>
             nb_get_retry <INT>
             delay_before_retry <INT>
         }
     }
 }
* delay_loop 延迟轮询时间(单位秒)。
* lb_algo 后端调试算法(load balancing algorithm)。
* lb_kind LVS调度类型NAT/DR/TUN。
* virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。
* sorry_server 当所有real server宕掉时,sorry server顶替。
* real_server 真正提供服务的服务器。
* weight 权重。
* notify_up/down 当real server宕掉或启动时执行的脚本。
* 健康检查的方式,N多种方式。
* path 请求real serserver上的路径。
* digest/status_code 分别表示用genhash算出的结果和http状态码。
* connect_port 健康检查,如果端口通则认为服务器正常。
* connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟

2.lvs:

–ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术;

–IPVS的三种转发模式:根据负载均衡器转发客户端请求以及RS返回响应机制的不同,将IPVS的转发模式分为三种:NAT,DR,FULLNAT。(还有一种IP TUNNEL模式,IP通道技术,接触比较少)

——DR模式(Direct Routing):DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。

DR模式的特点:数据包在LB转发过程中,源/目的IP端口都不会变化LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。每台RS上都必须在环回网卡上绑定LB的虚拟服务IP,因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致;因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。RS处理完请求后,响应直接回给客户端,不再经过LB,因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。LB和RS须位于同一个子网,因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。

——NAT模式下,请求包和响应包都需要经过LB处理。当客户端的请求到达虚拟服务后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。当收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的IP。

NAT模式的特点:LB会修改数据包的地址,对于请求包,会进行DNAT;对于响应包,会进行SNAT。LB会透传客户端IP到RS(DR模式也会透传),虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。需要将RS的默认网关地址配置为LB的浮动IP地址,因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网,因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。

–持久化连接:

9》lvs持久性连接
      对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款的时 候,我们当然不希望                https的443跳转到另外一台REAL SERVER上,很显然应该是同一REAL SERVER才对,这时候就要用到基于防火墙标记的持久连接,通过定义端口的姻亲关系来实现。在生产环                 境中用的最多的也是PNMP即基于防火墙标记的持久 连接,好了引子就说到这下面我们就来详细说说LVS的持久连接;  
    1>PPC(Persistent Port Connections):将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;(持久端口连接)
        例如:client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2
        缺陷:期望访问不同的端口到同一台RS上,无法实现。
        配置:
            ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600
            ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2
            ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
    2>PCC(Persistent Client Connections):将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;(持久客户端连接)
        说明:PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
        缺陷:定向所有服务,期望访问不同的Real Server无法实现。
        配置:
          ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600
          ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2
          ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
    3>PNMPP(Persistent Netfilter Marked Packet Persistence):持久防火墙标记连接,根据iptables 的规则,将对于某类服务几个不同端口的访问定义为一                                                                                                                    类;
      先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 Real Server上去,后台的Real Server 并不识别这些标记。将持久和防             火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server上去。
    案例:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制。
    配置:        
        iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
        iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8
        ipvsadm -A -f 8 -s rr -p 600
        ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
        ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
     4>持久连接命令
      1.ipvsadm -A|E … -p timeout
      2.选项
      3.-p timeout 指定持久连接时长,默认为360秒,单位是秒,即6分钟
http://www.it165.net/admin/html/201307/1565.html

LVS+Keepalived+nginx部署文档.docx

##########nginx负载均衡策略#############

当后端是缓存服务器时,经常使用一致性哈希算法来进行负载均衡。
使用一致性哈希的好处在于,增减集群的缓存服务器时,只有少量的缓存会失效,回源量较小。
在nginx+ats / haproxy+squid等CDN架构中,nginx/haproxy所使用的负载均衡算法便是一致性哈希。
我们举个例子来说明一致性哈希的好处。
假设后端集群包含三台缓存服务器,A、B、C。
请求r1、r2落在A上。
请求r3、r4落在B上。
请求r5、r6落在C上。
使用一致性哈希时,当缓存服务器B宕机时,r1/r2会仍然落在A上,r5/r6会仍然落在C上
也就是说这两台服务器上的缓存都不会失效。r3/r4会被重新分配给A或者C,并产生回源。
使用其它算法,当缓存服务器B宕机时,r1/r2不再落在A上,r5/r6不再落在C上了。
也就是说A、B、C上的缓存都失效了,所有的请求都要回源。
这里不介绍一致性哈希算法的基本原理,如果不了解,先花个10分钟看下这篇文章:
http://www.codeproject.com/Articles/56138/Consistent-hashing
在分析模块代码之前,先来看下nginx所实现的一致性哈希算法。

原文:https://blog.csdn.net/zhangskd/article/details/50256111

#######################

Ubuntu系统安装注意事项:https://blog.csdn.net/fduffyyg/article/details/86648737

–https://www.2cto.com/kf/201804/738752.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据