linux覆盤:mysql雙主與mysql-proxy實現讀寫分離

不停庫不鎖表在線主從配置

這裏用到了前面的innobackupex:http://www.javashuo.com/article/p-smiiyqpq-ca.htmlphp

mysqldump對於導出10G如下的數據庫或幾個表,仍是適用的,並且更快捷。一旦數據量達到100-500G,不管是對原庫的壓力仍是導出的性能,mysqldump就力不從心了。Percona-Xtrabackup備份工具,是實現MySQL在線熱備工做的不二選擇,可進行全量、增量、單表備份和還原。(但當數據量更大時,可能須要考慮分庫分表,或使用 LVM 快照來加快備份速度了)mysql

2.2版本 xtrabackup 能對InnoDB和XtraDB存儲引擎的數據庫非阻塞地備份,innobackupex經過perl封裝了一層xtrabackup,對MyISAM的備份經過加表讀鎖的方式實現。2.3版本 xtrabackup 命令直接支持MyISAM引擎。nginx

XtraBackup(包含innobackupex)優點 :sql

  1. 無需中止數據庫進行InnoDB熱備
  2. 增量備份MySQL
  3. 流壓縮到傳輸到其它服務器
  4. 能比較容易地建立主從同步
  5. 備份MySQL時不會增大服務器負載

mysql主從不一樣步如何作

show slave status\G
Slave_IO_Running: Yes 
Slave_SQL_Running: No 
可見是Slave不一樣步 

方法一:忽略錯誤後,繼續同步 
該方法適用於主從庫數據相差不大,或者要求數據能夠不徹底統一的狀況,數據要求不嚴格的狀況 解決: 
stop slave; 
#表示跳過一步錯誤,後面的數字可變 
set global sql_slave_skip_counter =1; 
start slave; 
以後再用mysql> show slave status\G 查看: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 數據庫

方法二:厲害了從新搞一遍,主要是數據的同步該方法適用於主從庫數據相差較大,或者要求數據徹底統一的狀況 服務器

MySQL雙主(主主)架構方案思路是

1.兩臺mysql均可讀寫,互爲主備,默認只使用一臺(masterA)負責數據的寫入,另外一臺(masterB)備用;架構

2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互爲主從;ide

3.兩臺主庫之間作高可用,能夠採用keepalived等方案(使用VIP對外提供服務);工具

4.全部提供服務的從服務器與masterB進行主從同步(雙主多從);性能

5.建議採用高可用策略的時候,masterA或masterB均不因宕機恢復後而搶佔VIP(非搶佔模式);

這樣作能夠在必定程度上保證主庫的高可用,在一臺主庫down掉以後,能夠在極短的時間內切換到另外一臺主庫上(儘量減小主庫宕機對業務形成的影響),減小了主從同步給線上主庫帶來的壓力;

可是也有幾個不足的地方:

1.masterB可能會一直處於空閒狀態(能夠用它當從庫,負責部分查詢);

2.主庫後面提供服務的從庫要等masterB先同步完了數據後才能去masterB上去同步數據,這樣可能會形成必定程度的同步延時;

masterA自增加ID:
vi /etc/my.cnf
server-id = 1
auto_increment_offset = 1
auto_increment_increment = 2  #奇數ID
log-bin = mysql-bin  #打開二進制功能,MASTER主服務器必須打開此項(雙主)
log-slave-updates = true  #將複製事件寫入binlog,一臺服務器既作主庫又作從庫此選項必需要開啓

masterB自增加ID:
vi /etc/my.cnf
server-id = 2
auto_increment_offset = 2
auto_increment_increment = 2  #偶數ID
log-bin = mysql-bin  #打開二進制功能,MASTER主服務器必須打開此項
log-slave-updates = true

 添加主從同步帳戶

masterA上:

mysql> grant replication slave on *.* to 'repl'@'192.168.10.12' identified by '123456';
mysql> flush privileges;

masterB上:

mysql> grant replication slave on *.* to 'repl'@'192.168.10.11' identified by '123456';
mysql> flush privileges;

查看主庫的狀態
masterA上:

mysql> show master status;

masterB上:

mysql> show master status;

 配置同步信息

masterA上:

mysql> change master to master_host='192.168.10.12',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=437;

mysql> start slave;

mysql> show slave status\G;

顯示有以下狀態則正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

masterB上:

#本人是測試環境,能夠保證沒數據寫入,不然須要的步驟是:先masterA鎖表-->masterA備份數據-->masterA解鎖表 -->masterB導入數據-->masterB設置主從-->查看主從

複製代碼
mysql> change master to master_host='192.168.10.11',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=120;

start slave;

mysql> show slave status\G;

顯示有以下狀態則正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

mysql-proxy實現讀寫分離

一、安裝lua  (mysql-proxy須要使用lua腳本進行數據轉發) 
#tar zxvf 
lua-5.1.4.tar.gz 
#cd lua-5.1.4 
#vi Makefile,修改INSTALL_TOP= 
/usr/local/lua 
#make posix 
#make install 

二、安裝libevent 
#tar 
zxvf libevent-2.0.8-rc.tar.gz 
#cd libevent-2.0.8-rc 
#./configure 
--prefix=/usr/local/libevent 
#make && make install 

三、安裝check 
#tar zxvf check-0.9.8.tar.gz 
#cd check-0.9.8 

#./configure && make && make install 

四、安裝mysql客戶端 

#tar zxvf mysql-5.0.92.tar.gz 
#cd mysql-5.0.92 
#./configure 
--without-server && make && make install 

五、設置環境變量 
(安裝mysql-proxy所需變量) 
#vi /etc/profile 
export 
LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" 
LDFLAGS="-L/usr/local/libevent/lib -lm" 
export 
CPPFLAGS="-I/usr/local/libevent/include" 
export 
CFLAGS="-I/usr/local/libevent/include" 
# source /etc/profile 

六、安裝mysql-proxy 
#tar zxvf mysql-proxy-0.6.0.tar.gz 
#cd 
mysql-proxy-0.6.0 
# ./configure --prefix=/usr/local/mysql-proxy --with-mysql 
--with-lua 
#make && make install 

七、啓動mysql-proxy 

本次對兩臺數據庫實現了讀寫分離;mysql-master爲可讀可寫,mysql-slave爲只讀 

#/usr/local/mysql-proxy/sbin/mysql-proxy 
--proxy-backend-addresses=192.168.1.201:3306 
--proxy-read-only-backend-addresses=192.168.1.202:3306 
--proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua 
&  

注:若是正常狀況下啓動後終端不會有任何提示信息,mysql-proxy啓動後會啓動兩個端口4040和4041,4040用於SQL轉發,4041用於管理mysql-proxy。若有多個mysql-slave能夠依次在後面添加
相關文章
相關標籤/搜索