2-18,19 搭建MySQL主從服務器並並經過mysql-proxy實現讀寫分離

 

MySQL主從服務器

實現方式: MySQL  REPLICATION

Replication能夠實現將數據從一臺數據庫服務器(master)複製到一臺或多臺數據庫服務器(slave) html

默認狀況下這種狀況屬於異步複製,無需維持長鏈接 mysql

經過配置,能夠複製全部庫或者幾個庫,甚至庫中的一些表 linux

它是MySQL內建的,自帶 sql

Replication的原理

主服務器master將數據庫的改變寫入二進制日誌文件,從服務器slave同步這些二進制日誌,並生成中繼日誌,從服務器根據中繼日誌,執行這些改變 數據庫

wps85A3.tmp

DML:SQL操做語句,update,insert,delete vim

Relay log :中繼日誌 後端

工程流程(見下圖) 安全

總體來講,分三步: 服務器

1). Master將改變記錄到二進制日誌(binary log)中. 網絡

(這些記錄叫作二進制日誌事件,binary log events);

2). Slave將Master的binary log events拷貝到它的中繼日誌(Relay log);

# 本過程由Slave的I/O線程來完成

3). Slave重作中繼日誌中的事件,修改Slave上的數據

# 本過程由Slave的SQL線程來完成

# 故,這裏有個前提,就是在搭建環境時,Master和Slave數據一致

wps85A4.tmp

更詳細的解釋以下:

mysql主從複製中:

第一步:master記錄二進制日誌。在每一個事務更新數據完成以前,master在二進制日誌記錄這些改變。MySQL將事務寫入二進制日誌,即便事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
第二步:slave將master的binary log拷貝到它本身的中繼日誌。首先,slave開始一個工做線程——I/O線程。I/O線程在master上打開一個普通的鏈接,而後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,若是已經執行完master產生的全部文件,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
第三步:SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並從新執行其中的事件而更新slave的數據,使其與master中的數據一致。

此外,在master中也有一個工做線程和其它MySQL的鏈接同樣,slave在master中打開一個鏈接也會使得master開始一個線程。複製過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操做不能在slave上並行操做。

Replication的做用

1. Fail Over 故障切換

2. Backup Server 備份服務,沒法對SQL語句執行產生的故障恢復,有限備份

3. High Performance 高性能,能夠多臺Slave,實現讀寫分離

Replication常見方案:

一、One master and Muti salve  一主多備

wps85A5.tmp

通常用來作讀寫分離的,master寫,其餘slave讀

這種架構最大問題I/O壓力集中

在Master上<多臺同步影響IO>

二、M-S-S

使用一臺slave做爲中繼,分擔Master的壓力,slave中繼須要開啓bin-log,並配置log-slave-updates

wps85B6.tmp

Slave中繼可以使用Black-hole存儲引擎,不會把數據存儲到磁盤,只記錄二進制日誌

三、M-M  雙主互備

不少人誤覺得這樣能夠作到MySQL負載均衡,實際什麼沒什麼好處,每一個服務器須要作一樣的同步更新,破壞了事物的隔離性和數據的一致性

wps85B7.tmp

四、M-M-M

監控三臺機器互相作對方的master

wps85B8.tmp

天生的缺陷:複製延遲,slave上同步要慢於master,若是大併發的狀況那延遲更嚴重

Mysql在5.6已經自身能夠實現fail over

五、One slave Muti master  一從對多主

好處:節省成本,將多個master數據自動化整合

缺陷:對庫和表數據的修改較多

四:部署MySQL主從同步 <M-S>

環境準備:

主機名

IP

系統 / MySQL版本

角色

xiaogan64

192.168.31.64

CentOS6.8 / 5.5.53

Master

xiaogan63

192.168.31.63

CentOS6.8 / 5.5.53

slave

模式:C/S

端口:3306

配置主數據庫服務器xiaogan64

建立須要同步的數據庫:

mysql> create database Test;

mysql> use Test;

mysql> create table xiaogan(id int,name varchar(20));

service mysqld stop

配置my.cnf:

vim /etc/my.cnf

log-bin=mysql-bin-master  #啓用二進制日誌,開啓log-bin 並設置爲master

server-id=1   #本機數據庫ID 標示 默認就是1,這裏不用改

binlog-do-db=Test #能夠被從服務器複製的庫。二進制須要同步的數據庫名

binlog-ignore-db=mysql  #不能夠被從服務器複製的庫

重啓mysql:

service mysqld restart

受權:

mysql> grant replication slave on *.* to slave@192.168.31.64 identified by "123456";

查看狀態信息:

mysql> show master status;

wps85B9.tmp

查看二進制日誌:

ls /usr/local/mysql/data/

mysql> show binlog events\G

wps85BA.tmp

複製前要保證同步的數據庫一致

mysqldump  -uroot -p123456  Test >Test.sql  

#也能夠導出數據庫

將導出的數據庫傳給從服務器

方法一:scp Test.sql  192.168.31.63:/root

方法二:使用nc命令

NetCat,它短小精悍、功能實用,被設計爲一個簡單、可靠的網絡工具,可經過TCP或UDP協議傳輸讀寫數據。同時,它仍是一個網絡應用Debug分析器,由於它能夠根據須要建立各類不一樣類型的網絡鏈接。

語法:

服務器端:nc發送數據的語法:  nc   -l  端口  < 要傳輸的文件

客戶端:  nc接受數據的語法:  nc   遠程nc服務器端IP  端口   >  文件名

開始傳送:

[root@xiaogan64 ~]# nc -l 888 < test.sql

[root@xiaogan64 ~]# lsof -i :888

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nc      3464 root    3u  IPv4  18662      0t0  TCP *:cddbp (LISTEN)

開始接收:

記得清空兩臺服務器的iptables,要否則端口不能通訊

iptables –F

/etc/init.d/iptables save

nc 192.168.31.64 888 > test.sql

wps85BB.tmp

配置從數據庫服務器xiaogAN63

兩臺數據庫服務器mysql版本要一致

mysql> show variables like '%version%';

wps85BC.tmp

測試鏈接到主服務器是否成功

mysql -uslave -p123456 -h 192.168.31.64

wps85BD.tmp

只有複製的權限

導入數據庫,和主數據庫服務器保持一致

mysql> create database Test;

mysql -uroot -p123456 Test<Test.sql

修改從服務器配置文件:

從服務器不必開啓bin-log日誌

service mysqld stop

vim /etc/my.cnf

server-id=2 

#從服務器ID號,不要和主ID相同 ,若是設置多個從服務器,每一個從服務器必須有一個惟一的server-id值,必須與主服務器的以及其它從服務器的不相同。能夠認爲server-id值相似於IP地址:這些ID值能惟一識別複製服務器羣集中的每一個服務器實例。

mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456'; # 注,是,號鏈接

mysql> start slave;

mysql> show slave status\G  查看狀態

wps85CD.tmp

Slave_IO_Running :一個負責與主機的io通訊

Slave_SQL_Running:負責本身的slave mysql進程

文本框是mysql5.1的配置

wps85CE.tmp

再到主服務器 xiaogan64 上查看狀態:

mysql> show processlist \G

wps85CF.tmp

插入數據測試同步:

mysql> insert into Test.xiaogan values (11,'ganbugan');

從數據庫上查看:

wps85D0.tmp

排錯:

若是遇到主從不一樣步,看一下主從bin-log的位置,而後再同步。

wps85D1.tmp

從服務器 xiaogan63 上執行MySQL命令:

mysql> slave stop; #先中止slave服務

mysql> change master to master_log_file='mysqllog.000004' ,master_log_pos=106;

#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄迴歸,達到同步的效果

mysql>slave start; #啓動從服務器同步服務

mysql> show slave status\G; #用show slave status\G;看一下從服務器的同步狀況

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

若是都是yes,那表明已經在同步

重啓從服務器,再查看狀態:

中止從服務器slave stop;

開啓從服務器slave start;

排錯思路:

1. 二進制日誌沒有開啓

2. IPTABLES 沒有放開端口

3. 對應的主機 IP地址寫錯了

SQL線程出錯

一、主從服務器數據庫結構不統一

出錯後,數據少,能夠手動解決建立插入,再更新slave狀態。

:若是主上誤刪除了。那麼從上也就誤刪除了。 #所以主上要按期作mysqldump備份。

五:部署MySQL主主雙向主從複製  M-M

經過mysql主主:進行mysql 雙向同步數據庫Test的配置

mysql主:服務端:xiaogan63   IP:192.168.31.63

mysql主:服務端:xiaogan64   IP:192.168.31.64 

在上面主從的基礎上進行配置

配置xiaogan63

它有兩種身份:

身份1: xiaogan63的主。 身份2: xiaogan64的從。

vim /etc/my.cnf

log-bin=mysql-bin-slave

binlog-do-db=Test

binlog-ignore-db=mysql  #避免同步mysql用戶 相關配置

service mysqld restart

受權:

mysql> grant replication slave on *.* to slave@'192.168.31.64' identified by '123456';

配置xiaogan64

vim /etc/my.cnf # 不用修改

wps85D2.tmp

5.1的配置

5.5上的配置:

[root@xiaogan64 ~]# mysql  -uroot -p123456

mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456';

mysql> start slave;

mysql> show slave status\G

檢查:

xiaogan64上查看slave狀態

mysql> show slave status \G

xiaogan63上查看slave狀態

mysql> show slave status \G

插入數據測試:

xiaogan63上插入數據,xiaogan64上查看

mysql> insert into T1 values(2,'天清');

xiaogan64上插入數據,xiaogan63上查看

mysql> insert into T1 values(3,'黑客');

注意:這種M-M架構沒有什麼好處,他每每給咱們產生一種實現了負載均衡的錯覺

六:部署M-S-S模型

環境:

xiaogan63   master      mysql5.5.53 192.168.31.63

xiaogan64 slave中繼   mysql5.5.53     192.168.31.64

xiaogan65   slave mysql5.5.53     192.168.31.65

部署master---->xiaogan63:

受權用戶:

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

[root@xiaogan63 ~]# vim /etc/my.cnf   #修改配置

sync-binlog=1

wps85D3.tmp

service mysqld restart

導出Master完整備份,  mysqldump .sql

XtraBackup工具下載地址

https://www.percona.com/downloads/XtraBackup/LATEST/

提供mysql運行時備份

源碼安裝方法:

https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/compiling_xtrabackup.html

YUM源安裝方法:

https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html

第一步:安裝percona的repo源 # Install the Percona repository

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm -y

第二步: 檢查yum源是否已生效: 執行 yum list | grep percona 便可

yum list | grep ^percona-xtrabackup

wps85E4.tmp

第三步:安裝xtrabackup

yum -y install xtrabackup-24

依賴關係:

wps85E5.tmp

[root@xiaogan63 ~]# innobackupex --user=root --password=123456 /opt/backup

wps85E6.tmp

wps85E7.tmp

[root@xiaogan63 ~]# innobackupex --user-memory=500M --apply-log /opt/backup/2016-10-22_23-49-01/ # 這個目錄是上一條命令建立的

wps85E8.tmp

將備份拷貝至slave中繼,和slave

[root@xiaogan63 ~]# scp -r /opt/backup/ 192.168.31.64:/opt/

[root@xiaogan63 ~]# scp -r /opt/backup/ 192.168.31.65:/opt/

部署slave中繼------> xiaogan64

修改主配置文件也要開啓bin-log:

log-bin=mysql-bin-slave1

log-slave-updates=1  

#把它從relay-log中讀取出來的二進制日誌以及本機上執行的操做記錄本身的二進制日誌裏面,這樣才能使第三臺slave經過中繼slave讀取到相應數據變化

binlog_format=row

server-id       = 2

拷貝master導出的數據到data下:

[root@xiaogan64 ~]# service mysqld stop

[root@xiaogan64 ~]# rm -rf /data/*

[root@xiaogan64 ~]# mv /opt/backup/2016-10-22_23-49-010/* /data/

[root@xiaogan64 ~]# chown -R mysql:mysql /data/

受權:

mysql> change master to master_host='192.168.31.63',master_user='repl',master_password='123456';

mysql> start slave;

# 因爲數據庫中的data所有是由63上考過來的,因此須要刪除本來的xiaogan數據庫,否則會報錯,知識Slave_SQL_Running 沒法建立數據庫

# 登陸 64的數據庫後,刪除xiaogan數據庫

wps85E9.tmp

再受權一個用戶給slave:

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

部署slave------>xiaogan65

導入數據:

[root@xiaogan65 ~]# service mysqld stop

[root@xiaogan65 ~]# rm -rf /data/*

[root@xiaogan65 ~]# mv /opt/backup/2016-10-22_23-49-010/* /data

[root@xiaogan65 ~]# chown -R mysql:mysql /data

修改配置:

log-bin=mysql-bin-slave2

binlog_format=row

server-id       = 3

重啓服務:

[root@xiaogan65 ~]# service mysqld start

指定slave中繼做爲主:

mysql> change master to master_host='192.168.31.64',master_user='repl',master_password='123456';

mysql> start slave;

wps85EA.tmp

從master上插入數據測試:

mysql> create table mermber(id int(4) unsigned not null auto_increment,name varcTestr(20),primary key(id));

mysql> insert into mermber values(1,'天屠'),(2,'孤葉');

而後分別在slave中繼,與slave上查看

wps85EB.tmp

wps85EC.tmp

wps85FC.tmp

排錯:

錯誤1:

此方法可能失效,自行驗證

mysql> show slave status\G

wps85FD.tmp

由結果能夠看到:

Read_Master_Log_Pos: 288

Exec_Master_Log_Pos: 107

Last_SQL_Errno: 1146

Last_SQL_Error: Error executing row event: 'Table 'Test.student' doesn't exist'

由於只對Test記錄了binlog,當在mydb庫操做其它數據庫的表,但該表在slave上又不存在時就出錯了。

到master上查看事件記錄

mysql> show binlog events in 'mysql-bin-master.000002' from 107\G

wps85FE.tmp

由上面的結果可知,咱們須要跳過兩個事務173,288

而後到salve中繼操做:

mysql> slave stop;

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2;   跳過一個事務

mysql> slave start;

wps85FF.tmp

這個搞定

或者:

它提供了一個session粒度的選項,經過關閉這個選項能夠不讓主庫將打開這個選項或關閉鏈接前的SQL語句寫入binlog。

set sql_log_bin=off;

mysql>alter table aaa add column xxx int default 1 after yyy;

模擬故障:

因爲歷史遺留問題,MySQL主從庫的表結構不一致,主庫的某個表tableA比從庫表tableA少了一個字段

當嘗試在主庫上更改表結構時,這行alter語句會隨着binlog同步到從庫,若是從庫執行這行語句時出錯,主從同步線程就會自動中止,那樣只能人爲手動處理錯誤,而後再啓動slave上的主從同步線程。場景大概是下面這個樣子:

先在從庫添加這個字段:

mysql> alter table student add age int default 0 after name;

再在主庫添加這個字段:

mysql> alter table student add age int default 0 after name;修改主庫上的表結構,添加一個字段

從庫會同步主庫的,可是從庫已經純在了這個字段

查看slave狀態

wps8600.tmp

wps8601.tmp

解決方法1:

跳過錯誤的事物

從庫上執行:

mysql> stop slave;

set global sql_slave_skip_counter=1;

mysql> start slave;

wps8602.tmp

不少slave數據庫的時候這樣改太麻煩了

解決方法2:

slave比較少的時候還能夠,可是當從庫有幾十臺時,逐臺去處理既費時又容易出錯,怎樣在主庫這一側一勞永逸地避免呢?

那很簡單,咱們不要讓主庫將alter語句記錄到binlog中就行

咱們直接這主庫中關閉binlog記錄

mysql> set sql_log_bin=off;

而後咱們再執行alter語句

mysql> alter table student add age int default 0 after name;

再開啓bin-log

mysql> set sql_log_bin=on;

錯誤2:

wps8603.tmp

這種要求對齊binlog

先到做爲它的主上查看binlog

wps8604.tmp

Slave上不對應

Slave上操做:

mysql> stop slave;

mysql> cTestnge master to master_host='192.168.31.64',master_user='repl',master_password='123456',master_log_file='mysql-bin-slave1.000002',master_log_pos=415;

mysql> start slave;

wps8615.tmp

Ok,恢復正常

# 拷貝完成數據後,重啓報錯

[root@xiaogan65 data]# service mysqld restart  重啓報錯

wps8616.tmp

[root@xiaogan65 data]# rm ibdata1 ib_logfile0 ib_logfile1

rm: remove regular file `ibdata1'? y

rm: remove regular file `ib_logfile0'? y

rm: remove regular file `ib_logfile1'? y

wps8617.tmp

[root@xiaogan65 data]# kill -9 9021

[root@xiaogan65 data]# kill -9 9312

[root@xiaogan65 data]# service mysqld restart

wps8618.tmp

MySQL讀寫分離的概述

Mysql做爲目前世界上使用最普遍的免費數據庫,相信全部從事系統運維的工程師都必定接觸過。但在實際的生產環境中,由單臺Mysql做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。

所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy/Amoeba)來提高數據庫的併發負載能力 這樣的方案來進行部署與實施的。

讀寫分離工做原理:

基本的原理是讓主數據庫處理事務性增、改、刪操做(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操做。數據庫複製被用來把事務性操做致使的變動同步到集羣中的從數據庫。

wps8619.tmp

數據內部交換過程:

wps861A.tmp

爲何要讀寫分離:

面對愈來愈大的訪問壓力,單臺的服務器的性能成爲瓶頸,須要分擔負載

一、 主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用

二、 從庫可配置myisam引擎,提高查詢性能以及節約系統開銷

三、 增長冗餘,提升可用性

實現讀寫分離的方式:

通常有兩種方式實現

應用程序層實現,網站的程序實現

應用程序層實現指的是在應用程序內部及鏈接器中實現讀寫分離

wps861B.tmp

優勢:

A:應用程序內部實現讀寫分離,安裝既可使用

B:減小必定部署難度

C:訪問壓力在必定級別如下,性能很好

缺點:

A:架構一旦調整,代碼要跟着變

B:難以實現高級應用,如自動分庫,分表

C:沒法適用大型應用場景

中間件層實現

中間件層實現是指在外部中間件程序實現讀寫分離

常見的中間件程序:

Mysql-proxy amoeba Atlas(360) Cobar(Alibaba) TDDL(Taobao)

優勢:

A:架構設計更靈活

B:能夠在程序上實現一些高級控制,如:透明化水平拆分,failover,監控

C:能夠依靠些技術手段提升mysql性能,

D:對業務代碼的影響小,同時也安全

缺點:

須要必定的開發運維團隊的支持

MySQL-Proxy概述

MySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它能夠監測、分析或改變它們的通訊。它使用靈活,沒有限制,常見的用途包括:負載平衡,故障、查詢分析,查詢過濾和修改等等。

MySQL Proxy就是這麼一箇中間層代理,簡單的說,MySQL Proxy就是一個鏈接池,負責將前臺應用的鏈接請求轉發給後臺的數據庫,而且經過使用lua腳本,能夠實現複雜的鏈接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來講,MySQL Proxy是徹底透明的,應用則只須要鏈接到MySQL Proxy的監聽端口便可。固然,這樣proxy機器可能成爲單點失效,但徹底可使用多個proxy機器作爲冗餘,在應用服務器的鏈接池配置中配置到多個proxy的鏈接參數便可。

wps861C.tmp

MySQL Proxy更強大的一項功能是實現「讀寫分離」,基本原理是讓主數據庫處理事務性查詢,讓從庫處理SELECT查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中的從庫。   

下載: mysql-proxy

http://dev.mysql.com/downloads/mysql-proxy/

wps862D.tmp

端口:  mysql-proxy 默認端口:4040

部署mysql-proxy實現讀寫分離

wps862E.tmp

實驗環境:

mysql-proxy服務端: xiaogan65             IP:192.168.31.65

mysql服務器(主,負責寫)服務端:xiaogan63    IP:192.168.31.63

mysql服務器(從,負責讀)客戶端:xiaogan64    IP:192.168.31.64

部署mysql-proxy服務端xiaogan65:

安裝前須要系統支持LUA語言環境:

[root@xiaogan65 ~]# yum install lua

安裝mysql-proxy:

推薦採用已經編譯好的二進制版本,由於採用源碼包進行編譯時,最新版的MySQL-Proxy對automake,glib以及libevent的版本都有很高的要求,而這些軟件包都是系統的基礎套件,不建議強行進行更新。
而且這些已經編譯好的二進制版本在解壓後都在統一的目錄內,所以建議選擇如下版本:

[root@xiaogan65 ~]# wget http://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@xiaogan65 ~]# tar -xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/

[root@xiaogan65 local]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy

修改系統環境變量:

[root@xiaogan65 local]# vim /etc/profile

export PATH=/usr/local/mysql-proxy/bin/:/usr/local/mysql/bin:$PATH

[root@xiaogan65 local]# source !$

mysql-proxy 腳本配置文件位置:

[root@xiaogan65 ~]# cd /usr/local/mysql-proxy

[root@xiaogan65 ~]# ls share/doc/mysql-proxy/

wps862F.tmp

修改配置文件實現讀寫分離:

[root@xiaogan65 ~]# cd /usr/local//mysql-proxy/share/doc

[root@xiaogan65 doc]# vim mysql-proxy/rw-splitting.lua

修改

40                 min_idle_connections = 4,

41                 max_idle_connections = 8,

wps8630.tmp

#修改默認鏈接,進行快速測試,默認最小4個以上的客戶端鏈接纔會實現讀寫分離,最大連接數爲8。

:爲了驗證試驗效果將他改爲1 .就是當有一個連接的時候,就實現讀寫分離的功能。爲了清晰的看到讀寫分離的效果,須要暫時關閉MySQL主從複製功能。

xiaogan63上建立數據庫和表,用於實現寫操做:

[root@xiaogan63 ~]# mysql -uroot -p123456

mysql> create database db;

mysql> use db;

mysql> create table test(id int);

mysql> insert into test values(6363);

mysql> grant all on db.* to user1@'%'  identified by '123456';

xiaogan64上建立數據庫和表,用於實現讀操做:

[root@xiaogan64 ~]# mysql -uroot -p123456

mysql> create database db;

mysql> use db;

mysql> create table test(id int);

mysql> insert into test values(6464);

mysql> grant all on db.* to user1@'%'  identified by '123456';

啓動服務mysql-proxy服務

[root@xiaogan65 ~]# mysql-proxy --proxy-read-only-backend-addresses=192.168.31.64:3306 --proxy-backend-addresses=192.168.31.63:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &

wps8631.tmp

參數說明:

--proxy-read-only-backend-addresses=192.168.31.64:3306

# 定義後端只讀服務器

--proxy-backend-addresses=192.168.31.63:3306  

#定義後端mysql主服務器地址,指定mysql寫主服務器的端口

--proxy-lua-script=/usr/local/mysql-proxy/sTestre/doc/mysql-proxy/rw-splitting.lua & 

#指定lua腳本,在這裏,使用的是rw-splitting腳本,用於讀寫分離

當有多個只讀服務器時,能夠寫多個如下參數:

--proxy-read-only-backend-addresses=192.168.31.64:3306  # 定義後端只讀服務器

--proxy-read-only-backend-addresses=192.168.31.62:3306  # 定義後端只讀服務器

#--proxy-address=192.168.31.65:3307 指定mysql proxy的監聽端口,默認爲:4040

完整的參數能夠運行如下命令查看:

[root@xiaogan65 ~]# mysql-proxy --help-all

查看proxy是否啓動:

[root@xiaogan65 ~]# lsof -i :4040

wps8632.tmp

測試讀寫分離

wps8633.tmp

測試寫操做:

[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h192.168.31.65

mysql> use db;

mysql> insert into test values(636363);  回車,沒有報錯

wps8634.tmp

##看不到64數據,能夠看到剛寫入的數據,說明寫操做成功。 由於是第一個客端鏈接,尚未啓動讀寫分離,因此select讀時,沒有看到「6464」數據,而是看到主上「6363「數據。

接下來,多打開幾個客戶端測試一下讀。注:第一個連接,必定是走backend 主mysql服務器的。

測試讀操做:

[root@xiaogan63 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65

[root@xiaogan64 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65

咱們再用65登錄,查看

[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65

這說明讀寫分離測試成功。 可是數據尚未保持同步。 保持數據同步,能夠經過mysql主歷來實現。

擴展: 查看客戶端鏈接狀態:

mysql> show processlist;

wps8644.tmp

wps8645.tmp

部署mysql主從並實現讀寫分離

在以前的基礎上配置主從

配置xiaogan63爲master

[root@xiaogan63 ~]# vim /etc/my.cnf

log-bin=mysql-bin-master

binlog_format=row

server-id       = 1

再修改庫受權:

[root@xiaogan63 ~]# mysql -uroot -p123456

mysql> grant all on *.* to slave@'%' identified by '123456';

mysql> use db;

mysql> drop table test;

[root@xiaogan63 ~]# service mysqld restart

配置xiaogan64爲slave

[root@xiaogan64 ~]# vim /etc/my.cnf

server-id       = 2

[root@xiaogan64 ~]# service mysqld restart

[root@xiaogan64 ~]# mysql -uroot -p123456

mysql> change master to master_host='192.168.31.63',master_user='slave',master_password='123456';

mysql> use db;

mysql> drop table test;

mysql> start slave;

mysql> show slave status\G

wps8646.tmp

主從同步測試:

1:Mysql主數據庫xiaogan63插入數據:

mysql> use db;

mysql> create table admin(id int);

mysql> insert into admin values(63);

2:Mysql從數據庫xiaogan64查看同步的數據:

wps8647.tmp

同步後,測試使用mysql-proxy 可否讀到一樣的數據。

在xiaogan65上測試

[root@xiaogan65 ~]# mysql -uslave -p123456 -P4040 -h192.168.31.65

wps8648.tmp

#能夠查看到admin中的63記錄,說明mysql+proxy+主從讀寫分離成功。

插入數據測試:

mysql> use db;

mysql> insert into admin values(64);

wps8649.tmp

在xiaogan63,xiaogan64上查看都有

當咱們slave掛掉後咋樣呢

模擬故障:

[root@xiaogan64 ~]# service mysqld stop

在xiaogan65上測試讀寫

mysql> insert into admin values(65);

wps864A.tmp

xiaogan63上查看鏈接狀態,確認關閉slave後,讀寫都是訪問xiaogan63

wps864B.tmp

總結:當中止掉 slave 數據庫,proxy 的查詢就會轉移到 master 上,當把 slave 啓動後,proxy 依然在讀 master,當有新的連接進來的時候纔會從新去讀取 slave 的數據。有時可能須要重啓下 mysql-proxy。

若是主數據庫掛了:

主從也沒了,在xiaogan65上只能查看數據

[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h192.168.31.65

wps865C.tmp

wps865D.tmp

相關文章
相關標籤/搜索