Centos7配置MySQL讀寫分離
阿新 • • 發佈:2019-02-10
背景
- 82和83兩臺Mysql已經實現了主從複製。
- 即將使用mysql-proxy進行讀寫分離,配置192為proxy,寫82讀83。
mysql-proxy
- mysql-proxy是一個處於客戶端和伺服器之間的中介軟體,它可以檢測,分析或改變它們的通訊。簡單說就是一箇中間層代理,一個連線池,負責將前臺應用的連線請求轉發給後臺的資料庫,並且通過lua指令碼,可以實現複雜的連線控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說只需要連線到mysql-proxy的監聽埠即可(預設4040)
下載mysql-proxy
https://downloads.mysql.com/archives/proxy/ 根據系統選擇
解壓
1 2 | tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz /usr/local/mysql-proxy |
新建資料夾
1 2 | mkdir /usr/local/mysql-proxy/lua 建立指令碼存放目錄 mkdir /usr/local/mysql-proxy/logs 建立日誌目錄 |
複製配置檔案
1 2 | cp share/doc/mysql-proxy/rw-splitting.lua ./lua #複製讀寫分離配置檔案 cp share/doc/my |
建立配置檔案
1
| vi /etc/mysql-proxy.cnf #建立配置檔案
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | [mysql-proxy] user=root 執行mysql-proxy使用者 admin-username=proxy 主從mysql共有的使用者 admin-password=proxy 使用者的密碼 proxy-address=10.120.112.192:4040 mysql-proxy執行ip和埠,不加埠,預設4040 proxy-read-only-backend-addresses |
修改讀寫分離配置
1
| vi /usr/local/mysql-proxy/lua/rw-splitting.lua
|
1 2 3 4 5 6 7 | if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 1, #預設超過4個連線數時,才開始讀寫分離,改為1 max_idle_connections = 1, #預設8,改為1 is_debug = false } end |
啟動mysql-proxy
1 2 3 4 5 | local bin/mysql-proxy --defaults-file= mysql-proxy.cnfnetstat -tupln | grep 4040 killall -9 mysql-proxy |
測試讀寫分離
建立Proxy使用者
在主伺服器建立Proxy使用者使用者mysql-proxy使用,從伺服器也會同步這個操作
1
| grant all on *.* to 'proxy'@10.120.112.192' identified by 'proxy';
|
連線mysql-proxy
使用客戶端連線代理
1
| mysql -u proxy -h 10.120.112.192 -P 4040 -p proxy;
|
測試思路
測試寫
關閉83從伺服器的slave服務,在proxy192上執行insert操作,發現新增的資料都在82主伺服器上。
測試讀
在proxy192上執行select語句,發現查出來的資料並不包括剛才insert的資料,說明讀的是83從伺服器上的資料。
切換讀庫引擎
- 讀庫預設引擎是InnoDB,修改為MyISAM會使查詢速度變快。
修改從伺服器/etc/my.cnf
1 2 3 4 5 6 7
[mysqld] default-storage-engine=MyISAM 建立新表時將使用的預設儲存引擎 key_buffer_size=128M myisam_sort_buffer_size=256M myisam_max_sort_file_size=5G myisam_repair_threads=1 myisam_recover
亂碼問題
通過mysql-proxy讀寫分離查詢的時候,可能會出現亂碼。原因是當我們使用mysql-proxy讀寫分離時,客戶端發出查詢請求前一般會先發送一條’set names gbk’的語句來宣告客戶端編碼,然後再發出實際查詢的SQL語句,若資料庫編碼和客戶端發出的不一致則會亂碼。
解決方法是強行執行後端讀伺服器的字元編碼,編輯 /etc/my.cnf檔案:
1 2 3 4 | [mysqld] init-connect='SET NAMES UTF8' skip-character-set-client-handshake character-set-server=utf8 |