{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2019-12-17--001","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":"7026ed40-9bc1-5cd8-945b-052ac9d84c9c","html":"<h1>DRBD 사용하여 DB 이중화 작업 내역</h1>\n<h3>DRBD</h3>\n<ul>\n<li>Distribute Replication Block Device</li>\n<li>블럭 디바이스를 HA(High Availabilty, 고가용성) 구성을 위한 Network Raid-1(mirroring) 유틸</li>\n</ul>\n<h3>환경</h3>\n<ul>\n<li>Ubuntu 18.04</li>\n<li>MariaDB 10.1</li>\n<li>DRBD 8.9</li>\n</ul>\n<h3>장치준비</h3>\n<h4>구성</h4>\n<ul>\n<li>하드웨어 hotlink 연결\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/1628f/hotlink.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: 49.16666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAACl0lEQVQozxWS7U7TUACGdwMmfkTUqHxtlq0bWzu2rnRtWdut3diGMGQIm4IMnYgQmDJRVESjiUZNNMZEIz/0Aky8AK/t8fjjzTk/zvuZE3p2+IJyU6B9hOvNsbi8Qnu1w9buHr3+E/pPnrO5tcHWdpdH+7t0N9bIT6bJqAnkhIKWc7HsCm4xICgHhHZ2HmD4G7jzO4yNZYmPqwIpMpqBpudR1AkymQymNSkMC4JUwi0YJOMSkStJTGcV3WyJdyZqOkvo5cEDFubKdG8t4Dk2sWiEmDzGpcEhRkZHGTh/gTMD57hw8RInTp7i9NkBHu50MHUV15mhvf6ZWvOIMUknGpMJ/fj4iO8fHvPpaYsvBw3e92q82S5zdD/g4I5Hv+Oxu+Jwv11gvWkyW1L49naDP78Oubk4w9Vpj4pviVYykhQm9PRgk/29LmutCq2GIC0WBblE/1bAy7tV3m3P8Hlvnq/71zg+XOL4xTK9m0W+vrrN398f+Pmuy9uHNXqdIoeb9f+CYuz+HVqtGmlVwisouFYKLS0RvnwWVR7GTEeZysTwjXFK+STlKZV2w6XTrtOeK7Cy6HNvtc7rxx1Cvd4NmtdKAj6Ok8U0ZApmnAl1lKHBMxTsFL6rErgKjhnF0CKUHJW5uoWtx8gqYdRUmGRimPaySLi6UsH3czhTCrWqTXXaol6zsc0U1YrNdNkQiRMsNUsEjsJsNU810CkIY0uTRJNR0qkR8Y3CoqUQDPwMnjuBIdz0nKhmK0zqcRRFwi8azM64rK81aF0XxmKOfPYKmjKMpUviHmEy8z/dEJYRZ37eI5QXNUx7HF2LYuUTQlgWW8aIJ2RSyQhFT2eh4VMSZ9HNCWhilhRGLibSRQTCJORBimKGskj+Dx+OcGnoIK4QAAAAAElFTkSuQmCC'); 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=\"hotlink\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/d9199/hotlink.png\"\n        srcset=\"/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/8ff5a/hotlink.png 240w,\n/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/e85cb/hotlink.png 480w,\n/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/d9199/hotlink.png 960w,\n/devHistoryBlog/static/638759bbf82c8fcd8f177af19a229fd6/1628f/hotlink.png 1232w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n<li>\n<p>두 서버간 파티션 및 drbd 연결 도식화</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">┌─────────────────────────┐    ┌────────────────────┐        \n│  /opt/autocrypt/data2   │    │/opt/autocrypt/data1│        \n┌───────────────────────────┐  ┌──────────────────────┐        \n│                           │  │         ext4         │        \n│            ext4           │──└──────────────────────┐      ┌───────────────────────────┐\n│                           │            drbd         ├──────┤            drbd           │\n┌───────────────────────────┐─────────────────────────┐      ┌───────────────────────────┐\n│            sdb2           │            sdb1         │      │            sdb1           │ \n┌───────────────────────────────────────────────────────┐    ┌─────────────────────────────┐\n│                           HDD                         │    │              HDD            │\n└───────────────────────────────────────────────────────┘    └─────────────────────────────┘\n                      Server1                                         Server2</code></pre></div>\n<hr>\n</li>\n</ul>\n<h3>작업내역</h3>\n<h4>1. 추가된 하드 자동 마운트 작업 (불필요시 skip)</h4>\n<p>1.1. sdb 파티션 구성</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># fdisk /dev/sdb  </code></pre></div>\n<p>1.2. 파티션 포맷</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># mkfs.ext4 /dev/sdb1\n# mkfs.ext4 /dev/sdb2</code></pre></div>\n<p>1.3. 디바이스 UUID 확인 </p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># blkid\n/dev/sdb1: UUID=&quot;bf5b50eb-5a00-4dc4-b628-243bea114909&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;18c5e0b8-01&quot;\n/dev/sdb2: UUID=&quot;21d5fe61-691c-44fa-9066-d2365a52d45d&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;18c5e0b8-02&quot;</code></pre></div>\n<p>1.4. 서버 시작 시 자동 마운트를 위한 UUID 등록 (파티션 포맷 시 UUID가 변경된다)</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># vi /etc/fstab\nUUID=21d5fe61-691c-44fa-9066-d2365a52d45d /opt/autocrypt/data2    ext4    defaults    0    0</code></pre></div>\n<p>1.5. 파티션 마운트 후 서버 재시작</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># mount /dev/sdb2 /opt/autocrypt/data2\n# reboot</code></pre></div>\n<p>1.6. 디스크 정보 확인</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># df -h</code></pre></div>\n<hr>\n<h4>2. hotlink 작업</h4>\n<p>2.1. hot link?<br>\n데이터나 파일의 변경이 발생하면 관련된 다른 프로그램의 데이터나 파일도 변경되도록 지시하는 연결</p>\n<p>2.2 인터페이스 확인</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">ip a</code></pre></div>\n<p>2.2. hotlink용 네트워크 인터페이스 추가</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># vi /etc/netplan/파일명.yaml</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\">network:\n    ethernets:\n        enp0s3:\n            dhcp4: true\n\n        # enp0s9  : 테스트 장비 hotlink 네트워크 인터페이스 명\n        # address : primary의 경우 addresses 10.1.1.1, secondary의 경우 10.1.1.2\n        enp0s9:\n            dhcp4: no\n            addresses: [10.1.1.1/24]  \n            gateway4: 10.1.1.1\n    version: 2</code></pre></div>\n<p>2.2. 네트워크 적용</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># netplan apply</code></pre></div>\n<hr/>\n<h4>3. drbd 작업</h4>\n<ul>\n<li>\n<p>3.1. drbd 설치</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># apt install drbd8-utils</code></pre></div>\n<p>***추가 내용 hostname 설정</p>\n</li>\n<li>\n<p>3.2. 설정파일 수정</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># vi /etc/drbd.conf</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\">global {\n    usage-count yes;\n}\ncommon {\n    startup {\n            wfc-timeout 10;\n            degr-wfc-timeout 10;\n            outdated-wfc-timeout 10;\n    }\n    syncer {\n            rate 100M;\n    }\n    protocol C;\n}\nresource r0 {\nnet {\nafter-sb-0pri discard-least-changes;\nafter-sb-1pri discard-secondary;\nafter-sb-2pri disconnect;\n}\n    on vpki1 {\n            device          /dev/drbd0;\n            disk            /dev/sdb1; # drbd 대상 디바이스\n            address         10.1.1.1:7789;\n            meta-disk       internal;\n    }\n    on vpki2 {\n            device          /dev/drbd0;\n            disk            /dev/sdb1; # drbd 대상 디바이스\n            address         10.1.1.2:7789;\n            meta-disk       internal;\n    }\n}</code></pre></div>\n</li>\n<li>\n<p>3.2. 메타 데이터 생성</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># drbdadm create-md r0</code></pre></div>\n</li>\n<li>\n<p>3.3. service 시작</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\">service drbd start</code></pre></div>\n</li>\n<li>\n<p>3.4. Primary 서버 설정 (Primary 서버만 작업)</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># drbdadm primary --force r0</code></pre></div>\n</li>\n<li>\n<p>3.5. drbd 파티션 포맷</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># mkfs.ext4 /dev/drbd0</code></pre></div>\n</li>\n<li>\n<p>3.6. DBMS 데이터 디렉토리 생성 및 마운트</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># mkdir -p /opt/autocrypt/data1\n# mount /dev/drbd0 /opt/autocrypt/data1</code></pre></div>\n</li>\n<li>\n<p>3.7. 디스크 정보 확인</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\">df -h</code></pre></div>\n</li>\n<li>\n<p>3.8. drdb 상태 확인</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># cat /proc/drbd\n또는\n# drbd-overview\n------------------------------------------------\n#연결된 상태\nConnected Primary/Secondary UpToDate/UpToDate\n#싱크 작업 중 상태\nSyncSource Primary/Secondary\n#연결 시도중 상태\nWFConnection Primary/Unknown\n#미연결 상태\nStandAlone Primary/Unknown</code></pre></div>\n</li>\n<li>\n<p>3.9. 미 연결 상태일 경우</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># drbdadm connect r0\nOR\n# service drbd restart</code></pre></div>\n</li>\n<li>\n<p>참고 (연결 상태일 경우)</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\">root@vpki1:~# drbd-overview\n0:r0/0  Connected Primary/Secondary UpToDate/UpToDate\n-----------------------------------------------------------------------------------\nroot@vpki1:~# netstat -anp | grep 7789\ntcp        0      0 10.1.1.1:40083          10.1.1.2:7789           ESTABLISHED -\ntcp        0      0 10.1.1.1:7789           10.1.1.2:49725          ESTABLISHED -</code></pre></div>\n</li>\n</ul>\n<hr/>\n<h4>4. DB 작업</h4>\n<ul>\n<li>\n<p>4.1. MariaDB 설치</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># apt install mariadb-server</code></pre></div>\n</li>\n<li>\n<p>4.2. 초기 MariaDB 데이터 백업</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># mv /var/lib/mysql ~/백업디렉토리/</code></pre></div>\n</li>\n<li>\n<p>4.3. 초기 MriaDB 데이터 /opt/autocrypt/data1 디렉토리로 복사</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># cp -rf ~/백업디렉토리/mysql/* /opt/autocrypt/data1/</code></pre></div>\n</li>\n<li>\n<p>4.4. mysql 실행을 위한 링크 생성</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># ln -s /opt/autocrypt/data1 /var/lib/mysql</code></pre></div>\n</li>\n<li>\n<p>4.5. mysql 디렉토리 owner 변경</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># chown -R mysql:mysql /var/lib/mysql/</code></pre></div>\n</li>\n<li>\n<p>4.6. MariaDB 시작</p>\n<div class=\"gatsby-highlight\" data-language=\"$xslt\"><pre class=\"language-$xslt\"><code class=\"language-$xslt\"># service mysql start</code></pre></div>\n</li>\n</ul>\n<hr>\n<p>참고url</p>\n<ul>\n<li><a href=\"https://wlstnans.tistory.com/128\">https://wlstnans.tistory.com/128</a>  </li>\n</ul>\n<hr><hr>\n#### 테스트 내용\n<ol>\n<li>스플릿 브레인(Split Brain) 현상<br>\n: 일반적으로 클러스터로 구성된 두 시스템 그룹간 네트워크의 일시적 동시 단절현상이 발생 시 나타나는 현상.\n클러스터 상의 모든 노드들은 노드 각자가 자신을 primary라고 인식하게 되는 상황을 말한다.</li>\n</ol>\n<p>테스트:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> primary : drbdadm down r0  \n secondary: drbdadm primary --force r0  \n primary : drbdadm up r0  \n  =&gt; Occur split brain  </code></pre></div>\n<p> 해결: </p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># drbdadm create-md r0  \n# drbdadm up r0  \n# drbdadm connect r0  \n# service drbd start  </code></pre></div>\n<hr>\n<h4>모니터링</h4>\n<h5>1. primary</h5>\n<p> monitoring target : was / db<br>\n문제 발생 시 :<br>\n- 1. stop was / db / drbd<br>\n- 2. ?</p>\n<h5>2. secondary</h5>\n<p> monitoring target : drbd-overview or /proc/drbd<br>\ncheck point :</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># drbd-overview\n0:r0/0  *Connected* Secondary/Primary UpToDate/UpToDate\n---------------------------------------------------------\n** 문제 발생 시 : status is not &#39;Connected&#39;</code></pre></div>\n<hr>\n<h5>스크립트 시나리오</h5>\n<p> -. secondary에서 primary로 변경</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> # drbdadm primary --force r0</code></pre></div>\n<p> -. check changed state</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> # drbd-overview</code></pre></div>\n<p> -. mount device</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> # mount /dev/drbd0 /opt/autocrypt/data1</code></pre></div>\n<p> -. check mounted state</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># df -h</code></pre></div>\n<p> -. service start : DB, WAS, Primary Script?</p>\n<p> -. Secondary Script exit</p>","fields":{"tagSlugs":["/tags/linux/","/tags/drbd/"],"slug":"/works/posts/2019-12-17--001"},"frontmatter":{"title":"[Linux] DRBD 작업 내역","tags":["linux","drbd"],"date":"2019-12-17","description":"DRBD 사용하여 DB 이중화 작업"}}},"pageContext":{"slug":"/works/posts/2019-12-17--001"}},"staticQueryHashes":[]}