Closed mRrvz closed 2 years ago
Первая версия, не является конечным и неизменяемым, замечания, предложения приветствуются. Делю на 3 комментария для простоты обсуждения.
Одним из наиболее важных решений, которые нам нужно принять на начальном этапе, является решение об ограничениях на ключ. Есть несколько вариантов:
uint32_t
ключей, максимум uint128_t
- 16 байтовые ключи).("{UserID: 1, CountryID: 2}", "Petya")
- и в дальнейшем можно накрутить функционал выборки по какой-то части ключа, но это уже не совсем про key-value, конечно.Интерфейс СУБД: Скорее всего это будет gRPC, потому что на сегодняшний день это наиболее популярный способ HTTP API, но можно попробовать и REST API.
Метрики: Предлагаю начать с graphite и его paintext или pickle протоколов. Оба очень простые:
plaintext
: <metric_path> <metric_value> <timestamp>
(timestamp = -1 - будет выставлено время приема метрики). пример: keys_amount 12 -1
pickle
: [(<metric_path>, (<timestamp>, <metric_value)), ...]
. пример: [(keys_amount, (-1, 12)), (keys_unique, (-1, 11))]
Логи: Вижу 2 варианта с наименьшим сопротивлением:
Ответственный: @hackfeed
думаю, что CLI будет наиболее удобным и простым вариантом (можно обсудить)
Предполагается, что это будет что-то вроде:
> bongodb_cli --cluster cluster.yaml --trash-talk
Oh, bruh, you're ready to smoke, sheeeesh :smoking:
> put [(12, "gangsta"), (23, "smoke")]
Sheeeeesh.
> get [12, 23, 34]
[(12, "gangsta"), (23, "smoke")].
> delete [12]
Sheeeeesh.
> get [12, 23, 34]
[(23, "smoke")].
Ответственный: @hackfeed
Думаю, что тоже можно CLI.
Для сбора метрик можно ничего отдельно не писать, а заиспользовать графит (хотя если очень хочется, можно и свое накрутить с протоколом графита, потому что он очень простой).
Для сбора логов @hackfeed нужно придумать формат взаимодействия (желательно наиболее простой для цпп еще...), здесь есть пространство для креатива. Полагаю, что сама программа должна форматированно показывать логи кластера, например (формат тоже можно обсудить):
# [LEVEL][host][shard:replica] message
[DEBUG][127.0.0.1:3001][3:1] write key 12
[DEBUG][127.0.0.1:3002][3:2] write key 12
Возможно стоит это объединить во что-то одно более целостное.
В дополнение к словам Паши.
Для оценки состояния кластера стоит собирать:
Метрики будут поставляться в модели Prometheus. Для этой модели есть C++ инструмент для экспорта метрик + можно бдуте подружить Prometheus с Grafana для мониторинга.
Для логирования будем использовать C++ spdlog. Логи будут записываться локально в файл и syslog по каждой ноде, CLI тулза будет заниматься организацией и выводом логов.
Решаем в рамках отдельных задач оставшиеся вопросы
Необходимо немножечко подумать и придумать: