Ubuntu10下若何搭建MySQL Proxy讀寫分別商量。本站提示廣大學習愛好者:(Ubuntu10下若何搭建MySQL Proxy讀寫分別商量)文章只能為提供參考,不一定能成為您想要的結果。以下是Ubuntu10下若何搭建MySQL Proxy讀寫分別商量正文
1、MySQL-Proxy基本
MySQL Proxy是一個處於你的Client端和MySQL server端之間的簡略法式,它可以監測、剖析或轉變它們的通訊。它應用靈巧,沒無限制,罕見的用處包含:負載均衡,毛病、查詢剖析,查詢過濾和修正等等。
(Figure1:MySQL Proxy)
MySQL-Proxy, announced in June, is a binary application that sits between your MySQL client and server, and supports the embedded scripting language Lua. The proxy can be used to analyze, monitor and transform communication, and supports a wide range of scenarios including:
load balancing and fail over handling query analysis and logging SQL macros query rewriting executing shell commandsOne of the more powerful features of MySQL Proxy is the ability to do "Read/Write Splitting". The basic concept is to have a master database handle transactional queries while slaves handle SELECT queries. Replication is used to synchronize the changes due to transactional queries with the slaves in the cluster.
MySQL-Proxy是處在你的MySQL數據庫客戶和辦事端之間的法式,它還支撐嵌入性劇本說話Lua。這個署理可以用來剖析、監控和變換(transform)通訊數據,它支撐異常普遍的應用場景:
負載均衡和毛病轉移處置 查詢剖析和日記 SQL宏(SQL macros) 查詢重寫(query rewriting) 履行shell敕令MySQL Proxy更壯大的一項功效是完成“讀寫分別(Read/Write Splitting)”。根本的道理是讓主數據庫處置事務性查詢,而從數據庫處置SELECT查詢。數據庫復制被用來把事務性查詢招致的變革同步到集群中的從數據庫。
2、實戰進程
測試情況:Ubuntu 10.04.2 LTS + MySQL5.1.41-3ubuntu12.10-log
192.168.1.147 proxy 署理 進口
192.168.1.126 master 主機 只寫
192.168.1.145 slaver 從機 只讀
法式上只須要鏈接到192.168.1.147,而192.168.1.126和192.168.1.145關於法式來講是通明的,你完整不須要理睬,也不須要曉得192.168.1.126和192.168.1.145,你對數據庫的一切操作都只對192.168.1.147停止操作。
1.裝置劇本lua
#apt-get install lua5.1
MySQL-Proxy的讀寫分別重要是經由過程rw-splitting.lua劇本完成的,是以須要裝置lua。
2.裝置設置裝備擺設MySQL-Proxy
#apt-get mysql-proxy
以後獲得到的版本是:mysql-proxy 0.8.0(檢查版本敕令:#mysql-proxy -V)
3.修正rw-splitting.lua
#vim /usr/share/mysql-proxy/rw-splitting.lua
設置裝備擺設並應用rw-splitting.lua讀寫分別劇本,劇本目次是 /usr/share/mysql-proxy,修正讀寫分別劇本rw-splitting.lua,修正默許銜接數,停止疾速測試,假如不修正銜接數的話要到達銜接數為4時才會啟用讀寫分別。
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默許為4
max_idle_connections = 1, //默許為8
is_debug = false
}
end
這是由於mysql-proxy會檢測客戶端銜接,當銜接沒有跨越min_idle_connections預設值時, 不會停止讀寫分別, 即查詢操作會產生到Master上。
4.新建文件夾/var/log/mysql-proxy/和文件mysql-proxy.log
#mkdir /var/log/mysql-proxy
#vi mysql-proxy.log
5.履行讀寫分別
#sudo mysql-proxy --proxy-read-only-backend-addresses=192.168.1.145:3306 --proxy-backend-addresses=192.168.1.126:3306 --proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua >/var/log/mysql-proxy/mysql-proxy.log &
參數解釋:
192.168.1.147 proxy 署理 進口
192.168.1.126 master 主機 只寫
192.168.1.145 slaver 從機 只讀
當運轉sudo mysql-proxy 下面語句後,查詢過程沒有4040的時刻,須要重啟mysql ( sudo /etc/init.d/mysql restart) 以後再輸出proxy設置。
6.檢查過程端口
#netstat -ant
#netstat –ntl
(Figure2:端口)
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN
7.檢查數據庫鏈接
mysql> show processlist\G;
(Figure3:過程)
可以看到,發生了一個新銜接。假如想殺失落某個鏈接,可使用mysql>help kill檢查kill的贊助信息,殺失落36過程的敕令:mysql>kill 36;
8.測試讀寫分別
1)在mysql-proxy機子進入MySQL
#mysql -u gaizai -p -P4040 -h 192.168.1.147
必需指定-h參數,否則報上面毛病:
(Figure4:失足)
2)顯示數據庫列表:
mysql> show databases;
假如你是搭建MySQL-Proxy勝利的話,你下面檢查到的數據庫列表應當是192.168.1.145辦事器上的數據庫列表。(可以在145和126分離創立分歧的數據庫停止測試)
3)進入測試數據庫:
mysql> use weibo;
4)查詢表記載:
mysql>select * from blog;
5)拔出一筆記錄:
mysql> INSERT INTO `blog` (`TaskID`, `Content`, `Quote`, `Author`, `Time`, `Url`, `ImageUrl`, `Transmits`, `Comments`, `Hash`, `AddOn`) VALUES('10','fefef','fefef','efef',NOW(),'http://www.cnblogs.com/zgx/archive/2011/09/13/2174823.html',NULL,'0','0','33333333',NOW());
6)查詢表記載:
mysql>select * from blog;
比較兩次查詢表的記載,看記載能否有變更,我們拔出了數據(確認拔出勝利),但兩次的數據是沒有變更的,這就對了,這就是讀寫分別了(我們讀的是145的數據庫,拔出的是126的數據庫,而我們的145與126又沒有設置Replication;假如之前設置了,請先停滯落後行測試)
注:有時刻mysql_proxy(38)庫裡會顯示出數據,重啟體系體系,從新啟動mysql後就沒有此景象了。
7)進入主寫辦事器(192.168.1.126) 檢查數據
#mysql -u gaizai -p -h 192.168.1.126
mysql> use weibo;
mysql>select * from blog;
可以檢查曾經寫入了一筆記錄。
8)進入從讀辦事器(192.168.1.145)
#mysql -u gaizai -p -h 192.168.1.145
mysql> use weibo;
mysql>select * from blog;
由於沒稀有據顯示,解釋只能讀,不克不及寫。
在應用對象SQLyog履行查詢時,在Proxy辦事器上會主動顯示上面的信息:
(Figure5:信息)
9.MySQL-Proxy+Replication
下面的測試只是測試了拔出數據後,在沒有停止Master與Slave的Replication設置的情形下,讀取Master與Slave的數據是分歧,假如想到達Figure1的後果,我們還須要設置Master與Slave之間的數據復制(Replication),概況請參考:Ubuntu10下MySQL搭建Master Slave
3、MySQL-Proxy敕令
贊助敕令:$mysql-proxy --help-all
檢查下MySQL Proxy的版本:$ mysql-proxy -V
編譯啟動劇本:$vi /etc/init.d/mysql-proxy
啟動敕令:$ /etc/init.d/mysql-proxy start
停滯敕令:$ /etc/init.d/mysql-proxy stop
重啟敕令:$ /etc/init.d/mysql-proxy restart
4、留意事項
1.在啟動mysql-proxy的時刻,可以把啟動敕令保留為文件:
建議應用設置裝備擺設文件的情勢啟動, 留意設置裝備擺設文件必需是660權限, 不然沒法啟動. 假如有多個Slave的話, proxy-read-only-backend-addresses參數可以設置裝備擺設多個以逗號分隔的IP:Port從庫列表。
殺失落mysql-proxy過程:# killall mysql-proxy
新建一個文件:# vi /etc/mysql-proxy.cnf
在文件中輸出兩個分隔符中央的內容:
------------------------------------------------------
[mysql-proxy]
admin-username=viajarchen
admin-password=123123
admin-lua-script = /usr/share/mysql-proxy//admin-sql.lua
proxy-backend-addresses=192.168.1.126:3306
proxy-read-only-backend-addresses=192.168.1.145:3306
proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua
log-file=/var/tmp/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
max-open-files=1024
------------------------------------------------------
設置權限:# chmod 660 /etc/mysql-proxy.cnf
或許#chmod +x /etc/init.d/mysql-proxy
設置啟動文件:# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
檢查信息:# ps -ef | grep mysql-proxy | grep -v grep
root 1869 1 0 18:16 ? 00:00:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
root 1870 1869 0 18:16 ? 00:00:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
檢查日記:# tail -50f /var/tmp/mysql-proxy.log
2.mysql-proxy參數
--admin-address=host:port 指定一個mysqo-proxy的治理端口, 缺省是4041;
-P, --proxy-address=<host:port> 是mysql-proxy 辦事器真個監聽端口, 缺省是4040;
-r, --proxy-read-only-backend-addresses=<host:port> 只讀Slave的地址和端口, 缺省為不設置;
-b, --proxy-backend-addresses=<host:port> 長途Master地址和端口, 可設置多個做failover和load balance, 缺省是127.0.0.1:3306;
--defaults-file=<file>設置裝備擺設文件, 可以把mysql-proxy的參數信息置入一個設置裝備擺設文件裡;
--daemon mysql-proxy以守護過程方法運轉
--keepalive try to restart the proxy if it crashed, 堅持銜接啟動過程會有2個, 一號過程用來監督二號過程, 假如二號過程逝世失落主動重啟proxy。
–log-level=debug界說log日記級別,由高到低分離有
(error|warning|info|message|debug)
--proxy-lua-script=file指定一個Lua劇本法式來掌握mysql-proxy的運轉和設置,這個劇本在每次新建銜接和劇本產生修正的的時刻將從新挪用。
--max-open-files:指定最年夜檔案開啟數為1024,不然會有【could not raise RLIMIT_NOFILE to 8192, Invalid argument (22). Current limit still 1024.】的log訊息湧現。
3.當MySQL主從復制在 show slave status\G 時湧現Slave_IO_Running或Slave_SQL_Running 的值不為YES時,,須要起首經由過程 stop slave 來停滯從辦事器,然後再停止測試讀寫分別。
4.MySQL-Proxy的rw-splitting.lua劇本在網上有許多版本,然則最精確無誤的版本依然是源碼包中所附帶的lib/rw-splitting.lua劇本,假如有lua劇本編程基本的話,可以在這個劇本的基本上再停止優化;
5.MySQL-Proxy現實上異常不穩固,在高並發或有毛病銜接的情形下,過程很輕易主動封閉,是以翻開–keepalive參數讓過程主動恢復是個比擬好的方法,但照樣不克不及從基本上處理成績,是以平日最穩妥的做法是在每一個從辦事器上裝置一個MySQL-Proxy供本身應用,固然比擬低效但卻能包管穩固性;
6.一主多從的架構其實不是最好的架構,平日比擬優的做法是經由過程法式代碼和中央件等方面,來計劃,好比單雙server-id號離開寫入等方法來完成兩個或多個主辦事器;
7.MySQL-Cluster 的穩固性也不是太好;
8.Amoeba for MySQL 是一款優良的中央件軟件,異樣可以完成讀寫分別,負載平衡等功效,而且穩固性要年夜年夜跨越MySQL-Proxy,建議年夜家用來替換MySQL-Proxy,乃至MySQL-Cluster。
9.mysql proxy不支撐old_password。別的也能夠經由過程檢查暗碼長度的方法來斷定:select length(password) from mysql.user假如長度為16位則是old_password無疑。
10. 裝置了mysql-proxy完成讀寫分別,有master x 1, slave x 2。為了測試failover,停失落了一個slave,然後mysql-proxy會一向報錯,提醒沒法銜接。這個情形比單點的mysql還蹩腳,掛失落一個就全掛失落!mysql的工程師給供給了一段代碼,調換失落:
src/network-mysqld-proxy.c的NETWORK_MYSQLD_PLUGIN_PROTO函數可以處理這個成績。network-mysqld-proxy-function.c文件。
(經由測試:我停滯失落slave數據庫,proxy的查詢就會轉移到master上,當把slave啟動後,proxy仍然在讀master,當有新的鏈接出去的時刻才會去讀取slave的數據)
11. 假如在mysql-proxy的機械上也裝置了mysql的話,老手就會在這個時刻凌亂了,究竟要若何停止測試和鏈接呢?好比應用敕令:#mysql -u gaizai -p -P4040 -h 192.168.1.147是表現上岸本機的4040端口,應用gaizai帳號,這個帳號可以不是當地mysql的帳號,如許就比擬輕易辨別了。
12. 在上述情況中,mysql-proxy、mysql-master、mysql-slave三台辦事器均存在單點毛病。為了不mysql-proxy單點隱得了兩種辦法:一種辦法是mysql-proxy合營keepalived做雙機,另外一種辦法是將mysql-proxy和運用辦事裝置到統一台辦事器上;為了不mysql-master單點毛病可使用DRBD+heartbear做雙機;為了不mysql-slave單點毛病可以添加多台mysql-slave,mysql-proxy會主動屏障後端產生毛病的mysql-slave。
13. 用sysbench (或許super-smack)測試mysql機能:
#sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000 --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --mysql-user=gaizai --mysql-host=192.168.1.126 --mysql-db=weibo --num-threads=15 prepare
#sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000 --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --mysql-user=gaizai --mysql-host=192.168.1.126 --mysql-db=weibo --oltp-test-mode=complex run
14. 關於mysql-proxy的啟動和封閉的shell劇本的編寫:
15. 讀寫分別不克不及躲避的成績之一就是延遲,可以斟酌Google供給的SemiSyncReplicationDesign補釘。
16. MySQL-Proxy缺省應用的是4040端口,假如你想通明的把3306端口的要求轉發給4040的話,那末可以:iptables -t nat -I PREROUTING -s ! 127.0.0.1 -p tcp --dport 3306 -j REDIRECT --to-ports 4040假如想刪除這條規矩,可以把下面例子中的-I換成-D。參考鏈接
17. 當應用bigint 時,mysql_insert_id()存在成績,概況見手冊,不外關於年夜多半人而言,bigint根本不會碰到,所以你可以疏忽這個成績)注:關於這兩個成績,官方BUG庫裡有人給出了響應的補釘。
5、毛病
在履行敕令的時刻湧現了上面的毛病:
(Figure6:毛病信息)
could not raise RLIMIT_NOFILE to 8192
這個一個正告級其余毛病,意思是MySQL Proxy在你的體系上不克不及把open files limit晉升到8192,不外沒緊要的,MySQL Proxy仍然好好的運轉在你的電腦上。
可以經由過程設置啟動--max-open-files參數處理。
MySQL Proxy裝置和應用(一)
mysql proxy master and slave test
參加--max-open-files=8192後報上面的毛病:
(Figure7:毛病信息)
6、疑問與解答
1.當slave宕機後,mysql-proxy是若何讀取的?(經由測試:我停滯失落slave數據庫,proxy的查詢就會轉移到master上,當把slave啟動後,proxy仍然在讀master,當有新的鏈接出去的時刻才會從新去讀取slave的數據。有時能夠須要重啟下mysql-proxy)
2.若何曉得mysql-proxy以後履行的select是在哪台機械上履行的?
3.當slave宕機一段時光後,假如再次同步master的缺掉的數據?
4.當設置裝備擺設中設置了proxy-read-only-backend-addresses=192.168.1.145:3306
,192.168.1.147:3306相似如許的兩個slave,假如兩個slave的數據分歧步,那末是怎樣讀取數據的?# tail -50f /var/tmp/mysql-proxy.log測試
5.臨盆情況中除停止法式調試外,其它不要開啟mysql查詢日記,由於查詢日記記載了客戶真個一切語句,頻仍的IO操作將會招致mysql全體機能降低。若何設置呢?
6.mysql-proxy.cnf文件中的治理員帳號和暗碼有甚麼用?應用敕令進入治理
mysql -u viajarchen -p -P 4041 -h 192.168.1.147 暗碼是123123
mysql> select * from proxy_connections;
mysql> select * from proxy_config;
(Figure8:信息)
7.關於mysql-proxy的啟動和封閉的shell劇本的編寫?測試
8.關於/usr/share/mysql-proxy/rw-splitting.lua劇本中的
local min_idle_connections = 4 local max_idle_connections = 8應當若何懂得?min的話就是要到達這個值的時刻才會讀寫分別,那末max的是甚麼意思呢?最年夜能有8個鏈接?
9.mysqld是甚麼意思?是mysql的守護過程!
10.HAProxy和keepalived怎樣一路搭建應用?能處理甚麼成績?