вторник, 4 ноября 2014 г.

Zookeeper

Запуск ZK в режиме кластера

Такой режим в отличии от ZK работающего с одного, единственного сервера, обеспечивает некоторую отказоустойчивость. Сервис работоспособен пока функционирует больше половины ZK нод кластера, поэтому желательно иметь нечетное кол-во нод в кластере.
Для примера, кластер из трех нод переживает падение одной ноды. Кластер из четырех нод не переживает падение двух нод, но кластер из пяти нод уже переживает падение двух нод.

apt-get install zookeeper zookeeperd

Настраиваем размер "кучи" (heap) в java.
В файле /etc/zookeeper/conf/environment прописываем максимальный размер кучи в JAVA_OPTS. Например ключом -Xmx в 800Мб:

JAVA_OPTS="-Xmx800m"

Zookeeper'у категорически противопоказан своп данных на диск (в противном случае про адекватную производительность можно забыть), следовательно на машинах все ресурсы которых предназначены для ZK, например можно смело выставить максимальный размер heap в 3Гб для машины с 4Гб памяти.

Настраиваем основной конфиг /etc/zookeeper/conf/zoo.cfg


# Миллисекунд в каждом tick (Tick внутренняя единица измерения в ZK, используется для задания таймаутов и т.д.)
tickTime=2000

# Время в tick, разрешенное клиентам для подключения и синхронизации с мастер нодой. Увеличение этого значение как правило необходимо при большом объеме данных управляемых ZK.
initLimit=10

# Время в tick между отправкой запроса и получением подтверждения
syncLimit=5

# Директория для хранения снапшотов
dataDir=/var/lib/zookeeper

# Включение данной опции указывает альтернативную директорию для хранения файлов журнала транзакций (вместо пути заданном опцией dataDir). Улучшает производительность при выносе хранения журналов транзакций на отдельный физический диск от диска со снапшотами
# dataLogDir=/disk2/zookeeper

# Порт для клиентских подключений
clientPort=2181

#Список всех ZK нод
#Первый порт используется для подключения к мастер ноде
#Второй для выбора/перевыбора мастер ноды
#server.1=zookeeper1:2888:3888
#server.2=zookeeper2:2888:3888
#server.3=zookeeper3:2888:3888

#Количество зарезервированного дискового пространства под файл журнала транзакций. По #умолчанию 64Мб.
#preAllocSize=65536

#В случае когда рейт клиентских запросов превышает скорость их обработки ZK, все #избыточные запросы становятся в очередь. Максимальный размер очереди регулируется с #помощью опции GlobalOutstandingLimit (по умолчанию равное 1000). ZK логирует #транзакции в файл журнала транзакций. По достижению значения опции snapCount, лог файл #ротируется. SnapCount по умолчанию равен 10000.
#snapCount=1000

#Если опция задана, то запросы будут логироваться в файл трассировки с именем #traceFile.year.month.day.
#traceFile=

# Мастер сервер принимает клиентские запросы и координирует обновления. По умолчанию #"yes". Для увеличения производительности на запись, за счет небольших потерь на операциях #чтения, есть возможность настройки сервера в режим с отключением приема клиентских #запросов, тем самым освобождая ресурсы под координацию.
#leaderServes=yes

/etc/zookeeper/conf/myid


В файл /etc/zookeeper/conf/myid прописываем уникальный id для каждого ZK инстанса

Пример лога запуска мастера:

2014-09-25 01:19:23,734 - INFO  [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 2 (n.leader), 0 (n.zxid), 2 (n.round), LOOKING (n.state), 1 (n.sid), LOOKING (my state)
2014-09-25 01:19:23,935 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumPeer@655] - LEADING
2014-09-25 01:19:23,935 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:ZooKeeperServer@154] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir /var/lib/zookeeper/version-2 snapdir /var/lib/zookeeper/version-2
2014-09-25 01:19:23,936 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FileSnap@82] - Reading snapshot /var/lib/zookeeper/version-2/snapshot.0
2014-09-25 01:19:23,937 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FileTxnSnapLog@254]  Snapshotting: 0
2014-09-25 01:19:23,944 - INFO  [LearnerHandler-/192.168.1.153:35897:LearnerHandler@249] - Follower sid: 1 : info : org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer@7c316b47
2014-09-25 01:19:23,944 - INFO  [LearnerHandler-/192.168.1.153:35897:LearnerHandler@273] - Synchronizing with Follower sid: 1 maxCommittedLog =0 minCommittedLog = 0 peerLastZxid = 0
2014-09-25 01:19:23,945 - INFO  [LearnerHandler-/192.168.1.153:35897:LearnerHandler@357] - Sending snapshot last zxid of peer is 0x0  zxid of leader is 0x100000000sent zxid of db as 0x0
2014-09-25 01:19:23,949 - WARN  [LearnerHandler-/192.168.1.153:35897:Leader@492] - Commiting zxid 0x100000000 from /192.168.1.154:2888 not first!
2014-09-25 01:19:23,950 - WARN  [LearnerHandler-/192.168.1.153:35897:Leader@494] - First is 0
2014-09-25 01:19:23,950 - INFO  [LearnerHandler-/192.168.1.153:35897:Leader@518] - Have quorum of supporters; starting up and setting last processed zxid: 4294967296

лог запуска слейва:

2014-09-25 01:19:23,961 - INFO  [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 2 (n.leader), 0 (n.zxid), 2 (n.round), LOOKING (n.state), 1 (n.sid), LOOKING (my state)
2014-09-25 01:19:24,162 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumPeer@643] - FOLLOWING
2014-09-25 01:19:24,162 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:ZooKeeperServer@154] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir /var/lib/zookeeper/version-2 snapdir /var/lib/zookeeper/version-2
2014-09-25 01:19:24,172 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Learner@294] - Getting a snapshot from leader
2014-09-25 01:19:24,174 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Learner@326] - Setting leader epoch 1
2014-09-25 01:19:24,175 - INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FileTxnSnapLog@254] - Snapshotting: 0

Типичные операции


Коннектимся к ZK:

/usr/share/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

Создание ноды:

[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1
Created /test

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

[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[test, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /zookeeper
[quota]

Получение метаданных ноды:

[zk: 127.0.0.1:2181(CONNECTED) 9] get /zookeeper/quota

cZxid = 0x0
ctime = Thu Jan 01 03:00:00 MSK 1970
mZxid = 0x0
mtime = Thu Jan 01 03:00:00 MSK 1970
pZxid = 0x0
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

Изменение данных ноды (переписываем 1 на 2):

[zk: 127.0.0.1:2181(CONNECTED) 20] get /test
1
cZxid = 0x1400000006
ctime = Tue Nov 04 22:07:45 MSK 2014
mZxid = 0x1400000006
mtime = Tue Nov 04 22:07:45 MSK 2014
pZxid = 0x1400000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 22] set /test 2
cZxid = 0x1400000006
ctime = Tue Nov 04 22:07:45 MSK 2014
mZxid = 0x1400000007
mtime = Tue Nov 04 22:09:39 MSK 2014
pZxid = 0x1400000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 23] get /test
2
cZxid = 0x1400000006
ctime = Tue Nov 04 22:07:45 MSK 2014
mZxid = 0x1400000007
mtime = Tue Nov 04 22:09:39 MSK 2014
pZxid = 0x1400000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0

Удаление ноды:

[zk: 127.0.0.1:2181(CONNECTED) 24] delete /test
[zk: 127.0.0.1:2181(CONNECTED) 25] ls /
[zookeeper]