MySQL Cluster - Lock wait timeout exceeded; try restarting transaction

440hz

php.ru
MySQL Cluster - Lock wait timeout exceeded; try restarting transaction

subj

где-че подкрутить?

MySQL error: [SELECT count(*) as cnt FROM `stat_in_niches_xymdh` WHERE `x` = '62' AND `y` = '2009' AND `m` = '06' AND `d` = '01' AND `h` = '02']
MySQL error: [1205] Lock wait timeout exceeded; try restarting transaction

90к записей

[sql]
CREATE TABLE IF NOT EXISTS `stat_in_niches_xymdh` (
`x` smallint(4) NOT NULL,
`y` smallint(4) NOT NULL,
`m` smallint(4) NOT NULL,
`d` smallint(4) NOT NULL,
`h` smallint(4) NOT NULL,
`intotal` bigint(20) unsigned NOT NULL DEFAULT '0',
`in1` bigint(20) unsigned NOT NULL DEFAULT '0',
`in2` bigint(20) unsigned NOT NULL DEFAULT '0',
`in3` bigint(20) unsigned NOT NULL DEFAULT '0',
`outnocookie` bigint(20) unsigned NOT NULL DEFAULT '0',
`outnoref` bigint(20) unsigned NOT NULL DEFAULT '0',
`outnojs` bigint(20) unsigned NOT NULL DEFAULT '0',
`outproxy` bigint(20) unsigned NOT NULL DEFAULT '0',
`outaol` bigint(20) unsigned NOT NULL DEFAULT '0',
`outreal` bigint(20) unsigned NOT NULL DEFAULT '0',
`outdomain` bigint(20) unsigned NOT NULL DEFAULT '0',
`outniche` bigint(20) unsigned NOT NULL DEFAULT '0',
`outcou` bigint(20) unsigned NOT NULL DEFAULT '0',
`back` bigint(20) unsigned NOT NULL DEFAULT '0',
`b1` bigint(20) unsigned NOT NULL DEFAULT '0',
`b2` bigint(20) unsigned NOT NULL DEFAULT '0',
`b3` bigint(20) unsigned NOT NULL DEFAULT '0',
KEY `x` (`x`),
KEY `y` (`y`),
KEY `m` (`m`),
KEY `d` (`d`),
KEY `h` (`h`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8;
[/sql]

хотя бывает рубит и на других таблицах.
 

svetasmirnova

маленький монстрик
"Lock wait timeout exceeded;" вообще о deadlock-е сообщает. Посмотреть SHOW PROCESSLSIT и понять из-за чего deadlock случился
 

флоппик

promotor fidei
Команда форума
Партнер клуба
SELECT clauses could block DELETE clause and cause lock wait. Do you use AUTOCOMMIT = 0 ?
Вообще, возможно сиюминутно стоит подкрутить innodb_lock_wait_timeout побольше, но надо разбиратся, кто именно лочит? Так например, если какой то поток, делающий DDL запрос отвалится, то при автокоммите = 0 транзакционный лок может остатся висеть.
 

svetasmirnova

маленький монстрик
Точнее собирать вывод SHOW PROCESSLIST и в случае deadlock- а его анализировать. (Так как у Cluster нет такой полезной фичи как latest detected deadlock для InnoDB)

флоппик
innodb_lock_wait_timeout тут не причём
 

440hz

php.ru
Точнее собирать вывод SHOW PROCESSLIST и в случае deadlock- а его анализировать
случается раз в сутки. время не засечь. работают 4 ноды + 4 MySQL API.

просто ложиться демон/демоны из-за этой ошибки и теряются данные, собранные им. жопа только из-за этого.

возможно из-за того, что работает mysqldump ночью? время похоже на правду. похоже он там таблицы блокирует и демон не успевает дождаться?

я переделаю бекап на по-табличный и сделаю минимальный приоритет. ночью посмотрим.


спасибо.
 

svetasmirnova

маленький монстрик
> случается раз в сутки. время не засечь. работают 4 ноды + 4 MySQL API.

Поэтому я и говорю, что тупо собирать вывод SHOW PROCESSLIST. Типа каждую минуту, потом сопоставлять со временем проблемы.

> возможно из-за того, что работает mysqldump ночью?

Очень может быть. Конечно лучше с него начать.
 

svetasmirnova

маленький монстрик
Хотя бы как ты сказал.

Кстати, а почему нативным NDB backup не пользуешься?
 

440hz

php.ru
Хотя бы как ты сказал.

$MYSQL_CMD -q -Q --user=$dbuser --pass=$dbpass $db > $dbfilename

Кстати, а почему нативным NDB backup не пользуешься?
часть данных лежит в MyISAM и InnoDB

-~{}~ 02.06.09 11:47:

не. блокирует не из-за бекапа. днем тоже свалился и на жругих таблицах.

а где подкрутить таймауты в кластере?
 

svetasmirnova

маленький монстрик
Вроде никак :(

Но если у тебя часть данных в InnoDB, InnoDB timeouts имеет смысл подкрутить. Плюс SHOW ENGINE INNODB STATUS может помочь найти проблему. Но только при использовании обоих типов таблиц в одной транзакции.
 

440hz

php.ru
Но если у тебя часть данных
к сожалению эти данные в кластере...

еще проблема вылезла. раньше скрипт работал 15 мин. записей в таблице лимон. добавил индекс. скрипт увеличил работу на 10 мин.

я понимаю, что индексы могут замедлять работу.

как вообще дела с индексами в NDB?
phpmyadmin показывает индексы равными кол-ву записей в таблице. есть вообще в них смысл? или это просто отображается так?
 

svetasmirnova

маленький монстрик
> как вообще дела с индексами в NDB?

Должно быть нормально. SHOW CREATE TABLE и смотреть EXPLAIN EXTENDED

> phpmyadmin показывает индексы равными кол-ву записей в таблице. есть вообще в них смысл? или это просто отображается так?

Это как?

А вообще кластер не любит сложные запросы с десятками JOIN-ов. Какой запрос тормозит?
 

440hz

php.ru
Какой запрос тормозит?
вот не поймать тормоз. валится и все. причем в непредсказуемом месте. там 4 ноды, 4 MySQLAPI, каждая работает. запросов проходит мнооооого...

ну к примеру так:

Код:
Индексы: Документация    Имя индекса  	Тип  	Уникальных элементов  	Действие  	Поле
uid 	INDEX 	976755  	Изменить 	Удалить 	ui
y 	INDEX 	976755  	Изменить 	Удалить 	y
m 	INDEX 	976755  	Изменить 	Удалить 	m
d 	INDEX 	976755  	Изменить 	Удалить 	d
h 	INDEX 	976755  	Изменить 	Удалить 	h
domain_id 	INDEX 	976755  	Изменить 	Удалить 	domain_id
dd 	INDEX 	976755  	Изменить 	Удалить 	dd
od 	INDEX 	976755  	Изменить 	Удалить 	od
on 	INDEX 	976755  	Изменить 	Удалить 	on
oc 	INDEX 	976755  	Изменить 	Удалить 	oc
traftype 	INDEX 	976755  	Изменить 	Удалить 	traftype

причем реально значений индесов намного меньше. к примеру кол-во значений traftype 10

-~{}~ 03.06.09 14:17:

А вообще кластер не любит сложные запросы с десятками JOIN-ов.
эт в курсе. там просто идет очень много SELECT и потом UPDATE. статистика считается
 

svetasmirnova

маленький монстрик
> вот не поймать тормоз.

Как можно не поймать тормоз? А slow query log на что?

> ну к примеру так:

Не знаю откуда он эти данные берёт. Может просто статистика для NDB неверная.
 

440hz

php.ru
Не знаю откуда он эти данные берёт. Может просто статистика для NDB неверная.
Код:
mysql> show index from anti2users;
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table      | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| anti2users |          1 | uid       |            1 | ui          | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | y         |            1 | y           | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | m         |            1 | m           | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | d         |            1 | d           | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | h         |            1 | h           | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | domain_id |            1 | domain_id   | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | dd        |            1 | dd          | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | od        |            1 | od          | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | on        |            1 | on          | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | oc        |            1 | oc          | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
| anti2users |          1 | traftype  |            1 | traftype    | A         |      978414 |     NULL | NULL   |      | BTREE      |         |
+------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
11 rows in set (0.00 sec)
-~{}~ 03.06.09 16:22:

Как можно не поймать тормоз?
сделал вывод "show full processlist" при ошибке.
будем смотреть...
 

440hz

php.ru
сделал выдачу processlist при ошибке.
в списке НЕТУ процессов вообще кроме show processlist;


даже не знаю куда рыть...
а скрипты валятся...
 

440hz

php.ru
Автор оригинала: svetasmirnova
Ошибка как я понимаю случается до show processlist?
ну да. выполняю запрос.
mysql_query();
ловлю от него ответ и если ошибка, то считываю processlist и вывожу в отчет об ошибке.

т.е. после ошибки как раз и разблокируется? хм...

причем валятся сразу несколько нод, но не все, вот в чем прикол...

причем ошибка возникает примерно раз в сутки в произвольном порядке.

блиииннн, ну хоть какие-нить идеи???? как словить что творится? никаких мыслей...
 
Сверху