支持海量域名的dns架构
环境 操作系统: Redhat 5.2 64位
dns服务器:bind9.5.0-p1
数据库: mysql5.1
公司前些年成为了域名注册商,起初采用一个zone文件存放一个zone配置的传统方式。后了解zone的增长量将会非常大,在n个百万级。在进行了测试和使用一段时间后,发现当zone数量巨大的情况下,采用传统的zone文件存放zone配置,存在着很大的问题。如将所有域名都放在同一服务器上,在需要重新启动bind时,花费的时间惊人,从下图看出当zone的数量达到30万时,载入时间已经需要近1小时,这显然是不能接受的
后经过权衡,决定以10万为分界,毎10万域名使用一主一辅2台服务器。这种结构尽管有一些不方便,但因为传统的方式稳定性好、查询效率高,所以也用了一段时间。然而当zone的数量到了60多万时,服务器达到了14台,终于觉得不能容忍这种方式了,因为一、太浪费服务器了,二、管理非常不方便,于是乎决心寻找替代的方案
在查找一些资料之后,毋庸置疑,基于bind的DLZ(dynamic load zone)是首选。但在DLZ支持的诸多后台数据库中,并不是起初就选择mysql的。bind的查询效率可以达到2万~3万每秒,在DLZ官方,性能评测只有Berkerly DB的查询效率可以达到4000至12000 bps每秒,比较接近bind的原始查询效率,而其他的mysql什么的都只有600~800每秒,Berkerly DB的优势非常明显,因此起初试图使用Berkerly DB作为后台数据库,但最终还是选择了mysql,主要原因如下:
在初步确定采用mysql作为数据库之后,必需要解决查询效率的问题,否则就很难真正投入生产环境。mysql作为后台的查询效率经测试在600-800之间,而我们预期的查询效率必需要达到3k~4k。该结构为什么会慢呢?主要原因就是采用mysql作为后台数据库时,bind不能起用多线程,只能采用单进程。而毎查询一个域名需要执行3~5条sql,所有的sql只能串行处理,所以效率才这么低。解决办法:
该方法经一位熟悉C的同事验证,不可行。(也许CU有大虾能搞定的,那就更方便易行了)
在我们的结构中,zone数量非常大,单个域名在短时间被重复查询的几率并不高,分析认为该方法不是特别适合我们的结构,因此未进行测试
查询效率低的关键原因是串行,因此我们试图人为的实现并行,经过测试后发现可以通过起多个named进程的方式,实现该想法。最终是服务器起8个地址,每个地址单独起一个named。起8个named之后的查询效率如下图,我们可以看出,单个named的查询效率随着named数量的增加从700多降至400,特别是到后期下降趋势很不明显。总体性能从700升至3200左右,两台dns服务器可达到6000多,完全可以满足我们的需要:
这个系统的结构最前端是两台F5的负载均衡设备(这原来就有),后面是两台dns服务器,每台起8个named进程,分别连至后台的mysql数据库。F5的每个vip对应每台dns服务器4个进程,这样整个系统没有任何单点。任何一台设备down了bouquet不影响使用。结构图如下:
#添加mysql组和用户,之所以指定为601,主要是为了方便各台服务器之间权限统一
- groupadd -g 601 mysql
- useradd -c “mysql software owner” -g mysql -u 601 mysql
#编辑自己的配置文件my.cnf和log以及innodb的相关目录
- mkdir /usr/local/mysql
- mkdir /usr/local/mysql/sock
- mkdir /usr/local/mysql/log
- su - mysql
- mkdir /home/mysql/mysqldata
- mkdir /home/mysql/mysqldata/binlog
- mkdir /home/mysql/mysqldata/mydata
- mkdir /home/mysql/mysqldata/innodb_ts
- mkdir /home/mysql/mysqldata/innodb_log
- mkdir /home/mysql/mysqldata/tmpdir
- exit
- mkdir /data
- ln -s /home/mysql/mysqldata /data/mysqldata
- chown -R mysql:mysql /usr/local/mysql/log
- chown -R mysql:mysql /usr/local/mysql/sock
- chown -R mysql:mysql /data/mysqldata
- chown -R mysql:mysql /data/mysqldata/mydata
- chown -R mysql:mysql /data/mysqldata/binlog
- chown -R mysql:mysql /data/mysqldata/innodb_ts
- chown -R mysql:mysql /data/mysqldata/innodb_log
- chown -R mysql:mysql /data/mysqldata/tmpdir
4.1.3. 编译安装源码
- make clean
#这里的config参数可以根据数据库相关需求稍作调整
- ./configure –prefix=/usr/local/mysql \
- –without-debug \
- –without-bench \
- –disable-shared \
- –enable-thread-safe-client \
- –enable-assembler \
- –enable-profiling \
- –with-mysqld-ldflags=-all-static \
- –with-client-ldflags=-all-static \
- –with-charset=latin1 \
- –with-extra-charset=utf8,gbk \
- –with-innodb \
- –with-csv-storage-engine \
- –with-federated-storage-engine \
- –with-mysqld-user=mysql \
- –without-embedded-server \
- –with-server-suffix=-community \
- –with-unix-socket-path=/usr/local/mysql/sock/mysql.sock \
- –with-mysqld-libs=-lmtmalloc \
- make make install
#准备my.cnf文件需要注意的几个目录配置:
- log-error=/usr/local/mysql/log/error.log
- log_slow_queries=/usr/local/mysql/log/slow_query.log
- datadir=/data/mysqldata/mydata tmpdir=/data/mysqldata/tmpdir
- bin-log=/data/mysqldata/binlog/mysql-bin
- innodb_data_home_dir=/data/mysqldata/innodb_ts
- innodb_log_group_home_dir=/data/mysqldata/innodb_log
其他相关参数进行针对性调整将准备好的my.cnf配置文件cp一份到/etc/my.cnf
创建系统表并修改目录权限
- cd /usr/local/mysql
- bin/mysql_install_db –user=mysql –socket=/usr/local/mysql/sock/mysql.sock
- chown -R root .
- chgrp -R mysql .
- chown -R mysql sock
- chown -R mysql log
- bin/mysqld_safe –socket=/usr/local/mysql/sock/mysql.sock –user=mysql &
- useradd -d /etc/namedb -s /bin/false named
- mkdir -p /var/named
- chown -R named:named /etc/namedb
- chown -R named:named /var/named
- tar -xzvf bind-9.5.0-p1.tar.gz
- ./configure –prefix=/opt/named.9.5.0-p1 –sysconfdir=/etc/namedb –with-dlz-mysql=yes –enable-largefile
注:采用mysql做后台数据库,千万不能用–enable-threads选项启用多线程,网上有一些朋友使用mysql做后台,谈到bind会莫名中断服务,大部分都是因为打开了多线程。
关键部分如下:
- [ -f /opt/named/sbin/named ] || exit 0
- [ -f /etc/namedb/named.conf.11 ] || exit 0
- # See how we were called.
- case "$1" in
- start)
- # Start daemons.
- echo -n "Starting named: "
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.11 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.12 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.13 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.14 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.15 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.16 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.17 -u named
- daemon /opt/named/sbin/named -c /etc/namedb/named.conf.18 -u named
关键部分如下,替代了原来对每一个zone的配置:
- dlz "Mysql zone" {
- database "mysql
- {host=localhost dbname=dns user=dns pass=12345678}
- {SELECT zone FROM records WHERE zone = '%zone%'}
- {SELECT ttl, type, mx_priority, data
- FROM records
- WHERE zone = '%zone%' AND host = '%record%' AND type <> 'SOA' AND type <> 'NS'}
- {SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum
- FROM records
- WHERE zone = '%zone%' AND type='NS'}
- {SELECT ttl, type, host, mx_priority, data, resp_contact, serial, refresh, retry, expire, minimum
- FROM records
- WHERE zone = '%zone%' AND type <> 'NS'}";
- };
该结构的可扩展性非常好,可采用的方式如下:
目前dns上的zone数量为约90万,查询速率为500,系统的load不到1,启动可以在秒级完成,并且已稳定运行近两个月。现在的架构,dns和mysql在同一物理机上,仅仅需要两台服务器,而这个数据量按原来的架构需要18台服务器,同时维护非常不便。
注:
1、dns一开始会有启动报错:
- #service named start
- Starting named: /opt/named/sbin/named: error while loading shared libraries:
2、libmysqlclient.so.15: cannot open shared object file: No such file or directory [FAILED]
解决办法:
a、编辑/etc/ld.so.conf 将mysql的lib目录加入
- include ld.so.conf.d/*.conf
- usr/local/mysql/lib/mysql/
b、执行ldconfig 命令
3、dns是否关闭递归查询,对该结构的查询效率有一定影响。因为关闭递归会少执行n多sql语句。
It is quite useful and interesting too.
VIRT 的上限是64G,也就是36位, cat /proc/cpuinfo的结果是:addre
昨天要准备用线程重写webbench,试验了下Fedora Linux 2.6.35.14
不明白您的具体的意思是什么?
已经发送到你QQ邮箱
http://www.2mysite.net/scriptencoder/screnc.asp 站长你好,看
你好,我发现一个问题,就是从mysqld2同步过来的数据,在mysqld1的
晕,我说是怎么回事情,原来我和你一样,忘记设置了活动分区