设为首页 收藏本站
查看: 813|回复: 0

[经验分享] lvs+keepalived+bind实现负载均衡高可用智能dns

[复制链接]

尚未签到

发表于 2018-12-30 06:26:21 | 显示全部楼层 |阅读模式
lvs+keepalived+bind实现负载均衡高可用智能dns

  整体架构:
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

  •   建几个目录:
  •   Sudo mkdir /usr/local/named/etc/zones
  •   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压力测试:
  使用queryperfdns压力测试
  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 会循环给出

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-657350-1-1.html 上篇帖子: 在Centos7玩转Mysql半同步和keepalived+MHA(二) 下篇帖子: 负载均衡--LVS+Keepalived
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表