He ʻano paʻakikī kaʻu i hiki ʻole ke wehewehe.He mīkini kamepiula kaʻu e holo nei Ubuntu 20.04
, docker
19.03.6 a me kahi
redis ipu. Hoʻokipa ʻia ma kahi
Windows 2019` Mīkini Hyper-V.
Aia ka lua o ka mīkini uila (pūnaewele like akā kikowaena pūnaewele ʻokoʻa) e holo nei W2k19 a me kahi redis-client
e pili ana i ka redis
laʻana.
Ma muli o ka hoʻonohonoho maikaʻi ʻole ʻana i kēlā me kēia manawa redis
hoʻopiha i ka mīkini Ubuntu, me ka hoʻohana ʻana i ka nui o ka hoʻomanaʻo, a me ka hana ʻana i mau kaukani * ua hoʻopau ka pilina *
ʻokoʻa i ka redis-client
.
Ke kū kēia, kū nā pilina āpau ma waena o nā mīkini i ka hana. Inā hoʻāʻo wau e pili ma o ssh
mai ka mīkini W2k19 a i Ubuntu a i ʻole ka hoʻohana ʻana i ka telnet telnet
mai ka mīkini like ma kekahi awa, loaʻa iaʻu kahi * ua hoʻopau ʻia ka pili *
.
E like inā hana kekahi mea ma ka mīkini Linux i ka pāpā auto o ka IP address o ka w2k19 mīkini. Mai nā mīkini ʻē aʻe hiki iaʻu ke hoʻohui ma o ssh
, telnet
a pēlā aku.
Ufw
pio ʻia fail2ban
hoʻouka ʻia iptables
hoʻonohonoho ʻia me nā awa āpau i hāmama Akā ʻaʻole hiki iā mākou ke hoʻohui aku. Ua hana hou mākou i ka hana ma kekahi mīkini ʻē aʻe, kahi VM lua me W2k19
a me ka mea like redis-client
.
ʻO ka mea a mākou i ʻike ai e kūkulu hou i nā pilina ma waena o kēlā mīkini me ka hoʻomaka hou ʻana o ka lawelawe ssh
ma ka mīkini Ubuntu i hoʻohui pū ʻia me ka reboot o ka mīkini W2k19
.
ʻAʻole i lawa ka mea hoʻokahi sudo service sshd restart
, a pololei he hou hou o ka mīkini W2k19
ʻaʻole lawa ka mīkini. ʻAʻole hiki iaʻu ke noʻonoʻo i nā mea e hana nei, a ʻaʻole hiki iā mākou ke ʻae ma ke ʻano he hana maʻamau i kēia mau hihia e hoʻomaka hou i ka lawelawe ssh
a hoʻi hou i ka mīkini.
Akā i kēia manawa ʻaʻole mākou hiki iā ke koho i ke kānāwai / hoʻonohonoho i kēlā me kēia mea e ālai ana i nā pilina. Pono e hana i kekahi mea me ka lawelawe ssh
paha, mai ka hoʻomaka hou ʻana e hāʻawi ia i mea e hoʻihoʻi i nā pilina, akā pehea?
A no ke aha e hoʻomaka hou ai i ka ssh
lawelawe (a me ka hoʻouka hou ʻana i ka W2k19
mīkini) ke wehe nei i ka pilina i ka redis
6379 awa?
!!! Kiʻi hou !!! Ua hoʻāʻo wau iā tcpdump ma ka mīkini ubuntu a ʻike ʻole i ke kaʻa mai ka VM ʻē aʻe. Ua hoʻonohonoho wau i ke aniani aniani pūnaewele no ka mīkini ubuntu, a kālailai i ke kalepa ʻana me ka wireshark, ʻaʻohe kaʻa mai ka VM ʻē aʻe. Ua kīnā au i nā pale ahi ma nā wahi āpau (ubuntu VM, client VM, host hyper-v) ʻoiai ke kālailai ʻana i ke kaʻa.
Время ожидания соединения истекло означает, что первоначальная TCP SYN не вызвала никакого ответа [в течение времени ожидания соединения]. Клиент не получил ни SYN/ACK, ни RST, ни ICMP-ошибку — ничего.
Это может произойти по многим причинам. Давайте разберем их в общих чертах, по этапам рукопожатия TCP.
Неисправность 1: исходный SYN не был доставлен на сервер.
Неисправность 2: сервер получил SYN, но accept()
запрос на подключение занял слишком много времени.
Неисправность 3: ответ SYN/ACK не был доставлен на клиентский компьютер.
Неисправность 4: последний ACK и все его повторные отправки потеряны. (Это может привести к другой ошибке, но я не уверен.)
Эта часть дает мне догадку:
… время от времени Redis перегружает машину Ubuntu, используя слишком много памяти…
Linux OOM killer — это деликатная тема; если вы не настроите из него дерьмо — обычно он предпочитает просто повесить пространство пользователя вместо того, чтобы что-то убивать. (Не спрашивайте меня, почему; я до сих пор не знаю. Легче настроить, чем докопаться до окончательных причин, почему.)
Позвольте предложить вам тест OOM: когда проблема повторится, можете ли вы пропинговать
сервер? Вы также можете ssh
войти в него? Вероятный результат: да для ping, нет для ssh — будет означать Неисправность 2.
Это типично для машин OOM: ядро все еще живо и счастливо и отвечает на пинги, как будто ничего не происходит. Но обратите внимание: в отличие от ping, для установления TCP требуется серверная программа пользовательского пространства (например, redis или sshd) для активного вызова accept()
при готовящемся к открытию соединении. В состоянии OOM это занимает целую вечность, так как программы ждут выполнения своих запросов на выделение памяти.
Результат теста OOM «Нет для ping, нет для ssh» — будет означать, что это не неисправность 2; Я бы предположил, что какой-то связующий элемент виртуализации выходит из строя.
Запуск Redis в докере еще больше усложняет задачу. У Docker есть собственная логика учета памяти (см. -- memory
и др.). Он также должен настроить правила iptables
для работы контейнерной сети.
Если это не поможет: пожалуйста, дайте более подробную информацию о настройке сети здесь, включая виртуализированные сети. Я чувствую, что мне уже нужна диаграмма, чтобы правильно подсчитать ваши виртуальные машины.