OneProxy使用手冊--致力於打造透明的數據層


介紹

     平民軟件官網上線(http://www.onexsoft.com)
  OneProxy是由原支付寶首席架構師樓方鑫開發,目前由樓方鑫創立的杭州平民軟件公司(@平民架構)提供技術支持。目前已有多家公司在生成環境中使用,其中包括了支付、電商等行業。
 
     OneProxy的主要功能有:
1. 垂直分庫
2. 水平分表
3. Proxy集群
4. 讀高可用
5. 讀寫分離(master不參與讀)
6. 讀寫分離(master參與讀)
7. 寫高可用
8. 讀寫隨機
 
 
 
如需技術支持,請添加微信號:onesoft007  
 
重要概念
     Server Group
     在OneProxy中,一組主從復制的MySQL集群被稱為Server Group。如圖. A所示,有Server Group A和Server Group B。
     
                                                            圖. A
     在OneProxy中,垂直分庫和水平分表的實現思路都是建立在Server Group的概念上。為了更好地說明,我們假設以下場景。
     A)Server Group A中有三張表table X, table Y, table Z,其中應用對table X操作非常頻繁,占用大量I/O帶寬,嚴重影響了應用對tableY, tableZ的操作效率。
              
                                                                      圖. B
     解決方案1.0:把table X移到另一組數據庫,即Server Group B中(如圖C所示),然后通過修改OneProxy的配置來改變table X的路由規則,無須改動應用。
 
                                                                      圖. C
     B)在使用了解決方案1.0后,系統的I/O壓力得到緩解。由於后期業務越來越多,Server Group B的寫入壓力越來越大,響應時間變慢。
     解決方案2.0 : 把Server Group B中的table X水平拆分,將X_00, X_01留在Server Group B中,把X_02,X_03留在Server Group C中,如圖D所示
 
                                                                                圖. D
 
 
支持的平台
     Redhat5.x_X64,Redhat6.x_X64
 
安裝步驟
  1)下載最新版OneProxy: http://www.onexsoft.cn/software/oneproxy-rhel6-linux64-v5.8.3-ga.tar.gz
          本文檔寫作時,最新版本為oneproxy-rhel6-linux64-v5.8.3-ga.tar.gz
     2)上傳到目標主機的目錄:/usr/local 
     3)cd /usr/local/
    tar zxvf oneproxy-rhel6-linux64-v5.8.3-ga.tar.gz
     4)cd oneproxy/
     5)修改demo.sh
###############################

#/bin/bash
#
export ONEPROXY_HOME=/usr/local/oneproxy/

# valgrind --leak-check=full \
${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf

#####################################
注:
紅色部分是需要根據自己的環境,需要更改的地方
 
   6)創建相關數據庫,用戶名和密碼
        假設已經安裝配置好MySQL,如果未安裝請參考(http://dev.mysql.com/doc/refman/5.6/en/installing.html)
   mysql -uroot
   mysql> create database if not exists test character set utf8 ;
   mysql> grant insert, update, delete, select on test.* to test@'10.0.0.%' identified by 'test'; 
     7)chmod +x ./demo.sh
    ./demo.sh
     8)檢查是否成功啟動。
          ps aux | grep mysql-proxy | grep -v grep
          如有輸出,則啟動成功。
          若無輸出,請檢查運行日志/usr/local/oneproxy/log/oneproxy.log
     注:目前OneProxy有個限制,如果/etc/hosts文件有IPv6地址,則無法啟動,因此需要注釋掉
          [root@oneproxy oneproxy]# vim /etc/hosts

    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

    9)通過mysql client連接OneProxy
        mysql -u test -h 10.0.0.9 -P3307 -p
    注:-h 后加上IP(最好不要是 localhost或者127.0.0.1,這種寫法可能導致其使用unix socket連接而無法連接上)
 
應用場景與配置范例
     下面給出在以下幾種場景下,如何正確的配置OneProxy
      1. 垂直分庫
     以圖. E為例,
 
                                                                      圖. E
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-master-addresses.2 = 10.0.0.12:3306@B

proxy-slave-addresses.2 = 10.0.0.13:3306@B

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test

proxy-part-template = conf/template.txt
proxy-part-tables.1 = conf/part.txt
proxy-part-tables.2 = conf/part2.txt
proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:master-only

proxy-group-policy.2 = B:master-only

proxy-table-map.1=X:B

proxy-table-map.2=Y:A

proxy-table-map.3=Z:A

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

 

#####################################
注:具體參數含義參考附錄
 
      2. 水平分表
     以圖. F為例
                                                                          圖. F
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-master-addresses.2 = 10.0.0.12:3306@B

proxy-slave-addresses.2 = 10.0.0.13:3306@B

proxy-master-addresses.3 = 10.0.0.14:3306@C

proxy-slave-addresses.4 = 10.0.0.15:3306@C

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test

proxy-part-tables.1 = conf/part.txt

proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:master-only

proxy-group-policy.2 = B:master-only

proxy-group-policy.3 = C:master-only

proxy-table-map.2=Y:A

proxy-table-map.3=Z:A

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

#####################################
 
OneProxy分庫分表配置文件conf/part.txt
####################################

[

  {
    "table" : "X",
    "pkey" : "id",
    "type" : "char",
    "method" : "crc32",
    "partitions" :     

      [
        { "suffix" : "_00", "group": "B" },
        { "suffix" : "_01", "group": "B" },
        { "suffix" : "_02", "group": "C" },
        { "suffix" : "_03", "group": "C"}
      ]


  }

]

####################################
 
 
注:具體參數含義參考附錄
 
     3. Proxy集群
 
      4. 讀高可用
     該方案是為了解決重要配置庫的單點問題。在master不可用時,OneProxy會自動讀取slave。
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test


proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:read_failover

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

#####################################
注:10.0.0.10為只讀主庫,10.0.0.11為只讀叢庫
 
      5. 讀寫分離(master不參與讀)
     讀寫分離能有效的解決應用讀負載較重且能忍受一定延遲的場景。此種模式下,讀負載只能由slave承擔,寫與事務負載只能由master承擔。
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test

proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:read_slave

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

#####################################
 
注:10.0.0.10為主庫,10.0.0.11為叢庫
 
      6. 讀寫分離(master參與讀)
     這是另一種讀寫分離模式,所有類型的負載(讀、寫、事務)都有可能由master承擔。
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test


proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:read_balance

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

#####################################
 
注:10.0.0.10為主庫,10.0.0.11為叢庫
 
      7. 寫高可用
     這是專門針對XtraDB Cluster集群設計的一種模式。這種模式,只允許將一個節點作為寫,而所有節點平均的承擔所有的讀負載。如圖G所示。
 
                                                                      圖. G
以圖. G為例,若Node 1節點不可用,則任意選擇另一台機器作為新的節點。如下圖所示。
                                                                      圖. H
     OneProxy在切換時,沒有考慮數據的一致性,需要XtraDB Cluster本身來保證。其它類型的集群慎用。
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-master-addresses.2 = 10.0.0.11:3306@A
proxy-master-addresses.3 = 10.0.0.12:3306@A

 

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test


proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:write_other

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

#####################################
 
注:目前寫入節點是由OneProxy自動選擇的,無法手動指定。
 
      8. 讀寫隨機
     這是專門針對XtraDB Cluster集群設計的一種模式。這種模式,所有的節點都平均的承擔讀寫負載。
OneProxy的配置文件conf/proxy.conf:
###############################

[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck

mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-master-addresses.2 = 10.0.0.11:3306@A
proxy-master-addresses.3 = 10.0.0.12:3306@A

 

proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test


proxy-charset = gbk_chinese_ci
proxy-group-policy.1       = A:write_balance

proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default

#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0

 

#####################################
 

FAQ

1、口令加密

  此時可以啟動oneproxy

  cd /usr/local/oneproxy

      sh ./demo.sh

  進入管理端口,然后鍵入passwd <string>。

mysql -uadmin -pOneProxy -P4041 --protocol=TCP

passwd test

  輸出為:

   1378F6CC3A8E8A43CA388193FBED5405982FBBD3

 
 
OneProxy管理
  介紹  
    OneProxy提供了目前兩種管理功能。
第一,提供了查看配置信息(例如后端 DB情況等)與系統的動態變化信息(例如OneProxy與后端數據庫建立的連接變化等)。
第二,提供了更改配置的功能。例如控制后端DB的上線或者下線。
   
   登錄 
  OneProxy的默認管理端口是4041,用戶名為admin,密碼為OneProxy,可以使用如下命令登錄:
mysql -u admin -h 10.128.130.237 -P4041 -pOneProxy
  
   使用方法
  輸入list help查看管理接口提供的命令
命令 描述 例子
LIST HELP 列出所有命令 list help
LIST BACKEND 列出所有后端數據庫 list backend
LIST GROUP 列出所有的server group,具體含義請參考重要概念 list group
LIST POOL 列出OneProxy與每個后端數據庫建立的連接池大小與連接池配置 list pool
LIST QUEUE 列出每個隊列里到達的請求數量與已處理完成的請求 list queue
LIST THREADS 列出每個線程處理過的請求數 list threads
LIST TABLEMAP 列出table與server group的對應關系 list tablemap
LIST USERS  列出用戶 list users
LIST SQLSTATS  列出執行過的SQL統計 list sqlstats [hash]
LIST SQLTEXT 列出執行過的SQL與hashcode的對應關系 list sqltext [hash]
SET  MASTER 指定某后端DB為寫庫 set master '192.168.1.119:3306'
SET  SLAVE 指定某后端DB為讀庫 set slave '192.168.1.119:3306'
SET  OFFLINE 下線指定的后端數據庫 set offline '192.168.1.119:3306'
SET  ONLINE 上線指定的后端數據庫 set online '192.168.1.119:3306'
SET  GPOLICY 指定server group的策略。

預定義策略,0 代表由 Lua Script 來決定,默認為 Master Only;

1 代表 Read Failover;

2 代表Read/Write Split(Master 節點不參與讀操作);

3 代表雙 Master 結構,或者是 XtraDB Cluster結構,即多主對等的方式;

4 代表 Read/WriteSplit(Master 節點共同參與讀操作);

5 代表讀寫隨機。

set gpolicy default 1
SET  GMASTER 針對XtraDB Cluster,指定某個編號的數據庫為寫庫 set gmaster default 1
SET  GACCESS

指定server group允許的sql類型。0:無任何限制,缺省值;

1:禁止 DDL 操作;
2:禁止不帶 Where 條件的 Select、 Update 或 Delete。

set gaccess default 1
SET  POOLMIN 設置OneProxy與后端數據庫連接池的最少連接數 set poolmin '192.168.1.119:3306' 5
SET  POOLMAX

設置OneProxy與后端數據庫連接池的最大連接數,

實際的連接數可以超過這個數值,

set poolmax '192.168.1.119:3306' 300 
SET  SQLSTATS 打開、關閉或者清空SQL統計 set sqlstats {on|off|clear}
MAP 把某個表歸屬給某個server group map my_test1_0 default
UNMAP 刪除表與server group的映射關系 unmap my_test1_0
SUSPEND 讓event process停止指定秒數 suspend 10
SHUTDOWN 關閉proxy shutdown force
   
警告:在使用紅色標記的命令前,需要了解命令對系統的含義,否則可能導致數據不一致或者系統不可用
 
附錄
   參數列表

參數名

含義

proxy-address

Proxy Server自身監聽地址

proxy-master-addresses

Master節點地址(可寫入節點)

proxy-slave-addresses

Slave節點地址(可讀取節點)

proxy-user-list

Proxy用戶列表(用戶名:口令)

proxy-table-map

為某張表指定“Server Group”

proxy-sql-review

為某張表指定Where條件中必須的列

proxy-database

Proxy對應的后端數據庫,默認: test

proxy-charset

Proxy字符集,默認:utf8_general_ci

proxy-lua-script

Proxy功能腳本(非常重要)

proxy-group-policy

預定義策略,0代表由Lua Script來決定,默認為Master Only;1代表Read Failover;2代表Read/Write Split(Master節點不參與讀操作);3代表雙Master結構,或者是XtraDB Cluster結構,即多主對等的方式;4代表Read/Write Split(Master節點共同參與讀操作);5代表讀寫隨機。

proxy-security-level

安全級別,0默認值,1禁止DDL,2禁止不帶條件的查詢語句,3只允許SELECT。

proxy-group-security

為特定Server Group設置安全級別。

安全級別,0默認值,1禁止DDL,2禁止不帶條件的查詢語句,3只允許SELECT。

event-threads

並發線程數,最大允許48個線程。

  解釋

A)  --proxy-master-addresses

重命名了MySQL Proxy里的參數(proxy-backend-addresses),覺得這個名字更容易記,所有允許寫操作的Master節點。格式如下:

格式:ip:port@groupname

其中“groupname”指的是“Server Group”的名字,如果不指定,則默認為“default”。

 

B)  --proxy-slave-addresses

重命名了MySQL Proxy里的參數(proxy-read-only-backend-addresses),覺得這個名字更容易記,所有允許只讀操作的Slave節點。格式如下:

格式:ip:port@groupname

其中“groupname”指的是“Server Group”的名字,如果不指定,則默認為“default”。

  

C)  --proxy-user-list

OneProxy止前接管了客戶端的登錄驗證,即客戶端在登錄驗證時不再需要和后端的MySQL數據庫通信了,這就要求OneProxy必須有一個完整的用戶列表,用來驗證客戶端登錄,可以通過這個參數來指定允許訪問的用戶名和口令列表,所有后端的數據庫都必須存在同樣用戶名和口令的登錄賬號。

可以用“bin/mysqlhash”來生成加密后的口令,例如: 

[root@ANYSQLSRV1 oneproxy]# bin/mysqlhash test

A94A8FE5CCB19BA61C4C0873D391E987982FBBD3

然后在命令行參數里指定這個用戶名和口令:

--proxy-user-list=test:A94A8FE5CCB19BA61C4C0873D391E987982FBBD3

如果有多個用戶需要指定,多次指定此選項即可。也可以指定用戶連接后端MySQL時的默認數據庫,如果不指定,則連接到“proxy-database”指定的默認數據庫。指定的格式如下:

--proxy-user-list=username:password@default_db

要求OneProxy后端所有的數據庫都有同名用戶、同名的數據庫,及相應的訪問權限,在OneProxy端並不支持改變一個會話的默認后端數據庫,即傳統的“USE”命令在OneProxy里有其他的含義。

 

D)  --proxy-database

OneProxy基於現有連接池機制的考慮,並不支持切換數據庫的功能,通過OneProxy連接的會話,只能對應到此參數指定的數據庫里,“use”命令在OneProxy中也是被禁用的,原因是現有的代碼里每一次獲得連接池中的連接后,都會多發一個“use”命令,在高並發環境中會影響性能(后續版本將會對此作出改進),這是在使用OneProxy時需要注意的地方。

此選項默認值是“test”,這個庫在默認安裝時都會創建好的。

 

E)  --proxy-charset

通過OneProxy來管理多個數據庫時,要求所有的數據庫字符集是一致的,同樣是基於現有連接池機制的考慮,可以選的值在README文件里有,默認值是“utf8_general_ci”,為了防止連接池中不同的連接出現不同的設置,“set”命令在OneProxy里也是不生效的。

 

F)     --proxy-group-policy

使用OneProxy時可以透時地對下層的數據架構做改造,可以通過Lua腳本來實現的,出於對性能及便捷性(許多人不是很懂Lua)的考慮,將簡單的Failover及讀寫分離的方案固化到OneProxy里,使用C語言來實現,即不需要寫任何Lua代碼也可以透明地使用Failover和讀寫分離方案了。指定格式:

--proxy-group-policy=<servergroup>:<policy_value>

對於復雜的分庫分表,則還需要編寫Lua腳本來實現,在“lua”子目錄下有一個示例腳本“oneproxy.lua”就是用來做分庫分表的。其中“servergroup”表示針對哪個“Server Group”進行設置。 

此選項可以設置的“policy_value”值有:

0

默認值,什么也不做,依賴於Lua腳本來實現。

1

Read Failover功能,對於讀操作,首先從Master讀取,如果Master不可用,則從Slave端讀取。

2

Read/Write Split功能,對於讀操作,首先從Slave讀取,如果Slave端不可用,則從Master端讀取。除非所有的Slave都不可用,否則Master不參與讀操作。

3

針對XtraDB Cluster群集環境的Read/Write Split功能,從集群中固定地選擇一台作為寫入節點,其他的節點作為讀節點;如果選中的寫入節點不可用,則重新選一台作為寫入節點,其他可用的節點繼續提供讀,這個策略提供了寫入節點的自動漂移,在雙Master節點上也可以設置成這種策略。

4

Read/Write Split功能,對於讀操作,從Master和Slave中隨機選一台進行查詢操作,寫入操作則從在Master上進行。

5

隨機讀寫功能,對於讀操作,從Master和Slave中隨機選一台進行查詢操作,寫入操作則是隨機選一台Master進行操作。 

后續會繼續內置更多的策略進去,以及不斷優化已有的策略,為大家透明地做MySQL架構改造而努力。

 

G)  --proxy-security-level

安全級別,提升安全性,默認值為0,即沒有任何設置。設成1禁止通過OneProxy來做DDL操作;設置為2則必須要有Where條件;設置為3只允許只讀的操作。

 

H)  --proxy-group-security

可針對某一個“Server Group”來指定安全級別,指定格式:

--proxy-group-policy=<servergroup>:<policy_value>

安全級別,提升安全性,默認值為0,即沒有任何設置。設成1禁止通過OneProxy來做DDL操作;設置為2則必須要有Where條件;設置為3只允許只讀的操作。

 

I)  --event-threads

這個參數本身的意義沒有變化,但內部的實現經過大幅優化,使得單個OneProxy實例可以支持20萬以上的QPS轉發。在已知的數據庫Proxy中,OneProxy的轉發能力一直是第一,此選項允許設置的最大值是48。

數十萬的轉發能力表示由OneProxy本身引起的時延增加基本可以忽略,這一點是OneProxy相對於MySQL Proxy而言的一個重大進步,解決了MySQL Proxy的並發處理能力。

通常這個值可以設為CPU Core數量的兩倍,用8C或16C配備萬兆網卡的機器來跑OneProxy可以達到最好的效果。

     

 

 
 
如需技術支持,請添加微信號:onesoft007    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM