0

Установка и настройка glustrerfs

Для синхронизации контента сервиса между двумя узлами я использую glusterfs. Оставлю заметку о том как его приготовить.

Вариантов синхронизации контента между узлами большое количество. От rsync до кластерных файловых систем. Далее речь пойдет о glusterfs.

GlusterFS is an open source, distributed file system capable of scaling to several petabytes (actually, 72 brontobytes!) and handling thousands of clients. GlusterFS clusters together storage building blocks over Infiniband RDMA or TCP/IP interconnect, aggregating disk and memory resources and managing data in a single global namespace. GlusterFS is based on a stackable user space design and can deliver exceptional performance for diverse workloads.

Мой очень вольный перевод:
GlusterFS — это распределенная файловая система с открытым исходным кодом и возможностью расширения до нескольких петабайт, способная обслуживать тысячи клиентов. GlusterFS кластеризирует хранилища данных через Infiniband RDMA или TCP/IP соединение, объединяет ресурсы дисков и памяти и позволяет управлять данными в едином пользовательском пространстве. GlusterFS основан на возможности наращивания объемов доступного для пользователя пространства, позволяя получить отличных показателей производительности для различных нагрузок.

GlusterFS умеет несколько режимов распределения данных в кластере:

  • распределенный (distributed)
  • реплицируемый (replicated)
  • по частям (striped)
  • распределённый по частям (distributed striped)
  • распределенный и реплицируемый (distributed replicated)
  • распределенный по частям и реплицируемый (distributed striped replicated)
  • реплицируемый по частям (striped replicated)
  • дисперсный (dispersed)
  • распределенный дисперсный (distributed dispersed)

Я буду использовать реплецируемый. В качестве ОС — Centos6.

Подготовка

Базовое

Про эти базовые вещи просто напомню:

  • синхронизация времени (ntp)
  • доступность узлов (сеть, dns или /etc/hosts)
  • диск под gluster volume

Репозиторий

# cd /etc/yum.repos.d/
# curl -O http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo

Firewall

Для работы glusterfs необходимо открыть следующие порты на всех узлах:
Основные:

  • 24007 TCP
  • 24008 TCP

portmapper:

  • 111 TCP,UDP

Один порт на каждый brick:

  • 49152 TCP
  • 49153 TCP

Установка

На обоих узлах:
# yum install glusterfs-server
# chkconfig glusterd on && service glusterd start

Настройка

Создание пула

Создаю доверенный пул, состоящий из двух узлов:
[gluster01.local]# gluster peer probe gluster02.local
[gluster01.local]# gluster peer status

Number of Peers: 1

Uuid: 13b60b47-15d9-446a-bf66-81306c0cd3fa
State: Peer in Cluster (Connected)
Hostname: gluster02.local

[gluster02.local]# gluster peer status

Number of Peers: 1

Hostname: gluster01.local
Port: 24007
Uuid: 73385a33-a0a0-4f0d-90cc-5496e3b653b7
State: Peer in Cluster (Connected)

Теперь нужно подготовить раздел, предназначенный для glusterfs.
У меня это отдельный диск — я считаю так надо!
Раздел: /dev/vdb1, примонтированный в /opt/gluster
Директория, с которой будет работать glusterfs и которая будет являтся brick: /opt/gluster/glfs

Затем создаю volume:
В моем случае:
# gluster volume create gv0 replica 2 gluster01.local:/opt/gluster/glfs gluster02.local:/opt/gluster/glfs

Посмотреть статус volume можно:
# gluster volume info

Volume Name: gv0
Type: Replicate
Volume ID: 404f70f5-c04c-4e3e-b90e-c585b141155c
Status: Created
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster01.local:/export/glfs
Brick2: gluster02.local:/export/glfs

Теперь можно стартовать volume:
# gluster volume start gv0

Использование volume

Для того что бы начать использовать созданный volume достаточно его примонтировать:
# mount -t glusterfs gluster01.local:gv0 /mnt/

Обращаю внимание, что нужно указывать не путь к brick, а название созданного volume. Т.е. не gluster01.local:/opt/gluster/glfs, а gluster01.local:gv0.

Bonus

GlusterFS позволяет позволяет гибко настраивать параметры своей работы. У меня была следующая проблема:
В случае, если один узел был выключен, то volume переставала отвечать и проходило довольно много времени, пока все приходило в порядок.
Это регулируется опцией network.ping-timeout:

The time duration for which the client waits to check if the server is responsive. When a ping timeout happens, there is a network disconnect between the client and server. All resources held by server on behalf of the client get cleaned up. When a reconnection happens, all resources will need to be re-acquired before the client can resume its operations on the server. Additionally, the locks will be acquired and the lock tables updated. This reconnect is a very expensive operation and should be avoided.

По умолчанию 42 секунды, установить можно так:
# gluster volume set gv0 network.ping-timeout "5"

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.