Сесія Oracle абарвалася праз VPN? Праверце слаі keepalive
Ціхая праца з базай даных можа перажыць неактыўны сеткавы паток. Прайдзіце праз перамыкач сокета, прадвызначаныя значэнні ядра і наладу Oracle Net у правільным парадку.
Дваццаць пяць хвілін карыснай працы з базай даных амаль нічога не выдаюць, і з кожнай прылады на шляху гэты паток выглядае неактыўным. Неактыўны стан — гэта менавіта тое, што збіраецца. Справаздача потым заўсёды мае адну форму: запыт працаваў, потым сесія знікла, і вынік так і не прыйшоў.
Чатыры праверкі вырашаюць, ці выжыве ціхая сесія, і яны ідуць ад сокета вонкі. Рабіце іх па парадку, бо кожная мяркуе, што папярэдні слой выконвае сваю працу.
Які паток сціхае
Важнае злучэнне — тое, што нясе трафік базы даных, пазначанае ўласнымі адрасамі і партамі. Нішто іншае яго не абнаўляе. Пінг да шлюза, другое SQL-злучэнне з таго ж хоста і ўласны пульс тунэля — гэта асобныя патокі з асобным станам на кожнай прыладзе, якая іх адсочвае.
ss -tio dst 10.60.4.20
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
Спіс сокетаў паказвае таймеры і стан чаргі для жывога злучэння, што інфарматыўней за тэст дасягальнасці. Значэнні sysctl — гэта прадвызначаныя значэнні ядра для паводзін keepalive, і наступны раздзел тлумачыць, чаму яны могуць ніколі не прымяніцца да вашай сесіі. Прадвызначанае значэнне, якое ніколі не спрацоўвае, неадрозніцца ад адсутнасці любога прадвызначанага значэння.
Запішыце адрасы, парты і інтэрфейс, якія выкарыстоўвае злучэнне. Калі сесія памірае, менавіта гэтыя дэталі дазваляюць спытаць правільную прыладу, што яна зрабіла, замест таго каб пытацца, ці была сетка даступная.
Ці сканчаецца палітыка прастою, ці абмяжоўвае
Дзве палітыкі даюць аднолькавы сімптом і патрабуюць процілеглых адказаў. Часовае абмежаванне прастою выдаляе стан, які кваліфікаваны трафік мог бы абнавіць, а keepalive можа гэтаму перашкодзіць. Абсалютнае абмежаванне сесіі выдаляе паток пасля фіксаванай працягласці незалежна ад актыўнасці, і ніякі keepalive гэтага не змяняе.
Спытайце ўладальніка кожнага пасярэдніка, якую з дзвюх ён рэалізуе. Міжсеткавы экран, прылада NAT, балансіроўшчык нагрузкі і хмарны шлюз могуць усе трымаць стан, і ім не абавязкова пагаджацца. Найбольш вузкі вызначае тэрмін, які трэба перамагчы.
Гэтае размежаванне таксама кажа, калі спыніць наладжваць. Калі палітыка — абсалютнае абмежаванне, правільнае рашэнне — карацейшая адзінка працы, аднаўляльная задача або зацверджанае выключэнне, і праверка ніжэй проста пацвердзіць, што keepalive нічога не змянілі.
Перамыкач сокета за прадвызначанымі значэннямі Linux
Keepalive — гэта опцыя для кожнага сокета. Прадвызначаныя значэнні ядра апісваюць, як сябе вядуць зонды пасля таго, як сокет уключыў механізм, і яны не ўключаюць яго для існуючых злучэнняў. Праграма, якая ніколі яго не запытвае, не атрымлівае зондаў, што б ні казалі значэнні sysctl.
Таму само павелічэнне лікаў нічога не змяняе для кліента базы даных. Механізм павінна ўключыць кліенцкая бібліятэка або праграма, і там, дзе стек прапануе кіраванне для асобнага злучэння, абмежаваная налада лепш за змену для ўсяго хоста, якая закранае незвязаныя службы.
Інтэрвал да першага зонда таксама не з'яўляецца часавым абмежаваннем запыту. Здаровае злучэнне застаецца ціхім паміж зондамі, а мёртвы партнёр распазнаецца па інтэрвале і колькасці зондаў. Чытанне гэтых трох значэнняў як аднаго абмежавання вядзе да налад, якія выяўляюць збой альбо занадта позна, альбо занадта паспешліва. Яны кіруюць выяўленнем, а не цярплівасцю праграмы.
EXPIRE_TIME — гэта налада базы даных, а не сеткавае выпраўленне
Oracle Net прапануе ўласны механізм жыццяздольнасці, наладжаны ў эфектыўным профілі працэсу, а не ў адвольным файле, які выпадкова мае падобнае імя. Значэнне выяўляецца ў хвілінах.
SQLNET.EXPIRE_TIME = 5
Яго галоўная мэта — выяўленне мёртвых злучэнняў на баку сервера, а на платформах, якія падтрымліваюць палепшаную мадэль, ён таксама наладжвае паводзіны TCP keepalive для гэтых злучэнняў. Гэта карысная ўласцівасць: слой базы даных можа забяспечыць зонды, не просячы кліенцкую праграму змяніцца.
Паказанае вышэй ілюстрацыйнае значэнне — гэта ўзгоднены выбар супраць меркаванага тэрміну, а не рэкамендацыя. Задакументаваная агульная рэкамендацыя — даўжэйшы інтэрвал, і правільны лік залежыць ад усталяванай рэалізацыі, прымаемых выдаткаў на зонды і фактычных правілаў абнаўлення на шляху. Змясціце наладу ў профіль, які чытае адпаведны працэс, і пацвердзіце, што працэс яе прыняў. Oracle дакументуе месцы профілю і паводзіны выяўлення ў сваім даведніку па параметрах.
Праверце ціхі інтэрвал, затым сплануйце аднаўленне
Пусціце новае дазволенае злучэнне праз ціхі перыяд, даўжэйшы за тэрмін, які вы спрабуеце перамагчы, і назірайце за трафікам жыццяздольнасці і вынікам праграмы. Не запісвайце змест карыснай нагрузкі, які вам не патрэбны; таймеры і стан злучэння адказваюць на пытанне.
ss -tio dst 10.60.4.20
# after the quiet interval, same command
ls -l "$ORACLE_HOME/network/admin/sqlnet.ora"
Калі сесія ўсё яшчэ знікае, тэрмін належыць прыладзе, якую вы яшчэ не спыталі, або палітыка — абсалютнае абмежаванне. Калі яна выжывае, адзначце, які слой змяніўся, каб наступная ціхая аперацыя не паўтарала расследаванне.
Нарэшце, вырашыце, што адбываецца, калі злучэнне сапраўды падае, бо праверкі жыццяздольнасці зніжаюць частоту і ніколі не выдаляюць магчымасць. Устанавіце запісаны вынік аперацыі з базай даных, перш чым адправіць яе зноў: страта адказу нічога не даказвае пра тое, ці была праца пацверджана. Для ўсяго, што павінна перажыць закрыццё ноўтбука або перазапуск тунэля, праца ва ўласнасці сервера з доўгачасовым вынікам — мацнейшы дызайн, а keepalive не планіроўшчык.