| 제목 | CI로 mysql replacatiion 된 DB 사용하기 | ||
|---|---|---|---|
| 글쓴이 | 한대승(불의회상) | 작성시각 | 2013/10/16 16:29:20 |
|
|
|||
|
별도의 클래스로 구현하여 처리하면 되겠다 싶어 열심히 만들어 보는데.... 이게 뭔 삽질이래 싶더군요. 그래서 그냥 단무지(단순, 무식, 지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 백업 후 테이블 초기화)하는데 잘 돌아갑니다. |