Репліка - сервер MySQL, що отримує зміни від джерела (source, раніше «master») через бінарний журнал і застосовує їх у себе. У типовому вебзастосунку читань у десятки разів більше, ніж записів, тож читання можна розподілити між кількома репліками, а всі записи лишити на джерелі.
записи читання
застосунок ──────► джерело ───► репліка 1 ◄──┐
│ ├── застосунок
└──────► репліка 2 ◄──┘
Налаштування в Laravel (config/database.php):
'mysql' => [
'driver' => 'mysql',
'read' => [
'host' => ['10.0.0.11', '10.0.0.12'], // випадкова репліка на запит
],
'write' => [
'host' => ['10.0.0.10'],
],
'sticky' => true,
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
// ...
],
SELECT ідуть на репліки, усе інше - на джерело. Транзакції й lockForUpdate() теж виконуються на джерелі.
Головна пастка - затримка реплікації. Репліка застосовує зміни з запізненням (зазвичай мілісекунди, під навантаженням - секунди й більше). Класичний баг:
$post = Post::create($data); // запис на джерело
return redirect()->route('posts.show', $post);
// наступний запит читає з репліки - поста там ще немає, 404
Як Laravel це пом'якшує: 'sticky' => true - якщо в поточному запиті вже був запис, наступні читання цього ж запиту йдуть на джерело. Але наступний HTTP-запит (після редиректу) знову піде на репліку.
Інші способи:
- явно читати з джерела:
Post::query()->useWritePdo()->find($id),DB::connection('mysql')->...; - для критичних сторінок після запису (профіль після редагування, замовлення після оплати) - читати з джерела кілька секунд після запису (через сесію чи кеш);
- черги: джоба, поставлена в черзі одразу після запису, може не знайти рядок на репліці -
afterCommitне допомагає від затримки репліки, лише від незакоміченої транзакції.
Що ще дають репліки:
- важкі звіти й аналітика без навантаження на джерело;
- бекапи з репліки;
- резерв на випадок відмови джерела (але перемикання - окрема задача).
Чого репліки не дають: масштабування записів. Усі записи все одно йдуть через одне джерело. Для цього - шардування чи інші архітектурні рішення.