OneProxy實現MySQL讀寫分離與負載均衡

 

簡介

Part1:寫在最前

    OneProxy平民軟件完全自主開發的分佈式數據訪問層,幫助用戶在MySQL/PostgreSQL集羣上快速搭建支持分庫分表的分佈式數據庫中間件,也是一款具有SQL白名單(防SQL注入)及IP白名單功能的SQL防火牆軟件。採用與MySQL Proxy一致的反向協議輸出模式,對應用非常簡單和透明易用,讓用戶畏懼的數據庫故障切換(Failover)、讀寫分離(Read/Write Split)、分庫分表(Horizontal Partitioning)等複雜方案變得極其簡單可控!基於Libevent機制實現,單個實例可以實現25萬的SQL轉發能力,用一個OneProxy節點可以帶動整個MySQL集羣,爲業務發展貢獻一份力量。

 

Part2:環境簡介

HE1:192.168.1.248 slave1

HE2:192.168.1.249 slave2

HE3:192.168.1.250 Master

HE4:192.168.1.251 Oneproxy

 

環境構建

Part1:安裝Oneproxy

[root@HE4 ~]# tar xvf oneproxy-rhel5-linux64-v5.8.5-ga.tar.gz
[root@HE4 oneproxy]# ls
bin  conf  demo.sh  log  oneproxy.service  README  testadmin.sql  testautocommit.sql  testproxy.sql  trantest.sql

 

Part2:構建主從環境

本文的架構是一主兩從,HE3作爲Master,HE1,HE2作爲Slave。主從的構建不是本文的重點,需要的可移步:

1分鐘利用mysqlreplicate快速搭建MySQL主從

http://suifu.blog.51cto.com/9167728/1878443

 

Part3:配置Oneproxy

目錄中的demo是初次啓動腳本,oneproxy.service是啓停腳本,在新版的oneproxy中,conf文件夾的proxy.cnf爲配置文件

[root@HE4 oneproxy]# cat demo.sh 
#/bin/bash
#
export ONEPROXY_HOME=/root/oneproxy
# valgrind --leak-check=full \
  ${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf

我們將demo.sh中的ONEPROXY_HOME變更爲解壓oneproxy時所在的目錄

[root@HE4 oneproxy]# cat oneproxy.service 
#!/bin/bash
# chkconfig: - 30 21
# description: OneProxy service.
# Source Function Library
. /etc/init.d/functions
# OneProxy Settings
ONEPROXY_HOME=/root/oneproxy
ONEPROXY_SBIN="${ONEPROXY_HOME}/bin/oneproxy"
ONEPROXY_CONF="${ONEPROXY_HOME}/conf/proxy.conf"
ONEPROXY_PID="${ONEPROXY_HOME}/log/oneproxy.pid"
RETVAL=0
prog="OneProxy"
start() {
        echo -n $"Starting $prog ... "
        daemon $ONEPROXY_SBIN --defaults-file=$ONEPROXY_CONF
RETVAL=$?
echo
}
stop() {
        echo -n $"Stopping $prog ... "
if [ -e ${ONEPROXY_PID} ]; then
daemon kill -INT $(cat ${ONEPROXY_PID})
       RETVAL=$?
fi
echo
}
restart(){
        stop
sleep 1
        start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        RETVAL=1
esac
exit $RETVAL

同時,將oneproxy.service中的ONEPROXY_HOME也改爲解壓時的目錄

 

進入oneproxy中的bin目錄,使用mysqlpwd對密碼進行加密

[root@HE4 oneproxy]# cd bin/

[root@HE4 bin]# ls

mysqlpwd  oneproxy

[root@HE4 bin]# ./mysqlpwd MANAGER

1C6D087BA5D2607A27DECB2F2AFE247E911E877A

 

編輯proxy.cnf中的內容

[root@HE4 conf]# cat proxy.conf 
[oneproxy]
keepalive     = 1
event-threads = 4
proxy-group-policy.2 = test:read-slave
log-file      = log/oneproxy.log
pid-file      = log/oneproxy.pid
lck-file      = log/oneproxy.lck
proxy-auto-readonly = 1
proxy-forward-clientip = 1
proxy-trans-debug = 1
proxy-address            = :3307
mysql-version = 5.7.16
proxy-master-addresses.1 = 192.168.1.250:3306@test
proxy-slave-addresses.2 = 192.168.1.248:3306@test
proxy-slave-addresses.3 = 192.168.1.249:3306@test
proxy-user-list          = sys_admin/1C6D087BA5D2607A27DECB2F2AFE247E911E877A@test
proxy-user-group         = test:sys_admin/1C6D087BA5D2607A27DECB2F2AFE247E911E877A@test
proxy-part-template      = conf/template.txt
proxy-part-tables.1      = conf/part.txt
proxy-part-tables.2      = conf/part2.txt
proxy-part-tables.3      = conf/cust1.txt
proxy-charset            = utf8_bin
proxy-secure-client = 127.0.0.1
# proxy-license  = 32C54560E06EFF3E
proxy-httpserver = :8080
proxy-httptitle = OneProxy Monitor

 

Part4:啓動Oneproxy

[root@HE4 oneproxy]# ./demo.sh

[root@HE4 oneproxy]# ./oneproxy.service restart

Stopping OneProxy ...                                      [  OK  ]

Starting OneProxy ...                                      [  OK  ]

測試

Part1:Oneproxy狀態校驗

瀏覽器打開192.168.1.251:8080端口能夠看到oneproxy的管理頁面

wKioL1haDsfRxw9DAALDhlq5SCA495.jpg

這裏可以看到主從的各種狀態信息。

 

 

Part2:負載均衡與讀寫分離校驗

[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE1        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE2        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE1        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE2        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE1        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE3        |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| HE3        |
+------------+

可以看到HE1,HE2兩個slave作爲負載均衡沒有問題,HE3作爲寫服務器也沒有問題。

 

 

 

——總結——

OneProxy配合MySQL實現讀寫分離與負載均衡實驗構建成功,Oneproxy還具有分庫分表功能.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章