第九十六天 : LVS负载均衡

Linux Cluster :

Cluster : 计算机集合, 为解决某个特定问题组合起来形成的单个系统;

Linux Cluster 类型 :

LB : Load Balancing, 负载均衡;()
HA : High Avaiibality, 高可用;( 通过冗余的方式让活动主机出现问题时取而代之, 并具有原主机一致的功能)
HP : High Performance, 高性能;(组合多台计算机分散计算量)

 系统扩展方式:

Scale UP:向上扩展
Scale Out:向外扩展
Cluster

LB Cluster :

实现 :

硬件 :

F5 Big-IP
Citrix Netscaler
A10 A10

软件 :

lvs : Linux Virtual Server (内核级别实现)
nginx :
haproxy :(实现功能与nginx相似)
ats :

基于工作协议层次划分(承前启后) :

传输层 : (通用解决方案)(DIP : DPORT)(四层路由器)
lvs :
nginx : (基于stream机制模拟调度)
haproxy : (基于TCP模型)
应用层 : (应用专用)(根据请求模型分类进行分发)
proxy sferver:

http:nginx, httpd, haproxy(mode http), …
fastcgi:nginx, httpd, …
mysql:mysql-proxy, …

VS : 根据请求报文的目标IP和目标协议将其调度转发至某realserver, 根据调度算法来挑选

Director 和各RS 都得配置实用VIP

lvs : ipvsadm/ipvs
报文的流程 : PREROUTING —> INPUT上的ipvs —-> POSTROUTING
ipvsadm : 用户空间的命令行工具, 规则管理器, 用于管理集群服务及RealServer
ipvs : 工作与内核空间
lvs 集群的类型 :

lvs-nat : 修改请求报文的目标IP
lvs-dr : 封装新的MAC地址
lvs-tun : 在原请求IP报文之外新加一个IP首部
lvs-fullnat : 修改请求报文的源和目标IP

lvs-nat :

多目标IP的DNAT机制, 通过将请求报文中的目标地址和目标端口修改为某挑出的RS和RIP的PORT实现转发

1. RIP 和DIP 必须在同一个IP 网络, 且应该使用私网地址; RS的网关要指向DIP
2. 请求报文和响应报文都必须经由Director转发, Director易于成为系统瓶颈
3. 支持端口映射, 可修改请求报文的目标PORT;
4. vs 必须是Linux 系统, rs 可是任意系统

LVS

lvs-dr :

通过为请求报文重新封装一个MAC首部进行转发, 源MAC 是DIP 所在接口的MAC, 目标MAC是某挑选出的RS的RIP所在接口的MAC地址, 源IP/PORT, 以及目标IP/PORT均保持不变

1. 确保前端路由器将目标IP为VIP的请求报文发完Director :
a. 在前端网关左静态绑定
b. 在RS 上使用arptables
c. 在RS 上修改内核参数以限制ARP通过及应答基本

arp_announce

echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1  > /proc/sys/net/ipv4/conf/lo/arp_ignore

arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2  > /proc/sys/net/ipv4/conf/lo/arp_announce

2. RS 的RIP 可以使用私网地址, 也可以是公网地址, RIP 与DIP 在同一网络, RIP 的网关不能指向DIP, 以确保响应报文不会经由Director
3. RS跟Director要在同一个物理网络;
4. 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
5. 不支持端口映射;

报文从那个接口出去源IP就为此接口的IPLVS-DR

1. DIP, VIP, RIP 都应该是公网地址
2. RS 的网关不能, 也不可能指向DIP
3. 请求报文要经由Director, 但响应不能经由Director
4. 不支持端口映射
5. RS 的OS 得支持隧道功能

为了支持dr模式, 有下列几种方法解决 :

1. ARPtables 将IP和MAC地址进行绑定
2. 内核参数, 将VIP地址绑定在一个比较特殊的接口上, 使其不能直接在内网响应请求
3. 路由器设置 (有路由器的管理权限)

lvs-fullnat :

同时修改请求报文和源IP地址和目标IP地址进行转发
CIP —> DIP
VIP —> RIP
1. VIP 是公网地址, RIP和DIP是私网地址, 通常不在

ipvs scheduler 根据其调度时是否考虑当前RS的负载情况, 可分为动态方法和静态方法.(调度算法)

静态方法 :

RR : roundrobin 轮询
WRR : Weighted RR 加权轮询(考虑服务器的权重(服务器的服务能力))
SH : Source Hashing 源IP地址HASH, 实现 session sticy(WRR 是其原生算法), 完成会话绑定, 将来自于同一个IP地址的请求始终发往第一次挑中的RS, 从而实现会话的绑定.
DH : Destination Hashing 目标地址HASH, 将发往同一个目标地址的请求始终发至第一次挑中的RS
动态方法 : 主要根据每RS 当前的负载状态及调度算法进行调度;
LC : Last Connections
Overhead = activeconns*256+inactiveconns (最初的时候, 自上而下的进行接收请求)
WLC : Weighted LC 加权LC
Overhead = (activeconns*256+inactiveconns)/weight
SED : Shortest Expection Delay 最短期望延迟
Overhead = (activeconns*256+inactiveconns + 1)/weight
NQ : Never Queue 不排队算法

LBLC : Locality-Based LC 动态的DH算法
LBLCR : LBLC with Replication 带复制功能的LBLC

ipvs 集群 :
(先定义服务, 在定义集群)
集群服务 :
服务上的RS :
ipvsadm (管理集群, 管理集群服务, 查看)
ipvsadm命令:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]

管理集群服务:增、改、删;
增、改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

删:

ipvsadm -D -t|u|f service-address

service-address:

-t|u|f:

-t: TCP协议的端口,VIP:TCP_PORT
-u: TCP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字;

[-s scheduler]:指定集群的调度算法,默认为wlc;

管理集群上的RS:增、改、删;

增、改:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

删:

ipvsadm -d -t|u|f service-address -r server-address
server-address:

rip[:port]

选项:

lvs类型:

-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重;权重越高优先级越高

清空定义的所有内容:

ipvsadm -C

查看:
ipvsadm -L|l [options]

–numeric, -n:numeric output of addresses and ports 数字格式显示IP和PORT
–exact:expand numbers (display exact values) 精确值
–connection, -c:output of current IPVS connections 显示IPVS连接
–stats:output of statistics information 统计数据
–rate :output of rate information 速率

保存和重载:

ipvsadm -S = ipvsadm-save
ipvsadm-save > /path/file
ipvsadm -R = ipvsadm-restore
ipvsadm-restore < /path/file

重置清零 :
ipvsadm -Z

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port         CPS(每秒连接数量)    InPPS(每秒入站报文数)   OutPPS(每秒出站报文数)    InBPS   OutBPS
-> RemoteAddress:Port
TCP  192.168.48.142:80                   1        6        4      474      454
-> 10.1.99.99:80                       0        3        2      232      217
-> 10.1.99.100:80                      0        3        2      242      237

同一个Director 可负载多个集群

负载均衡的设计要点 :

1. 是否需要回话保持
2. 是否需要共享存储

共享存储 : DS(分布式存储)
数据同步 : rsync + inotify 实现数据同步

设计要点 :
1. RIP与DIP在同一IP网络, RIP的网关要指向DIP
2. 支持端口映射
lvs-dr :
为了提升网络的承载能力的设计方案

dr 模型中, 各主机上均需要配置VIP, 解决地址冲突的方式有三种 :

1. 在前端网卡做静态绑定;
2. 在各RS使用arptables;
3. 在个RS修改内核参数, 来限制arp响应和通告的级别;

限制响应级别 : arp_ignore

0 : 默认值, 表示可使用本地任意接口上配置的任意地址进行响应
1 : 仅在请求目标IP 配置在本地主机的接收到请求报文接口上时, 才给予响应;
限制通告级别 : apr_announce

第七十八天 : DNS 服务及配置

DNS (domain name server)  : 域名查询服务

2016100311421

一级域 : .com .org .gov .edu .net

国家域 : .cn

反向域 : in-addr-arpa

正向解析 : FQDN —> IP

反向解析 : IP —> FQDN

查询 :

递归查询 : recursion

迭代查询 : iteration

在进行DNS查询的时候, 所遵循的顺序如下:

本机host文件 —> 本地缓存 —> DNS —> 服务器缓存(清除缓存使用rndc flush (此工具稍后详解) )

资源记录类型 :

Resource Record

所有资源记录类型中的FQDN都必须以 . 结尾, 否则系统会自动补全Zone Name 到未添加 . 的域名后面~

SOA : (一个数据库只能有一个 )Start Of Authority 起始授权

nextkara.com.    600    IN    SOA    admin.mail.com.    (

01 ; 版本号

1H ; 同步( 刷新 )时间间隔

10M ;  同步失败重试时间间隔

1D ; 缓存过期时间

12H ); 错误缓存时间

    括号前后要加空格, 最开始的name 的value 可以用@ 来代替, 方便其他地方使用@的定义可以在配置文件中的zone “domain name”来定义, 或者使用$ORIGIN 来定义@的值, 此记录每个数据库文件中仅能有一个.

NS : Name Server 域名服务器(的定义)

@    600    IN    NS    dns.nextkara.com

@    600    IN    NS    dns2.nextkara.com

此处@表明所要解析的区域名, 每一条NS记录在下方都要增加一条关于NS的A记录用于查找DNS服务器的IP

MX : Mail eXchange 邮件交换服务器

@    600    IN    MX    10    mail

@    600    IN    MX    20    mail2

倒数第二个字段为邮件服务器的优先级, 高优先级(数字越小, 优先级越高)的服务器无响应的话才会使用低优先级的

A : Address (FQDN —> IP )只能定义在正向区域文件中

www    600    IN    A     192.168.48.122

www    600    IN    A     192.168.48.123

多个主机使用同一个name则表示使用轮询的方式来进行解析

AAAA : Address (FQDN —> IPv6 )

CNAME : 别名记录 A 为 B  的别名

ftp    600    IN    CNAME    www

PTR : IP —> FQDN 指针记录, 将对应的IP地址转换为对应的域名

只能定义在指定的反向区域文件中, 所省略的内容根据配置文件中的所定义的Zone Name (包括了主机的网络地址, 数据库文件中写的为主机地址)

配置文件内容及选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 大部分配置选项未定义的话, 会自动采用每个选项的默认选项
options {
        listen-on port 53 { 127.0.0.1; }; // 监听IP和端口, 无此选项则默认网卡上所有可用IP
        listen-on-v6 port 53 { ::1; }; // 监听IPv6和端口, 无此选项则默认网卡上所有可用IP
        directory       "/var/named"; // 区域文件存放目录
        dump-file       "/var/named/data/cache_dump.db"; //统计数据
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; }; // 允许查询的主机列表, 用于主从同步和区域传送

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recurs ion.
         - If you are building a RECURSIVE (caching) DNS server, you need to ena ble
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable  access
           control to limit queries to your legitimate users. Failing to do so w ill
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes; //允许递归查询, 开启此选项会加大服务器的运行压力

        dnssec-enable yes; //安全相关的选项, 未定义则不启用
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key"; // 未定义则不

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
//根域的区域文件
zone "." IN {
        type hint;
        file "named.ca";
};
//用户自定义的区域文件配置选项存放的路径
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

201610031431001图 1-2 : 根域名服务器简化配置

201610031435001图1-3 : com域服务器简化配置

201610061911001

201610061913001

图1-4 : nextkara.com 域服务器简化配置

DNS 的进阶配置 :

主从复制

子域授权

转发服务器

访问控制

智能DNS

1. 主从复制

主从同步的时候, 应该先对主服务器进行配置重载, 然后再对从服务器进行同步.
On Master : (1) 确保区域文件中为每个服务配置NS记录, 并且在向正向区域文件需要从每个服务器的NS记录中
在分布式环境中, 让多台服务器彼此通讯, 基于某一应用彼此协同工作的进程或服务, 都应该让时间同步, 避免出现因为时间而产生的错误

在主服务器的zone数据库文件中加入从服务器的NS记录和A记录, 添加完成后使用命令重载配置文件

201610062050001然后在从服务器上加修改/etc/named.conf 文件中的内容, 如下图所示:

201610062103001然后使用rndc reload 重载配置即可开始主从复制

2.子域授权

可参考之前的.com服务器配置图, 就是在本地域之上再加上一个授权解析域, 在区域文件中加入子域的NS记录和A记录

正向解析区域授权子域的方法 :

(下例是com域授权nextkara.com域进行解析)
nextkara.com.     IN    NS    dns.nextkara.com.
dns.nextkara.com.    IN    A    192.168.48.156
子域的授权是直接在父域的区域文件所定义的一条NS记录和一条A记录

3.转发服务器

定义转发 : 被转发的服务器必须允许为当前服务做递归
    (1) 区域转发 : 仅转发对某特定区域的解析请求 ;
        zone “Zone_Name” IN {
            type forward;
            forward {first | only };
            forwarders { Server_IP; };
        };
    (2) 全局转发 : 针对凡本地没有通过zone定义的区域查询请求, 通通转给某服务器 ;
        options {
            forward { only | first }
            forwarders { Server IP ; }
        };

4.访问控制(ACL)

bind 中的安全控制选项 :
    ACL : 访问控制列表 , 把一个地址或多个地址归并为一个命名的集合, 随后通过此名称即可对此全集内所有的主机实现统一调用;
    acl ACL_NAME {
        HOST_IP;
        HOST_IP2;
    };
bind 有四个内置的ACL :
    none : 没有一个主机
    any : 任意一个主机
    local : 本机
    localnet : 本机所在的IP所属的网络
配置文件中访问控制指令 :
    allow-query { }; 允许查询的主机; (白名单)
    allow-transfer { }; 允许向哪些主机做区域传送
    allow-recursion { }; 允许哪个主机向此主机发起递归查询请求;
    allow-update { }; 运行动态更新区域数据库文件中内容 ( 有变化主动向DNS服务器注册, 不安全, 不推荐使用 )

5.智能DNS (基于View 机制)

视图 view :
    优先级越高, 越写在前面.
    view VIEW_NAME {
        match-clients { 192.168.48.0/24; } //用于匹配acl
        zone ZONE_NAME {
            ….
        };
        ….
    };

201610062153001

补充 :

dig命令 :

dig @server name type

dig -t TYPE hostname [ +trace ]

+[no]trace:跟踪解析过程 : dig +trace magedu.com
+[no]recurse
:进行递归解析
测试反向解析:
dig -x IP = dig –t ptr reverseip.in-addr.arpa
模拟区域传送:
dig -t axfr ZONE_NAME @SERVER
dig -t axfr magedu.com @10.10.10.11
dig –t axfr 100.1.10.in-addr.arpa @172.16.1.1
dig -t NS . @114.114.114.114
dig -t NS . @a.root-servers.net

rndc命令 :

rndc COMMAND
COMMAND:

reload: 重载主配置文件和区域解析库文件
reload zone: 重载区域解析库文件
retransfer zone: 手动启动区域传送过程,而不管序列号是否增加
notify zone: 重新对区域传送发通知
reconfig: 重载主配置文件
querylog: 开启或关闭查询日志文件/var/log/message
trace: 递增debug一个级别
trace LEVEL: 指定使用的级别
notrace: 将调试级别设置为 0
flush:清空DNS服务器的所有缓存记录

排错参考 :
SERVFAIL:The nameserver encountered a problem while
processing the query.
可使用dig +trace排错,可能是网络和防火墙导致
NXDOMAINThe queried name does not exist in the zone.
可能是CNAME对应的A记录不存在导致
REFUSEDThe nameserver refused the client’s DNS
equest due to policy restrictions.
可能是DNS策略导致

NOERROR不代表没有问题,也可以是过时的记录
查看是否为权威记录,
flags:aa标记判断
被删除的记录仍能返回结果,可能是因为
*记录存在
如:
*.example.comIN A 172.25.254.254
注意“ .”的使用
避免
CNAME指向CNAME记录,可能产生回环
test.example.com. IN CNAME lab.example.com.
ab.example.com. IN CNAME test.example.com.
正确配置PTR记录,许多服务依赖PTR,如sshd,MTA
正确配置轮询round-robin记录