апр 16, 2013

MongoDB replica и Azure

Как-то понадобилось использовать в качестве бэкап-реплики инстанс на microsoft azure. Остальная часть кластера находится на другой площадке. Опыт подсказывал, что никаких подводны камней тут быть не может. Однако нет. Репликация успешно стартовала, но через часов 6 соединение пропадало.

Mon Apr  1 06:10:12.909 [rsSync]   Fatal Assertion 16233
0xdc7f71 0xd87cf3 0xbff47f 0xc1b101 0xc1bf1d 0xc1c1ec 0xe10879 0x7f569eeb1e9a 0x7f569e1c4cbd
 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0xdc7f71]
 /usr/bin/mongod(_ZN5mongo13fassertFailedEi+0xa3) [0xd87cf3]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl17syncDoInitialSyncEv+0x6f) [0xbff47f]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl11_syncThreadEv+0x71) [0xc1b101]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl10syncThreadEv+0x2d) [0xc1bf1d]
 /usr/bin/mongod(_ZN5mongo15startSyncThreadEv+0x6c) [0xc1c1ec]
 /usr/bin/mongod() [0xe10879]
 /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x7f569eeb1e9a]
 /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f569e1c4cbd]
Mon Apr  1 06:10:12.919 [rsSync]

***aborting after fassert() failure

Mon Apr  1 06:10:12.919 Got signal: 6 (Aborted).

Mon Apr  1 06:10:12.923 Backtrace:
0xdc7f71 0x6ce459 0x7f569e1074a0 0x7f569e107425 0x7f569e10ab8b 0xd87d2e 0xbff47f 0xc1b101 0xc1bf1d 0xc1c1ec 0xe10879 0x7f569eeb1e9a 0x7f569e1c4cbd
 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0xdc7f71]
 /usr/bin/mongod(_ZN5mongo10abruptQuitEi+0x399) [0x6ce459]
 /lib/x86_64-linux-gnu/libc.so.6(+0x364a0) [0x7f569e1074a0]
 /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x35) [0x7f569e107425]
 /lib/x86_64-linux-gnu/libc.so.6(abort+0x17b) [0x7f569e10ab8b]
 /usr/bin/mongod(_ZN5mongo13fassertFailedEi+0xde) [0xd87d2e]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl17syncDoInitialSyncEv+0x6f) [0xbff47f]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl11_syncThreadEv+0x71) [0xc1b101]
 /usr/bin/mongod(_ZN5mongo11ReplSetImpl10syncThreadEv+0x2d) [0xc1bf1d]
 /usr/bin/mongod(_ZN5mongo15startSyncThreadEv+0x6c) [0xc1c1ec]
 /usr/bin/mongod() [0xe10879]
 /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x7f569eeb1e9a]

После переписки с разработчиками  mongodb и серии экспериментов выяснилось, что проблема в сетевой структуре Azure. После большой нагрузки на сеть неактивные соединения просто дропаются.

Чтобы этого избежать достаточно изменить значения, влияющие на активность поддержания keepalive соединения:

echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_time

Сделать это нужно на строне реплики.