爲mysql作讀寫分離有兩個步驟:第一步爲mysql配置主從複製;第二步用mysql-proxy爲mysql作讀寫分離。mysql
爲了保證mysql主從複製搭建成功,最好保證兩臺機器上mysql的版本一致。 在mysql中輸入以下命令查看版本信息。linux
select version();
我使用的兩臺mysql地址分別爲192.168.10.42和192.168.10.49。42上的mysql做爲master使用,49上的mysql做爲slave使用。sql
登陸192.168.10.42,找到mysql的配置文件my.cnf。打開my.cnf在[mysqld]下面加入以下內容數據庫
log-slow-queries=mysql-slow.log log-error=mysql.err log-bin=mysql-bin server-id=1
上面的配置主要是爲了開啓主數據庫的二進制日誌功能,在添加時最好先瀏覽一下my.cnf這個文件,由於有的屬性可能已經存在了。添加完成後保存退出,而後重啓mysql。ubuntu
service mysqld restart
mysql重啓完成後,以root登陸進去,給從數據庫分配主數據庫的複製權限,命令以下tcp
grant replication slave on *.* to 'user'@'192.168.10.49' identified by `password`;
其中「*.*」表示從數據庫可以複製主數據庫上的哪些庫和哪些表,「user」和「password」是主數據庫分配給從數據庫的用戶名和密碼,根據需求本身設定,這裏僅做示例使用。設置從數據庫時要用到這個用戶名和密碼。ide
權限分配後輸入以下命令能夠查看到剛纔設置的用戶名,密碼和ip地址信息。測試
select host,user,password from mysql.user;
而後查看一下主數據庫的狀態信息,輸入以下命令lua
show master status;
記住其中的File和Position字段的值,配置從數據庫時會使用到。spa
登陸到191.168.10.49,找到mysql的配置文件my.cnf,在[mysqld]下面加入以下內容
log-slow-queries=mysql-slow.log log-error=mysql.err log-bin=mysql-bin server-id=10
添加前最好瀏覽下這個文件的原有配置,若是已經配置夠就不用再配置了。保存退出後,重啓mysql服務
service mysqld restart
測試從數據庫是否能用主數據分配的用戶名和密碼登陸到主數據庫。
mysql -uuser -ppassword -h192.168.10.42
若是不能登陸,先檢查一下可否ping通。若是可以ping桶,再檢查一下192.168.10.42上的防火牆是否配置了3306端口。沒有,則在iptables中添加3306端口的放行策略,而後重啓iptables。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
重啓iptables
service iptables restart
這樣,應該就能夠登錄到主數據庫了。
以root登陸從數據庫,配置slave信息
change master to master_host='192.168.10.42', master_user='user' , master_password='password', master_log_file='mysql-bin.000005', master_log_pos=3065;
而後開啓從數據庫的slave狀態。
slave start;
查看slave信息。
show slave status\G;
若是Slave_IO_Running與Slave_SQL_Running爲YES,則slave狀態開啓成功。不然,根據mysqld.log日誌查看具體緣由。
到此,mysql的主從複製就設置好了。在主數據庫上添加刪除幾條數據,能夠在從數據庫上一樣的操做。停掉從數據庫的slave狀態
slave stop;
再往主數據庫中添加刪除數據,這些操做就不會影響到從數據庫了。
mysql的讀寫分離,使用mysql-proxy來實現。而mysql-proxy而依託lua腳本,因此機器上密碼安裝lua。
安裝mysql-proxy的機器爲192.168.29.132。
操做系統爲ubuntu14.1。
mysql-proxy的版本爲mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz。
由於咱們使用的是ubuntu因此安裝lua的方式就很簡單了。
apt-get install lua
能夠根據本身的系統選擇相應的方式安裝lua,保證lua命令可以執行就能夠了。mysql-proxy的版本也要根據本身的操做系統進行相應的選擇。
把mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz上傳到/home/mysql_proxy目錄下,解壓
tar zxvf mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz cd mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit cp share/doc/mysql-proxy/rw-splitting.lua ./ vi rw-splitting.lua
找到以下片斷
if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 4, max_idle_connections = 8, is_debug = false } end
爲測試使用把4和8改成1。在生產環境中根據需求可作相應的修改。修改後以下圖
如今就能夠啓動mysql-proxy了,命令以下
./bin/mysql-proxy --proxy-read-only-backend-addresses=192.168.10.49:3306 --proxy-backend-addresses=192.168.10.42:3306 --proxy-lua-script=rw-splitting.lua
控制檯沒有錯誤輸出則啓動正常。
mysql-proxy的偵聽端口爲4040,因此在192.168.29.132這臺機器上要開放4040端口。在iptables文件中添加以下內容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4040 -j ACCEPT
重啓iptables
service iptables restart
輸入以下命令,能夠查看端口偵聽情況。
netstat -anp | grep 4040
因爲mysql-proxy架設在192.168.29.132這臺機器上,還須要在主數據庫中配置這臺機器的權限,命令以下。
grant all on *.* to 'user'@'192.168.29.132' identified by 'password';
如今mysql讀寫分離就完成了,結構圖以下
應用程序鏈接到mysql-proxy上,全部的寫請求經過紅線發送到master mysql上,全部的讀請求經過藍線發送到slave mysql上,master和slave之間經過紫線同步數據。
如今就能夠測試讀寫分離機制是否起做用了。經過以下命令鏈接到mysql-proxy上。而後停掉192.168.10.49上的slave狀態。
mysql -uuser -ppassword -h192.168.29.132 -P4040
在mysql-proxy上,經過sql插入幾條數據。能夠看到42上的mysql中有新增的數據,49上的mysql沒有新增數據。而後在mysql-proxy上select一下,能夠看到選出來的結構沒有剛纔插入的幾條數據。
至此,mysql的讀寫分離就完成了。