介紹




#/bin/bash
#
export ONEPROXY_HOME=/usr/local/oneproxy/
# valgrind --leak-check=full \
${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

[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

[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
[
{
"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"}
]
}
]
[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
[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
[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


[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]
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提供了目前兩種管理功能。
第一,提供了查看配置信息(例如后端 DB情況等)與系統的動態變化信息(例如OneProxy與后端數據庫建立的連接變化等)。
命令 | 描述 | 例子 |
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 操作; |
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可以達到最好的效果。