DNS资源记录

DNS资源记录,第1张

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

SOA记录:start of authority,起始授权机构。该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。
格式如下:
alibabacom IN SOA dnsserveralibabacom mailalibabacom (
1
3h
1h
1w
1h )
第四列指定了"dnsserveralibabacom"为该域的master DNS服务器
第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点"",正如上面的例子" mailalibabacom ",其实际表示的是" mail@alibabacom "。
第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:
alibabacom IN SOA dnsserveralibabacom mailalibabacom ( 1 3h 1h 1w 1h )
前三列是声明性的语句,表示"alibabacom"这个域内的起始授权机构为第四列的值"dnsserveralibabacom"所表示的主机。第五列和第六列是SOA的附加属性数据。
每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。
注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

NS记录:name server,存储的是该域内的dns服务器相关信息。即NS记录标识了哪台服务器是DNS服务器。格式如下:
alibabacom IN NS dnsserveralibabacom
前三列仍然是声明性语句,表示"alibabacom"域内的DNS服务器(name server)为第四列值所表示的"dnsserveralibabacom"主机。
如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:
alibabacom IN NS dnsserver1alibabacom
alibabacom IN NS dnsserver2alibabacom
表示主机"dnsserver1alibabacom"和主机"dnsserver2alibabacom"都是域"alibabacom"内的dns服务器,但没有区分出主次dns服务器。
不少朋友搞不懂SOA记录,也很容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,SOA的名称"起始授权机构"所表示的意思也就容易理解了。

A记录:address,存储的是域内主机名所对应的ip地址。格式如下:
dnsserveralibabacom IN A 172161015
客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。
AAAA记录存储的是主机名和ipv6地址的对应关系。

PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:
161016172in-addrarpa IN PTR >linux下配置mysql主从同步的步骤
一、主机环境
主机:
master *** 作系统:rhel60
IP:172160100
MySQL版本:5147
从机:
slave *** 作系统:rhel60
IP:172160200
MySQL版本:5147
二、创建数据库
分别登录master机和slave机的mysql:mysql –u root –p
创建数据库:create database repl;
三、master机和slave机的相关配置
1、修改master机器中mysql配置文件mycnf,该文件在/etc目录下
在[mysqld]配置段添加如下字段
server-id=1
log-bin=mysql-bin
binlog-do-db=repl //需要同步的数据库,如果没有本行,即表示同步所有的数据库
binlog-ignore-db=mysql //被忽略的数据库
在master机上为slave机添加一同步帐号
grant replication slave on to 'replication'@'172160200' identified by '123456';
重启master机的mysql服务:service mysqld restart
用show master status 命令看日志情况

    redis集群模式,丢失master主服务器是无法继续工作的,所以随时都需要一个master节点。但是服务器宕机是经常出现的事情,集群本身是无法完成故障转移的,所以需要一个第三方的解决方案,帮redis集群完成故障转移(选择主节点、通知从节点修改同步master地址,让原来的主节点成为从节点)。

(1)首先sentinel也属于一种redis服务器,只不过启动时加载的配置文件不同。配置文件里包括了监控的主服务器列表(对,可以是多个主服务器,即就是多个集群)。

(2)sentinel通过配置文件中的主服务器IP:端口号,建立链接和订阅,就是一个双向的通道

(3)sentinel默认每10秒,向建立链接的主服务器,发送INFO命令;主服务器收到命令,返回主服务器信息。

可以看到,返回了主服务器的运行ID,重要的是:同步主服务器的从节点信息

(4)从步骤(3)中获取到的从节点信息,从节点的IP和端口。sentinel和从节点建立链接和订阅

(5)sentinel默认每10秒,向建立链接的从服务器,发送INFO命令,从服务器接收到命令后,返回从服务器信息
    主要包括了从服务器对应的master节点的地址:端口号,偏移量

(6)sentinel与主服务器和从服务器建立了链接和订阅,可以向主从服务器发送命令,也可以接收主从服务器的广播

订阅命令:subscribe _sentinel_:hello

通道名:hello

sentinel对hello频道的订阅会一直持续到sentinel和服务器之间的链接断开为止
sentinel向服务器通道发送的消息,其他与该服务器建立订阅关系的sentinel也会收到订阅通知,sentinel自己也会收到自己发出的消息的订阅通知

(7)sentinel默认会每两秒一次,向所有建立链接和订阅的主从服务器,发送广播消息

命令:publish_sentinel__:hello  "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"

可以看到主要包含
s_ip : sentinel自己 IP地址

s_port : sentinel自己端口号

s_runid : sentinel自己的运行ID

s_epoch : sentinel当前的配置纪元

m_name, m_ip, m_port, m_epoch : 当前监控服务器的名称(主或者从)、IP地址、端口号、当前配置纪元

这个消息,也会被其他订阅该通道的sentinel收到

sentinel在接收到订阅消息后(就是上文中自己与别的sentinel,publish的消息),首先过滤掉自己发,然后接收别人的消息,就能获取监听改主服务器的所有sentinel节点

(8)通过上一步,sentinel能够感知到其他监控主服务器的sentinel节点,然后和其他sentinel建立连接,最终,所有监视主服务器的sentinel节点组成了一个相关连接的网络!
sentinel会默认每1s向自己所建立连接的服务器发送PING命令,这些服务器包括(监视master的其他sentinel,master、salve服务器),根据收到的返回值,来确定目标服务器的状态

常见返回值:+PONG、-LOADING、-MASTERDOWN,含义在此处先不关注

判定条件:目标服务器在一定的时间内(配置文件字段:down-after-milliseconds的值),一直返回“失败”

对失败的定义:

(1)目标服务器没有在规定时间内返回(该时间可配置)

(2)目标服务器返回了上述三种返回值之外的值

确定一个目标服务器失败之后,会在sentinel自己的实例表中记录该实例的状态,用:

SRI_S_DOWN表示,S=subjective客观

注:一个master服务器会被多个sentinel监控,多个sentinel可能设置了不同的

down-after-milliseconds

        和我们设想的一样,单一的sentinel并不能决定目标master服务器的生死存亡,会拿着自己实例表里的“客观”下线的服务器地址和端口,去向同样监控这台服务器的sentinel询问,看看“别人”这个服务器到底下线没? 当能够从别的sentinel那里询问到“足够数量”的已下线(客观下线或者主观下线)结果后,sentinel就可以判断目标服务器真的下线了,就可以执行故障转移了。

(1)sentinel发送命令is-master-down-by-addr

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>

发送的目标:监控master服务器的其他sentinel

参数解析:ip、port=自己监控的master服务器的IP,端口,current_epoch=源sentinel当前的配置纪元,runid=源sentinel的唯一标识ID

(2)sentinel对命令is-master-dowm-by-addr的回复

        1) <down_state> :下线的状态,0-未下线,1-已下线

        2) <leader_runid> :当前sentinel的局部leader,为 “” 时表示没有leader

        3) <leader_epoch> :当前sentinel的局部leader的配置纪元,当没有leader时,该项为0

(3)sentinel收到命令is-master-down-by-addr的回复后

        sentinel收到足够数量(可配置)的“已下线”回复(即down_state=1),就会在自己的实例表里将对应的master服务器状态(flags)设置为 SRI_O_DOWN,O=Objective。

        监控同一个master服务器的sentinel,对客观下线的条件可以不一致,即收到多少已下线回复才认定客观下线,可以不尽相同。

        由于监控同一个master服务器的sentinel有很多,并不能决定是哪个sentinel去执行故障转移,所以需要多个sentinel进行选leader头结点。

        具体步骤:

        (1)sentinel通过向其他sentinel节点发送is-master-down-by-addr命令,已经可以判断当前master服务器是否客观下线

     (2)已经判断master服务器客观下线的sentinel,再次向其他节点发送
is-master-down-by-addr命令,携带自己的runId和配置纪元

这里再复习一遍命令 :
sentinel is-master-down-by-addr <ip>,<port>,<cur_epoch>,<runid>

    (3)目标sentinel收到源sentinel的 is-master…命令之后,执行以下判断

            1>判断epoch和自己的纪元是否相等,不相等直接舍弃这条命令

            2>判断自己的配置表里是否有局部leader,没有的话,将源sentinel的runid设置为自己的局部了leader

                如果已经有了局部leader,那么会返回自己的局部leader的信息

            3>对源sentinel的is-master-down-by-addr命令进行回复

示例:
        源sentinel向目标sentinel发送命令,
                 SENTINEL is-master-down-by-addr 127001 8080 0 11522852334a

        源sentinel收到命令的回复

                1    

                11522852334a

                0

        表示有一个sentinel将自己成功设置成为leader(需要把返回的runid和自己的runid比对)

            4>当过半的sentinel将自己成功设置为局部leader,标识选主成功,如果在一段时间内没有收到过半的成功数,那么会进行下一轮命令的发送,epoch递增+1

                例如,共有10个sentinel监视同一个master服务器,其中一个sentinel必须收到10/2+1=6个及以上的成功数,才能认为自己成功当选leader

(1)筛选master节点的备胎(即就是哪些slave节点可以成为新的master)

          选择master节点备胎就一个要求,数据尽量完整,状态尽量好

            1>删除,客观下线或者主观下线的slave服务器

            2>删除,在最近5s没有回复过头sentinel节点的INFO命令的slave服务器

            剩下的slave服务器,根据优先级进行排序,遇到优先级一样的,再根据偏移量排序(目的是筛选出和master服务器数据较同步的slave服务器)。再遇到偏移量一样的,继续根据runid排序,找出runid最小的(没有什么依据,只是个排序),至此,可以作为master的slave服务器就筛选好了。

    (2)slave服务器升级为master

            头sentinel向步骤(1)中筛选出来的slave服务器发送slaveof_no_one,发送完该转移命令。之后,头sentinel每秒一次的频率向上述slave服务器发送INFO命令,观察INFO命令返回的role字段,看是否变为master,变为master表示成功升级为master服务器。

   (3)修改原slave服务器列表的复制/同步目标

            头sentinel向原slave服务器列表发送命令:

slave of 127001:8080,修改slave的复制目标

   (4)修改已下线的master服务器为新master的slave节点

            头sentinel保持对已下线master的监控,当已下线master重新上线(对PING命令有回复),就对他发送slave of 127001命令,让其成为slave。

            至此,故障转移全部结束。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12658963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存