TIP게시판

제목 CI로 mysql replacatiion 된 DB 사용하기
글쓴이 한대승(불의회상) 작성시각 2013/10/16 16:29:20
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 15031   RSS
한대승(불의회상)
마스터와 슬레이브로 DB 쪼게놓고 고민을 해봤습니다.
별도의 클래스로 구현하여 처리하면 되겠다 싶어 열심히 만들어 보는데....
이게 뭔 삽질이래 싶더군요.

그래서 그냥 단무지(단순, 무식, 지X...)로 처리 하기로 했습니다.

먼저 config/database.php 설정입니다.

$active_group = 'slave';
$active_record = TRUE;

$db['slave']['hostname'] = 'mysql:host=192.168.0.1;port=3306';
$db['slave']['username'] = 'test';
$db['slave']['password'] = 'test';
$db['slave']['database'] = 'test';
$db['slave']['dbdriver'] = 'pdo';
$db['slave']['dbprefix'] = '';
$db['slave']['pconnect'] = FALSE;
$db['slave']['db_debug'] = TRUE;
$db['slave']['cache_on'] = FALSE;
$db['slave']['cachedir'] = '';
$db['slave']['char_set'] = 'utf8';
$db['slave']['dbcollat'] = 'utf8_general_ci';
$db['slave']['swap_pre'] = '';
$db['slave']['autoinit'] = TRUE;
$db['slave']['stricton'] = FALSE;

$db['master']['hostname'] = 'mysql:host=192.168.0.2;port=3306';
$db['master']['username'] = 'test';
$db['master']['password'] = 'test';
$db['master']['database'] = 'test';
$db['master']['dbdriver'] = 'pdo';
$db['master']['dbprefix'] = '';
$db['master']['pconnect'] = FALSE;
$db['master']['db_debug'] = TRUE;
$db['master']['cache_on'] = FALSE;
$db['master']['cachedir'] = '';
$db['master']['char_set'] = 'utf8';
$db['master']['dbcollat'] = 'utf8_general_ci';
$db['master']['swap_pre'] = '';
$db['master']['autoinit'] = TRUE;
$db['master']['stricton'] = FALSE;

다음으로 core/My_Model.php 입니다.
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// DB Replacation Model
class MY_Model extends CI_Model {
    protected $wdb;
    
    public function __construct()
    {
        parent::__construct();
        
        $this->load->database();
        $this->wdb = $this->load->database('master', TRUE);
    }
    
    public function map($fil, $arr)
    {
        $data = array();
        foreach($fil as $name) {
            isset($arr[$name]) ? $data[$name] = $arr[$name] : NULL;
        }
        
        return $data;
    }
}
* MY_Model 안에 있는 map() 함수는 사용자 함수 입니다.

모델 구현시는 아래와 같이 합니다.
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Album_model extends MY_Model {
    public function __construct()
    {
        parent::__construct();
    }
    
    public function getAll()
    {
        return $this->db->get('album')->result();
    }
    
    public function addAlbum($arr)
    {
        $ret = FALSE;
        $data = $this->map(array('artist', 'title'), $arr);
        if(!empty($data)) {
            $this->wdb->insert('album', $data);
            $ret = $this->wdb->insert_id();
        }
        
        return $ret;
    }
    
    public function deleteAlbum($id)
    {
        if(!empty($id)) {
            $this->wdb->where(array('id' => $id));
            $this->wdb->delete('album');
        }
    }

    public function updateAlbum($arr, $id)
    {
        $ret = FALSE;
        $data = $this->map(array('artist', 'title'), $arr);
        if(!empty($id) && !empty($data)) {
            $this->wdb->where(array('id' => $id));
            $this->wdb->update('album', $data);
            $ret = TRUE;
        }

        return $ret;
    }
}
* 무식하지만 차~~암 쉽죠!

테스트용 컨트롤러 입니다.
    public function album_test()
    {
        $this->output->enable_profiler();
        $this->load->model('mysql/album_model');

        echo "<pre>";
        $data = array('artist' => 'hoksi', 'title' => 'aaaa');
        $id = $this->album_model->addAlbum($data);
        print_r($this->album_model->getall());
        $data['title'] = 'bbb';
        $this->album_model->updateAlbum($data, $id);
        print_r($this->album_model->getall());
        $this->album_model->deleteAlbum($id);
        print_r($this->album_model->getall());
    }

*결과

Array
(
   [0] => stdClass Object
        (
            [id] => 88
            [artist] => hoksi
            [title] => aaaa
        )

)
Array
(
    [0] => stdClass Object
        (
            [id] => 88
            [artist] => hoksi
            [title] => bbb
        )

)
Array()



 다음글 CodeIgniter Cheet Sheets (3)
 이전글 한글언어팩 누락 부분 (1)

댓글

변종원(웅파) / 2013/10/16 16:51:12 / 추천 0
slave가 default?
한대승(불의회상) / 2013/10/16 16:58:37 / 추천 0
웅파// DB세션을 사용할 경우 문제가 발생 할 수 있겠네요.
프로파일링이나 세션의 경우 default를 기준으로 되어 있어서요.
양승현 / 2013/10/16 17:10:14 / 추천 0
L4장비나 따로 스위치가 없는경우 유용한 방법이네요.
전 과감히 master-master로 하여 1개 아이피를 앞에 물려 사용중입니다.
깨지면? ㅋㅋ.. 대책없는 상태로 운영중.. 근데 3~4달간 안깨지고 잘 되고있네용.
변종원(웅파) / 2013/10/16 17:13:57 / 추천 0
master - slave replication 잘 깨진다는 소리가 있어 걱정을 했는데 
6월말부터 아직까지 잘 운영되고 있네요. 
초기 운영미숙으로 한번 재연결 하고 이제는 2주에 한번 정비(innodb 증분백업분 및 전체 db 백업 후 테이블 초기화)하는데 잘 돌아갑니다.