一、背景
    根据当前某公司内部生产系统容器平台架构设计,在各生产线边缘机房部署容器平台,与数据中心容器平台形成纵向冗余,在此情况下,传统部署在数据中心机房的DNS系统成为容器平台业务服务的短板,一旦DNS系统出现故障或网络通信故障,将影响容器平台正常访问,原有的纵向冗余能力大大降低。
二、技术原理
         该方案利用BGP路由协议的多属性,可通过属性进行控制路由策略,从而决定客户端的访问路径,使得客户端访问就近站点;同时BGP协议的触发更新机制,网络中会及时删除已故障节点路由信息。DNS是基于UDP的无连接服务协议,客户端与DNS站点无持续会话传输数据,站点切换对用户影响很小(已丢失请求重传即可获取新数据)。
三、网络架构设计
 
 图1  网络架构示意图
拓扑说明
BGP AS号:64512(模拟骨干网),65511(模拟生产区一),65512(模拟数据中心)
IP地址:10.0.0.161,10.0.0.162分别为模拟生产区域一和骨干网络互联IP地址,
        10.0.0.181,10.0.0.182分别为模拟数据中心和骨干网络互联IP地址。
                   10.0.168.1为模拟生产区域一内DNS服务器真实IP地址,10.0.169.1为模拟数据中心内DNS服务器真实IP地址。10.1.1.6均为DNS服务器上的环回口IP地址。
客户端:10.1.168.11为生产区域一内客户端,172.16.16.12为模拟数据中心的其他服务器。
 
四、相关配置
4.1 网络设备
         4.1.1 骨干路由配置
bgp 64512 
router-id 10.0.255.121 
group BR internal 
peer BR connect-interface LoopBack0 
group DC external 
peer DC as-number 100 
peer 10.0.0.161 as-number 65511 
peer 10.0.0.169 as-number 65511 
peer 10.0.0.181 as-number 65512 
peer 10.0.6.2 group DC 
peer 10.0.6.6 group DC 
peer 10.0.255.122 group BR 
# 
address-family ipv4 unicast 
  balance 4 
  network 100.100.100.100 255.255.255.255 
  peer BR enable 
  peer DC enable 
  peer 10.0.0.161 enable 
  peer 10.0.0.169 enable 
  peer 10.0.0.181 enable 
4.1.2 生产区域配置

feature bgp 

router bgp 65511 

  address-family ipv4 unicast 

    network 10.1.168.0/24 

  neighbor 10.0.0.162 remote-as 64512 

    address-family ipv4 unicast 

  neighbor 10.0.168.1 remote-as 396385 

    address-family ipv4 unicast  

 4.1.3 数据中心配置

feature bgp 

router bgp 65512 

  router-id 10.0.255.10 

  address-family ipv4 unicast 

    network 172.16.16.0/24 

  neighbor 10.0.0.182 remote-as 64512 

    address-family ipv4 unicast 

neighbor 10.0.169.1 remote-as 396385 

    address-family ipv4 unicast 

4.2 服务器
4.2.1 服务器网卡配置
 
 图2 服务器环回口配置
 
 图3 DNS服务器1网卡配置
 图4 DNS 服务器2网卡配置
4.2.2 服务器路由软件配置
 
 图5 DNS服务器1路由配置
说明:生产区域内,通过对BGP路由进行设置no-advertise,对外宣告10.1.1.6路由后,接收改路由的邻居(骨干网)不再向外传递,仅生产区域内的路由表会有2条路由,且本区直连DNS为最佳路径。
 
 图6 DNS服务器2路由配置
4.2.3 服务器DNS服务
 
 图7  DNS服务器1域名配置
说明:生产区域内针对域名tang.com的A记录地址为10.0.168.1
 
 图8  DNS服务器1域名配置
说明:数据中心内针对域名tang.com的A记录地址为10.0.169.1
4.2.4 DNS服务检查
 
 图9  DNS服务器1域名解析监控状态检查
DNS服务器上需要对域名解析服务进行健康检查,一旦异常,将触发路由服务进程,进行关闭或者撤销路由发布
4.3 客户端配置
 
图10 客户端1网络配置
 
 
图11 客户端2网络配置
五、测试效果
5.1 正常情况下,生产区域内客户端访问dns访问最短路径,优先选择和本区域直连的DNS服务器。
 
 图12生产区域内路由表
   
 
图13客户端 10.1.168.11访问10.1.1.6路径
 
 图14 客户端110.1.168.11解析域名结果
 
 图15 客户端2 172.16.16.12访问10.1.1.6
 
 图16 客户端172.16.16.12 解析结果
 说明:两台终端均就近站点访问,解析结果按照对应的DNS服务器配置进行返回域名解析结果。
 
5.2 模拟生产区域1内DNS服务故障
    模拟对域名tan.com进行解析,但是DNS服务未正常返回结果,触发停止FRR服务[W1] 。
 
 
图17执行脚本,并检查FRR服务
注:后续将脚本设置为后台运行,并根据实际情况,修改监控指标。
5.3区域一内客户端户端访问DNS发生切换。
故障切换时客户端10.1.168.11访问10.1.1.6情况
 图18 客户端1 访问DNS
ping过程仅丢1个包,访问路径TTL值发生变化说明站点已经切换
 
 图19 客户端访问DNS路径
 
查看生产区域内网路设备路由表是否
 
 
图20 生产区域网络设备BGP路由表信息
在生产区域(65511)里,已经不存在本地直连DNS服务器的BGP路由,只有从骨干网学习到的路由,因此客户端10.1.168.11访问10.1.1.6需要分别经过64512、65512、396385三个区域。
 
 
图21 访问切换示意图
5.4 DNS服务故障恢复
    手动重新启动frr服务,对恢复情况进行验证。
 
 
图22 切换过程中访问情况
         重新启动FRR服务后,DNS服务器迅速与网络交换机建立了BGP邻居关联,并发布了10.1.1.6的路由更新,根据BGP选路原则,生产区域(65511)内访问10.1.1.6优先访问直连站点,所以TTL值也增大,ping过程未发生丢包。
六、结论
    经过以上环境和测试,完成了BGP Anycast 技术进行DNS服务多站点部署,实现客户端最短路径访问、多站点间进行相互冗余的目标。

[W1]通过停用FRR服务,会导致BGP 邻居关系down,如果频繁故障,可能会导致路由抖动。

参考资料:

[1]  https://yetiops.net/posts/anycast-bgp/

[2]  https://www.noction.com/blog/bgp-anycast

利用BGP Anycast 实现DNS 服务的高可用测试的更多相关文章

  1. 利用keepalive+mysql replication 实现数据库的高可用

    利用keepalive+mysql replication 实现数据库的高可用 http://www.xuchanggang.cn/archives/866.html

  2. 使用redis实现程序或者服务的高可用

    使用redis实现程序或者服务的高可用,就是将某一程序或服务部署在不同服务器上,或者是跨机房部署,当运行服务的服务器挂了之后,其他服务器上的该服务能立马顶上,这里我简单的使用redis实现这一目的. ...

  3. 学习heartbeat-03t实现web服务的高可用案例及维护要点

    8.Heartbeat实现web服务的高可用案例 8.1部署准备 通过web服务高可用案例来熟悉heatbeat软件的使用,用上面的两台服务器机器名分别为heartbeat-1-130和heartbe ...

  4. 分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  5. 分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

    原文:http://www.iteye.com/topic/1145651 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于Z ...

  6. Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试

    文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...

  7. Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试

    文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...

  8. Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移

    文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...

  9. DolphinScheduler 集群高可用测试:有效分摊服务器压力,达到性能最大优化!

    点击上方 蓝字关注我们 1 文档编写目的 Apache DolphinScheduler(简称DS)是一个分布式去中心化,易扩展的可视化DAG工作流任务调度平台.在生产环境中需要确保调度平台的稳定可靠 ...

  10. MariaDB Galera Cluster环境搭建及高可用测试

    一.服务器概况Galera Cluster需要至少三个节点,在此次实验过程中,三个节点IP地址:192.168.56.101192.168.56.102192.168.56.103OS为centos ...

随机推荐

  1. web自动化01-环境搭建

    1.自动化测试是什么? 借助工具实现 借助代码编写脚本实现  2.自动化测试需要掌握那些? web自动化测试基础 移动端自动化基础 pytest自动化测试框架 po设计模式 数据驱动 日志模块使用 自 ...

  2. 第一单元 .Net 平台介绍

    第一单元 .Net 平台介绍 学习编程,电脑基本配置(当然配置越高越好): 内存 :初期学习8 G,后期可能跟不上, 最好16 G以上 硬盘:500 G,5400 转速,至少C盘是固态,全是固态最好 ...

  3. 让你的代码动起来:Python进度条神器tqdm详解及应用实例

    各位Python高手,今天我要给大家介绍一个好用的库,它就是:tqdm tqdm在阿拉伯语中的意思是 "进展",所以这个库也被称为 "快速进展条".不得不说,这 ...

  4. Access+Trunk 配置

    实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 在SW1和SW2上创建聚合组 PC1 与 PC3 属于 VLAN 10 : PC2 与 PC4 属于 VLAN 20 利用 Access 与 T ...

  5. WPF中实现含有中心点Slider双向滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...

  6. 【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

    目录 一.开发背景 二.爬虫代码 2.1 爬微博列表 2.2 爬微博评论 2.3 导入MySQL数据库 三.可视化代码 3.1 大标题 3.2 词云图(含:加载停用词) 3.3 玫瑰图(含:snown ...

  7. 龙芯下如何进行.net core程序开发部署

    龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1..NET6..NET7版本.本文以.NETCore3.1在loongnix-serve ...

  8. Supervisor启动并管理Celery相关进程

    Supervisor启动并管理Celery相关进程 关于celery在运行过程中, 默认情况下是无法在关机以后自动重启的.所以我们一般开发中会使用supervisor进程监控来对celery程序进行运 ...

  9. 【C++ Primer】2.1 基本内置类型

    1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...

  10. Java判断101-200之间有多少个素数,并输出所有素数。

    代码如下: public static void main(String[] args) { //记录个数 int count = 0; //循环遍历 for(int i = 101;i <= ...