下面介紹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配置文件中