summaryrefslogtreecommitdiffhomepage
path: root/ru-ru/zfs-ru.html.markdown
blob: cef0e3b565ef90e80406ffad164e0c834c36aa63 (plain)
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
---
category: tool
tool: zfs
contributors:
    - ["sarlalian", "http://github.com/sarlalian"]
    - ["A1EF", "https://github.com/A1EF"]
filename: LearnZfs-ru.txt
translators:
    - ["A1EF", "https://github.com/A1EF"]
lang: ru-ru
---


[ZFS](http://open-zfs.org/wiki/Main_Page)
представляет собой переосмысление системы хранения данных, комбинирующее в едином инструменте
традиционные файловые системы и системы управления томами. ZFS обладает некоторой специфичной
терминологией, которая отличает её от более традиционных систем хранения данных, однако имеет
отличный набор возможностей, акцентированных на удобстве использования системными администраторами.


## Концепции ZFS

### Виртуальные устройства

Виртуальное устройство (VDEV) подобно устройству RAID, представляемого RAID-контроллером.
Есть несколько типов виртуальных устройств (VDEV), которые предлагают различные преимущества,
включая отказоустойчивость и скорость доступа. В основном виртуальные устройства (VDEV)
предоставляют лучшую отказоустойчивость и безопасность, нежели RAID-контроллеры. Не рекомендуется
использовать установку RAID с ZFS, поскольку ZFS рассчитывает непосредственно управлять дисками.

Типы виртуальных устройств (VDEV)

* mirror (поддерживается n-кратное зеркалирование)
* raidz
	* raidz1 (1-диск четности, аналог RAID 5)
	* raidz2 (2-диска четности, аналог RAID 6)
	* raidz3 (3-диска четности, нет имеет аналогичного RAID-массива)
* disk
* file (не рекомендовано для промышленного применения из-за добавления нежелательного промежуточного слоя иной файловой системы)

Ваши данные распределяются среди всех виртуальных устройств (VDEV), представленных в пуле хранения,
так что увеличив число виртуальных устройств (VDEV), вы увеличите количество IOPS.

### Пулы хранения

ZFS использует пулы хранения как абстракцию над нижним уровнем провайдера хранения (VDEV), позволяя вам отделить видимые пользователю
файловые системы от физического их размещения.

### ZFS датасеты

ZFS датасеты подобны традиционным файловым системам, но имеют гораздо больше возможностей, обеспечивающих обилие преимуществ ZFS.
Датасеты поддерживают [Copy on Write](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8), снапшоты, квоты, сжатие и дедубликацию.


### Ограничения

Один каталог может содержать до 2^48 файлов, каждый до 16 эксабайт. Один пул хранения может содержать до 256 зеттабайт (2^78) данных
и может быть распределён по 2^64 устройствам. А один хост может иметь 2^64 пула хранения. Лимиты огромны.


## Команды

### Пулы хранения

Действия:

* Просмотр
* Статус
* Удаление
* Получение/установка свойств

Просмотр пулов

```bash
# Создание пула типа raidz
$ zpool create zroot raidz1 gpt/zfs0 gpt/zfs1 gpt/zfs2

# Просмотр пулов
$ zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   141G   106G  35.2G         -    43%    75%  1.00x  ONLINE  -

# Просмотр детализованной информации о конкретном пуле
$ zpool list -v zroot
NAME                                     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP HEALTH  ALTROOT
zroot                                    141G   106G  35.2G         -    43%    75%  1.00x ONLINE  -
  gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655   141G   106G  35.2G         -    43%    75%
```

Статус пулов

```bash
# Получение информации о статусе пулов
$ zpool status
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0 in 2h51m with 0 errors on Thu Oct  1 07:08:31 2015
config:

        NAME                                          STATE     READ WRITE CKSUM
        zroot                                         ONLINE       0     0     0
          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0

errors: No known data errors

# Скрабинг пула для исправления любых ошибок
$ zpool scrub zroot
$ zpool status -v zroot
  pool: zroot
 state: ONLINE
  scan: scrub in progress since Thu Oct 15 16:59:14 2015
        39.1M scanned out of 106G at 1.45M/s, 20h47m to go
        0 repaired, 0.04% done
config:

        NAME                                          STATE     READ WRITE CKSUM
        zroot                                         ONLINE       0     0     0
          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0

errors: No known data errors
```

Свойства пулов

```bash
# Получение свойств пула, свойства могут быть заданы пользователем или системой.
$ zpool get all zroot
NAME   PROPERTY                       VALUE                          SOURCE
zroot  size                           141G                           -
zroot  capacity                       75%                            -
zroot  altroot                        -                              default
zroot  health                         ONLINE                         -
...

# Установка значения свойства пула
$ zpool set comment="Storage of mah stuff" zroot
$ zpool get comment
NAME   PROPERTY  VALUE                 SOURCE
tank   comment   -                     default
zroot  comment   Storage of mah stuff  local
```

Удаление пула

```bash
$ zpool destroy test
```


### Датасеты

Действия:

* Создание
* Просмотр
* Переименование
* Удаление
* Получение/установка свойств

Создание датасетов

```bash
# Создание датасета
$ zfs create zroot/root/data
$ mount | grep data
zroot/root/data on /data (zfs, local, nfsv4acls)

# Создание дочернего датасета
$ zfs create zroot/root/data/stuff
$ mount | grep data
zroot/root/data on /data (zfs, local, nfsv4acls)
zroot/root/data/stuff on /data/stuff (zfs, local, nfsv4acls)


# Создание тома
$ zfs create -V zroot/win_vm
$ zfs list zroot/win_vm
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot/win_vm         4.13G  17.9G    64K  -
```

Просмотр датасетов

```bash
# Просмотр всех датасетов
$ zfs list
NAME                                                                       USED  AVAIL  REFER  MOUNTPOINT
zroot                                                                      106G  30.8G   144K  none
zroot/ROOT                                                                18.5G  30.8G   144K  none
zroot/ROOT/10.1                                                              8K  30.8G  9.63G  /
zroot/ROOT/default                                                        18.5G  30.8G  11.2G  /
zroot/backup                                                              5.23G  30.8G   144K  none
zroot/home                                                                 288K  30.8G   144K  none
...

# Просмотр конкретного датасета
$ zfs list zroot/home
NAME         USED  AVAIL  REFER  MOUNTPOINT
zroot/home   288K  30.8G   144K  none

# Просмотр снапшотов
$ zfs list -t snapshot
zroot@daily-2015-10-15                                                                  0      -   144K  -
zroot/ROOT@daily-2015-10-15                                                             0      -   144K  -
zroot/ROOT/default@daily-2015-10-15                                                     0      -  24.2G  -
zroot/tmp@daily-2015-10-15                                                           124K      -   708M  -
zroot/usr@daily-2015-10-15                                                              0      -   144K  -
zroot/home@daily-2015-10-15                                                             0      -  11.9G  -
zroot/var@daily-2015-10-15                                                           704K      -  1.42G  -
zroot/var/log@daily-2015-10-15                                                       192K      -   828K  -
zroot/var/tmp@daily-2015-10-15                                                          0      -   152K  -
```

Переименование датасетов

```bash
$ zfs rename zroot/root/home zroot/root/old_home
$ zfs rename zroot/root/new_home zroot/root/home
```

Удаление датасета

```bash
# Датасеты не могут быть удалены, если у них имеются какие-то снапшоты
$ zfs destroy zroot/root/home
```

Получение / установка свойств датасета

```bash
# Получение всех свойств
$ zfs get all zroot/usr/home
NAME            PROPERTY              VALUE                  SOURCE
zroot/home      type                  filesystem             -
zroot/home      creation              Mon Oct 20 14:44 2014  -
zroot/home      used                  11.9G                  -
zroot/home      available             94.1G                  -
zroot/home      referenced            11.9G                  -
zroot/home      mounted               yes                    -
...

# Получения свойства для датасета
$ zfs get compression zroot/usr/home
NAME            PROPERTY     VALUE     SOURCE
zroot/home      compression  off       default

# Установка значения свойства на датасете
$ zfs set compression=lz4 zroot/lamb

# Получение значений выбранных свойств всех датасетов
$ zfs list -o name,quota,reservation
NAME                                                               QUOTA  RESERV
zroot                                                               none    none
zroot/ROOT                                                          none    none
zroot/ROOT/default                                                  none    none
zroot/tmp                                                           none    none
zroot/usr                                                           none    none
zroot/home                                                          none    none
zroot/var                                                           none    none
...
```


### Снапшоты

ZFS снапшоты -- одна из очень важных особенностей zfs

* Место, которое они занимают, равно разнице данных между файловой системой и её снапшотом
* Время создания занимает считанные секунды
* Восстановление настолько быстро, насколько позволяет вам запись данных
* Они очень просты в автоматизации

Действия:

* Создание
* Удаление
* Переименование
* Получение доступа к снапшотам
* Отправка / Получение
* Клонирование


Создание снапшотов

```bash
# Создание снапшота единственного датасета
zfs snapshot zroot/home/sarlalian@now

# Создание снапшота для родительского и дочерних датасетов
$ zfs snapshot -r zroot/home@now
$ zfs list -t snapshot
NAME                       USED  AVAIL  REFER  MOUNTPOINT
zroot/home@now                 0      -    26K  -
zroot/home/sarlalian@now       0      -   259M  -
zroot/home/alice@now           0      -   156M  -
zroot/home/bob@now             0      -   156M  -
...
```

Удаление снапшотов

```bash
# Как удалить снапшот
$ zfs destroy zroot/home/sarlalian@now

# Удаление снапшота в родительском и дочерних датасетах
$ zfs destroy -r zroot/home/sarlalian@now
```

Переименование снапшотов

```bash
# Переименование снапшота
$ zfs rename zroot/home/sarlalian@now zroot/home/sarlalian@today
$ zfs rename zroot/home/sarlalian@now today

$ zfs rename -r zroot/home@now @yesterday
```

Получение доступа к спапшотам

```bash
# CD в каталог снапшота
$ cd /home/.zfs/snapshot/
```

Отправка и получение

```bash
# Сохранение снапшота в файл
$ zfs send zroot/home/sarlalian@now | gzip > backup_file.gz

# Отправка снапшота в другой датасет
$ zfs send zroot/home/sarlalian@now | zfs recv backups/home/sarlalian

# Отправка снапшота на удаленный хост
$ zfs send zroot/home/sarlalian@now | ssh root@backup_server 'zfs recv zroot/home/sarlalian'

# Отправка полного датасета со снапшотами на новый хост
$ zfs send -v -R zroot/home@now | ssh root@backup_server 'zfs recv zroot/home'
```

Клонирование снапшотов

```bash
# Клонирование снапшота
$ zfs clone zroot/home/sarlalian@now zroot/home/sarlalian_new

# Повышение клона, чтобы он больше не зависел от снапшота
$ zfs promote zroot/home/sarlalian_new
```

### Собираем всё вместе

Нижеследующий скрипт использует FreeBSD, jails и ZFS для автоматизации
подготовки чистой копии стейджинговой базы mysql с живой реплики слейв-ноды.

```bash
#!/bin/sh

echo "==== Остановка стейджингового сервера баз данных ===="
jail -r staging

echo "==== Очистка существующих стейджингового сервера и снапшота ===="
zfs destroy -r zroot/jails/staging
zfs destroy zroot/jails/slave@staging

echo "==== Фиксация базы на слейве ===="
echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slave

echo "==== Сохранение снапшота файлов базы слейва как zroot/jails/slave@staging ===="
zfs snapshot zroot/jails/slave@staging

echo "==== Запуск слейв-ноды сервера баз данных ===="
jail -c slave

echo "==== Клонирование снапшота слейва на стейджинговый сервер ===="
zfs clone zroot/jails/slave@staging zroot/jails/staging

echo "==== Установка конфига стейджингово mysql ===="
mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slave
cp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnf

echo "==== Настройка стейджингового файла rc.conf ===="
mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slave
mv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.local

echo "==== Запуск стейджингово сервера баз данных ===="
jail -c staging

echo "==== Отключение синхронизации стейджинговой базы с мастером ===="
echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging
echo "RESET SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging
```


### Почитать дополнительно

* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs)
* [FreeBSD Handbook on ZFS](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/zfs.html)
* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs)
* [Oracle's Tuning Guide](http://www.oracle.com/technetwork/articles/servers-storage-admin/sto-recommended-zfs-settings-1951715.html)
* [OpenZFS Tuning Guide](http://open-zfs.org/wiki/Performance_tuning)
* [FreeBSD ZFS Tuning Guide](https://wiki.freebsd.org/ZFSTuningGuide)