我编写了一些 PostgreSQL 数据库客户端代码来更新中央数据库,其中包含来自多个客户端的 IP 地址和主机名表。有两张表:一张保存 IP 地址和主机名之间的映射,一张保存尚未解析为主机名的 IP 地址队列。
这是 IP 地址到主机名的映射表:
CREATE TABLE g_hostmap(
appliance_id INTEGER,
ip INET,
fqdn TEXT,
resolve_time TIMESTAMP,
expire_time TIMESTAMP,
UNIQUE(appliance_id, ip))
这是工作队列表:
CREATE TABLE g_hostmap_work(
ip INET,
input_table TEXT)
数据库客户端每个都从单个工作队列表中拉取请求。每个请求都包含一个私有 IPv4 地址,为其请求主机名。
工作流程如下:每个客户端定期向中央数据库工作队列查询需要主机名的 IP 地址列表,对这些地址执行反向 DNS 查找,然后使用 ( IP 地址、主机名)对,一次一对。我希望通过尝试同时解析相同的 IP 地址来最大限度地减少多个客户端重复工作的可能性。
我将每批更新限制为 10 行或工作队列大小的 10%(以行为单位),以较大者为准。客户的时间有点独立。如何在更新过程中进一步减少 DNS 名称服务器和主机名表的争用?我的客户担心会有很多重复的工作。
这是对工作队列中项目计数的初始查询:
SELECT COUNT(*)
FROM g_hostmap_work queued
LEFT JOIN g_hostmap cached
ON queued.ip = cached.ip
AND now() < cached.expire_time
这是返回工作队列中项目子集的查询:
SELECT queued.ip, queued.input_table, cached.expire_time
FROM g_hostmap_work queued
LEFT JOIN g_hostmap cached
ON queued.ip = cached.ip
AND now() < cached.expire_time
LIMIT 10
以下是使用新 IP 地址/主机名映射更新数据库的单个 INSERT 语句示例:
INSERT INTO g_hostmap_20131230 VALUES
(NULL, '192.168.54.133', 'powwow.site', now(), now() + 900 * INTERVAL '1 SECOND')