Mysql中介軟體 oneProxy的使用總結
介紹
OneProxy是由原支付寶首席架構師樓方鑫開發,目前由樓方鑫創立的杭州平民軟體公司(@平民架構)提供技術支援。它保留了 MySQL-Proxy 0.8.4官方版本上其協議處理和軟體框架,然後對軟體做了大量優化,極大增強了系統的併發能力。目前已有多家公司在生成環境中使用,其中包括了支付、電 商等行業。
OneProxy的主要功能有:
1. 垂直分庫
2. 水平分表
3. Proxy叢集【暫無文件】
4. 讀高可用
5. 讀寫分離(master不參與讀)
6. 讀寫分離(master參與讀)
7. 寫高可用
8. 讀寫隨機
9. SQL檢查
10. SQL統計【暫無文件】
11. 任務佇列監控【暫無文件】
12. 連線池管理【暫無文件】
#/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可以達到最好的效果。
【參考資料】
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
相關文章
- MySQL中介軟體總結MySql
- 常用的MySQL中介軟體網址彙總MySql
- MySQL中介軟體MySql
- 中介軟體漏洞攻防學習總結
- Web中介軟體常見漏洞總結Web
- MySQL中介軟體--ProxySQLMySql
- 中介軟體redis的使用Redis
- MySQL中介軟體之ProxySQLMySql
- gin使用中介軟體
- 業務中介軟體設計方法論經驗總結
- Express 文件(使用中介軟體)Express
- Django 2.1.3 中介軟體使用Django
- KingShard MySQL中介軟體快速入門MySql
- RocketMQ訊息中介軟體詳解(萬字圖文總結)MQ
- 訊息中介軟體之RabbitMQ關鍵知識點總結MQ
- Express的使用筆記3 中介軟體Express筆記
- MySQL cetus 中介軟體 讀寫分離MySql
- Redis中介軟體與Web中介軟體RedisWeb
- 中介軟體之訊息中介軟體-pulsar
- Django-中介軟體的介紹及使用Django
- MySQL中介軟體之ProxySQL(14):ProxySQL+PXCMySql
- 使用 defineNuxtRouteMiddleware 建立路由中介軟體UX路由
- gin使用BasicAuth()(驗證)中介軟體
- 訊息中介軟體 — 使用場景
- go的web框架gin的使用(八):中介軟體GoWeb框架
- 軟體工程總結軟體工程
- MySQL中介軟體之ProxySQL(7):詳述ProxySQL的路由規MySql路由
- 使用SAP CRM中介軟體從ERP下載具有層級結構的equipmentUI
- lumen的CORS中介軟體CORS
- Mycat中介軟體實現Mysql資料分片(上篇)MySql
- Mycat中介軟體實現Mysql資料分片( 下篇)MySql
- 開源 | MySQL資料傳輸中介軟體—DTLEMySql
- 中介軟體漏洞
- 中介軟體-NginxNginx
- ThinkPHP 中介軟體PHP
- django中介軟體Django
- golang 中介軟體Golang
- 中介軟體整理