Database 접속 속도 개선하기



    서버를 운영하다 보면 적어도 두가지 서버를 운영하게 됩니다. 하나는 웹서버고, 다른 하나는 DB 서버 입니다.

    오늘은 이 두가지를 연동하다 보면 간혹 설정에 따라 속도에 딜레이가 생기는 경우가 있어서 그것을 개선하기 위해 개선 방법에 대해 글을 씁니다.


    이 개선 방법이 효과적으로 사용되기 위해서는 아래와 같은 조건이어야 합니다.


    1. 웹서버와 DB서버가 같은 서버에 설치되어 있을 것

    2. DB 기본 접속주소가 localhost 일 것


    이렇게 두가지 조건으로 사용하시는 분들은 속도를 많이 개선할 수 있습니다. 데이터 베이스 서버를 설치하는 방법은 아래의 글들을 읽어보시면 도움이 됩니다.



    속도를 개선할 수 있는 방법은 2가지가 있는데 먼저 첫번째 방법입니다.




    각 웹 소스에 DB 접속 주소를 127.0.0.1로 바꾸기


    데이터 베이스가 같은 서버에 설치된 경우라면 데이터베이스 연결 주소가 localhost 또는 127.0.0.1입니다.

    각 웹소스별로 기본 설정이 조금씩 다른데, 현재 XE의 경우에는 127.0.0.1 로 되어있습니다.


    이 127.0.0.1 과 localhost의 차이는 무엇일까요?


    간단히 표현 하자면 127.0.0.1의 경우에는 내 컴퓨터로 연결하기 위한 IP주소입니다. localhost의 경우는 내 컴퓨터로 연결하기 위한 이름표(CNAME) 같은 역할을 하구요.


    예를 들어서 설명하면 휴대폰에 우리집 전화번호를 저장해놓고, 집에 전화를 걸 때 직접 전화번호를 입력해서 전화를 거는 경우 (127.0.0.1로 설정한 경우)주소록에서 "우리집"을 찾아서 전화를 거는 경우(localhost를 입력한 경우)처럼 생각할 수 있습니다.


    이렇게 IP주소와 도메인 네임으로 된 레코드를 각각 A RecordCNAME Record 라고 합니다.


    위에 설명대로 하자면, 당연히 localhost보다는 IP주소를 직접 입력하는 것이 엑서스 하는데 더 시간적인 이익이 있을 겁니다. 특히, 데이터베이스와 같은 다양한 사이즈의 많은 정보의 이동이 많은 경우라면 일일이 주소록을 거쳐서 이동하는 것 보다는 직접 주소를 통해 가는 것이 훨씬 빠르지요.


    그래서 웹 소스들을 XE 처럼 DB호스트 네임을 127.0.0.1로 바꿔주면 데이터베이스 교환에서 시간적 이익을 많이 얻을 수 있고, 전체적으로 봤을 땐 체감적으로도 빨라진 것을 느낄 수 있습니다.


    데이터베이스를 사용하는 웹 소스들의 DB호스트 네임을 127.0.0.1로 바꿔준다면 훨씬 빠른 서비스를 제공할 수 있습니다.





    하지만, 변경해야 하는 소스들이 제법 많다면 일일이 변경하기가 조금 힘듭니다. 특히 하나하나 변경을 해야하는데, 데이터베이스 정보가 저장된 위치조차 찾을 수 없는 경우가 허다 합니다.


    이런 경우 두번째 방법을 사용하면 됩니다.




    Hosts 파일에 localhost 추가하기


    일일이 수정을 할 수 없는 경우 윈도우에서는 hosts 파일을 수정하는 것만으로 직접 주소를 입력하는 것과 같은 효과를 얻을 수 있습니다.


    위에서 "직접 주소를 입력하는 것""전화번호부에서 찾는 것"으로 예를 들었는데, 이 hosts 파일에 추가한다는 것은 마치 전화번호들 중에서 필요한 것들을 "즐겨찾기로 등록"하는 것과 같습니다.


    근데 이게 단순히 실제 주소만 즐겨찾기로 등록가능 한 것이 아니라 다른 임의의 주소도 속여서 등록이 가능한데, 나중에 더 자세히 다뤄 보도록 하겠습니다.


    워낙에 hosts 파일은 유명해서 인증과정을 이야기 할 때 중요하게 거론되기도 하는데 일단 여기서 데이터베이스 접속 속도를 빠르게 하기 위한 수단으로만 알아보도록 합시다.


    hosts 파일 주소는 C:\Windows\System32\drivers\etc 에 가면 있습니다. 확장자 이름이 없는 파일로 존재합니다.





    hosts 파일을 메모장으로 열어줍니다. (다른 편집프로그램도 상관없습니다.) 



    그리고 하단부에 다음과 같이 추가를 합니다.


    127.0.0.1 localhost


    중요한 것은 앞에 #이 없어야 합니다. hosts 파일에서 줄 맨 앞에 #이 붙어있으면 주석과 같은 의미를 가집니다. 그리고 hosts 파일 안에도 localhost의 DNS를 자체적으로 컨트롤 할 수 있다고 설명에 적혀 있네요.


    이 하나의 과정만으로 앞으로 localhost는 더 이상 생각할 것도 없이 127.0.0.1이라고 가정하기 때문에 DB 호스트 네임을 127.0.0.1로 바꾼것과 시간이가 없게끔 만들어 줄 수 있습니다.


    여러파일의 데이터베이스 접속주소를 일일이 변경해야 하는 경우에는 이렇게 한번에 변경하는것과 같은 효과를 갖는 이 방법이 더 좋은 방법이라고 생각합니다. 


    이렇게 두가지 방법으로 데이터 베이스 접근 방법을 변경해도 체감상으로 빨라졌다를 느낄 수 있습니다. 

    단, 위에서도 설명드렸다시피 이미 접속 주소를 127.0.0.1로 사용하는 경우이거나 데이터데이스 서버가 달라서 127.0.0.1로 접속을 할 수 없는 경우에는 해당하지 않습니다.







    Posted by Study For Us clamp2x
    • Terry
      2015.02.09 15:33 신고

      쓰신 의도는 알겠는데 이걸로는 접속속도 개선의 의미가 없습니다..
      무슨 뜻이냐면..우리가 도메인을 이용해서 서버를 접속하려 할때 어디어디를 먼저 거쳐가는가에 대한 이해 부족에서 나온거 같네요..
      웹브라우저가 됐든 이런 DB 클라이언트가 됐든..
      ip가 아닌 도메인 이름을 입력받게 되면 먼저 접근하는 곳이 님이 언급한 hosts 파일입니다..거기에서 입력한 도메인과 매핑되는 ip를 찾았을 경우 해당 ip,로 다이렉트 접속을 시도하지만..
      그렇지 않을 경우 DNS 서버로 접속을 시도해서 해당 이름에 대한 ip 어드레스를 조회하게 되는거죠..
      물론 님이 말하신대로 직접 ip를 입력받으면 거기에 다이렉트로 접속을 시도하기때문에 hosts 파일을 뒤질 필요없이 바로 접속은 할꺼에요..
      그러나 로칼에 저장되어 있는 hosts 파일에서 localhost가 127.0.0.1이란걸 알게 되는 과정이 님이 언급하신 시간을 줄여야 할 필요성을 느낄정도로 그렇게 오래 걸리는 과정이 아닙니다..

      이게 정말 의심스럽다면 php에서도 밀리세컨드 단위로 시간을 찍는 기능이 있을테니 그걸로 확인해보셔도 됩니다..
      즉 php에서 DB Connection을 받기 전에 php에서 현재 시간을 밀리세컨드 단위로 찍어본뒤..
      php에서 DB Connection을 연결한후
      그 담줄에서 현재 시간을 다시 밀리세컨드 단위로 찍어보세요..
      밀리세컨드 단위에서의 차이뿐이 없을겁니다..초단위로 넘어간다 해도 1초에서 2초 사이일꺼에요..

      그리고 DB Connection Pool이 적용되면..
      처음 웹서버나 WAS가 기동될때 미리 DB Connection을 여러개를 맺고 시작하기땜에..
      그 담부터는 맺어진 Connection을 바로바로 이용하는 식이어서..
      그때그때 Connection을 맺으면 모를까..Connection Pool 방식을 사용하면 속도의 차이도 아예 없는거죠..

      • Favicon of http://studyforus.tistory.com BlogIcon Study For Us clamp2x
        2015.02.11 15:22 신고

        댓글이 차단 되어 있길래 복원합니다.
        새로운 사실을 알게 되네요. DB connection pool 이 모든 DB 버전에 적용이 되는 건가요?

        수정합니다. DB connection pool은 WAS에서 사용하는 기술이네요.

        단 하나의 쿼리로 전송되는 경우에는 밀리초 단위이지만 여러 단위로 인젝션 되는 경우에는 하나하나가 병렬적으로 처리되면서 시간적인 로스가 커질 것이라고 생각됩니다.
        물론 WAS를 사용하는 경우 DB connection pool을 이용하면 속도에 관해서는 별다른 문제 없을듯 보입니다.
        그리고 기본적으로 접속을 시도할 때의 과정이 이해 부족이라는 것은 이해할 수가 없네요. 본문글을 읽어보면 결론은 님이 이야기 한 내용과 같은 내용이 됩니다.
        본문에 있는 글을 읽어보셔도 직접 IP주소를 입력하는 것이 아니라면 hosts파일에 있는 주소를 수정하여 우선적으로 인식한다 라는 내용이 함축되어 있었는데 쉽게 풀어간다고 했던게 오히려 오해를 불러왔던것 같습니다.
        그리고 DB connection pool 은 제가 몰랐던 사실이라 저에게 새로운 사실을 알게 해주셔서 감사합니다. ^^ 잘만 활용하면 좋은 기능이 될 것 같네요.

    • leinfox
      2016.07.13 03:22 신고

      내용 도움 많이 되었습니다 :)

      그리고 추가적으로 질문하고 싶은 내용이 있는데, 웹서버 데이터베이스를 config.php에서 설정하는데 config.php에서 의미하는 database가 schema명을 쓰는 것이 맞는 것인지 잘 모르겠습니다.
      또, 제 경우에는 데이터베이스를 계정 관리용으로 사용하는데 생성된 계정으로 로그인을 하는 경우 http500에러가 발생합니다. 데이터베이스 커넥팅에 대체 어떤 문제가 있는 것인지 모르겠습니다..

      답해주시면 감사드리겠습니다 :)

      • Favicon of http://studyforus.tistory.com BlogIcon Study For Us clamp2x
        2016.07.13 23:20 신고

        XE에서 경우를 말씀하시는 건가요? config.php 에서 database를 이야기 하면 schema명을 말하는 것이 맞습니다.
        그리고, 계정 관리용으로 사용할 때 데이터베이스 자체에서 생성하면 php의 DB컨트롤러로 만든것과 차이가 있기 때문에 500에러를 나타내는 것 같습니다.^^

      • leinfox
        2016.07.15 00:44 신고

        아하...그렇군요
        제경우에는 MySQL을 이용했는데 그렇다면 phpmyadmin을 이용해야 정상적으로 작동하게 되는 건가요?

      • Favicon of http://studyforus.tistory.com BlogIcon Study For Us clamp2x
        2016.07.15 00:50 신고

        아닙니다. MySQL 에서 명령어로 계정을 생성하나, phpMyAdmin에서 계정을 생성하나 똑같습니다.

        처음 질문 내용이 잘 이해가 안가는데 방금 다신 댓글을 보니깐 CMS(php로 된 소스 - XE같은것)를 설치하려고 MySQL에서 계정과 데이터베이스를 생성해서 연결하려고 해보니 500에러가 발생했다는 이야기였나요?

        만약, 그렇다면 php 버전과 MySQL 버전이 서로 맞지 않아 생기는 경우일 수 있습니다.
        php 버전은 5.6~5.7 MySQL 버전은 5.5~5.6 버전이 가장 안정적으로 별다른 에러없이 잘 구동이 됩니다.

        또한 500에러가 발생하는 경우는 MySQL의 연결 오류보다는 php쪽에 문제가 있을 가능성이 높습니다. php 버전과 VC++의 버전이 서로 맞아야 하는데 이것도 서로 다르면 500에러를 뿜기도 하구요.

        질문이 애매하게 해주셔서 전에는 위에 처럼 답을 했지만, 조금 더 상황을 자세하게 말씀해주시면 확실하게 답변드릴 수 있을것 같습니다.^^

    • 별루
      2017.04.07 09:53 신고

      성능개선 쿼리를 보느게 낳을듯요

      • Favicon of http://studyforus.tistory.com BlogIcon Study For Us clamp2x
        2017.04.07 11:28 신고

        물론 그것도 과정중에 하나지만 쿼리문이나 소스코드만으로 할 수 없는 한계점을 해결하기 위한 방법입니다. ^^

    • 개발자
      2017.11.29 18:44 신고

      localhost 냐 127.0.0.1 이냐 이런 수준은 사람이 느끼지 못하는 속도 입니다.
      대부분, 웹서버와 디비서버를 별도로 둡니다.
      이 상황에서의 속도를 개선하는 방법을 찾아야지..
      정말 말도 안되는 내용을 정보라고 올려두었네요..

      • Favicon of http://studyforus.tistory.com BlogIcon Study For Us clamp2x
        2017.11.29 21:24 신고

        사람이 느끼기 힘든 수준이라는 것은 맞는 말이긴 합니다만 저 사양또는 윈도우 같이 리소스를 많이 차지하는 경우 많은 트랜젝션이 오가는 상황이라면 전혀 말도 안되는 방법은 아닙니다.

        그리고 큰 웹사이트 아니고서는 웹서버외 디비 서버를 분리하는 일이 더 드뭅니다. 왠만한 중소 규모 사이트는 개별적으로 서버를 운영하든 웹호스팅을 이용하든 대부분 웹서버와 디비 서버가 한군데에 있는 경우가 더 많습니다.

        대규모 사이트만 관리해보셨나봐요?
        물론 웹서버와 디비서버는 규모에 맞게 최적화를 해야하는 것은 맞지만 그 외적으로 의외로 자주 발생하는 문제입니다. 그렇기 때문에 중소규모 또는 개인 서버 규모에서는 상황에 따라 굉장히 유용한 팁은 맞습니다. ^^

        현재 운영하고 있는 사정에 맞춰 속도 개선을 하고 싶다면 서버 사이드에서 할 일은 다 하고 코딩 개선하셔야죠.

      • asdas
        2017.12.04 22:03 신고

        윗 댓글도 그렇고 충분히 도움되는 내용인데 자기가 모르는 내용이라고 말도 안된다 어쩐다 하는걸 보면.. 아주 얕게 공부한걸 자랑거리로 삼으며 남을 비난할정도로 자랑할게 없는 인생인 당신의 모습이 안타까워보이기까지 합니다. 자기가 아는게 전부가 아닌데 말이죠.. 그런식으로 인생을 사신다면 일생동안 얻는게 별로 없으실겁니다. 지렁이가 일생동안 5m밖을 나가지 않듯이, 그런 겉핥기식의 지식으로 끝날거라는 말입니다.

        localhost와 127.0.0.1의 속도차이는 상황마다 다르지만 크게는 3초이상 차이날때도 있습니다. 물론 어느정도 입지가 다져진 중소기업 이상의 회사에서는 이런 사소한 일로 로딩이 생기진 않겠죠. 하지만 그런 사소한것까지 해결해야하는게 프로그래머이구요.

        어디서 원활히 인수인계되어 유지보수가 쉬운 일을 잠시동안 맡아보신 모양인데, 세상에는 본인이 아는것보다 모르는게 더 많습니다.

티스토리 툴바