假如一個業務場景,測試後,讀寫比列爲1:20,根據讀寫比例,合理設置優化方案。
node
讀寫比列:mysql
寫數據/讀數據比例, insert/update/delete / selectlinux
從「讀寫分離」概念推導實現基本要素:sql
通常來講,讀服務器就是指寫服務器的數據鏡像。數據庫
從服務器端看:要有N臺從服務器和主服務器保持數據一致。服務器
從客戶端看:好比有一條insert語句和一條select語句,ide
則要區分讀/寫語句,而且分別請求從/主服務器。測試
服務器端讀寫分離的具體技術優化
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>show master status;
會多兩個文件:mysql-bin.000001和mysql-bin.index
已經可以充當master服務器
5,配置從服務器打開binlog和relaylog
mysql>show slave status;
Empty set (0.00 sec)
[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();
(2)用集羣中間件
好比官方的mysql_proxy,還有國產的中間件amoeba