1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
|
# Развертывание кластера YDB на виртуальных или железных серверах
Данный документ описывает способ развернуть мультитенантный кластер YDB на нескольких серверах.
## Перед началом работы {#before-start}
### Требования {#requirements}
У вас должен быть ssh доступ на все сервера. Это необходимо для установки артефактов и запуска бинарника YDB.
Ваша сетевая конфигурация должна разрешать TCP соединения по следующим портам (по умолчанию):
* 2135, 2136 - grpc для клиент-кластерного взаимодействия;
* 19001, 19002 - Interconnect для внутрикластерного взаимодействия нод;
* 8765, 8766 - http интерфейс для мониторинга кластера.
<!--Ознакомьтесь с [Production checklist](../production_checklist.md) и рекомендованной топологией кластера;-->
Выберите сервера и диски, которые будут использоваться для хранения данных:
* Используйте схему отказоустойчивости `block-4-2` для деплоя кластера в одной зоне доступности (AZ). Чтобы переживать выпадения 2 нод используйте не менее 8 нод.
* Используйте схему отказоустойчивости `mirror-3-dc` для деплоя кластера в трех зонах доступности (AZ). Чтобы переживать выпадения 1 AZ и 1 ноды в другом AZ используйте не менее 9 нод. Количество нод в каждой AZ должно быть одинаковым.
Запускайте каждую статическую ноду на отдельном сервере.
## Создайте системного пользователя и группу, от имени которого будет работать {{ ydb-short-name }} {#create-user}
На каждом сервере, где будет запущен YDB выполните:
```bash
sudo groupadd ydb
sudo useradd ydb -g ydb
```
Для того, чтобы {{ ydb-short-name }} server имел доступ к блочным дискам для работы, необходимо добавить пользователя, под которым будет запущен процесс, в группу disk
```bash
sudo usermod -aG disk ydb
```
## Подготовьте и отформатируйте диски на каждом сервере {#prepare-disks}
{% note warning %}
Мы не рекомендуем использовать для хранения данных диски, которые используются другими процессами (в т.ч. операционной системой)
{% endnote %}
1. Создайте раздел на выбранном диске
{% note alert %}
Будьте внимательны! Следующая операция удалит все разделы на указанных дисках!
Убедитесь, что вы указали диски, на которых нет других данных!
{% endnote %}
```bash
sudo parted /dev/nvme0n1 mklabel gpt -s
sudo parted -a optimal /dev/nvme0n1 mkpart primary 0% 100%
sudo parted /dev/nvme0n1 name 1 ydb_disk_ssd_01
sudo partx --u /dev/nvme0n1
```
После выполнения в системе появится диск с лейблом `/dev/disk/by-partlabel/ydb_disk_ssd_01`
Если вы планируете использовать более одного диска на каждом сервере - укажите для каждого свой уникальный лейбл вместо `ydb_disk_ssd_01`. Эти диски необходимо будет использовать в конфигурационных файлах далее.
Скачайте и распакуйте архив с исполняемым файлом `ydbd` и необходимыми для работы YDB библиотеками:
```bash
curl -L https://binaries.ydb.tech/ydbd-stable-linux-amd64.tar.gz -o ydbd-stable-linux-amd64.tar.gz
tar -xz ydbd-stable-linux-amd64.tar.gz
```
Создайте директории для запуска:
```bash
sudo mkdir -p /opt/ydb/bin /opt/ydb/cfg /opt/ydb/lib
sudo chown -R ydb:ydb /opt/ydb
```
3. Скопируйте бинарник, библиотеки и конфигурационный файл в соответствующие директории:
```bash
sudo cp -i ydbd-stable-linux-amd64/bin/ydbd /opt/ydb/bin/
sudo cp -i ydbd-stable-linux-amd64/lib/libaio.so /opt/ydb/lib/
sudo cp -i ydbd-stable-linux-amd64/lib/libiconv.so /opt/ydb/lib/
sudo cp -i ydbd-stable-linux-amd64/lib/libidn.so /opt/ydb/lib/
```
3. Отформатируйте диск встроенной командой
```bash
sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib /opt/ydb/bin/ydbd admin bs disk obliterate /dev/disk/by-partlabel/ydb_disk_ssd_01
```
Проделайте данную операцию для каждого диска, который будет использоваться для хранения данных.
Подготовьте конфигурационные файлы:
{% list tabs %}
- Незащищенный режим
В данном режиме трафик между нодами кластера, а также между клиентом и кластером использует нешифрованное соединение. Используйте данный режим для тестовых задач.
{% include [prepare-configs.md](_includes/prepare-configs.md) %}
Сохраните конфигурационный файл {{ ydb-short-name }} под именем `/opt/ydb/cfg/config.yaml`
- Защищенный режим
В данном режиме трафик между нодами кластера, а также между клиентом и кластером шифруется протоколом TLS.
{% include [generate-ssl.md](_includes/generate-ssl.md) %}
Создайте на каждой ноде директирии для сертификатов
```bash
sudo mkdir /opt/ydb/certs
sudo chown -R ydb:ydb /opt/ydb/certs
sudo chmod 0750 /opt/ydb/certs
```
Скопируйте сертификаты и ключи ноды
```bash
sudo -u ydb cp certs/ca.crt certs/node.crt certs/node.key /opt/ydb/certs/
```
{% include [prepare-configs.md](_includes/prepare-configs.md) %}
3. В секциях `interconnect_config` и `grpc_config` укажите путь до сертификата, ключа и CA сертификаты:
```text
interconnect_config:
start_tcp: true
encryption_mode: OPTIONAL
path_to_certificate_file: "/opt/ydb/certs/node.crt"
path_to_private_key_file: "/opt/ydb/certs/node.key"
path_to_ca_file: "/opt/ydb/certs/ca.crt"
grpc_config:
cert: "/opt/ydb/certs/node.crt"
key: "/opt/ydb/certs/node.key"
ca: "/opt/ydb/certs/ca.crt"
```
Сохраните конфигурационный файл под именем `/opt/ydb/cfg/config.yaml`
{% endlist %}
## Запустите статические ноды {# start-storage}
{% list tabs %}
- Вручную
1. Запустите на каждой ноде {{ ydb-short-name }} storage:
```bash
sudo su - ydb
cd /opt/ydb
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib
/opt/ydb/bin/ydbd server --log-level 3 --syslog --tcp --yaml-config /opt/ydb/cfg/config.yaml \
--grpc-port 2135 --ic-port 19001 --mon-port 8765 --node static
```
- С использованием systemd
1. Создайте на каждой ноде конфигурационный файл `/etc/systemd/system/ydbd-storage.service` со следующим содержимым
```text
[Unit]
Description=YDB storage node
After=network-online.target rc-local.service
Wants=network-online.target
StartLimitInterval=10
StartLimitBurst=15
[Service]
Restart=always
RestartSec=1
User=ydb
PermissionsStartOnly=true
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ydbd
SyslogFacility=daemon
SyslogLevel=err
Environment=LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib
ExecStart=/opt/ydb/bin/ydbd server --log-level 3 --syslog --tcp --yaml-config /opt/ydb/cfg/config.yaml --grpc-port 2135 --ic-port 19001 --mon-port 8765 --node static
LimitNOFILE=65536
LimitCORE=0
LimitMEMLOCK=3221225472
[Install]
WantedBy=multi-user.target
```
2. Запустите на каждой ноде {{ ydb-short-name }} storage:
```bash
sudo systemctl start ydbd-storage
```
{% endlist %}
## Инициализируйте кластер {#initialize-cluster}
На одной из нод кластера выполните команду:
```bash
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib /opt/ydb/bin/ydbd admin blobstorage config init --yaml-file /opt/ydb/cfg/config.yaml ; echo $?
```
Код завершения команды должен быть нулевым.
## Создание первой базы данных {#create-fist-db}
Для работы с таблицами необходимо создать как минимум одну базу данных и поднять процесс, обслуживающий эту базу данных (динамическую ноду).
```bash
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib /opt/ydb/bin/ydbd admin database /Root/testdb create ssd:1
```
## Запустите динамическую ноду базы {#start-dynnode}
{% list tabs %}
- Вручную
1. Запустите динамическую ноду {{ ydb-short-name }} для базы /Root/testdb:
```bash
sudo su - ydb
cd /opt/ydb
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib
/opt/ydb/bin/ydbd server --grpc-port 2136 --ic-port 19002 --mon-port 8766 --yaml-config /opt/ydb/cfg/config.yaml \
--tenant /Root/testdb --node-broker <node1.ydb.tech>:2135 --node-broker <node2.ydb.tech>:2135 --node-broker <node3.ydb.tech>:2135
```
Где `<nodeN.ydb.tech>` - FQDN серверов, на которых запущены статические ноды.
Запустите дополнительные динноды на других серверах для обеспечения доступности базы данных.
- С использованием systemd
1. Создайте конфигурационный файл `/etc/systemd/system/ydbd-testdb.service` со следующим содержимым:
```text
[Unit]
Description=YDB testdb dynamic node
After=network-online.target rc-local.service
Wants=network-online.target
StartLimitInterval=10
StartLimitBurst=15
[Service]
Restart=always
RestartSec=1
User=ydb
PermissionsStartOnly=true
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ydbd
SyslogFacility=daemon
SyslogLevel=err
Environment=LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ydb/lib
ExecStart=/opt/ydb/bin/ydbd server --grpc-port 2136 --ic-port 19002 --mon-port 8766 --yaml-config /opt/ydb/cfg/config.yaml --tenant /Root/testdb --node-broker <node1.ydb.tech>:2135 --node-broker <node2.ydb.tech>:2135 --node-broker <node3.ydb.tech>:2135
LimitNOFILE=65536
LimitCORE=0
LimitMEMLOCK=32212254720
[Install]
WantedBy=multi-user.target
```
Где `<nodeN.ydb.tech>` - FQDN серверов, на которых запущены статические ноды.
2. Запустите динамическую ноду {{ ydb-short-name }} для базы /Root/testdb:
```bash
sudo systemctl start ydbd-testdb
```
3. Запустите дополнительные динноды на других серверах для обеспечения доступности базы данных.
{% endlist %}
## Протестируйте работу с созданной базой {#try-first-db}
1. Установите YDB CLI, как описано в статье [Установка YDB CLI](../../reference/ydb-cli/install.md)
2. Создайте тестовую таблицу `test_table`:
```bash
ydb -e grpc://<node.ydb.tech>:2136 -d /Root/testdb scripting yql \
--script 'CREATE TABLE `testdir/test_table` (id Uint64, title Utf8, PRIMARY KEY (id));'
```
Где `<node.ydb.tech>` - FQDN сервера, на котором запущена динамическая нода, обслуживающая базу `/Root/testdb`
|