Я использую rsyslog для записи данных DNS в postgres. Сообщения всегда довольно короткие и похожи друг на друга: <ip of host making dns request> <dns request>
Я использую регулярное выражение для получения ip от запрашивающего и FQDN от запроса.
rsyslog постоянно использует 40% -55% ЦП, в то время как postgres составляет всего 0,5% -2,5% ЦП. (rsyslog и postgres находятся на одном хосте)
Есть ли способ снизить использование процессора rsyslog, перенеся большую часть рабочей нагрузки на postgres? Я пробовал изменить queue.size с 50000 на 1000, но, похоже, это не имеет значения.
template(name="sql-syslog" type="list" option.sql="on") {
constant(value="INSERT INTO tablename (request_time, server, ip, request) values ('")
property(name="timereported" dateformat="pgsql")
constant(value="','")
property(name="fromhost")
constant(value="','")
property(name="msg"
regex.type="ERE"
regex.submatch="1"
regex.expression="([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}) (.*\\.) (.*)$"
regex.nomatchmode="DFLT"
)
constant(value="','")
property(name="msg"
regex.type="ERE"
regex.submatch="2"
regex.expression="([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}) (.*\\.) (.*)$"
regex.nomatchmode="DFLT"
)
)
constant(value="')")
}
# load module
module(load="ompgsql")
action(type="ompgsql" server="dbhost"
user="dbuser" pass="dbpass"
db="dbname"
template="sql-syslog"
queue.size="1000"
queue.type="LinkedList"
queue.filename="dbq"
queue.workerthreads="5"
queue.workerthreadMinimumMessages="500"
queue.timeoutWorkerthreadShutdown="1000"
queue.timeoutEnqueue="10000")
Поскольку сообщения проходят через системный журнал в PostGreSQL, вам необходимо настроить rsyslog.
Сложные регулярные выражения нуждаются в обработке - они обрабатываются последовательно - строка за строкой - до тех пор, пока не будет выполнено последнее совпадение.
Ваше регулярное выражение там выглядит довольно сложным - попробуйте упростить - возможно, вы можете перенаправить DNS-журналы на собственное syslog-устройство (local2?) И вместо этого записать это полное устройство в PostGreSQL.
ИЛИ позвольте DNS регистрироваться напрямую в PostGreSQL - если возможно.