Mysql中介軟體 oneProxy的使用總結

天府雲創發表於2018-03-15

介紹

OneProxy是由原支付寶首席架構師樓方鑫開發,目前由樓方鑫創立的杭州平民軟體公司(@平民架構)提供技術支援。它保留了 MySQL-Proxy 0.8.4官方版本上其協議處理和軟體框架,然後對軟體做了大量優化,極大增強了系統的併發能力。目前已有多家公司在生成環境中使用,其中包括了支付、電 商等行業。



     OneProxy的主要功能有:

1. 垂直分庫

2. 水平分表

3. Proxy叢集【暫無文件】

4. 讀高可用

5. 讀寫分離(master不參與讀)

6. 讀寫分離(master參與讀)

7. 寫高可用

8. 讀寫隨機

9. SQL檢查

10. SQL統計【暫無文件】

11. 任務佇列監控【暫無文件】

12. 連線池管理【暫無文件】


重要概念
     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 groupmap my_test1_0 default
UNMAP刪除表與server group的對映關係unmap my_test1_0
SUSPEND讓event process停止指定秒數suspend 10
SHUTDOWN關閉proxyshutdown 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可以達到最好的效果。

【參考資料】

1、OneProxy簡明使用手冊 - CSDN部落格 http://blog.csdn.net/h331895809/article/details/53282882

2、Mysql 中介軟體 oneProxy總結 - CSDN部落格 http://blog.csdn.net/wjc19911118/article/details/51375196

3、使用OneProxy部署MySQL資料庫的讀寫分離_資料庫技術_https://www.linuxidc.com/Linux/2015-08/121177.htm


相關文章