整体架构:

1.IP地址规划:

Dns1:172.28.0.54

Dns2:172.28.0.55

Dr服务器主:172.28.0.57

Dr服务器从:172.28.0.67

Vip:172.28.0.99

原理过程:

Lvs+keepalived实现高性能高可靠性负载均衡,这里使用dr模式,客户机访问负载均衡服务器,会调度到后面的真实服务器上,真实服务器直接将结果返回,如果主调度服务器除了问题,vip会漂到从服务器继续提供负载均衡,主恢复后vip重新漂到主服务器,后面的真实服务器如果出现问题,会被剔除集群,直到恢复。

Lvs描述:

lvs说明:目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network AddressTranslation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和 Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术,它们的大致原理如下(我们将在其他章节对其工作原理进行详细描述),

Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。

针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:使用

比较多的是以下四种:

轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

第一部分智能dns主从实现

注意:dns主从服务器时间一定要同步,所有服务器的时间都有同步

1.下载bind9:

Wget http://www.isc.org/downloads/file/bind-9-9-5rc2/?version=tar.gz

Bind9.9.5目前最新稳定版本

2.安装:

Ubuntu默认没有C/C++编译环境所以先要安装好编译环境

sudo apt-get installbuild-essential

bind9使用默认需要openssl支持我们这里编译安装openssl

下载openssl-1.0.1f

Wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz

安装openssl

Sudo mkdir /usr/local/ssl

./config --prefix=/usr/local/ssl

Make && sudo make install

正式开始安装bind9

Tar xvf bind-9.9.5.tar.gz

Sudo mkdir /usr/local/named

Cd bind-9.9.5

./configure –enable-threads –prefix=/usr/local/named--enable-largefile --with-openssl=/usr/local/ssl

Make

Sudo make install

创建用户named用户,使用named用户运行dns

1.groupadd named

2.useradd -g named -s /sbin/nologin named

  1. 建几个目录:

  2. Sudo mkdir /usr/local/named/etc/zones

  3. Sudo mkdir /usr/local/named/log //保存日志就新建这个目录

3.配置

Master 配置主从使用tsig事务签名认证,dnssec-keygen -a HMAC-MD5 -b 128 -n HOSTxxxx 生成的秘钥,实现智能dns主从同步

Cd /usr/local/named/etc/

Vim named.conf

include"/usr/local/named/etc/named.conf.options"; //放配置

include"/usr/local/named/etc/named.conf.local"; //定义zone

include"/usr/local/named/etc/cnc";  //acl列表自定义ip地址

include"/usr/local/named/etc/chinanet"; //acl列表自定义ip地址

vim /usr/local/named/etc/named.conf.options

options {

directory "/usr/local/named";//修改默认路径

pid-file"/usr/local/named/var/run/named.pid";

allow-query-cache { any; }; //允许查询

};

//这里设置日志有多种级别日志一般不设置

//logging {

// channel query_log {

//       file"/usr/local/named/log/query.log"        versions 3 size 20m;

//     severity        info;

//  print-time        yes;

// print-category  yes;

//};

//category queries {

//      query_log;

// };

//};

//下面的是dnssec-keygen -a HMAC-MD5 -b 128 -n HOST xxxx 生成的秘钥,实现智能dns主从同步

key chinanet {

algorithm hmac-md5;

secret"kve3QMmhjXGZUZURb6mucQ==";

};

Vim /usr/local/named/etc/named.conf.local

view "chinanetzone" {

match-clients { key chinanet; chinanet; }; //前面的是key 后面的是acl

server 172.28.0.55 { keys { chinanet; }; };//定义从服务器,通过key同步

zone "test.com" {

type master;    //定义此区为主服务器,从服务器写slave

file "/usr/local/named/etc/zones/db.test";   //指定区资源文件的位置,区域文件随便取名字

allow-transfer { key chinanet;};允许通过key的服务器同步zone文件

//allow-transfer { 172.28.0.55;};

also-notify { 172.28.0.55;};

};

zone "." {

type hint;

file"/usr/local/named/etc/zones/db.root";

};

};

//反向解析根据条件看需不需要配置

//zone "172.in-addr.arpa" {

//     type master;    //定义此区为主服务器

//      file "/etc/bind/db.172";       //指定区资源文件的位置

//     };

Chown –R named:named/usr/local/named

Zones文件:

;

; BINDdata file for local loopback interface

;

$TTL    604800 ;其它服务器缓存保留时间

@       IN     SOA     spdns01.test.com.root.test.com. (

2         ; Serial

604800         ; Refresh

86400         ; Retry

2419200         ; Expire

604800 )       ; Negative Cache TTL

;

@       IN     NS      spdns01.test.com.

@       IN     NS      spdns02.test.com.

spdns01IN      A       172.28.0.57

spdns02IN      A       172.28.0.67

;spdns02        IN     A       172.28.0.55

www     IN     A       2.2.2.2

Slave配置:

Slave配置只有named.conf.local不同:

view "chinanetzone" {

match-clients { key chinanet; chinanet; };

server  { keys { chinanet; }; };

zone "test.com" {

type slave;    //定义此区为从服务器

file "/usr/local/named/etc/zones/db.slavechinanettest";   //指定区资源文件的位置,区域文件随便取名字

masters { 172.28.0.54; };

};

zone "." {

type hint;

file"/usr/local/named/etc/zones/db.root";

};

};

//zone "172.in-addr.arpa" {

//     type master;    //定义此区为主服务器

//      file "/etc/bind/db.172";       //指定区资源文件的位置

//     };

赋权 chown –R:named /usr/local/named

杀掉named进程sudo killall -9 named

这里为了方便我们可以写个bind自动启动脚本,实现开机自动启动:

#!/bin/bash

# named a network name service.

# chkconfig: 345 35 75

# description: a name server

if [ `id -u` -ne 0 ]

then

echo "ERROR:For bind to port 53,mustrun as root."

exit 1

fi

case "$1" in

start)

if [ -x /usr/local/named/sbin/named ]; then

/usr/local/named/sbin/named -c/usr/local/named/etc/named.conf –u named && echo . && echo'BIND9 server started'

fi

;;

stop)

kill `cat/usr/local/named/var/run/named.pid` && echo . && echo 'BIND9server stopped'

;;

restart)

echo .

echo "Restart BIND9 server"

$0 stop

sleep 10

$0 start

;;

reload)

/usr/local/named/sbin/rndc reload

;;

status)

/usr/local/named/sbin/rndc status

;;

*)

echo "$0 start | stop | restart|reload |status"

;;

esac

这里可以使用chkconfig实现开机自启动

Rndc 实现配置文件的更新:

配置 rndc 远程控制 DNS 服务器的基本流程:

1.  在每个受控服务器端使用 rndc-confgen 生成 key,配置 named.conf 文件允许被哪台

控制端服务器控制。

2.  在控***务器端将每个受控服务器端的 key 复制到本地,配置 rndc.conf 文件允许

控制哪些受控服务器

Rnd能够不停掉服务器进行配置很牛逼

在受控端也就是dns主从服务器端使用rndc-congen生成配置文件信息

./rndc-confgen -k mrndc-key(-k选项可以定义key名)

Rndc 不能在用root权限启动的dns服务器中运行一般对权限要求高为了安全

同样在从服务器使用命令./rndc-confgen

在主dns的named.conf文件中加入生成的秘钥例如:

key "rndc-key" {

algorithm hmac-md5;

secret "EyZKic6KKjt1agePxK41cA==";

};

controls {

inet * port 953

allow { any; } keys {"rndc-key"; };

};

在 rndc.conf中加入key:

key "rndc-key" {

algorithm hmac-md5;

secret "EyZKic6KKjt1agePxK41cA==";

};

options {

default-key "rndc-key";

default-server 127.0.0.1;

default-port 953;

};

Lvs+keepalived实现高可用高性能负载均衡

1.环境 ubuntu12.04  lvs

下载软件:

Wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

直接用sudoapt-get install 安装就行了

Wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz

modprobe -l | grep ipvs 查看内核支不支持 ubuntu支持

2.安装:

Ubunut内核自带支持这个lvs,如果是redhat 或者ubuntu还要重新编译内核

首先要安装好编译安装环境:

Sudo apt-get install ipvsadm

Sudo dpkg-reconfigure ipvsadm(这个命令可以图形界面配置ipvsadm)这里不使用

注意:安装keepalived需要ssl支持

Sudo apt-get install libssl-dev

Tar xvf keepalived-1.2.12.tar.gz

Sudo mkdir /usr/local/keepalived

./configure –prefix=/usr/local/keepalived

Make && sudo make install

3.配置keepalived

要实现负载均衡,首先对真实服务器进行配置如下

真实服务器上面的脚本: 防止回环 广播等 最好设置为开机自动启动脚本

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin

./lib/lsb/init-functions

VIP=172.28.0.99

case"$1" in

start)

/sbin/ifconfig lo:0 $VIP broadcast $VIPnetmask 255.255.255.255 up

/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"

;;

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"

;;

*)

echo "Usage: $0 {start|stop}"

exit 1

esac

exit 0

真实服务器需要的配置做成脚本实现,可以使用命令sudo chkconfig –add  realserver.sh

这样可以使用sudo service realserver.sh start/stop来运行脚本

设置开机自动启动这里使用:chkconfig命令

需要安装,sudo chkconfig –add realserver.sh

Sudo chkconfig realserver.sh on (如果报错/sbin/insserv:No such file or directory,则需要:

sudo ln -s /usr/lib/insserv/insserv/sbin/insserv 再用chkconfig命令)

sudo/usr/local/keepalived/sbin/keepalived –D 检查运行情况

启动/usr/local/keepalived/sbin/keepalived –f指定配置文件位置 否则默认查找配置文件/etc/keepalived/keepalived.conf

Keepalived配置文件如下

Sudo vim /etc/init.d/keepalived.conf

#vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

 notification_email {

***@**.com  //定义邮箱,自己定义

  }

 notification_email_from ***@rui.com

  smtp_server222.73.214.147

 smtp_connect_timeout 30

  router_id LVS_DEVEL

}

vrrp_instance VI_1 {

     state MASTER //从服务器这里写BACKUP

     interface eth0  //vip绑到哪个网卡上

  virtual_router_id 51

    priority 100  //优先级主比从大

   advert_int 1

  authentication {

auth_typePASS

      auth_pass 1111

   }

  virtual_ipaddress {

      172.28.0.99 //vip

   }

}

virtual_server 172.28.0.99 53 {  //ip和端口

   delay_loop 6

   lb_algorr  

   lb_kindDR    

  //persistence_timeout60  //同一IP的连接60秒内被分配到同一台realserver

  inhibit_on_failure  //服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除

  protocol UDP  //使用什么协议访问

   real_server 172.28.0.54 53 {  //负载均衡真实服务器和服务端口

       weight 3   //权重 rr算法没意义

    TCP_CHECK {

       connect_timeout10

       nb_get_retry3

          delay_before_retry 3

       }

   }

   real_server172.28.0.55 53 {  

       weight 1

      TCP_CHECK {

          connect_timeout 10

          nb_get_retry 3

          delay_before_retry 3

       }

   }

}

#下面的是一些例子,因为不支持udp检测,所以可以自定义脚本检查

#   MISC_CHECK      

#        {

#            connect_timeout 3

#           misc_path "/etc/keepalived/dnscheck.sh -h 192.168.0.11"

#        }

#    }

#    real_server192.168.0.12 53 {

#        weight1

#       MISC_CHECK      

#        {

#           connect_timeout 3

#           misc_path "/etc/keepalived/dnscheck.sh -h 192.168.0.12"

#        }

查看vip情况

sudo ip addr list 或者 ip addr show 查看vip

从服务器只需更改几个地方

1 state MASTER  改为stateBACKUP

2. priority 100 改到比主小

要实现keepalived开机自启动:

/usr/local/keepalived/sbin/keeplived 加到/etc/rc.local里面

Dns压力测试:

使用queryperf做dns压力测试

cd  bind-9.9.5/contrib/queryperf

./configure –prefix=/usr/local/named

make

不需要make install 可以直接使用这个工具,一般我们sudo cp queryperf/usr/local/named/bin

Queryperf的使用:

Queryperf  -sdns服务器–d 文件(文件格式:域名类型A, NS 等) -l发包时间长短

还有一个工具也可以进行dns性能测试:dnsperf

#!/bin/sh

SECS=60                #//运行时间

INPUT=test.txt      #//调用压力测试文件

SERVER=172.28.0.54            #//目标DNS服务器地址

./queryperf-s $SERVER -d $INPUT -l $SECS > out1 2>&1 &  #//第一个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out2 2>&1 &  #//第二个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out3 2>&1 &  #//第三个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out4 2>&1 &  #//第四个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out5 2>&1 &  #//第五个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out6 2>&1 &  #//第六个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out7 2>&1 &  #//第七个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out8 2>&1 &  #//第八个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out9 2>&1 &  #//第九个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out10 2>&1 &  #//第十个进程

./queryperf-s $SERVER -d $INPUT -l $SECS > out11 2>&1 &  #//第十一个进程

wait

grep'Queries per' out? | awk 'BEGIN { sum=0;}{ sum += $5;} END {printf("Total:%.1f qps\n", sum);}'    #//数据汇总

dns轮询设置

在 named.conf 中可以设置 bind 的 round-robin 的给出结果的顺序:
options {
rrset-order { order random; };
};
rrset-order 支持三个参数:fixed, random, cyclic 。
fix 会将多个A记录按配置文件的顺序固定给出
random 会随机给出
cyclic 会循环给出

lvs+keepalived+bind实现负载均衡高可用智能dns的更多相关文章

  1. lvs+keepalived+bind实现负载均衡高可用智能dns【转】

    转:https://www.cnblogs.com/mikeluwen/p/7068356.html 整体架构: 1.IP地址规划: Dns1:172.28.0.54 Dns2:172.28.0.55 ...

  2. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  3. Keepalived实现Nginx负载均衡高可用

    第一章:keepalived介绍 VRRP协议 目的就是为了解决静态路由单点故障问题的 第二章: keepalived工作原理 2.1 作为系统网络服务的高可用功能(failover) keepali ...

  4. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

  5. Lvs+keepAlived实现负载均衡高可用集群(DR实现)

    第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...

  6. 实现基于Haproxy+Keepalived负载均衡高可用架构

    1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...

  7. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

  8. JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  9. Nginx+keepalived实现负载均衡高可用配置

    1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...

随机推荐

  1. Centos7下yum安装mongodb

    简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...

  2. 我只能说,Spring Data REST真的很燥辣

    我自己写REST,到一半了,突然想试一下Spring Data REST,还真不是乱说, 燥辣得很,短时间全生成,快赶上DJANGO的速度了.怕了我. 参考文档: Spring Data REST入门 ...

  3. uva12265 贩卖土地 单调栈

    输入一个n*m的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 输入包含多组测试数据,第一行输入一个正整数N,表示输入样例 ...

  4. AC日记——开关灯 codevs 1690

    开关灯 思路: 线段树: bool懒标记维护: 更新区间时是区间总值减去当前值: 来,上代码: #include <cstdio> #include <cstring> #in ...

  5. MSSQL—列记录合并成一行

    在项目开发中,有时会碰到将列记录合并为一行的情况,例如根据地区将人员姓名合并,或根据拼音首字母合并城市等,下面就以根据地区将人员姓名合并为例,详细讲一下合并的方法. 首先,先建一个表,并添加一些数据, ...

  6. ZOJ 3940 Modulo Query (2016年浙江省赛E题,区间折叠 + map运用)

    题目链接  2016 ZJCPC Problem E 考虑一个开区间$[0, x)$对$a_{i}$取模的过程. $[0, x)$中小于$a_{i}$的部分不变,大于等于$a_{i}$的部分被切下来变 ...

  7. ReactiveCocoa(二)

    前言 通过ReactiveCocoa(一)的学习,相信大家对ReactiveCocoa有了一些基本认识吧.下面就让我们来学习ReactiveCocoa的一些基本使用吧! ReactiveCocoa基本 ...

  8. JavaScrip book

     1.<JavaScript: The Good Parts>中文版:<JavaScript语言精粹>2.<Professional JavaScript for Web ...

  9. Overview of iOS Crash Reporting Tools: Part 2/2

    Thanks for joining me for the second part of this two-part series on crash reporting services! The f ...

  10. 阅读 Android源码的一些姿势

    日常开发中怎么阅读源码 找到正确的源码 IDE 是日常经常用的东西,Eclipse 就不说了,直接从 Android Studio(基于 IntelliJ Community 版本改造)开始. 我们平 ...