Mysql主從複製,讀寫分離(mysql-proxy),雙主結構完整構建過程

下面介紹MySQL主從複製,讀寫分離,雙主結構完整構建過程,不涉及過多理論,只有實驗和配置的過程。 
Mysql主從複製(轉載請註明出處,博文地址:) 
原理是master將改變記錄到二進制日誌(binary log),slave將master的binary log拷貝到中繼日誌(relay log),slave經過中繼日誌同步master的操做。 
1,實驗環境,實驗有2臺Ubutu server 14都安裝了mysql服務器,在相同的IP段 
172.16.34.212(主), 
172.16.34.156(從).mysql

2,將這兩臺IP受權,容許其它IP經過帳號密碼進行訪問(如添加個euht帳號容許全部外部IP以密碼123456訪問),分別登陸進兩臺機子的mysql執行以下語句 
Grant all privileges on . to ‘euht’@’%’ identified by ‘123456’ with grant option; 
Flush privileges; 
這裏寫圖片描述sql

注: 
①上述代碼的意思是建立一個euht用戶,host=%,容許全部IP經過用戶名euht進行訪問。添加完刷新權限。 
②此時兩臺機子的mysql應該是能夠相互訪問的,若是不能夠,致使的緣由有不少,最多見的是防火牆沒關,mysql服務器綁定了本地地址。經過以下方法通常可解決問題 
關閉防火牆,或開放3306端口 
這裏寫圖片描述 
更改my.cnf文件,把bind-address註釋掉 
vi /etc/mysql/my.cnf 
這裏寫圖片描述 
3,找到主服務器172.16.34.212MySQL安裝文件夾修改my.cnf(etc/mysql/my.cnf)文件,在[mysqld]下面增長下面幾行代碼 
server-id=1 
log-bin=master-bin 
log-bin-index=master-bin.index 數據庫

log_bin_trust_function_creators=1vim


保存後重啓mysql(service mysql restart;) 
注:若是隻須要同步特定的庫,如上添加代碼,binlog-do-db =euht ,用於master-slave的具體數據庫 
4,進入mysql後,查看主服務器mysql master狀態,日誌File爲master-bin.000001,Position爲107(記下這兩個值,後面進行從服務器操做的時候須要用到) 
這裏寫圖片描述 
5,配置從服務器(172.16.34.156) 
一樣配置從服務器容許外部IP訪問(參考第2點)服務器

配置日誌文件ide

找到從服務器172.16.34.156MySQL安裝文件夾修改my.cnf(etc/mysql/my.cnf)文件,在[mysqld]下面增長下面幾行代碼(server-id跟主服務器不要相同了) 
server-id=10 
log-bin=master-bin 
log-bin-index=master-bin.index測試

log_bin_trust_function_creators=1lua

6,鏈接到主服務器(鏈接上156的mysql執行如下語句,更改相應的內容) 
change master to 
master_host=’172.16.34.212’, 
master_user=’euht’, 
master_password=’123456’, 
master_log_file=’master-bin.000001’, 
master_log_pos=107;.net

7,啓動slave 
mysql> start slave;代理

8,查看slave狀態 
mysql> show slave status\G 
其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須爲YES,才代表狀態正常。 
這裏寫圖片描述 
以上已經能夠實現172.16.34.162主服務器的庫的全部變化同步到從服務器172.16.34.156

測試以下: 
1,如圖兩臺服務器都沒自定義數據庫 
這裏寫圖片描述

2,建立一個數據庫到主庫(172.16.34.212),而後刷新從庫觀察狀況(172.16.34.156) 
這裏寫圖片描述

觀察得出212的全部操做都同步到從156從庫了。至此主從複製完成。 
注意如下幾點: 
1,作主從複製時,首先肯定兩臺服務器的mysql沒任何自定義庫(不然只能夠配置完後以前的東西無法同步,或者兩個庫都有徹底相同的庫應該也是能夠同步)
2,server_id必須配置不同 
3,防火牆不能把mysql服務端口給攔截了(默認3306) 
4,確保兩臺mysql能夠相互訪問(即須要第二步操做) 
5,重置master,slave。Reset master;reset slave;開啓關閉slave,start slave;stop slave; 
Mysql讀寫分離

以上工做作完後能夠開始搭建讀寫分離,讀寫分離目前主要的幾種方式: 
1,MySQL Proxy(中間件) 
2,Amoeba for MySQL(中間件) 
3,Mycat(中間件) 
4,應用層實現 
下面介紹用MySQL Proxy實現讀寫分離。Mysql Proxy通常安裝到單獨的一臺服務器來進行讀寫調度,如下添加一臺IP來安裝mysql-proxy調度器,IP爲172.16.34.236 
1,首先安裝mysql-proxy 
apt-get install mysql-proxy

2,實現讀寫分離是有lua腳本實現的,如今mysql-proxy裏面已經集成,無需再安裝。 
3,配置鏈接數達到多少纔讀寫分離,此處改成1,1個鏈接就開始讀寫分離 
vim /usr/share/mysql-proxy/rw-splitting.lua

這裏寫圖片描述

4,啓動mysql-proxy,主庫用於寫172.16.34.212,從庫用於讀172.16.34.156 
sudo mysql-proxy –proxy-read-only-backend-addresses=172.16.34.156:3306 –proxy-backend-addresses=172.16.34.212:3306 –proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua –admin-username=euht 
–admin-password=123456 
–admin-lua-script=/usr/share/mysql-proxy/admin.lua 
5,啓動後默認佔用端口4040和4041。4040用於SQL轉發,4041用於管理mysql-proxy。(netstat -tupln|grep mysql-proxy) 
這裏寫圖片描述

6,測試讀寫分離 
用主庫172.16.34.212的用戶euht在這臺mysql-proxy服務器登陸進去(也能夠單獨爲這個代理建立一個用戶) 
如今從這臺代理登陸進主mysql服務器插入一條數據到testtb,結果爲主從兩臺服務器都有數據了。 
這裏寫圖片描述

爲了測試讀寫是否真的分離了,咱們把這兩臺服服務器的數據差別化

先登陸mysql-proxy代理(-P指定端口號,必須指定不然登陸進去的將是本地3306端口的那個,固然因爲這臺219服務器我沒配置讓外部機子能夠訪問,因此執行下面的語句缺乏端口號直接報錯。) 
mysql -ueuht -p -h172.16.34.219 -P4040 
登陸進去咱們爲了看到讀寫分離是否生效,先到從服務器156把slave給停掉。(stop slave;)而後在代理服務器219的mysql-proxy執行插入數據。先看本來的數據狀況 
這裏寫圖片描述

插入數據和查看數據 
這裏寫圖片描述

發現插入數據成功,再select出來竟然沒有剛纔插入的數據。這時咱們分別到兩臺服務器去查看數據。 
172.16..34.156從服務器的數據仍是原來的 
這裏寫圖片描述 
再看212的數據 
這裏寫圖片描述

看到這裏就看到效果了。主服務器已經有了剛纔插入的數據,從服務器沒有。這是由於從服務器的主從複製已經關閉,因此從mysql-proxy代理端插入數據(其實是用了主服務器212去插入)沒有複製到從服務器。從mysql-proxy讀取沒看到新插入的數據是由於代理端是去從服務器156讀取數據的。 
至此,mysql的主從複製和讀寫分離就結束了。下面簡單說一下雙主結構。

Mysql雙主結構

經過上面的介紹很容易看出,雙主結構其實就是兩臺服務器相互數據複製。那麼作到雙主結構只須要把212主服務器變成156的從服務器便可。

在212服務器上執行(先到156查看日誌位置,改對相應的東西便可show master status;) 
change master to 
master_host=’172.16.34.212’, 
master_user=’euht’, 
master_password=’123456’, 
master_log_file=’master-bin.000001’, 
master_log_pos=294;

開啓主從 
mysql> start slave;

156,212都start slave,並且配置互爲slave,這就是雙主結構。

測試,212插入數據156會同步,156插入數據212會同步。經測試所有經過。(記得查看運行狀態,Slave_IO_Running 與 Slave_SQL_Running 的值都必須爲YES,才代表狀態正常。Show slave status\G)

若是配置有雙主結構,log_slave_updates這個選項須要設置到myssql的my.cnf配置文件中

相關文章
相關標籤/搜索