Устройство репликации в in-memory базе данных Reindexer С++
Мы разрабатываем in-memory базу данных для платформы Wink - облачного телевидения/кинотеатра, как быстрый и умный кэш для контентных данных. Каждая нода системы содержит свою копию кэша, а за репликацию данных из централизованного хранилища отвечает код бэка — приложения на golang.
В какой-то момент такая схема перестала быть удобной в эксплуатации, и мы приняли решение переложить функцию репликации на движок in-memory. При реализации мы рассматривали несколько альтернативных подходов к архитектуре репликации для решения задачи, в итоге остановились на комбинированном подходе: логическая репликация по WAL + live stream обновлений.
В докладе расскажу о наиболее интересных деталях подкапотной реализации:
* как реализовывали сервер, как реализовывали клиент — и то и то приложения на C++11;
* какая многопоточная модель используется;
* где и как нашлись узкие бутылочные горлышки, и как их удалось пофиксить своими lock free-буферами.
И, кроме этого, расскажу, как оптимизировали in-memory WAL, чтобы он занимал минимум памяти и вмещал максимум данных.