分區和分片
數據庫群組是由于各種各樣的原因建立的,他可以提升處理能力、容忍錯誤,并且
提升大量服務器同時工作的的性能。群組有時會組合分區和共享功能,來將大量復雜的任務
分拆成更加簡單的任務,更加可控的單元。
插件可以支持各種各樣的 MySQL 群組,一些群組會內置一些分區和共享的方法,他們可以
被透明的使用。插件支持最常用的 MySQL 主從同步表過濾和共享 (應用級分區)。
MySQL 主從同步支持過濾方式的分區,他可以讓你創建所有數據庫同步,或者部分數據庫同步。
這樣就要求應用能夠擁有同樣的策略,你可以通過
從 1.5.0 版本開始,可以通過節點組過濾和 SQL hints 完成手動的分區和共享。
節點組過濾器可以讓你將 master 和 slave 命名成一個符號。 范例中,
master_0 和 slave_0
被放在一個命名為 Partition_A 的組中。他們能夠完全的組成一個群組。
例如,你可以使用一個節點群組用于共享,并且使用使用群組名稱作為一個地址共享,
就像 Shard_A_Range_0_100
Example #1 Cluster node groups
{
"myapp": {
"master": {
"master_0": {
"host": "localhost",
"socket": "\/tmp\/mysql.sock"
}
},
"slave": {
"slave_0": {
"host": "simulate_slave_failure",
"port": "0"
},
"slave_1": {
"host": "127.0.0.1",
"port": 3311
}
},
"filters": {
"node_groups": {
"Partition_A" : {
"master": ["master_0"],
"slave": ["slave_0"]
}
},
"roundrobin": []
}
}
}
Example #2 通過 SQL hints 完成手動分區
if?($hint)?{$sql=$hint.$sql;
}
if?(!($res=$mysqli->query($sql)))?{printf("[%d]?%s",$mysqli->errno,$mysqli->error);
returnfalse;
}$row=$res->fetch_assoc();printf("%d?-?%s?-?%s\n",$row['_thread'],$row['_hint'],$sql);
returntrue;
}$mysqli=?newmysqli("myapp","user","password","database");
if?(!$mysqli)/*?Of?course,?your?error?handling?is?nicer...?*/die(sprintf("[%d]?%s\n",mysqli_connect_errno(),mysqli_connect_error()));/*?All?slaves?allowed?*/select($mysqli,"slave_0");select($mysqli,"slave_1");/*?only?servers?of?node?group?"Partition_A"?allowed?*/select($mysqli,"slave_1","/*Partition_A*/");select($mysqli,"slave_1","/*Partition_A*/");?>
6804 - slave_0 - SELECT CONNECTION_ID() AS _thread, 'slave1' AS _hint FROM DUAL
2442 - slave_1 - SELECT CONNECTION_ID() AS _thread, 'slave2' AS _hint FROM DUAL
6804 - slave_0 - /*Partition_A*/SELECT CONNECTION_ID() AS _thread, 'slave1' AS _hint FROM DUAL
6804 - slave_0 - /*Partition_A*/SELECT CONNECTION_ID() AS _thread, 'slave1' AS _hint FROM DUAL
默認的,插件使用所有配置的 master 和 slave 進行查詢操作。但是如果一個查詢,使用
/*node_group*/ 的 SQL hint,那么插件將只使用在
node_group 列出的服務器進行查詢操作。所以,SELECT
查詢操作,只會在 /*Partition_A*/ 列出的 slave_0
中進行。