亿级数据的高并发通用搜索引擎架构设计

曾经在七月,写过一篇文章──《基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计
》,前公司的分类信息搜索基于此架构,效果明显,甚至将很大一部分带Where条件的MySQL SQL查询,都改用了Sphinx+MySQL搜索。但是,这套架构仍存在局限:一是MySQL本身的并发能力有限,在200~300个并发连接下,查询和更新就比较慢了;二是由于MySQL表的主键与Sphinx索引的ID一一对应,从而无法跨多表建立整站查询,而且新增加类别还得修改配置文件,比较麻烦;三是因为和MySQL集成,无法发挥出Sphinx的优势。

  最近,我设计出了下列这套最新的搜索引擎架构,目前已经写出“搜索查询接口”和“索引更新接口”的beta版。经测试,在一台“奔腾四 3.6GHz 双核CPU、2GB内存”的普通PC机,7000万条索引记录的条件下,“搜索查询接口”平均查询速度为0.0XX秒(查询速度已经达到百度、谷歌、搜狗、中国雅虎等搜索引擎的水平,详见文章末尾的“附2”),并且能够支撑高达5000的并发连接;而“索引更新接口”进行数据分析、入队列、返回信息给用户的全过程,高达1500 Requests/Sec。

  “队列控制器”这一部分是核心,它要控制队列读取,更新MySQL主表与增量表,更新搜索引擎数据存储层Tokyo Tyrant,准实时(1分钟内)完成更新Sphinx增量索引,定期合并Sphinx索引。我预计在这周写出beta版。

点击查看原图

  图示说明:

  1、搜索查询接口:
  ①、Web应用服务器通过HTTP POST/GET方式,将搜索关键字等条件,传递给搜索引擎服务器的search.php接口;
  ②③、search.php通过Sphinx的API(我根据最新的Sphinx 0.9.9-rc1 API,改写了一个C语言的PHP扩展sphinx.so),查询Sphinx索引服务,取得满足查询条件的搜索引擎唯一ID(15位搜索唯一ID:前5位类别ID+后10位原数据表主键ID)列表;
  ④⑤、search.php将这些ID号作为key,通过Memcache协议一次性从Tokyo Tyrant中mget取回ID号对应的文本数据。
  ⑥⑦、search.php将搜索结果集,按查询条件,进行摘要和关键字高亮显示处理,以JSON格式或XML格式返回给Web应用服务器。

  2、索引更新接口:
  ⑴、Web应用服务器通过HTTP POST/GET方式,将要增加、删除、更新的内容告知搜索服务器的update.php接口;
  ⑵、update.php将接收到的信息处理后,写入TT高速队列(我基于Tokyo Tyrant做的一个队列系统);
  注:这两步的速度可达到1500次请求/秒以上,可应对6000万PV的搜索索引更新调用。

  3、搜索索引与数据存储控制:
  ㈠、“队列控制器”守护进程从TT高速队列中循环读取信息(每次50条,直到末尾);
  ㈡、“队列控制器”将读取出的信息写入搜索引擎数据存储层Tokyo Tyrant;
  ㈢、“队列控制器”将读取出的信息异步写入MySQL主表(这张主表按500万条记录进行分区,仅作为数据永久性备份用);
  ㈣、“队列控制器”将读取出的信息写入MySQL增量表;
  ㈤、“队列控制器”在1分钟内,触发Sphinx更新增量索引,Sphinx的indexer会将MySQL增量表作为数据源,建立增量索引。Sphinx的增量索引和作为数据源的MySQL增量表成对应关系;
  ㈥、“队列控制器”每间隔3小时,短暂停止从TT高速队列中读取信息,并触发Sphinx将增量索引合并入主索引(这个过程非常快),同时清空MySQL增量表(保证了MySQL增量表的记录数始终只有几千条至几十万条,大大加快Sphinx增量索引更新速度),然后恢复从TT高速队列中取出数据,写入MySQL增量表。

  本架构使用的开源软件:

  1、Sphinx 0.9.9-rc1
  2、Tokyo Tyrant 1.1.9
  3、MySQL 5.1.30
  4、Nginx 0.7.22
  5、PHP 5.2.6

  本架构自主研发的程序:

  1、搜索查询接口(search.php)
  2、索引更新接口(update.php)
  3、队列控制器
  4、Sphinx 0.9.9-rc1 API的PHP扩展(sphinx.so)
  5、基于Tokyo Tyrant的高速队列系统

 


  附1:MySQL FullText、Lucene搜索、Sphinx搜索的第三方对比结果:

  1、查询速度:
  MySQL FullText最慢,Lucene、Sphinx查询速度不相上下,Sphinx稍占优势。
  点击查看原图

  2、建索引速度:
  Sphinx建索引速度是最快的,比Lucene快9倍以上。因此,Sphinx非常适合做准实时搜索引擎。

  3、详细对比数据见以下PDF文档: 

     

发表在 article | 标签为 , | 亿级数据的高并发通用搜索引擎架构设计已关闭评论

易趣网淘宝网5年交战史

自2003年阿里巴巴旗下淘宝网上线以来,易趣网与淘宝网的战斗一直没有停止过。从一下淘宝网与易趣网的交战历史,可以看出在斗争中成长的两大C2C网站,也可以看到中国C2C发展的一丝脉络。
 

 

  易趣淘宝交战史:
 

 

  1999年8月 两位哈佛商学院毕业生,邵亦波和谭海音,在中国上海创办易趣网。成立之初,公司在上海一个两居室的民居内办公。两位创始人邵亦波和谭海英是当时仅有的两名员工。
 

 

  2000年7月 易趣推出个人网上开店服务,短短一周即吸引5,000多位网友“尝鲜”,此举切实地培养起中国首批真正靠网络来赚钱的网民。
 

 

  2001年7月 易趣宣布网站开始对卖家登录物品收取登录费。
 

 

  2002年9月 易趣开始对卖家网上商品成交后收取商品交易服务费。易趣开始进入了电子商务平台非免费运营的阶段,也标志着中国电子商务的发展的一个里程碑。
 

 

  2003年6月,eBay投资1.5亿美金,收购易趣(美国)公司的股份。易趣公司和eBay展开全面合作。
 

 

  2003年5月10日,淘宝网上线。同时宣布全站免费。
 

 

  2003年,电子商务巨头美国eBay在这个时候投资1.8亿美元,接管易趣,
 

 

  2003年,淘宝网上线。
 

 

  2003年,eBay将易趣网更名为eBay易趣。
 

 

  2003年10月,淘宝网发布了“支付宝”服务。
 

 

  2004年2月2日,易趣正式调低了自己的商品登录费用,这是易趣采取收费策略后第一次“降价让利”。
 

 

  2004年4月,yahoo与新浪合作的一拍网成立。
 

 

  2004年9月17日,易趣与eBay正式完成对接。
 

 

  2005年4月,淘宝网和搜狐宣布结成战略联盟,紧接着在5月,成为MSN中国拍卖频道的合作伙伴。
 

 

  2005年5月1日易趣网再次宣布登录费、月租费下调;6月9日的“安付通”升级。
 

 

  2005年7月11日,贝宝(PayPal China)中国网站正式开通,标志着贝宝正式登陆中国市场。
 

 

  2005年10月20日,淘宝网宣布将继续免费三年。
 

 

  2006年5月10日,正式推出全新B2C(企业对个人)业务——淘宝商城。并同时推出竞价排名服务“招财进宝”,在宣布继续免费3年之后,这项有偿增值服务被认为是“变相收费”,成为淘宝成立以来最大的一次改革。
 

 

  2006年12月,eBay与TOM在线合作携手组建一家合资公司,结合双方的优势资源,专为中国市场打造一个本地化的交易平台。TOM在线CEO王雷雷同时兼任合资公司CEO。
 

 

  2007年7月,eBay和TOM联手打造的全新交易平台—易趣正式上线启用。
 

 

  2008年4月,淘宝B2C平台正式上线。与此同时,淘宝将对该B2C的“品牌/商城”业务收费,此举被认为是提前收费,违反了淘宝2005年10月宣布的继续免费3年的承诺。同月,淘宝出现轰动一时的“评价门”事件。
 

 

  2008年4月14日,易趣针对老卖家、其他网站卖家和新手卖家发起一轮“易趣卖家共成长计划”,根据不同层面的卖家需求,提供从认证、培训到推广等各种免费且有效的资源支持,帮助这三类卖家在易趣上快速开店、稳步成长。凡是在易趣上开有店铺并提交了准确个人信息的卖家都可报名参加易趣这一成长计划。
 

 

  2008年5月5日,易趣宣布,用户到易趣上开店,易趣将终身免收包括高级店铺和超级店铺在内的店铺费,并免收商品登录费、店铺使用费等传统收费项目。这意味着,易趣这一国内首家收费的C2C网站,在经过若干年的收费探索后,开始转向全平台免费使用的模式。

发表在 info | 易趣网淘宝网5年交战史已关闭评论

C++ socket 编程

使用socket写代码主要是要看自己的需求是什么。
如果通信时,内容很重要就要使TCP方式。
如果用户数太多,可能就要使用UDP方式了。
在TCP模式下,最简单的方式就是这样的,使阻塞方式:
服务端:
1.初始化socket环境,创建socket
2.梆定一个端口
3.开始监听
4.接收客户端
5.接收到客户端之后,使用这个socket来与这个客户通信

#include "stdAfx.h"
#include <winsock2.h>
#include <mswsock.h>
#include <iostream>

using namespace std;

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")

DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err=0;

wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
return err;
}

int main(int argc, char* argv[])
{
cout<<"程序开始"<<endl;
IniSOCKDLL();
SOCKET ss=WSASocket(AF_INET,
   SOCK_STREAM,
   0,
   NULL,
   0,
   NULL);

SOCKADDR_IN addr;
int len;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(1002);
len=sizeof(addr);

bind(ss , (PSOCKADDR)&addr , len);
listen(ss,5);

SOCKET sc=accept(ss,(PSOCKADDR)&addr,&len);
char buff[1024];
ZeroMemory(buff,1024);
recv(sc,buff,1024,0);
cout<<buff<<endl;

ZeroMemory(buff,1024);
memcpy(buff,"123",3);
send(sc,buff,3,0);

closesocket(sc);
closesocket(ss);
return 0;
}

客户端:
1.初始化socket环境,创建socket
2.连接服务端
3.开启一个线程来接收数据
4.使用send直接发数据包

#include "stdAfx.h"
#include <winsock2.h>
#include <mswsock.h>
#include <iostream>

using namespace std;

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")

DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err=0;

wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
return err;
}

int main(int argc, char* argv[])
{
IniSOCKDLL();
SOCKET sc=WSASocket(AF_INET,
   SOCK_STREAM,
   0,
   NULL,
   0,
   NULL);

SOCKADDR_IN addr;
int len;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(1002);
len=sizeof(addr);

connect(sc, (struct sockaddr *)&addr, len);

char buff[1024];
ZeroMemory(buff,1024);
memcpy(buff,"123",3);
send(sc,buff,3,0);

recv(sc,buff,1024,0);
cout<<buff<<endl;

closesocket(sc);
return 0;
}

由这个我们可以做一个这样的模型:
为每个阻塞函数开一个线程,让它来处理。
这就要留意退出的时候把这一些线程给关闭。

 

当然TCP方式的模型还有事件选择模型。
就是把所有的网络事件和我们的一个程序里定义的事件梆定。
这个有它的好处,可能可以让我们更好的写一个线程来管理
接收与发送。
现在来讲一下一个完成端口模型。

完成端口

一个完成端口其实就是一个通知队列,由操作系统把已经完成的重叠I/O请求的通知
放入其中。当某项I/O操作一旦完成,某个可以对该操作结果进行处理的工作者线程
就会收到一则通知。而套接字在被创建后,可以在任何时候与某个完成端口进行关
联。

步骤:
1、创建一个空的完成端口;
2、得到本地机器的CPU个数;
3、开启CPU*2个工作线程(又名线程池),全部都在等待完成端口的完成包;
4、创建TCP的监听socket,使用事件邦定,创建监听线程;
5、当有人连接进入的时候,将Client socket保存到一个我们自己定义的关键键,
    并把它与我们创建的完成端口关联;
6、使用WSARecv和WSASend函数投递一些请求,这是使用重叠I/O的方式;
7、重复5~6;

注:1、重叠I/O的方式中,接收与发送数据包的时候,一定要进行投递请求这是
    它们这个体系结构的特点
    当然,在完成端口方式中,不是直接使用的WSARecv和WSASend函数进行请求
    的投递的。而是使用的ReadFile,Write的方式
   2、完成端口使用了系统内部的一些模型,所以我们只要按照一定的顺序调用就
    可以完成了。
   3、完成端口是使用在这样的情况下,有成千上万的用户连接的时候,它能够
    保证性能不会降低。

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#define PORT 5150
#define DATA_BUFSIZE 8192

//关键项
typedef struct
{
   OVERLAPPED Overlapped;
   WSABUF DataBuf;
   CHAR Buffer[DATA_BUFSIZE];
   DWORD BytesSEND;
   DWORD BytesRECV;
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;

typedef struct
{
   SOCKET Socket;
} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;

DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID);

void main(void)
{
   SOCKADDR_IN InternetAddr;
   SOCKET Listen;
   SOCKET Accept;
   HANDLE CompletionPort;
   SYSTEM_INFO SystemInfo;
   LPPER_HANDLE_DATA PerHandleData;
   LPPER_IO_OPERATION_DATA PerIoData;
   int i;
   DWORD RecvBytes;
   DWORD Flags;
   DWORD ThreadID;
   WSADATA wsaData;
   DWORD Ret;

   if ((Ret = WSAStartup(0x0202, &wsaData)) != 0)
   {
      printf("WSAStartup failed with error %d\n", Ret);
      return;
   }

   //打开一个空的完成端口

   if ((CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)) == NULL)
   {
      printf( "CreateIoCompletionPort failed with error: %d\n", GetLastError());
      return;
   }

   // Determine how many processors are on the system.

   GetSystemInfo(&SystemInfo);

   // 开启cpu个数的2倍个的线程

   for(i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++)
   {
      HANDLE ThreadHandle;

      // Create a server worker thread and pass the completion port to the thread.

      if ((ThreadHandle = CreateThread(NULL, 0, ServerWorkerThread, CompletionPort,
         0, &ThreadID)) == NULL)
      {
         printf("CreateThread() failed with error %d\n", GetLastError());
         return;
      }

      // Close the thread handle
      CloseHandle(ThreadHandle);
   }

   //打开一个服务器socket

   if ((Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
      WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
   {
      printf("WSASocket() failed with error %d\n", WSAGetLastError());
      return;
   }

   InternetAddr.sin_family = AF_INET;
   InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   InternetAddr.sin_port = htons(PORT);

   if (bind(Listen, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
   {
      printf("bind() failed with error %d\n", WSAGetLastError());
      return;
   }

   if (listen(Listen, 5) == SOCKET_ERROR)
   {
      printf("listen() failed with error %d\n", WSAGetLastError());
      return;
   }

   //开始接收从客户端来的连接

   while(TRUE)
   {
      if ((Accept = WSAAccept(Listen, NULL, NULL, NULL, 0)) == SOCKET_ERROR)
      {
         printf("WSAAccept() failed with error %d\n", WSAGetLastError());
         return;
      }

      // 创建一个关键项用于保存这个客户端的信息,用户接收发送的重叠结构,
      // 还有使用到的缓冲区
      if ((PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR,
         sizeof(PER_HANDLE_DATA))) == NULL)
      {
         printf("GlobalAlloc() failed with error %d\n", GetLastError());
         return;
      }

      // Associate the accepted socket with the original completion port.

      printf("Socket number %d connected\n", Accept);
      PerHandleData->Socket = Accept;

      //与我们的创建的那个完成端口关联起来,将关键项也与指定的一个完成端口关联
      if (CreateIoCompletionPort((HANDLE) Accept, CompletionPort, (DWORD) PerHandleData,
         0) == NULL)
      {
         printf("CreateIoCompletionPort failed with error %d\n", GetLastError());
         return;
      }

      // 投递一次接收,由于接收都需要使用这个函数来投递一个接收的准备

      if ((PerIoData = (LPPER_IO_OPERATION_DATA) GlobalAlloc(GPTR,          sizeof(PER_IO_OPERATION_DATA))) == NULL)
      {
         printf("GlobalAlloc() failed with error %d\n", GetLastError());
         return;
      }

      ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
      PerIoData->BytesSEND = 0;
      PerIoData->BytesRECV = 0;
      PerIoData->DataBuf.len = DATA_BUFSIZE;
      PerIoData->DataBuf.buf = PerIoData->Buffer;

      Flags = 0;
      if (WSARecv(Accept, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
         &(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
      {
         if (WSAGetLastError() != ERROR_IO_PENDING)
         {
            printf("WSARecv() failed with error %d\n", WSAGetLastError());
            return;
         }
      }
   }
}
//工作线程
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
   HANDLE CompletionPort = (HANDLE) CompletionPortID;
   DWORD BytesTransferred;
   LPOVERLAPPED Overlapped;
   LPPER_HANDLE_DATA PerHandleData;
   LPPER_IO_OPERATION_DATA PerIoData;
   DWORD SendBytes, RecvBytes;
   DWORD Flags;
  
   while(TRUE)
   {
      //完成端口有消息来了
      if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
         (LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
      {
         printf("GetQueuedCompletionStatus failed with error %d\n", GetLastError());
         return 0;
      }

      //是不是有人退出了

      if (BytesTransferred == 0)
      {
         printf("Closing socket %d\n", PerHandleData->Socket);

         if (closesocket(PerHandleData->Socket) == SOCKET_ERROR)
         {
            printf("closesocket() failed with error %d\n", WSAGetLastError());
            return 0;
         }

         GlobalFree(PerHandleData);
         GlobalFree(PerIoData);
         continue;
      }

      //

      if (PerIoData->BytesRECV == 0)
      {
         PerIoData->BytesRECV = BytesTransferred;
         PerIoData->BytesSEND = 0;
      }
      else
      {
         PerIoData->BytesSEND += BytesTransferred;
      }

      if (PerIoData->BytesRECV > PerIoData->BytesSEND)
      {

         // Post another WSASend() request.
         // Since WSASend() is not gauranteed to send all of the bytes requested,
         // continue posting WSASend() calls until all received bytes are sent.

         ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));

         PerIoData->DataBuf.buf = PerIoData->Buffer + PerIoData->BytesSEND;
         PerIoData->DataBuf.len = PerIoData->BytesRECV - PerIoData->BytesSEND;

         if (WSASend(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &SendBytes, 0,
            &(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
         {
            if (WSAGetLastError() != ERROR_IO_PENDING)
            {
               printf("WSASend() failed with error %d\n", WSAGetLastError());
               return 0;
            }
         }
      }
      else
      {
         PerIoData->BytesRECV = 0;

         // Now that there are no more bytes to send post another WSARecv() request.

         Flags = 0;
         ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));

         PerIoData->DataBuf.len = DATA_BUFSIZE;
         PerIoData->DataBuf.buf = PerIoData->Buffer;

         if (WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
            &(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
         {
            if (WSAGetLastError() != ERROR_IO_PENDING)
            {
               printf("WSARecv() failed with error %d\n", WSAGetLastError());
               return 0;
            }
         }
      }
   }
}

发表在 article | 标签为 | C++ socket 编程已关闭评论

电信/联通/全国DNS列表/PUBLIC DNS

Global DNS Server List

  • 1.1.1.1 – CloudFlare
  • 2.2.2.2 – 法国电信/ Orange
  • 3.3.3.3 – 通用电气
  • 4.4.4.4 – Level3 通信
  • 5.5.5.5 – E-Plus(德国第三大的手机运营商)
  • 6.6.6.6 – 美国陆军
  • 7.7.7.7 – 未使用的理论上属于美国国防部
  • 8.8.8.8 – 谷歌
  • 9.9.9.9 – IBM

教育网DNS服务器:

北京邮电大学DNS服务器
2001:da8:202:10::36
2001:da8:202:10::37

北京科技大学DNS服务器
2001:da8:208:10::6

”Google Over IPv6”计划的DNS:
Hurricane Electric DNS

ordns.he.net 2001:470:20::2 74.82.42.42
tserv1.fmt2.he.net 2001:470:0:45::2 72.52.104.74
tserv1.dal1.he.net 2001:470:0:78::2 216.218.224.42
tserv1.ams1.he.net 2001:470:0:7d::2 216.66.84.46
tserv1.mia1.he.net 2001:470:0:8c::2 209.51.161.58
tserv1.tor1.he.net 2001:470:0:c0::2 216.66.38.58
ns.ipv6.uni-leipzig.de 2001:638:902:1::10 139.18.25.34

Google Public DNS

google-public-dns-a.google.com 2001:4860:4860::8888 8.8.8.8
google-public-dns-b.google.com 2001:4860:4860::8844 8.8.4.4

Cloudflare DNS

2606:4700:4700::1111 1.1.1.1
2606:4700:4700::1001 1.0.0.1

公众 DNS 测试:

Google 8.8.8.8 私有和未过滤,最受欢迎。
CloudFlare 1.1.1.1 私有和未过滤的新玩家。
Quad 9 9.9.9.9 私有和安全意识很高的新玩家。
OpenDNS 208.67.222.222 阻止恶意网域并提供阻止成人内容的旧玩家。
Norton DNS 199.85.126.20 阻止恶意域名并与其防病毒软件集成的旧玩家。
CleanBrowsing 185.228.168.168 私有和阻止访问成人内容,新玩家。
Yandex DNS 77.88.8.7 阻止恶意域名的旧玩家,在俄罗斯非常受欢迎。
Comodo DNS 8.26.56.26 阻止恶意域名的旧玩家

结果摘要

测试非常简单,针对不同流行的域名(google, facebook, twitter, gmail 等)在整个一小时内执行了 70 次DNS 查询。对每个位置的所有请求进行平均,以获得每个 DNS 解析程序的整体性能指标。

TLDR /摘要

  • 所有供应商(Yandex 除外)在北美和欧洲表现非常好。他们在美国,加拿大和欧洲的响应时间均小于 15 毫秒。然而,亚洲和南美洲在总体平均数上有所不同,因为一些提供商在那里连接不好。
  • CloudFlare 是所有位置中最快的 DNS。它在全球的平均值为 4.98 毫秒,令人惊叹。
  • 谷歌和 Quad9 分别接近第二和第三。Quad9 在北美和欧洲比谷歌速度快,但在亚洲/南美洲表现不佳。
  • CloudFlare 在任何地方都有强大的存在。尽管 Google 和 Quad9 在某些地方的响应时间很高,但CloudFlare 在各个地方都表现良好。
  • Yandex 仅适用于俄罗斯。它不像其他提供商那样使用 Anycast,并且在任何地方都非常缓慢。
  • CleanBrowsing 是成人(色情)内容过滤的最快速的提供商。

全球平均

#1 CloudFlare:4.98 ms
#2 Google:16.44 ms
#3 Quad9:18.25 ms
#4 CleanBrowsing:19.14 ms
#5 Norton:34.75 ms
#6 OpenDNS:46.51 ms
#7 Comodo:71.90
#8 Yandex:169.91

北美平均水平

#1 CloudFlare:3.93 ms
#2 Quad9:7.21 ms
#3 Norton:8.32 ms
#4 Google:8.53 ms
#5 CleanBrowsing:11.83 ms
#6 OpenDNS:14.66 ms
#7 Comodo:25.91 ms
#8 Yandex:119.09 ms

欧洲平均

#1 CloudFlare:2.96
#2 Quad9:4.35
#3 CleanBrowsing:5.74
#4 Google:7.17
#5 OpenDNS:8.99
#6 Norton:10.35
#7 Comodo:13.06
#8 Yandex:35.74

测试结果来自:medium

China Global DNS Server List

全国各地电信 DNS 服务器 IP 地址

名称 DNS 服务器 IP 地址
安徽电信 DNS 61.132.163.68 202.102.213.68
北京电信 DNS 219.141.136.10 219.141.140.10
重庆电信 DNS 61.128.192.68 61.128.128.68
福建电信 DNS 218.85.152.99 218.85.157.99
甘肃电信 DNS 202.100.64.68 61.178.0.93
广东电信 DNS 202.96.128.86 202.96.128.166
202.96.134.33 202.96.128.68
广西电信 DNS 202.103.225.68 202.103.224.68
贵州电信 DNS 202.98.192.67 202.98.198.167
河南电信 DNS 222.88.88.88 222.85.85.85
黑龙江电信 219.147.198.230 219.147.198.242
湖北电信 DNS 202.103.24.68 202.103.0.68
湖南电信 DNS 222.246.129.80 59.51.78.211
江苏电信 DNS 218.2.2.2 218.4.4.4
61.147.37.1 218.2.135.1
江西电信 DNS 202.101.224.69 202.101.226.68
内蒙古电信 219.148.162.31 222.74.39.50
山东电信 DNS 219.146.1.66 219.147.1.66
陕西电信 DNS 218.30.19.40 61.134.1.4
上海电信 DNS 202.96.209.133 116.228.111.118
202.96.209.5 108.168.255.118
四川电信 DNS 61.139.2.69 218.6.200.139
天津电信 DNS 219.150.32.132 219.146.0.132
云南电信 DNS 222.172.200.68 61.166.150.123
浙江电信 DNS 202.101.172.35 61.153.177.196
61.153.81.75 60.191.244.5

全国各地联通 DNS 服务器 IP 地址

名称 DNS 服务器 IP 地址
北京联通 DNS 202.106.196.115 202.106.46.151
202.106.0.20 202.106.195.68
重庆联通 DNS 221.5.203.98 221.7.92.98
广东联通 DNS 210.21.196.6 221.5.88.88
河北联通 DNS 202.99.160.68 202.99.166.4
河南联通 DNS 202.102.224.68 202.102.227.68
黑龙江联通 202.97.224.69 202.97.224.68
吉林联通 DNS 202.98.0.68 202.98.5.68
江苏联通 DNS 221.6.4.66 221.6.4.67
内蒙古联通 202.99.224.68 202.99.224.8
山东联通 DNS 202.102.128.68 202.102.152.3
202.102.134.68 202.102.154.3
山西联通 DNS 202.99.192.66 202.99.192.68
陕西联通 DNS 221.11.1.67 221.11.1.68
上海联通 DNS 210.22.70.3 210.22.84.3
四川联通 DNS 119.6.6.6 124.161.87.155
天津联通 DNS 202.99.104.68 202.99.96.68
浙江联通 DNS 221.12.1.227 221.12.33.227
辽宁联通 DNS 202.96.69.38 202.96.64.68

全国各地移动 DNS 服务器 IP 地址

名称 DNS 服务器 IP 地址
江苏移动 DNS 221.131.143.69 112.4.0.55
安徽移动 DNS 211.138.180.2 211.138.180.3
山东移动 DNS 218.201.96.130 211.137.191.26

Apple TV DNS 服务器 IP 地址

名称 DNS 服务器 IP 地址
上海电信 180.153.225.136
杭州电信 115.29.189.118
广东电信 203.195.182.150
北方联通 118.244.224.124

全国电信DNS列表

58.217.249.160 58.217.249.161 江苏省南京市 南京信风网络科技有限公司DNS服务器电信节点
59.51.78.210 59.51.78.211 湖南省 电信DNS服务器
60.191.244.5 60.191.244.5 浙江省金华市 电信DNS服务器
60.207.196.198 60.207.196.198 北京市 电信通DNS服务器
61.128.114.133 61.128.114.134 新疆乌鲁木齐市 电信DNS服务器
61.128.114.166 61.128.114.167 新疆乌鲁木齐市 电信DNS服务器
61.128.128.68 61.128.128.68 重庆市 电信DNS服务器
61.128.192.68 61.128.192.68 重庆市 电信DNS服务器
61.130.254.34 61.130.254.36 浙江省湖州市 电信DNS服务器
61.132.163.68 61.132.163.68 安徽省 电信DNS服务器
61.134.1.4 61.134.1.4 陕西省西安市 电信DNS
61.134.1.5 61.134.1.5 陕西省西安市 电信DNS服务器
61.139.2.69 61.139.2.69 四川省成都市 电信DNS服务器
61.139.39.73 61.139.39.73 四川省泸州市 电信DNS服务器
61.139.54.66 61.139.54.66 四川省凉山州西昌市 电信DNS服务器
61.147.37.1 61.147.37.1 江苏省徐州市 电信DNS服务器
61.166.150.101 61.166.150.101 云南省昆明市 电信DNS服务器
61.166.150.123 61.166.150.123 云南省 电信DNS服务器
61.166.150.139 61.166.150.139 云南省昆明市 电信DNS服务器
61.177.7.1 61.177.7.1 江苏省苏州市 电信DNS服务器
61.187.98.3 61.187.98.3 湖南省株洲市 电信DNS服务器
61.187.98.6 61.187.98.6 湖南省株洲市 电信DNS服务器
67.138.116.2 67.138.116.2 美国 俄勒冈州波特兰市Integra电信股份有限公司DNS服务器
76.10.67.2 76.10.67.2 美国 北达科他州卡斯县法戈市IdeaOne电信公司DNS服务器
76.14.0.8 76.14.0.9 美国 北达科他州卡斯县法戈市IdeaOne电信公司DNS服务器
76.14.96.13 76.14.96.14 美国 北达科他州卡斯县法戈市IdeaOne电信公司DNS服务器
76.14.192.8 76.14.192.9 美国 北达科他州卡斯县法戈市IdeaOne电信公司DNS服务器
106.59.255.234 106.59.255.239 云南省昆明市 电信DNS服务器
106.59.255.241 106.59.255.242 云南省昆明市 电信DNS服务器
112.100.100.100 112.100.100.100 黑龙江省 电信DNS
113.111.211.22 113.111.211.22 广东省广州市 电信DNS服务器
116.228.111.18 116.228.111.18 上海市 电信DNS服务器
116.228.111.118 116.228.111.118 上海市 电信DNS服务器
118.118.118.1 118.118.118.1 四川省雅安市 电信DNS服务器
118.123.202.215 118.123.202.218 四川省成都市 阿里巴巴(中国)有限公司阿里公共DNS电信节点
119.84.104.215 119.84.104.218 重庆市 阿里巴巴(中国)有限公司阿里公共DNS电信节点
124.207.160.106 124.207.160.106 北京市 电信通DNS服务器
124.207.160.110 124.207.160.110 北京市 电信通DNS服务器
143.90.130.11 143.90.130.11日本 软银电信公司DNS服务器
143.90.130.166 143.90.130.166 日本 软银电信公司DNS服务器
165.21.83.88 165.21.83.88 新加坡 新加坡电信数字媒体私人有限公司DNS服务器
165.21.83.100 165.21.83.100 新加坡 新加坡电信数字媒体私人有限公司DNS服务器
165.21.100.88 165.21.100.88 新加坡 新加坡电信数字媒体私人有限公司DNS服务器
168.126.63.1 168.126.63.2 韩国 KT电信DNS服务器
180.168.255.18 180.168.255.18 上海市 电信DNS服务器
202.96.96.68 202.96.96.68 浙江省杭州市 电信DNS服务器
202.96.103.36 202.96.103.36 浙江省 电信DNS服务器
202.96.104.15 202.96.104.16 浙江省宁波市 电信DNS服务器
202.96.104.26 202.96.104.26 浙江省宁波市 电信DNS服务器
202.96.107.27 202.96.107.29 浙江省绍兴市 电信DNS服务器
202.96.128.68 202.96.128.68 广东省广州市 电信DNS服务器
202.96.128.86 202.96.128.86 广东省广州市 电信DNS服务器
202.96.128.166 202.96.128.166 广东省广州市 电信DNS服务器
202.96.134.33 202.96.134.33 广东省深圳市 电信DNS服务器
202.96.134.133 202.96.134.133 广东省深圳市 电信DNS服务器
202.96.144.47 202.96.144.47 广东省汕头市 电信DNS服务器
202.96.154.15 202.96.154.15 广东省深圳市 电信DNS服务器
202.96.209.5 202.96.209.6 上海市 电信DNS服务器
202.96.209.133 202.96.209.133 上海市 电信DNS服务器
202.98.96.68 202.98.96.68 四川省成都市 电信DNS服务器
202.98.192.67 202.98.192.67 贵州省 电信DNS服务器
202.98.198.167 202.98.198.167 贵州省 电信DNS服务器
202.98.224.68 202.98.224.68 西藏拉萨市 电信DNS服务器
202.100.96.68 202.100.96.68 宁夏银川市 电信DNS服务器
202.100.192.68 202.100.192.68 海南省 电信DNS服务器
202.100.199.8 202.100.199.8 海南省三亚市 电信DNS服务器
202.101.6.2 202.101.6.2 上海市 电信DNS服务器
202.101.98.55 202.101.98.55 福建省福州市 电信DNS服务器
202.101.107.85 202.101.107.85 福建省泉州市 电信DNS服务器
202.101.172.35 202.101.172.35 浙江省杭州市 电信DNS服务器
202.101.172.47 202.101.172.47 浙江省杭州市 电信DNS服务器
202.101.224.68 202.101.224.71 江西省 电信DNS服务器
202.101.226.68 202.101.226.69 江西省九江市 电信DNS服务器
202.102.3.141 202.102.3.141 江苏省常州市 电信DNS服务器
202.102.3.144 202.102.3.144 江苏省常州市 电信DNS服务器
202.102.7.90 202.102.7.90 江苏省扬州市 电信DNS服务器
202.102.8.141 202.102.8.141 江苏省南通市 电信DNS服务器
202.102.199.68 202.102.199.68 安徽省芜湖市 电信DNS服务器
202.102.200.101 202.102.200.101 安徽省蚌埠市 电信DNS服务器
202.102.213.68 202.102.213.68 安徽省 电信DNS服务器
202.103.0.68 202.103.0.68 湖北省武汉市 电信DNS服务器
202.103.0.117 202.103.0.117 湖北省武汉市 电信DNS服务器
202.103.24.68 202.103.24.68 湖北省武汉市 电信DNS服务器
202.103.44.150 202.103.44.150 湖北省武汉市 电信DNS服务器
202.103.176.22 202.103.176.22 广东省茂名市 电信DNS服务器
202.103.224.68 202.103.224.68 广西南宁市 电信DNS服务器
202.103.225.68 202.103.225.68 广西柳州市 电信DNS服务器
210.200.211.193 210.200.211.193 台湾省 亚太电信股份有限公司DNS服务器
210.200.211.225 210.200.211.225 台湾省 亚太电信股份有限公司DNS服务器
211.147.6.3 211.147.6.4 北京市 电信通DNS服务器
211.167.242.34 211.167.242.34 北京市 电信通DNS服务器
216.8.196.88 216.8.196.89 美国 印第安纳州里普利县亚当斯地区桑曼镇Enhanced电信集团公司DNS服务器
216.8.209.88 216.8.209.88 美国 印第安纳州里普利县亚当斯地区桑曼镇Enhanced电信集团公司DNS服务器
216.8.228.88 216.8.228.88 美国 印第安纳州里普利县亚当斯地区桑曼镇Enhanced电信集团公司DNS服务器
218.2.2.2 218.2.2.2 江苏省淮安市 电信DNS服务器
218.2.135.1 218.2.135.1 江苏省南京市 电信DNS服务器
218.4.4.4 218.4.4.4 江苏省苏州市 电信DNS服务器
218.6.200.139 218.6.200.139 四川省成都市 电信DNS服务器
218.30.19.50 218.30.19.50 陕西省西安市 电信DNS服务器
218.76.192.100 218.76.192.101 湖南省邵阳市 电信DNS服务器
218.85.152.99 218.85.152.99 福建省福州市 电信DNS服务器
218.85.157.99 218.85.157.99 福建省福州市 电信DNS服务器
218.89.0.124 218.89.0.124 四川省乐山市 电信DNS服务器
219.141.136.10 219.141.136.10 北京市 电信DNS服务器
219.141.140.10 219.141.140.10 北京市 电信DNS服务器
219.141.148.37 219.141.148.37 北京市 电信DNS服务器
219.141.148.39 219.141.148.39 北京市 电信DNS服务器
219.146.0.130 219.146.0.130 山东省济南市 电信DNS服务器
219.146.1.66 219.146.1.66 山东省济南市 电信DNS服务器
219.147.198.230 219.147.198.230 黑龙江省齐齐哈尔市 电信DNS服务器
219.148.204.66 219.148.204.66 辽宁省沈阳市 电信DNS服务器
219.149.6.99 219.149.6.99 辽宁省大连市 电信DNS服务器
219.149.194.55 219.149.194.56 吉林省长春市 电信DNS服务器
219.150.32.132 219.150.32.132 天津市 电信DNS服务器
219.239.26.42 219.239.26.42 北京市 电信通DNS服务器
220.168.208.3 220.168.208.3 湖南省常德市 电信DNS服务器
220.168.208.6 220.168.208.6 湖南省常德市 电信DNS服务器
220.170.64.68 220.170.64.68 湖南省衡阳市 电信DNS服务器
220.181.70.210 220.181.70.210 北京市 电信互联网数据中心公众DNS服务器
220.187.24.2 220.187.24.2 浙江省舟山市 电信DNS服务器
220.187.24.6 220.187.24.6 浙江省舟山市 电信DNS服务器
221.228.255.1 221.228.255.1 江苏省无锡市 电信DNS服务器
221.232.129.30 221.232.129.30 湖北省武汉市 电信DNS服务器
222.75.152.129 222.75.152.129 宁夏银川市 电信DNS服务器
222.85.85.85 222.85.85.85 河南省 电信DNS服务器
222.88.88.88 222.88.88.88 河南省洛阳市 电信DNS服务器
222.172.200.68 222.172.200.68 云南省 电信DNS服务器
222.221.0.9 222.221.0.12 云南省昆明市 电信DNS服务器
222.221.5.240 222.221.5.241 云南省昆明市 云南电信公众信息产业有限公司DNS服务器
222.222.222.222 222.222.222.222 河北省石家庄市 电信DNS
222.243.129.81 222.243.129.81 湖南省 电信DNS服务器
222.246.129.80 222.246.129.81 湖南省 电信DNS服务器

全国联通DNS列表

58.22.96.66 58.22.96.66 福建省 联通DNS服务器
58.240.57.33 58.240.57.33 江苏省南京市 联通DNS服务器
58.241.208.46 58.241.208.46 江苏省盐城市 联通DNS服务器
58.242.2.2 58.242.2.2 安徽省合肥市 联通DNS服务器
60.12.166.166 60.12.166.166 浙江省金华市 联通DNS服务器
61.135.164.13 61.135.164.18 北京市 联通DNS服务器
113.207.20.15 113.207.20.18 重庆市 阿里巴巴(中国)有限公司公共DNS服务器联通节点
119.6.6.6 119.6.6.6 四川省成都市 联通DNS服务器
123.125.81.6 123.125.81.6 北京市 上海聚流软件科技有限公司公共DNS服务器联通节点
124.161.97.234 124.161.97.234 四川省 联通DNS服务器
124.161.97.238 124.161.97.238 四川省 联通DNS服务器
124.161.97.242 124.161.97.242 四川省 联通DNS服务器
140.207.198.6 140.207.198.6 上海市 上海聚流软件科技有限公司公共DNS服务器联通节点
202.96.64.68 202.96.64.68 辽宁省沈阳市 联通DNS服务器
202.96.69.38 202.96.69.38 辽宁省大连市 联通DNS服务器
202.96.75.68 202.96.75.68 辽宁省沈阳市 联通DNS服务器
202.96.86.18 202.96.86.18 辽宁省抚顺市 联通DNS服务器
202.97.224.68 202.97.224.69 黑龙江省 联通DNS服务器
202.98.0.68 202.98.0.68 吉林省长春市 联通DNS服务器
202.98.1.11 202.98.1.11 吉林省长春市 联通DNS服务器
202.98.5.68 202.98.5.68 吉林省长春市 联通DNS服务器
202.99.96.68 202.99.96.68 天津市 联通DNS
202.99.104.68 202.99.104.68 天津市 联通DNS
202.99.160.68 202.99.160.68 河北省 联通DNS服务器
202.99.166.4 202.99.166.4 河北省 联通DNS服务器
202.99.168.8 202.99.168.8 河北省保定市 联通DNS服务器
202.99.192.66 202.99.192.66 山西省太原市 联通DNS服务器
202.99.192.68 202.99.192.68 山西省太原市 联通DNS服务器
202.99.224.8 202.99.224.8 内蒙古呼和浩特市 联通DNS服务器(netcool)
202.99.224.67 202.99.224.67 内蒙古呼和浩特市 联通DNS服务器(cns)
202.99.224.68 202.99.224.68 内蒙古呼和浩特市 联通DNS服务器(nmdns)
202.102.134.68 202.102.134.70 山东省青岛市 联通DNS服务器
202.102.152.3 202.102.152.3 山东省济南市 联通DNS服务器
202.102.154.3 202.102.154.3 山东省济南市 联通DNS服务器
202.102.224.68 202.102.224.68 河南省 联通DNS服务器
202.102.227.68 202.102.227.68 河南联通xDSL DNS
202.106.0.20 202.106.0.20 北京市 联通DNS服务器
202.106.46.151 202.106.46.151 北京市 联通DNS服务器
202.106.196.233 202.106.196.234 北京市 联通DNS服务器
210.21.196.6 210.21.196.6 广东省深圳市 联通DNS服务器
210.22.70.3 210.22.70.3 上海市 联通DNS服务器
211.90.72.65 211.90.72.65 内蒙古呼和浩特市 联通DNS服务器
211.90.80.65 211.90.80.65 山西省太原市 联通DNS服务器
211.91.88.129 211.91.88.129 安徽省合肥市 联通DNS服务器
211.92.136.81 211.92.136.81 贵州省贵阳市 联通DNS服务器
211.92.144.161 211.92.144.161 云南省昆明市 联通DNS服务器
211.93.0.81 211.93.0.81 宁夏银川市 联通DNS服务器
211.93.24.129 211.93.24.129 黑龙江省哈尔滨市 联通DNS服务器
211.93.64.129 211.93.64.129 吉林省 联通DNS服务器(全省通用)
211.95.1.97 211.95.1.97 上海市 联通DNS服务器
211.95.72.1 211.95.72.1 上海市 联通DNS服务器
211.95.193.97 211.95.193.97 广东省广州市 联通DNS服务器
211.97.64.129 211.97.64.130 广西南宁市 联通DNS服务器
211.97.96.65 211.97.96.65 海南省海口市 联通DNS服务器
218.24.249.2 218.24.249.2 辽宁省盘锦市 联通DNS服务器
218.24.249.18 218.24.249.18 辽宁省盘锦市 联通DNS服务器
218.29.4.227 218.29.4.227 河南省南阳市 联通DNS服务器
218.29.4.249 218.29.4.249 河南省南阳市 联通DNS服务器
218.29.5.148 218.29.5.148 河南省南阳市 联通DNS服务器
218.29.7.233 218.29.7.233 河南省南阳市 联通DNS服务器
218.29.12.166 218.29.12.166 河南省南阳市 联通DNS服务器
218.29.39.19 218.29.39.19 河南省南阳市 联通DNS服务器
218.29.42.233 218.29.42.233 河南省南阳市 联通DNS服务器
218.29.72.22 218.29.72.22 河南省郑州市 联通DNS服务器
218.29.90.149 218.29.90.149 河南省郑州市 联通DNS服务器
218.29.106.250 218.29.106.250 河南省郑州市 联通DNS服务器
218.29.117.126 218.29.117.126 河南省郑州市 联通DNS服务器
218.29.122.70 218.29.122.70 河南省郑州市 联通DNS服务器
218.29.156.138 218.29.156.138 河南省三门峡市 联通DNS服务器
218.29.172.149 218.29.172.149 河南省濮阳市 联通DNS服务器
218.29.174.166 218.29.174.166 河南省濮阳市 联通DNS服务器
218.29.188.210 218.29.188.210 河南省郑州市 联通DNS服务器
218.29.188.243 218.29.188.243 河南省郑州市 联通DNS服务器
218.29.193.118 218.29.193.118 河南省郑州市 联通DNS服务器
218.29.203.18 218.29.203.18 河南省郑州市 联通DNS服务器
218.29.209.106 218.29.209.106 河南省郑州市 联通DNS服务器
218.29.222.108 218.29.222.108 河南省郑州市新密市 联通DNS服务器
218.29.223.150 218.29.223.150 河南省郑州市新密市 联通DNS服务器
218.29.228.70 218.29.228.70 河南省郑州市巩义市 联通DNS服务器
218.29.236.14 218.29.236.14 河南省郑州市 联通DNS服务器
218.29.237.82 218.29.237.82 河南省郑州市 联通DNS服务器
218.29.254.154 218.29.254.154 河南省漯河市 联通DNS服务器
218.104.32.106 218.104.32.106 江苏省苏州市 联通DNS服务器
218.104.78.2 218.104.78.2 安徽省合肥市 联通DNS服务器
218.104.111.114 218.104.111.114 湖北省武汉市 联通DNS服务器
218.104.111.122 218.104.111.122 湖北省武汉市 联通DNS服务器
218.104.128.106 218.104.128.106 福建省 联通DNS服务器
220.248.192.12 220.248.192.13 江西省南昌市 联通DNS服务器
221.3.131.11 221.3.131.12 云南省 联通DNS服务器
221.4.66.66 221.4.66.66 广东省广州市 联通DNS服务器
221.5.88.88 221.5.88.88 广东省肇庆市 联通DNS服务器
221.5.203.86 221.5.203.86 重庆市 联通DNS服务器
221.5.203.90 221.5.203.90 重庆市 联通DNS服务器
221.5.203.98 221.5.203.99 重庆市 联通DNS服务器
221.6.4.66 221.6.4.67 江苏省南京市 联通DNS服务器
221.7.1.20 221.7.1.21 新疆 联通DNS服务器
221.7.34.10 221.7.34.10 甘肃省兰州市 联通DNS服务器
221.7.92.86 221.7.92.86 重庆市 联通DNS服务器
221.7.92.98 221.7.92.98 重庆市 联通DNS服务器
221.7.128.68 221.7.128.68 广西南宁市 联通DNS服务器
221.7.136.68 221.7.136.68 广西柳州市 联通DNS服务器
221.11.132.2 221.11.132.2 海南省海口市 联通DNS服务器
221.12.1.226 221.12.1.228 浙江省杭州市 联通DNS服务器
221.12.33.227 221.12.33.228 浙江省宁波市 联通DNS服务器
221.12.65.227 221.12.65.228 浙江省温州市 联通DNS服务器
发表在 article | 标签为 , | 电信/联通/全国DNS列表/PUBLIC DNS已关闭评论