1. 程式人生 > >Centos7配置MySQL讀寫分離

Centos7配置MySQL讀寫分離

背景

  • 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
sql-proxy/admin-sql.lua ./lua #複製管理指令碼

建立配置檔案

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
=10.120.114.83 指定後端從slave讀取資料
proxy-backend-addresses=10.120.114.82 指定後端主master寫入資料 proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua 指定讀寫分離配置檔案位置 admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua 指定管理指令碼 log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log 日誌位置 log-level=debug 定義log日誌級別,由高到低分別有(error|warning|info|message|debug) daemon=true 以守護程序方式執行 keepalive=true mysql-proxy崩潰時,嘗試重啟

修改讀寫分離配置

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
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf

netstat -tupln | grep 4040 #已經啟動

killall -9 mysql-proxy #關閉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