You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`.docs`| Хранит сжатые батчи сырых документов логов |
24
+
|`.meta`| Токенизированный поток метаданных (для восстановления) |
25
+
|`.index`| Дисковый обратный индекс. |
20
26
21
-
#### File layout
22
-
seq-db store keeps all document data in three file types:
27
+
Поскольку набор данных хранится в этих трех типах файлов, перемещение или восстановление шарда выполняется просто: достаточно скопировать (`cp` / `rsync`) директорию на целевой узел и запустить под.
|`.docs`| Stores compressed batches of raw log documents |
27
-
|`.meta`| Tokenized metadata stream (used for recovery) |
28
-
|`.index`| On-disk inverted index |
29
+
Подробнее о типах файлов и их внутренней структуре читайте [здесь](internal/fractions.md).
29
30
30
-
31
-
Because the dataset is stored in these three file types, moving or restoring a
32
-
shard is straightforward: simply `cp` / `rsync` the directory
33
-
to the target node and start the pod.
34
-
35
-
Read more about file types and their internal structure [here](internal/fractions.md).
36
-
37
-
#### Durability
38
-
A write operation is acknowledged only after the payload is safely persisted:
31
+
#### Durability (обеспечение надежности)
32
+
Операция записи подтверждается только после того, как полезная нагрузка гарантированно сохранена:
39
33
40
34
```
41
-
write, fsync # .meta file
42
-
write, fsync # .data file
35
+
write, fsync # файл .meta
36
+
write, fsync # файл .data
43
37
```
44
-
That is, two write system calls followed by two fsync
45
-
calls—guaranteeing the data survives a node
46
-
crash or restart before the client receives a success response.
47
-
Indexing occurs asynchronously, so it usually takes under 1
48
-
second before the newly written documents are available for search queries.
49
-
Note that this value may be slightly higher when bulk load spikes happen
38
+
То есть, два системных вызова `write`, за которыми следуют два вызова `fsync` — это гарантирует, что данные переживут аварию узла или его перезапуск до того, как клиент получит ответ об успехе.
39
+
Индексация происходит асинхронно, поэтому обычно проходит менее 1 секунды, прежде чем вновь записанные документы становятся доступны для поисковых запросов.
40
+
Примечание: это значение может быть немного выше в периоды пиковой нагрузки.
50
41
51
42
### seq-db proxy
52
-
seq-db proxy is a stateless coordinator for all read & write traffic.
53
-
It maintans a user-defined cluster topology, and allows changes in read-write
54
-
traffic distribution without changes to the stateful components
43
+
seq-db proxy — это stateless-координатор всего трафика чтения и записи.
44
+
Он поддерживает заданную пользователем топологию кластера и позволяет изменять распределение read-write трафика без изменений stateful-компонентов.
55
45
46
+
#### Ключевые характеристики
47
+
- Развертывается как k8s `Deployment`
48
+
- Выполняет логическую репликацию между store'ами
49
+
- Маршрутизирует трафик между уровнями хранения (hot/cold stores)
56
50
57
-
#### Key characteristics
58
-
- Deployed as k8s `Deployment`
59
-
- Performs logical replication between stores
60
-
- Routes traffic between storage tiers (hot/cold stores)
51
+
seq-db proxy токенизирует каждый входящий документ и сжимает батчи с помощью zstd / lz4 перед отправкой батчей в seq-db stores.
Давайте рассмотрим пример архитектуры с 4 шардами seq-db и коэффициентом репликации (replication-factor)=2 (каждый лог должен храниться в двух отдельных seq-db stores).
55
+
Обратите внимание, что реплики шарда могут располагаться в разных зонах доступности (availability zones).
65
56
66
-
### Read-path & write-path (rf=2)
67
-
Let's take a look at an example architecture with 4 seq-db shards and replication-factor=2
68
-
(each log must be stored in two separate seq-db stores).
69
-
Note that replicas of shard can be located in different availability zones.
70
-
71
-
### Write-path
72
-
The write commits only after seq-db proxy receives an ack **from all replicas of the addressed shard**.
57
+
### Write-path (путь записи)
58
+
Запись фиксируется (commit) только после того, как seq-db proxy получает подтверждение (ack) **от всех реплик целевого шарда**.
73
59
74
60
```mermaid
75
61
sequenceDiagram
@@ -78,16 +64,16 @@ sequenceDiagram
78
64
participant Proxy as seq-db proxy
79
65
80
66
box Shard1
81
-
participant A as seq-db store<br /> shard1 replica A
82
-
participant B as seq-db store<br />shard1 replica B
67
+
participant A as seq-db store<br />шард1 реплика A
68
+
participant B as seq-db store<br />шард1 реплика B
83
69
end
84
70
85
71
box Shard2
86
-
participant C as seq-db store<br /> shard2 replica A
87
-
participant D as seq-db store<br /> shard2 replica B
72
+
participant C as seq-db store<br />шард2 реплика A
73
+
participant D as seq-db store<br />шард2 реплика B
88
74
end
89
75
90
-
Note over Proxy,B: seq-db proxy chooses a random shard
76
+
Note over Proxy,B: seq-db proxy выбирает случайный шард
91
77
Client->>Proxy: write(batch1)
92
78
Proxy->>A: write(batch1)
93
79
Proxy->>B: write(batch1)
@@ -96,7 +82,7 @@ sequenceDiagram
96
82
B-->>Proxy: ack
97
83
Proxy-->>Client: ack
98
84
99
-
Note over Proxy,B: the write is done if acks received <br/> from both replicas of a shard
85
+
Note over Proxy,B: запись завершена, если подтверждения получены<br/>от обеих реплик шарда
100
86
101
87
Client->>Proxy: write(batch2)
102
88
Proxy->>C: write(batch2)
@@ -108,10 +94,8 @@ sequenceDiagram
108
94
Proxy-->>Client: ack
109
95
```
110
96
111
-
### Read-path
112
-
While the written document must be acknowledged by all replicas
113
-
of a shard,
114
-
a read is successful when **at least one replica of each shard** returns a response.
97
+
### Read-path (путь чтения)
98
+
В то время как записанный документ должен быть подтвержден всеми репликами шарда, чтение считается успешным, когда **хотя бы одна реплика каждого шарда** возвращает ответ.
115
99
116
100
```mermaid
117
101
sequenceDiagram
@@ -120,41 +104,40 @@ sequenceDiagram
120
104
participant Proxy as seq-db proxy
121
105
122
106
box Shard1
123
-
participant A as seq-db store<br /> shard1 replica A
124
-
participant B as seq-db store<br />shard1 replica B
107
+
participant A as seq-db store<br />шард1 реплика A
108
+
participant B as seq-db store<br />шард1 реплика B
125
109
end
126
110
127
111
box Shard2
128
-
participant C as seq-db store<br /> shard2 replica A
129
-
participant D as seq-db store<br /> shard2 replica B
112
+
participant C as seq-db store<br />шард2 реплика A
113
+
participant D as seq-db store<br />шард2 реплика B
130
114
end
131
115
132
-
Note over Proxy,C: seq-db proxy chooses <br /> a random replica of each shard
133
-
Client->>Proxy: request 1
134
-
Proxy->>A: request 1
135
-
Proxy->>C: request 1
116
+
Note over Proxy,C: seq-db proxy выбирает<br />случайную реплику каждого шарда
117
+
Client->>Proxy: запрос 1
118
+
Proxy->>A: запрос 1
119
+
Proxy->>C: запрос 1
136
120
137
-
A-->>Proxy: response 1 (shard1 replica A)
138
-
C-->>Proxy: response 1 (shard2 replica A)
139
-
Note over Proxy: seq-db proxy merges the returned responses
140
-
Proxy-->>Client: merge(res1_s1rA, res1_s2rA)
121
+
A-->>Proxy: ответ 1 (шард1 реплика A)
122
+
C-->>Proxy: ответ 1 (шард2 реплика A)
123
+
Note over Proxy: seq-db proxy объединяет (merge) полученные ответы
124
+
Proxy-->>Client: merge(ответ1_ш1рA, ответ1_ш2рA)
141
125
126
+
Client->>Proxy: запрос 2
127
+
Proxy->>B: запрос 2
128
+
Proxy->>D: запрос 2
142
129
143
-
Client->>Proxy: request 2
144
-
Proxy->>B: request 2
145
-
Proxy->>D: request 2
146
-
147
-
B-->>Proxy: response 2 (shard1 replica B)
148
-
D-->>Proxy: response 2 (shard2 replica B)
130
+
B-->>Proxy: ответ 2 (шард1 реплика B)
131
+
D-->>Proxy: ответ 2 (шард2 реплика B)
149
132
150
-
Proxy-->>Client: merge(res2_s1rB, res2_s2rB)
133
+
Proxy-->>Client: merge(ответ2_ш1рB, ответ2_ш2рB)
151
134
```
152
135
153
-
## Notes about replication & consistency
154
-
seq-db doesn't have any mechanism to keep replicas consistent between each other.
155
-
That is, if a write operation succeeds on a replica of a shard and fails on another replica, the replicas
156
-
would be out of sync and won't be (automatically) synced.
157
-
The only given guarantee is that a write operation will succeed only having at least RF replicas saved on disk.
158
-
This optimization allows seq-db to have a higher than alternatives ingestion throughput
159
-
with the obvious price of the possible inconsistencies of retrieval and aggregation queries.
160
-
seq-db was designed as a database for logs/traces with this tradeoff in mind.
136
+
## Примечания о репликации и согласованности (consistency)
137
+
seq-db не имеет каких-либо механизмов для поддержания согласованности реплик между собой.
138
+
То есть, если операция записи завершилась успешно на одной реплике шарда и завершилась ошибкой на другой, реплики окажутся
139
+
в рассогласованном состоянии и не будут автоматически синхронизированы. Единственная предоставляемая гарантия
140
+
заключается в том, что операция записи завершится успехом, только если как минимум RF реплик сохранили данные на диск.
141
+
Эта оптимизация позволяет seq-db иметь более высокую пропускную способность приема данных по сравнению с аналогами,
142
+
за очевидную цену — возможной несогласованности результатов запросов на получение гистограмм и агрегации.
143
+
seq-db был разработан как база данных для логов/трейсов с учетом этого компромисса.
0 commit comments