下面介紹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(從).
2,將這兩台IP授權,允許其它IP通過賬號密碼進行訪問(如添加個euht賬號允許所有外部IP以密碼123456訪問),分別登錄進兩台機子的mysql執行如下語句
Grant all privileges on . to ‘euht’@’%’ identified by ‘123456’ with grant option;
Flush privileges;
注:
①上述代碼的意思是創建一個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
保存後重啟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點)
配置日志文件
找到從服務器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
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;
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)
http://xxxxxx/Linuxjc/1175803.html TechArticle