讀寫分離介紹
讀寫分離適合於讀特別多的場景,一台只寫,一台只讀,提高讀的效率。
實現的思路
前提:
讀寫分離建立在兩台機器上,並且這兩台機器是做了主從復制的,主庫只寫,從庫只讀,從而實現的。
實現:
第一種:
在主庫創建一個只寫的用戶,而從庫創建一個只寫的用戶,讓程序去連接不同的服務器可達到讀寫分離的效果。
第二種:
通過代理軟件,這種的好處是程序不需要關心寫和讀的操作分別連接的哪台服務器,只管往代理機器發即可,代理軟件進行判斷發往不同的mysql服務器。
通過代理實現的軟件有:mysql-proxy,amoeba
代理方式的實現
圖解:
環境:
需要開三台機器。
192.168.101 # 主庫-只寫
192.168.102 # 從庫-只讀
192.168.100 # 代理
安裝lua腳本語言:
# 這個是mysql-proxy需要的
官方下載地址:
http://www.lua.org/ftp/
(1)安裝依賴 yum install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make readline-devel -y (2)下載包 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz -P /opt/ (3)解壓包 cd /opt/ tar xf lua-5.3.5.tar.gz (4)修改Makefile文件 cd /opt/lua-5.3.5/ vi Makefile # 設置 INSTALL_TOP= /usr/local/lua (5)編譯 make linux && make install (6)添加環境變量 vim /etc/profile 添加: export LUA_HOME=/usr/local/lua export PATH=$PATH:$LUA_HOME/bin 環境變量生效: source /etc/profile
安裝mysql-proxy:
(1) 下載mysql-proxy包
wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -P /opt/
(2) 解壓包和創建軟連接
tar xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy085
(3) 創建logs目錄
mkdir /opt/mysql-proxy085/logs
(4) 添加環境變量
echo "PATH=/opt/mysql-proxy085/bin/:$PATH" >> /etc/profile
source /etc/profile
(5) 配置代理文件
vim /etc/mysql-proxy.cnf
配置內容:
[mysql-proxy] # 運行mysql-proxy用戶 user=root # mysql-proxy連接后端mysql服務器的用戶 admin-username=mysql_proxy_user # mysql-proxy連接后端mysql服務器的密碼 admin-password=123456 # 代理的監聽地址端口,默認端口4040 proxy-address=0.0.0.0:3307 #指定后端主master寫入數據 proxy-backend-addresses=192.168.1.101:3306 #指定后端從slave讀取數據 proxy-read-only-backend-addresses=192.168.1.102:3306 #指定讀寫分離配置文件位置 proxy-lua-script=/opt/mysql-proxy085/share/doc/mysql-proxy/rw-splitting.lua #日志位置 log-file=/opt/mysql-proxy085/logs/mysql-proxy.log #定義log日志級別,由高到低分別有(error|warning|info|message|debug) log-level=debug #以守護進程方式運行 daemon=true #mysql-proxy崩潰時,嘗試重啟 keepalive=true
# 配置參數自行修改
(6) 修改配置文件權限
chmod 660 /etc/mysql-proxy.cnf
(7) 主庫添加授權用戶
grant all privileges on *.* to 'mysql_proxy_user'@'192.168.1.%' identified by '123456';
flush privileges;
(8) 啟動代理
mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
(9) 連接通過代理賬戶連接代理開啟的ip及端口
注:前提你連接的這台機器得弄個mysql客戶端
# 測試的話:mysql包解壓了,添加環境變量即可
# 后端的話:直接通過模塊就連接1.100機器3307端口即可
mysql -umysql_proxy_user -p123456 -h192.168.1.100 --port=3307
(10) 成功
注:lua是必須要安裝的
試驗結果:
注:寫操作,主從兩台機器都會操作,因為他們是主從復制的。
想要看出效果需要修改lua腳本,因為它有限制(表示多少連接才開啟讀寫分離):
vim /opt/mysql-proxy085/share/doc/mysql-proxy/rw-splitting.lua
# min_idle_connnections參數表示最少多少個連接,才開始讀寫分離
查詢讀寫次數的sql語句:
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
show global staus like 'com_select'; # 單個的