질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요

데이터 베이스 접속시  master / slave 접속시 아래처럼 선언하면 됩니다.

databases.php
'mysql' => array(
    'read' => array(
        'host' => '196.168.1.2'
    ),
    'write' => array(
        'host' => '196.168.1.3'
    ),
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),


여기서 문제는 Laravel 서버 내부코드를 봤더니  위처럼 read/write 방식으로 연결할 경우 

read Connection도 만들고,  write Connection 도 한번에 만들게 되네요

ConnectionFactory.php
    /**
     * Create a single database connection instance.
     *
     * @param  array  $config
     * @return \Illuminate\Database\Connection
     */
    protected function createReadWriteConnection(array $config)
    {
        $connection = $this->createSingleConnection($this->getWriteConfig($config));

        return $connection->setReadPdo($this->createReadPdo($config));
    }

insert, update 등  write 커넥션은 필요할때  접속하면  좋을것 같은데  한번에 다 접속해버리네요

대부분  mater 는 한대,  slave 는 여러대를 놓고 서비스 할텐데  master 에 connection full 차는 경우가 발생하지 않을까요?


select만 할경우는  어떻게  해야 될지?  

제가 잘못 알고 있는걸까요?


    CommentAdd your comment...

    3 answers

    1.  
      1
      0
      -1

      아쉽게도 라라벨에서는 두개의 커넥션을 항상 연결하도록 되어 있다고 알고 있습니다. 저도 개인적으로는 리플리케이션에서 사용하도록 select 는 slave 에서, 나머지 insert/ update/ delete 는 master 에서 수행하도록 할 수 있으면 좋겠습니다. 

       

        CommentAdd your comment...
      1.  
        1
        0
        -1

        말씀하신대로 필요할 때 커넥션을 생성하도록 되어 있었으면 더 좋았을 것 같네요.

        아쉬운대로 하자면 mysql_read 와 mysql_write 커넥션을 분리하는 방식으로 할 순 있을것 같은데

        // config/database.php
        
        
        'mysql_read' => array(
            'host' => '196.168.1.2',
            'driver'    => 'mysql',
            'database'  => 'database',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
        'mysql_write' => array(
            'host' => '196.168.1.3',
            'driver'    => 'mysql',
            'database'  => 'database',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
        // .env
        
        
        DB_CONNECTION=mysql_read

        이런 방식은 이미 알고 계셨을 것 같지만 혹시나 해서 굳이 써봤습니다. ㅎㅎ


        PS. 이렇게 커넥션을 완전히 분리해놓으면 findOrCreate() 같은 걸 쓰기가 좀 애매해지겠군요...


          CommentAdd your comment...
        1.  
          1
          0
          -1

          라라벨이 설정을 읽고 커넥션을 만드는 순간에는 애플리케이션이 read를 할 지, write를 할 지 알 수 없을 것 같은데요. 그리고 read와 write가 같은 사용자와 비밀번호를 사용한다는 보장도 없고요.

          혹시 방법을 찾게 되면 꼭 다시 공유해 주세요. 저도 찾는 것 있으면 공유 드릴게요.

          1. 김주원

            여러 개의 MySQL 인스턴스가 Master와 Read Replica로 묶여 있으면, MySQL 레벨에서 자동으로 읽기와 쓰기를 분리해서 라우팅을 하는 걸로 압니다.


            찾아보니 이걸 애플리케이션 레벨에서 강제로 하는 방법도 있네요. 링크를 남깁니다.

            https://laracasts.com/discuss/channels/laravel/i-have-a-question-about-db-readwrite?page=2

          2. 매그니토

            답변 감사합니다. 

            예제들이 write를 지정하는 방법만 있네요

            원하는건  read 할때는 write 커넥션을 안해서  Master 에 부담을 주지 않기 위해서 인데   안되나 보내요

          CommentAdd your comment...