{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2022-12-09--002","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"f5491a6d-4577-507d-ae3d-63ab05e84252","html":"<p>이전글)</p>\n<ul>\n<li><a href=\"https://ssongey.github.io/devHistoryBlog/works/posts/2022-12-09--001\">Unable to acquire JDBC Connection 에러 오답노트1</a></li>\n</ul>\n<p>현재글)</p>\n<ul>\n<li><strong>Unable to acquire JDBC Connection(DHCP lease lost) 에러 오답노트2</strong></li>\n</ul>\n<br/>\n<br/>\n<h2>✔️ 문제 재확인</h2>\n<p>어플리케이션의 문제는 아닌듯 보여 VM 장비로 포커스를 맞춰 문제를 다시 파악했다.<br>\n여러 VM의 어플리케이션 로그들을 키바나에서 보고 있어서 몰랐는데, 자세히 보니 특정 패턴이 보였다.<br>\n각 장비마다 <strong>매일 특정 시간대에 connection 에러를 발생</strong>시키고 있었다..!!!<br>\n즉, 1번 워커노드의 서버는 매일 대약 2시쯤, 2번 워커노드의 서버는 매일 대략 3시 반쯤 등 timeout 오류를 발생시키고 있었다.</p>\n<br/>\n<br/>\n<p>열심히 인사이트를 찾아보다가 syslog를 확인하게 되었는데,</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># syslog 위치 (나는 무슨 문제였는지 몰랐기 때문에 syslog 내용을 확인 하였다.)</span>\n$ ll /var/log/syslog*</code></pre></div>\n<p>아래와 같이 systemd-networkd 에서 <strong>eth0: DHCP lease lost</strong> 가 발생이 되고 있다는 걸 알게 되었다.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/7ca1f/002-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 52.083333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB80lEQVQoz21SaW/aQBA1CBFuE2x8rm+DA6jiCNjG0NAcbaJ+rBQpitqq//9PvM4sUVRF/TCaebs7b97MrPJye8KPY4Vfjw94ufuC14dbPJ8+k7+T+PfTV3n25/sj2RN+fju/2xcFirJEQb4kn+c5VqsVFHV4iebFBUzLwkjToBsG+oMBDNOU2HYcqMMh9PEYjuu+x6qqolarSavX61AURcYKJ2i6jjCKYNk2hPBgEpnwPEkWxbEsxjhNUxnzPRMyyb/W7XahJL4H37aQUWLkCUyjEB4lTeMIie9jPkkJm0iDQMYBFfWp0JCUfiRst9tQcuFgaejYBx62roXcc7GxDRS+kPiYhBS75CPcTGLsQ3onbGijEQakUn2zXq93JrQdF5d0yS1zW+y5LfYeKUwnExiEE2o3u7qSYwnCEA6p7Pf7koh9p9M5E1o0D5YvhMCYhm1Tsk4zdSjRoAUFRMqY72MqwsoYM8F/W+ZqriuQZRl8SuYl8DLiJJFKpnRus6qA4mn2tjiBERF/JJRFluMRskFXzmtl6thYY3zShrh2TJqthuJ9pi6q0MeO3i3p3YDabLVa0lhZs9lEo9GAcn864VgWuKkqFNcbVEWO7XqFA/lyu5Xnu/UaFX3c0+GALX3eMt9hvdlgsVhgNpthPp/LDvlb/QWUxQ0pe23OpgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/d9199/002-01.png\"\n        srcset=\"/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/8ff5a/002-01.png 240w,\n/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/e85cb/002-01.png 480w,\n/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/d9199/002-01.png 960w,\n/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/07a9c/002-01.png 1440w,\n/devHistoryBlog/static/227992d3eb72343b5578cb6c9992d803/7ca1f/002-01.png 1890w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>참고) systemd-networkd 로그만 확인하는 방법</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ journalctl -u systemd-networkd</code></pre></div>\n<br/>\n<br/>\n<p>즉!! <strong>VM에서 커넥션 종료</strong>를 시켰고, 어플리케이션 서버에서는 이를 전혀 감지하지 못하고 <strong>dead connection 을 가지고 요청을 수행</strong>하려다가  결국 타임아웃 에러가 발생 한 것이다.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/81ebd/002-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABQUlEQVQoz3WR627CMAyFeX4kXgEeaPxAmioVEGyjpJckTWjTtFpLe2Y3DG2TZsnqxcffsZOFcw5pmkIpCdc0qLSG/3hD837C2LXguN/vqKoKdV1DzFqFmr4b0nNM04TvWHjvkSQJijxH13WwskB9OsD/AA7DMMMYwFopJb27/4F5lkEUGpmhCUSK8VE8HI4ziBt4woa14joD9c2ha4Nh3/eI4xi87aKln6kQSAh4zgyi1xjlQLCrwmq1wnb7MjdZa+FJq1IBTStLW6P1YUI2WC6X2O12YUJBrpdc4ZxbnI5neNpA6AqbzQZRFP0CyuQCmRcorCOgf9bW6zX2+30AsoPSJWxVz8UQE8ZxfF4Kr8OXJslcK40bHUX7WDmoH2fIgLIsYUxIbvx70Ay0xlDdQJO5y9M5fZGhtwaftqQn5c3gC5GrEl0CJH88AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/d9199/002-02.png\"\n        srcset=\"/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/8ff5a/002-02.png 240w,\n/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/e85cb/002-02.png 480w,\n/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/d9199/002-02.png 960w,\n/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/07a9c/002-02.png 1440w,\n/devHistoryBlog/static/0b14f90493521ee2b3a2db37eb2e00d2/81ebd/002-02.png 1868w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br/>\n<br/>\n<h3>Hikari Pool 에서 타임아웃 에러가 발생한 이유는 아래와 같다.</h3>\n<ol>\n<li>DB 수행이 필요한 요청이 들어온다.</li>\n<li>Connection Pool에서 커넥션을 가져온다.</li>\n<li>Hikari CP에서 가져온 커넥션에 대한 validation을 진행한다. 이때, <strong>validation timeout은 default로 5초이다.</strong></li>\n<li><strong>DHCP lease lost 때문에 dead connection으로 validation에 실패하게 되고(5초 소요)</strong></li>\n<li>해당 커넥션을 종료시키고 <strong>다시 2번부터 수행한다.</strong> (커넥션을 종료하면 Pool의 개수를 맞추기 위해 hikari 의 housekeeper 스레드에서 새로운 커넥션을 생성하여 pool에 넣는다.)</li>\n<li>2-5번을 반복하며 vaildation을 하는데 시간을 계속 소비하여 available 한 커넥션을 찾지 못하고, 결국 db connetion timout 에러가 발생하게 된다. (기본 db connection timeout 시간은 30초이다. : spring.datasource.hikari.connectionTimeout )</li>\n</ol>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/555cf/002-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 82.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACBklEQVQ4y6WU25KiQBBE/f9/MzY0FBTQcFQuIgqKIF5r+rRbrjKz8zIdUUADnZ2ZldA5n89SVZVwZiyXSxkOhzIajcRxHImiSNbrtaRp+qw4jmWxWNh35/O5rFYru/Z+v0unKArxPE9ms5kcDgcLst1uZbfbyX6/l+v1autyudhihGEog8FAxuOx3bzb7VowRofD8XgUgLMsE9d1n7sBoMx1cD8IAplOp5IkiUSGLeBPhoqsN2DHmQ243mw2lnnTNHI6nez1xACGWBGFsl+nEkwmCvBgqKCwUT/wChuQh494hpfIL8vSbJaL0+9LGi7FNxsAdm8DIpFFDBghCaYA4OntdrPP8jy3jWwqw9z47Pn+P8ltQLqGLAC0Odogimeo8A3I7ONDfCMX39+aohPOLIaVAnHdLr0PU4r5G+BrU34z3iQrGL4RCxoyMXLocpupWqAq8PhbDzEdEDpK0V1exjf1lWbwTq/Xs8Emg1+C/doUGGmEmJM9zaAOPj1UOKYZdBjw/3aZ/MEUs4kQxRdEIZNnaoHvDiWPIxv0HwEZLAYEQGVY17UFJE7loZKsMDaYgPdcX5qrRfo+2MwBQxqZ468CCD4Whl1iWJV1I/24FC+r5Y8byOWR+a+A+um9esfP4zVSSE6SlSRZbt8PvPFDchsQOXQWdjRHC3bqo9pg/4d/04ACxfgEeK8XD9LzWlAAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/d9199/002-03.png\"\n        srcset=\"/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/8ff5a/002-03.png 240w,\n/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/e85cb/002-03.png 480w,\n/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/d9199/002-03.png 960w,\n/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/07a9c/002-03.png 1440w,\n/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/29114/002-03.png 1920w,\n/devHistoryBlog/static/40b2ae00d620a480f3f444024ab89f03/555cf/002-03.png 1960w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br/>\n<br/>\n<p>DHCP 현상에 대한 인프라팀 답변으로는, 생성된 VM 들은 DHCP 기반으로 IP를 할당받도록 되어 있었고, DHCP 갱신을 24시간 주기로 수행하며 갱신하는 시점에 순간 네트워크 설정이 reset 되면서 기존 연결이 무효화가 되어 DB처럼 커넥션을 연결해놓고 사용하는 경우에는 해당 문제가 발생했다고 한다.</p>\n<br/>\n<hr>\n<h2>✔️ 문제를 확인 했으니, 조치를 해보자</h2>\n<p>ubuntu 18.04 기준으로 <strong>/etc/netplan/50-cloud-init.yaml</strong> 파일에 <strong>critical: true</strong> 필드를 추가 후 apply 하면 된다.</p>\n<h3>1. 설정파일 수정</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># /etc/netplan/50-cloud-init.yaml</span>\nnetwork:\n    ethernets:\n        eth0:\n            dhcp4: <span class=\"token boolean\">true</span>\n            critical: <span class=\"token boolean\">true</span> <span class=\"token comment\">#추가</span>\n            match:\n                macaddress: fa:<span class=\"token punctuation\">..</span>.\n            set-name: eth0\n    version: <span class=\"token number\">2</span></code></pre></div>\n<h3>2. 설정파일 적용</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ <span class=\"token function\">sudo</span> netplan apply</code></pre></div>\n<br/>\n<p>당일에는 DHCP 갱신이 이미 발생이 된 후라 다음날 확인을 해보니, 더이상 connection 오류가 발생하지 않았다.</p>\n<p>어휴! 이슈 해결하느라 고생한 나 자신 칭찬한다.</p>\n<br/>\n<br/>\n<p>참고)</p>\n<ul>\n<li>dhcp란?<br>\n<a href=\"https://jwprogramming.tistory.com/35\">https://jwprogramming.tistory.com/3</a></li>\n<li>dhcp ip 대여시간<br>\n<a href=\"https://points.tistory.com/15\">https://points.tistory.com/15</a></li>\n<li>dhcp message type<br>\n<a href=\"http://www.ktword.co.kr/test/view/view.php?m_temp1=5419&#x26;id=1244\">http://www.ktword.co.kr/test/view/view.php?m_temp1=5419&#x26;id=1244</a></li>\n<li>라우터 vs 공유기<br>\n<a href=\"https://m.blog.naver.com/PostView.naver?blogId=msnayana&#x26;logNo=80105365859&#x26;proxyReferer=\">https://m.blog.naver.com/PostView.naver?blogId=msnayana&#x26;logNo=80105365859&#x26;proxyReferer=</a></li>\n<li>configuring dhcp lease<br>\n<a href=\"https://serverfault.com/questions/1022612/configuring-dhcp-lease-when-using-systemd-networkd-on-ubuntu-18-04-server\">https://serverfault.com/questions/1022612/configuring-dhcp-lease-when-using-systemd-networkd-on-ubuntu-18-04-server</a></li>\n</ul>","fields":{"tagSlugs":null,"slug":"/works/posts/2022-12-09--002"},"frontmatter":{"title":"Unable to acquire JDBC Connection 에러 오답노트2","tags":null,"date":"2022-12-09","description":"DHCP lease lost"}}},"pageContext":{"slug":"/works/posts/2022-12-09--002"}},"staticQueryHashes":[]}