假如一個業務場景,測試後,讀寫比列為1:20,根據讀寫比例,合理設定優化方案。
讀寫比列:
寫資料/讀資料比例, insert/update/delete / select
從“讀寫分離”概念推導實作基本要素:
一般來說,讀伺服器就是指寫伺服器的資料鏡像。
從伺服器端看:要有N台從伺服器和主伺服器保持資料一緻。
從用戶端看:比如有一條insert語句和一條select語句,
則要區分讀/寫語句,并且分别請求從/主伺服器。
伺服器端讀寫分離的具體技術
1:資料庫叢集技術
叢集由3個概念
(1)sql節點 sql node
(2)資料節點 data node
(3)管理節點 ndb managerment
sql語句發送“1sql節點”,“1sql”節點發往“2資料節點”,再由3管理節點完成資料節點之間的同步。
叢集技術相對複雜,至少有3種節點,4台伺服器才能完成。
2,資料庫複制
寫/master(0) 同步 讀/slave(1)
3,資料庫複制replication的實作原理
(1)主伺服器凡運作語句,都産生一個二進制日志 binlog
(2)從伺服器不斷讀取主伺服器的binlog
(3)從伺服器讀取到的binlog,轉換為自身可執行的relaylog
(4)執行relaylog
4,實作步驟:
(1)首先確定主伺服器打開二進制日志功能
這樣,主伺服器一旦有資料變化,立即産生二進制日志
(2)從伺服器也需要開啟二進制日志和relay日志功能
這樣可以從主伺服器讀取binlog,并産生relaylog
(3)在主伺服器建立一個從伺服器的賬号,并授予最高權限
(4)指定從伺服器對應的主伺服器,開啟從伺服器
具體實施
假如一台虛拟機xp,和一台linux
(1)在虛拟機xp下安裝mysql作為從伺服器
(2)在linux下編譯mysql,作為主伺服器
(3)保證xp與linux的3306端口互通
(4)配置主伺服器,打開binlog
mysql>show master status;
Empty set (0.00 sec)
#開啟二進制日志
log-bin=mysql-bin
#給伺服器起一個唯一的id
serve-id=1
#指定日志格式
binlog-format=mixd/row/statement
重新開機mysql
會多兩個檔案:mysql-bin.000001和mysql-bin.index
已經能夠充當master伺服器
5,配置從伺服器打開binlog和relaylog
mysql>show slave status;
[mysql]
#slave config
log_bin =mysql-bin
server_id =2
relay_log =mysql-relay-bin
log_slave_updates =1
read_only =1
重新開機從伺服器
6,在主伺服器上建立相應的複制賬号
mysql>grant replication slave,replication client
->on *.*
->to repl@'192.168.2.%' identified by '111111';
Query OK, 0 rows affected (0.02 sec)
mysql>flush privileges;
Query OK,0 rows affected (0.00 sec)
7,在從伺服器通過語句指定要複制的主伺服器(注意,可以一主多從,不可以一從多主)
mysql>change master to
->master_host='192.168.2.99',(主伺服器ip)
->master_user='repl',
->master_password='111111',
->master_log_file='mysql-bin.000001',
->master_log_pos=0;
Query OK, 0 rows affected (0.08 sec)
8,啟動從伺服器功能
->start slave;
9,測試
如何在用戶端應用的時候,路由語句
一般用兩種方法
(1)直接在PHP的mysql類做判斷,最簡單,不用額外加軟體
比如discuz論壇。
代碼:
//下面這個mysql類,不僅僅是一個mysql類,還充當一個sql語句的路由功能。
class mysql{
$dbm=主伺服器;
$dbs1=從伺服器1;
$dbs2=從伺服器2;
public function query(){
在query裡面進行語句判斷
分别連接配接不同的mysql伺服器
}
}
new mysql
mysql->query();