Comments 19
Это самое важное. Для вас не должно существовать безусловных авторитетов. Если кто-либо говорит полную чушь, или говорит что-то, что противоречит вашей практике — не прислушивайтесь к таким советам, и не важно, насколько этот человек известный и уважаемый.
Золотые слова
Согласен.
Я бы ещё Google SRE книжку посоветовал посмотреть. Там тоже очень много хорошего. Применяется везде, а не только для их платформы.
Когда что-то важное упало — напишите постмортем
Как мне кажется, упущен пункт, что это знание должно быть расшарено с заинтересованными.
Getting the most out of shared postmortems — CRE life lessons
goo.gl/ns5Ce2
Спасибо за статью.
Есть разные способы, как можно достигать консистентности в таких случаях, но самым распространненым являются очереди — вы добавляете в одной транзакции данные и запись в отдельную таблицу — очередь на обновление сервиса. Поскольку это транзакция на одном сервере, то она либо пройдет целиком, либо не пройдет вовсе. Соответственно, даже если обновить данные в сервисе сразу не удалось, в конечном итоге данные будут согласованы.
Не уловил вашей мысли. Можете "на пальцах" объяснить?
Чтобы решить эту проблему, можно ввести очереди:
— BEGIN;
— update accounts…;
— insert into sphinx_queue values (account_id);
— COMMIT;
То есть, вместо обновления сфинкса мы пишем в той же транзакции еще в одну таблицу-очередь. Потом, в отдельном фоновом процессе, мы эту очередь разгребаем и обновляем сфинкс. Если обновить сфинкс не удалось, то мы просто оставляем запись в таблице и пробуем снова через какое-то время.
Более подробно об этом (и других проблемах шардинга) рассказывал Михаил Курмаев на хайлоаде: m.youtube.com/watch?v=Ygfwwd490mk
https://habrahabr.ru/post/217521/ — это один из способов смягчить проблему, но не устранить её
https://habrahabr.ru/post/44608/ — вот намного более старая статья, где есть намек на то, как можно решить проблему более правильно
Я чуток отредактировал комментарий, добавив туда ещё одну ссылку :).
Но идея не особо меняется — вы используете поле для сортировки, например, id, и в token вставляете последнее значение id, на котором остановились. Если поле не уникальное (например, timestamp в секундах), то в токен дополнительно засовываете значения id, которые вы уже видели с самым последним значением timestamp. Грубо говоря, если у вас строки в таблице идут вот так:
id timestamp
1 1
2 2
3 3
4 4
5 4 <- limit = 5, это последняя запись на текущей странице
6 4
7 5
То для следующей страницы мы должны в итоге получить запрос вида SELECT… WHERE timestamp >= 4 AND id NOT IN(4,5)
А вот что то практическое можете по этим пунктам посоветовать? =) про шардинг или вот про мониторинг, например?
Про шардинг — https://youtube.com/watch?v=Ygfwwd490mk, доклад Михаила Курмаева. Про мониторинг — вопрос хороший, сходу хороших докладов не припомню. Если речь идет о просто мониторинге серверов и немножко бизнес метрик, то не сочтите за рекламу, но я бы рекомендовал начать с того, что делают ребята из okmeter, например.
Понятно что оптимизация и тут понадобится, но я так понимаю уже с целью экономии денег?
Ничего не могу посоветовать, ибо с облачными базами не работал. Но из того, что я слышал от людей, которые их использовали, это обычно получается дорого и неуправляемо (как раз из-за отсутствия возможности что-то настроить «под себя»). То есть, оно годится в условиях сильно ограниченных людских ресурсов и слабо ограниченных финансовых ресурсов (enterprise?), и обычно это с хайлоадом плохо сочетается. Но понимать, как система работает, всё равно очень желательно, как раз для того, чтобы не тратить лишних денег (на больших объемах уменьшение расходов даже на 1% может выливаться в месячную зарплату одного работника).
ов. Если кто-либо говорит полную чушь, или говорит что-то, что противоречит вашей практике — не прислушивайтесь к таким советам, и не важно, насколько этот человек известный и уважаемый.
Прислушиваться нужно. Проверять нужно. Часто бывает, что человек несёт полную чушь, потому что он думает уже не о «твоей маленькой проблеме», а больших последствиях твоего метода исправления маленькой проблемы.
Часто бывает, что «чушь» — это иная парадигма и иной комплект ценностей. Например, вам могут нести чушь про идемпотентность и вред неявных сайд-эффектов. Чушь? Чушь. Слушать? Ну..., как сказать, можно и не слушать.
Список полезных идей для высоконагруженных сервисов