DNS 主从同步原理

  • 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 根据序列号的变化。
  • 从DNS:从可以单独修改,主从不会报错。但从修改后,主端同步给从后 从端修改数据会丢失
  • 主从原理:从会监听主的 TCP 53 端口,它会隔一段时间去探测 主配置文件中的序列号,如果主端 序列号更新后 从端探测到会 将主端内容 同步到本地。
  • 同步模式:从主动探测时间比较缓慢,可以设置主端,每次变更序列号时主动将,数据信息,推送给从端。

DNS实验环境

master服务器:172.16.2.116

slave1服务器: 172.16.2.225

关闭selinux。

关闭iptables或者正确设置。

安装步骤

1.安装软件

yum install -y bind bind-utils bind-chroot

说明:

  • bind是主程序
  • bind-utils是工具包,包括dig、nslookup等NDS命令
  • bind-chroot为bind提供一个伪装的根目录以增强安全性(将“/var/named/chroot/”文件夹作为BIND的根目录)
  • /etc/named.conf,/etc/named.rfc1912.zones是主配置文件
  • /var/named/named.ca是根区域解析库文件
  • /var/named/named.localhost, /var/named/named.loopback 是本机和环回地址的解析库文件
  • rndc---remote name domain controller这是一个辅助管理工具,默认情况下与BIND安装在同一主机,而且只能通过127.0.0.1连接named进程,监听的端口号是TCP/953。

2.修改主服务器配置文件

2.1配置named.conf文件

这个配置文件主要分3段内容,options是全局配置,logging是日志配置,最后是区域解析库配置以及所包含的区域解析库文件配置。

只修改第二行和最后一行为any,(生产环境最好配置上转发?)

options {
listen-on port 53 { any; }; #修改为any
listen-on-v6 port 53 { ::1; };
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 { any; };  #修改为any
     forwarders { 119.29.29.29; };

2.2编辑/etc/named.rfc1912.zones在文件末尾添加一个正向解析区域和一个反向解析区域

 1 zone "hanli.com" IN {
2 type master;          #定义区域类型,type可选值为:hint(根的)|master(主的)|slave(辅助的)|forward(转发)
3 file "hanli.com.zone";
4 allow-transfer { 172.16.2.225; }; #指定允许转发的目标主机,即从服务器
5 };
6 zone "2.16.172.in-addr.arpa" IN {
7 type master;          
8 file "2.zone";
9 allow-transfer { 172.16.2.225; };
10 };

修改后检查下:这个命令会同时检查named.conf和named.rfc1912.zones两个文件

# named-checkconf
没有任何输出表示 /etc/named.conf没有语法错误

 2.3 在/var/named目录下创建hanli.com.zone正向解析库文件和2.zone反向解析库文件

[root@master] /var/named$ vim hanli.com.zone
$TTL 1D
@ IN SOA dns1.hanli.com. mail.hanli.com. (
2018030422
2H
10M
1W
1D
)
@ IN NS dns1.hanli.com.
@ IN NS dns2.hanli.com.
@ IN MX 10 mail.hanli.com.
dns1 IN A 172.16.2.116
dns2 IN A 172.16.2.225
mail IN A 172.16.2.116
www IN A 172.16.2.116

检查正向解析库文件有没有错误

[root@master] /var/named$ named-checkzone "hanli.com" hanli.com.zone
zone hanli.com/IN: loaded serial 2018030422
OK

 注意事项:

  • 区域解析库文件第一个记录必须是SOA记录,必须有NS记录并且正解区域要有NS记录的A记录,反解则不需要有NS记录对应的A记录。
  • $TTL表示宏定义,TTL(Time- To-Live),dns记录在本地DNS服务器上保留的时间
  • @符号可代表区域文件/etc/named.conf里面定义的区域名称,即:"hanli.com."。
  • 2018030422 ;标识序列号,十进制数字,不能超过10位,通常使用日期
  • 2H ;刷新时间,即每隔多久到主服务器检查一次,此处为2小时,实验环境可以设置小一点
  • 4M ;重试时间,应该小于刷新时间,此处为4分钟,实验环境可以设置小一点
  • 1D ;过期时间,此处为1天
  • 2D ;主服务器挂后,从服务器至多工作的时间,此处为2天)
  • 这个文件里所有的域名结尾的点号一定不能省略。
  • 区域解析库文件是放在/var/named目录下,由named进程是以named用户运行,因此区域解析库文件的属组应设置为named。

反向解析库文件

[root@master] /var/named$ vim 2.zone
$TTL 1d
@ IN SOA dns1.hanli.com. mail.hanli.com. (
2018030422;
2H;
10M;
1W;
1D;
)
IN NS dns1.hanli.com.
IN NS dns2.hanli.com.
116 IN PTR www.hanli.com.
116 IN PTR mail.hanli.com.
116 IN PTR dns1.hanli.com.
225 IN PTR dns2.hanli.com.
~

注意事项

  • 反向解析数据文件里面只有SOA、NS、PTR资源记录,所有A记录都要改为PTR记录,名称为IP地址,IP地址可以写全也可以简写,如果写全则是IP地址反写加上.in-addr.arpa.例如:116.2.16.172.in-addr.arpa. PTR资源记录的值为域名。

检测反向解析库配置有没有错误

[root@master] /var/named$ named-checkzone "2.16.172.in-addr.arpa" 2.zone
zone 2.16.172.in-addr.arpa/IN: loaded serial 2018030422
OK

正向解析区域检查没问题

查看权限:目录下文件,属组应为named用户

[root@master] /var/named$ ll
total 24
-rw-r--r--. 1 root named 342 Mar 4 23:05 2.zone
drwxr-x---. 7 root named 61 Mar 4 18:26 chroot
drwxrwx---. 2 named named 23 Mar 4 18:38 data
drwxrwx---. 2 named named 31 Mar 4 18:46 dynamic
-rw-r--r--. 1 root named 643 Mar 4 23:05 hanli.com.zone
-rw-r-----. 1 root named 2281 May 22 2017 named.ca
-rw-r-----. 1 root named 152 Dec 15 2009 named.empty
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
-rw-r-----. 1 root named 168 Dec 15 2009 named.loopback
drwxrwx---. 2 named named 6 Jan 22 21:30 slaves

2.4 启动named服务,并测试

# systemctl start named.service

使用dig -t 测试正向解析

[root@master] /var/named/chroot/etc/named$ dig -t A web.hanli.com @172.16.2.116

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> -t A web.hanli.com @172.16.2.116
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36950
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.hanli.com. IN A ;; ANSWER SECTION:
web.hanli.com. 86400 IN CNAME www.hanli.com.
www.hanli.com. 86400 IN A 172.16.2.116 ;; AUTHORITY SECTION:
hanli.com. 86400 IN NS ns1.hanli.com.
hanli.com. 86400 IN NS ns2.hanli.com. ;; ADDITIONAL SECTION:
ns1.hanli.com. 86400 IN A 172.16.2.116
ns2.hanli.com. 86400 IN A 172.16.2.116 ;; Query time: 1 msec
;; SERVER: 172.16.2.116#53(172.16.2.116)
;; WHEN: Sun Mar 04 22:16:52 CST 2018
;; MSG SIZE rcvd: 144

使用dig -x 测试反向解析

[root@master] /var/named$ dig -x 172.16.2.225 @172.16.2.116

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> -x 172.16.2.225 @172.16.2.116
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29042
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;225.2.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION:
225.2.16.172.in-addr.arpa. 86400 IN PTR dns2.hanli.com. ;; AUTHORITY SECTION:
2.16.172.in-addr.arpa. 86400 IN NS dns2.hanli.com.
2.16.172.in-addr.arpa. 86400 IN NS dns1.hanli.com. ;; ADDITIONAL SECTION:
dns1.hanli.com. 86400 IN A 172.16.2.116
dns2.hanli.com. 86400 IN A 172.16.2.225 ;; Query time: 1 msec
;; SERVER: 172.16.2.116#53(172.16.2.116)
;; WHEN: Mon Mar 05 13:19:37 CST 2018
;; MSG SIZE rcvd: 147

至此DNS主服务器已经配置完毕并能正常工作。

说明:

通常在应用中,DNS的反向解析并不是很重要,可以不配置,当服务器中有域名作为邮件服务器时,此时可以配置反向解析,因为邮件中过滤垃圾邮件的技术通常是解析邮箱地址,如果IP地址不能反解成一个域名则视为垃圾邮件。

3、从服务器配置172.16.2.225

前提条件:

  • 两台主机可以不一定处在同一网段,但是两台主机之间必须要实现网络通信;
  • 辅助DNS服务器必须要有主DNS服务器的授权,才可以正常操作。

3.1、安装bind

3.2、编辑/etc/named.conf将监听IP地址改一下,其它不需要更改

options {
listen-on port 53 { 172.16.2.225;127.0.0.1; };

3.3 编辑/etc/named.rfc1912.zones

zone "hanli.com" IN {
type slave;
masters { 172.16.2.116; };
file "slaves/hanli.com.zone";
};
zone "2.16.172.in-addr.arpa" IN {
type slave;
masters { 172.16.2.116; };
file "slaves/2.zone";
};

3.4 注意事项:从服务器的区域解析库文件应当是从主服务器加载过来的,所以无需创建区域解析库文件。

3.5 启动从named服务,

# systemctl start named

[root@slave1] /var/named/slaves$ systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2018-03-05 14:16:04 CST; 11s ago
Process: 3463 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 3474 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
Process: 3472 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
Main PID: 3477 (named)
CGroup: /system.slice/named.service
└─3477 /usr/sbin/named -u named -c /etc/named.conf

3月 05 14:16:04 slave1 named[3477]: zone 2.16.172.in-addr.arpa/IN: Transfer started.
3月 05 14:16:04 slave1 named[3477]: transfer of '2.16.172.in-addr.arpa/IN' from 172.16.2.116#53: connected using 172.16.2.225#44740
3月 05 14:16:04 slave1 named[3477]: zone 2.16.172.in-addr.arpa/IN: transferred serial 2018030425
3月 05 14:16:04 slave1 named[3477]: transfer of '2.16.172.in-addr.arpa/IN' from 172.16.2.116#53: Transfer completed: 1 mes...es/sec)
3月 05 14:16:04 slave1 named[3477]: zone 2.16.172.in-addr.arpa/IN: sending notifies (serial 2018030425)
3月 05 14:16:04 slave1 named[3477]: zone hanli.com/IN: Transfer started.
3月 05 14:16:04 slave1 named[3477]: transfer of 'hanli.com/IN' from 172.16.2.116#53: connected using 172.16.2.225#39337
3月 05 14:16:04 slave1 named[3477]: zone hanli.com/IN: transferred serial 2018030425
3月 05 14:16:04 slave1 named[3477]: transfer of 'hanli.com/IN' from 172.16.2.116#53: Transfer completed: 1 messages, 9 rec...es/sec)
3月 05 14:16:04 slave1 named[3477]: zone hanli.com/IN: sending notifies (serial 2018030425)
Hint: Some lines were ellipsized, use -l to show in full.

从状态日志中发现,zone区域文件已同步到从服务器

3.6 检查测试同步功能

查看/var/named/slaves/目录,发现多了两个文件。

[root@slave1] /var/named/slaves$ ll
总用量 8
-rw-r--r-- 1 named named 365 3月 5 14:16 2.zone
-rw-r--r-- 1 named named 394 3月 5 14:16 hanli.com.zone

查看文件内容,可以看到该文件和主DNS服务器上的文件内容是一样的。说明这2个文件是自动从主服务器同步过来的。

以后添加DNS记录,只需修改正向解析文件/var/named/hanli.com.zone,和 反向解析文件/var/named/2.zone,并更新序列号,(需要重载named)。则主服务器会自动将zone区域文件推送至从服务器/var/named/slaves下。

3.7 测试从DNS服务器。

正向解析

[root@slave1] /var/named/slaves$ dig -t A www.hanli.com @172.16.2.225

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> -t A www.hanli.com @172.16.2.225
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7925
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.hanli.com. IN A ;; ANSWER SECTION:
www.hanli.com. 86400 IN A 172.16.2.116 ;; AUTHORITY SECTION:
hanli.com. 86400 IN NS dns1.hanli.com.
hanli.com. 86400 IN NS dns2.hanli.com. ;; ADDITIONAL SECTION:
dns1.hanli.com. 86400 IN A 172.16.2.116
dns2.hanli.com. 86400 IN A 172.16.2.225 ;; Query time: 0 msec
;; SERVER: 172.16.2.225#53(172.16.2.225)
;; WHEN: 一 3月 05 14:22:32 CST 2018
;; MSG SIZE rcvd: 128

反向解析

[root@slave1] /var/named/slaves$ dig -x 172.16.2.116  @172.16.2.225

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> -x 172.16.2.116 @172.16.2.225
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52076
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;116.2.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION:
116.2.16.172.in-addr.arpa. 86400 IN PTR mail.hanli.com.
116.2.16.172.in-addr.arpa. 86400 IN PTR www.hanli.com.
116.2.16.172.in-addr.arpa. 86400 IN PTR dns1.hanli.com. ;; AUTHORITY SECTION:
2.16.172.in-addr.arpa. 86400 IN NS dns2.hanli.com.
2.16.172.in-addr.arpa. 86400 IN NS dns1.hanli.com. ;; ADDITIONAL SECTION:
dns1.hanli.com. 86400 IN A 172.16.2.116
dns2.hanli.com. 86400 IN A 172.16.2.225 ;; Query time: 0 msec
;; SERVER: 172.16.2.225#53(172.16.2.225)
;; WHEN: 一 3月 05 14:25:12 CST 2018
;; MSG SIZE rcvd: 184

后续

1、将生产环境机器主机名和ip地址记录到主dns正向解析区域文件中

2、将生产环境的机器dns全部换成主dns服务器地址

# Generated by NetworkManager
nameserver 172.16.2.116

3、就可以 ssh 主机名了,很方便

[root@master] /var/named$ ssh slave1.hanli.com
Last login: Mon Mar 5 15:41:02 2018 from mail.hanli.com

[root@master] /var/named$ ssh slave2.hanli.com
Last login: Mon Mar 5 15:41:13 2018 from mail.hanli.com

错误排查

1、主服务器zone文件无法同步到从服务器的slaves目录下

查看日志

[root@slave1] /var/named/slaves$ tail -f /var/log/messages
Mar 5 13:48:36 slave1 named[3305]: command channel listening on 127.0.0.1#953
Mar 5 13:48:36 slave1 named[3305]: command channel listening on ::1#953
Mar 5 13:48:36 slave1 named[3305]: managed-keys-zone: loaded serial 2
Mar 5 13:48:36 slave1 named[3305]: zone 0.in-addr.arpa/IN: loaded serial 0
Mar 5 13:48:36 slave1 named[3305]: zone localhost.localdomain/IN: loaded serial 0
Mar 5 13:48:36 slave1 named[3305]: zone localhost/IN: loaded serial 0
Mar 5 13:48:36 slave1 named[3305]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Mar 5 13:48:36 slave1 named[3305]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Mar 5 13:48:36 slave1 named[3305]: all zones loaded
Mar 5 13:48:36 slave1 named[3305]: running
Mar 5 13:50:06 slave1 named[3305]: zone hanli.com/IN: refresh: retry limit for master 172.16.2.116#53 exceeded (source 0.0.0.0#0)
Mar 5 13:50:06 slave1 named[3305]: zone hanli.com/IN: Transfer started.
Mar 5 13:50:06 slave1 named[3305]: transfer of 'hanli.com/IN' from 172.16.2.116#53: failed to connect: host unreachable
Mar 5 13:50:06 slave1 named[3305]: transfer of 'hanli.com/IN' from 172.16.2.116#53: Transfer completed: 0 messages, 0 records, 0 bytes, 0.001 secs (0 bytes/sec)
Mar 5 13:50:06 slave1 named[3305]: zone 2.16.172.in-addr.arpa/IN: refresh: retry limit for master 172.16.2.116#53 exceeded (source 0.0.0.0#0)
Mar 5 13:51:36 slave1 named[3305]: zone hanli.com/IN: refresh: retry limit for master 172.16.2.116#53 exceeded (source 0.0.0.0#0)
Mar 5 13:51:37 slave1 named[3305]: zone 2.16.172.in-addr.arpa/IN: refresh: retry limit for master 172.16.2.116#53 exceeded (source 0.0.0.0#0)

发现无法连接机器,考虑是iptables和seLinux的问题,检查下主服务器和从服务器是否已关闭,或正确设置。

重新设置后,已正确同步。

参考

http://www.cnblogs.com/fatt/p/4494695.html

http://www.cnblogs.com/mfyang/p/8467421.html

http://www.cnblogs.com/feihongwuhen/archive/2009/12/08/7171038.html

DNS主从同步部署的更多相关文章

  1. MySQL面试题中:主从同步部署介绍

    主从同步部署1.两台相同版本的mysql数据库,一台做主库,一台从库 主库开启binlog 在配置文件中的[mysqld]模块中添加log-bin=mysql-bin和server-id=1,一定要保 ...

  2. DNS 主从同步配置

    DNS 主从同步配置 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 看序列号. 从DNS:从是可以单独修改,主从不会报错.但从修改后,主端同步给从后 从端修改数据会丢失 主从原理:从会 ...

  3. Centos下内网DNS主从环境部署记录

    一.DNS是什么?DNS(Domain Name System),即域名系统.它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统. DNS采用C-S架构,服务器端工作在UDP ...

  4. Linux的DNS主从服务器部署

    下面的部署是在Linux的DNS正向解析部署上进行修改的. 如果有什么问题或者错误,可以访问上篇帖子 下面开始有关DNS的服务部署.<DNS主从服务器> 环境描述: 192.168.196 ...

  5. DNS主从服务部署

    (1)节点信息 console01 主DNS 192.168.80.3 192.168.10.3 console02 从DNS 192.168.80.4 192.168.10.4 (2)环境部署 # ...

  6. MySQL主从同步原理 部署【转】

    一.主从的作用:1.可以当做一种备份方式2.用来实现读写分离,缓解一个数据库的压力二.MySQL主从备份原理master 上提供binlog ,slave 通过 I/O线程从 master拿取 bin ...

  7. linux服务基础之DNS正反向解析、主从同步、子域授权及视图

    关键词: 正向解析 反向解析 主从复制 自域授权 视图 一.DNS基本原理 1.1 什么是DNS?BIND又是什么? DNS:Domain Name Service,它是一个基于应用层的协议,是C/S ...

  8. Mysql主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

    Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一 ...

  9. 部署mysql主从同步

                                                 mysql-day06        部署mysql主从同步 案例拓扑 • 一主.一从 – 单向复制时,建议将 ...

随机推荐

  1. 【LeetCode】1401. 圆和矩形是否有重叠 Circle and Rectangle Overlapping

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 利用公式 日期 题目地址:https://leetco ...

  2. java源码——对文件内容的查找和替换(开始写界面咯)

    问题是:"键盘输入文件的路径.查找内容和替换内容,对指定路径的文件的内容进行查找和替换." 好久没写界面了,今天熟悉一下界面的书写和监听器操作. 这个问题的本身不是很难,重点应该是 ...

  3. 【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...

  4. 【LeetCode】743. Network Delay Time 解题报告(Python)

    [LeetCode]743. Network Delay Time 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...

  5. 1119 - Pimp My Ride

    1119 - Pimp My Ride    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB To ...

  6. 计算机图形学——梁友栋-Barsky算法

    梁算法是计算机图形学上最经典的几个算法,也是目前唯一一个以中国人命名的出现在国内外计算机图形学课本的算法,我之前在介绍裁剪算法的时候介绍过这个算法 https://www.cnblogs.com/wk ...

  7. uniapp与webview之间的相互传值

    1.uni-app 如何发送数据到 H5? 其实很接单.在 web-view 中只需要通过 URL 就可以向 H5 进行传参 例如在 uni-app 中: <template> <v ...

  8. 关于 Spring-WebFlux 的一些想法

    本文是本人在知乎提问 spring webflux现在看来是否成功? 下的回答,其他回答也很精彩,如果感兴趣可以查看 现在基于 spring web 的同步微服务有一个非常大的缺陷就是:相对于基于 s ...

  9. springboot配置health接口

    springboot配置health接口 spring-boot-starter-actuator 健康监控配置及使用 这样是可以看到一些结果的 如果在配置文件中用了下面这个,也是可以生效的 # 不进 ...

  10. Python原生数据结构增强模块collections

    collections简介 python提供了4种基本的数据结构:list.tuple.dict.set.基本数据结构完全可以hold住所有的场景,但是在处理数据结构复杂的场景时,这4种数据结构有时会 ...