mysql讀寫分離策略

mysql作讀寫分離有兩個步驟:第一步爲mysql配置主從複製;第二步用mysql-proxymysql作讀寫分離。mysql

 

mysql主從複製

爲了保證mysql主從複製搭建成功,最好保證兩臺機器上mysql的版本一致。 在mysql中輸入以下命令查看版本信息。linux

select version();

我使用的兩臺mysql地址分別爲192.168.10.42192.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;

記住其中的FilePosition字段的值,配置從數據庫時會使用到。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的讀寫分離,使用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

爲測試使用把48改成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上,masterslave之間經過紫線同步數據。

如今就能夠測試讀寫分離機制是否起做用了。經過以下命令鏈接到mysql-proxy上。而後停掉192.168.10.49上的slave狀態。

 

mysql -uuser -ppassword -h192.168.29.132 -P4040

 

mysql-proxy上,經過sql插入幾條數據。能夠看到42上的mysql中有新增的數據,49上的mysql沒有新增數據。而後在mysql-proxyselect一下,能夠看到選出來的結構沒有剛纔插入的幾條數據。

至此,mysql的讀寫分離就完成了。

相關文章
相關標籤/搜索