Страница 1 из 1

Как работает Spamassassin bayes расположенная на выделенном сервере PostgreSQL

Добавлено: 2019-05-14 12:05:57
Amaka
Добрый день!
Кто-нибудь использует для базы bayes выделенный сервер PostgreSQL?
У меня проблема в MySQL. Т.к. сейчас использую для хранения базы bayes выделенные сервера MySQL (master-master).
При больших потоках писем вижу ошибки MySQL deadlock и жуткие тормоза.

Как работает Spamassassin bayes расположенная на выделенном сервере PostgreSQL

Добавлено: 2019-05-16 8:25:37
skeletor
А какой тип таблиц в mysql? не myisaam случайно?

Как работает Spamassassin bayes расположенная на выделенном сервере PostgreSQL

Добавлено: 2019-05-16 9:15:20
Amaka
Стоит InnoDB.
mysql Ver 14.14 Distrib 5.5.62, for FreeBSD11.2 (amd64) using readline 8.0

Код: Выделить всё

Create Table: CREATE TABLE `bayes_token` (
  `id` int(11) NOT NULL DEFAULT '0',
  `token` binary(5) NOT NULL DEFAULT '\0\0\0\0\0',
  `spam_count` int(11) NOT NULL DEFAULT '0',
  `ham_count` int(11) NOT NULL DEFAULT '0',
  `atime` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`,`token`),
  KEY `bayes_token_idx1` (`id`,`atime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Create Table: CREATE TABLE `bayes_seen` (
  `id` int(11) NOT NULL DEFAULT '0',
  `msgid` varchar(200) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `flag` char(1) NOT NULL DEFAULT '',
  `time_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`msgid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Create Table: CREATE TABLE `bayes_expire` (
  `id` int(11) NOT NULL DEFAULT '0',
  `runtime` int(11) NOT NULL DEFAULT '0',
  KEY `bayes_expire_idx1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Create Table: CREATE TABLE `bayes_vars` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(200) NOT NULL DEFAULT '',
  `spam_count` int(11) NOT NULL DEFAULT '0',
  `ham_count` int(11) NOT NULL DEFAULT '0',
  `token_count` int(11) NOT NULL DEFAULT '0',
  `last_expire` int(11) NOT NULL DEFAULT '0',
  `last_atime_delta` int(11) NOT NULL DEFAULT '0',
  `last_expire_reduce` int(11) NOT NULL DEFAULT '0',
  `oldest_token_age` int(11) NOT NULL DEFAULT '2147483647',
  `newest_token_age` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `bayes_vars_idx1` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Create Table: CREATE TABLE `bayes_global_vars` (
  `variable` varchar(30) NOT NULL DEFAULT '',
  `value` varchar(200) NOT NULL DEFAULT '',
  PRIMARY KEY (`variable`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


Как работает Spamassassin bayes расположенная на выделенном сервере PostgreSQL

Добавлено: 2019-05-16 9:23:52
skeletor
Ого, вот это динозавр 5.5. Обновитесь хотя бы до 5.6 или 5.7 (тут больше фиксов для Innodb, хотя по скорости немного медленнее, чем 5.6). Насчёт mysql 8, то она слишком медленная (по сравнению 5.6/5.7) и профита для её использования на продакшине под нагрузкой пока не вижу.

Лучше смотреть то, что сейчас на сервере, то есть

Код: Выделить всё

mysql>show create table `bayes_vars`;
а не в скрипте. А видно на какой таблице deadlock'и?

Как работает Spamassassin bayes расположенная на выделенном сервере PostgreSQL

Добавлено: 2019-05-16 9:42:30
Amaka
Вот что в логах:

Код: Выделить всё

190423 14:04:15 [ERROR] Slave SQL: Error 'Deadlock found when trying to get lock; try restarting transaction' on query. 
                          Default database: 'spamas_db'. 
                Query: 'INSERT INTO bayes_token
               (id, token, spam_count, ham_count, atime)
               VALUES ('2','<8E><AC>t<EC><84>','0','1','1528886783')
               ON DUPLICATE KEY UPDATE spam_count = GREATEST(spam_count + '0', 0),
                                       ham_count = GREATEST(ham_count + '1', 0),
                                       atime = GREATEST(atime, '1528886783')', Error_code: 1213
190423 14:04:33 [ERROR] Slave SQL: Error 'Deadlock found when trying to get lock; try restarting transaction' on query. 
                         Default database: 'spamas_db'. 
                Query: 'INSERT INTO bayes_token
               (id, token, spam_count, ham_count, atime)
               VALUES ('2','<9D>mBi^T','0','1','1528886783')
               ON DUPLICATE KEY UPDATE spam_count = GREATEST(spam_count + '0', 0),
                                       ham_count = GREATEST(ham_count + '1', 0),
                                       atime = GREATEST(atime, '1528886783')', Error_code: 1213
190423 14:04:59 [ERROR] Slave SQL: Error 'Deadlock found when trying to get lock; try restarting transaction' on query. 
                         Default database: 'spamas_db'. 
                Query: 'INSERT INTO bayes_token
               (id, token, spam_count, ham_count, atime)
               VALUES ('2','<9D>mBi^T','0','1','1528886783')
               ON DUPLICATE KEY UPDATE spam_count = GREATEST(spam_count + '0', 0),
                                       ham_count = GREATEST(ham_count + '1', 0),
                                       atime = GREATEST(atime, '1528886783')', Error_code: 1213

Но это возникает при большом потоке писем. У меня несколько серверов с установленным Spamassassin.