Играю с GlusterFS. А теперь мне любопытно, как полностью восстановить реплицированный том.
Итак, я создал 1 реплицированный том из узлов server1 и server2:
root@server1:~# gluster volume create replicated replica 2 transport tcp server1:/mnt/repl1 server2:/mnt/repl2 force
root@server1:~# gluster volume start replicated
volume start: replicated: success
И смонтировал его на клиентском узле:
root@client:~# mount.glusterfs server1:/distributed /mnt/distrib/
Сейчас пытаюсь протестировать высокую доступность. Итак, я выключил server1 и попытался записать что-нибудь в точку монтирования клиента:
root@client:/mnt/replica# ls -lh
total 106M
-rw-r--r-- 1 root root 19 Jul 12 2015 1.txt
-rw-r--r-- 1 root root 1.3K Jul 12 2015 2.txt
-rw-r--r-- 1 root root 106M Jul 12 2015 testfile1
Так что пока хорошо. Все файлы также находятся на server2:
root@server2:/mnt/repl2# ls -lh
total 106M
-rw-r--r-- 2 root root 19 Jul 12 03:52 1.txt
-rw-r--r-- 2 root root 1.3K Jul 12 03:54 2.txt
-rw-r--r-- 2 root root 106M Jul 12 03:53 testfile1
root@server2:/mnt/repl2#
В конце концов, мой server1 выходит в сеть, и там я вижу только скелет файлов без данных:
root@server1:/mnt/repl1# ls -lh
total 4.0K
-rw-r--r-- 2 root root 0 Jul 12 12:21 1.txt
-rw-r--r-- 2 root root 0 Jul 12 03:54 2.txt
-rw-r--r-- 2 root root 0 Jul 12 12:21 testfile1
Только после доступа к файлам из точки монтирования клиента (с помощью cat или подобным образом) информация загружается в файлы server2:
root@client:/mnt/replica# cat 2.txt
GlusterFS — blalabla..
root@server1:/mnt/repl1# ls -lh
total 4.0K
-rw-r--r-- 2 root root 0 Jul 12 12:21 1.txt
-rw-r--r-- 2 root root 1.3K Jul 12 03:54 2.txt
-rw-r--r-- 2 root root 0 Jul 12 12:21 testfile1
root@server1:/mnt/repl1#
Можно ли автоматически восстановить все файлы на ранее отказавшем сервере без доступа к ним из точки подключения клиента?
stat()
-загрузка файлов из точки монтирования клиента - это то, как Gluster узнает, что файлы необходимо реплицировать повторно, поэтому в основном ответ на ваш вопрос - «нет».
Решение, однако, просто stat()
каждый файл - что на самом деле проще, чем кажется, просто запустите его от клиента:
find /mnt/repl1 -exec stat {} \;
Это задокументировано Вот.