ShardingSphere-Proxy分库分表以及多租户安装使用
需求:你提供SAAS服務(wù),你有你有2個(gè)租戶(商戶),各自的數(shù)據(jù)進(jìn)各自的庫(kù),而你不希望你的微服務(wù)java里默認(rèn)配置多個(gè)租戶數(shù)據(jù)源,數(shù)據(jù)連接池太多,而且后面動(dòng)態(tài)增加也不方便,諸如此類(lèi)很多問(wèn)題。
方案:ShardingSphere-Proxy基于數(shù)據(jù)庫(kù)表有一個(gè)租戶字段
1.ShardingSphere-Proxy家族產(chǎn)品簡(jiǎn)介
ShardingSphere-Proxy和ShardingSphere-JDBC都是ShardingSphere的不同產(chǎn)品。
ShardingSphere-JDBC是客戶端分庫(kù)分表,而ShardingSphere-Proxy是一個(gè)中間層,客戶端代碼無(wú)需配置修改,定位為透明化的數(shù)據(jù)庫(kù)代理端,提供封裝了數(shù)據(jù)庫(kù)二進(jìn)制協(xié)議的服務(wù)端版本,用于完成對(duì)異構(gòu)語(yǔ)言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的數(shù)據(jù)庫(kù))版本,它可以使用任何兼容 MySQL/PostgreSQL 協(xié)議的訪問(wèn)客戶端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作數(shù)據(jù),對(duì) DBA 更加友好。
- 向應(yīng)用程序完全透明,可直接當(dāng)做 MySQL/PostgreSQL 使用。
 - 適用于任何兼容 MySQL/PostgreSQL 協(xié)議的的客戶端。
 
2.分庫(kù)分表和多租戶
分庫(kù)分表一般使用的是hash取模的方式,很多類(lèi)似產(chǎn)品都是這樣實(shí)現(xiàn)的。
ShardingSphere有一個(gè)特別的亮點(diǎn)是基于表中某一個(gè)字段進(jìn)行分庫(kù)分表。
我們可以利用這個(gè)實(shí)現(xiàn)多租戶。
至于ShardingSphere-Proxy和ShardingSphere-JDBC配置使用是一樣的,只是一個(gè)客戶端一個(gè)中間層而已。
3.系統(tǒng)環(huán)境依賴
很多參考信息包括官方網(wǎng)站都不是很友好,導(dǎo)致安裝使用過(guò)程中遇到太多問(wèn)題需要解決,那么我這里就把完整的教程和注意事項(xiàng)寫(xiě)下來(lái),照著做就行了。
環(huán)境:CentOS7.8
ShardingSphere-Proxy官方網(wǎng)站:ShardingSphere
安裝java
ShardingSphere-Proxy需要基于java,如果已經(jīng)安裝可以忽略。
另外本機(jī)內(nèi)存需要注意需要4G內(nèi)存以上,不然Java啟動(dòng)會(huì)報(bào)錯(cuò)內(nèi)存不足。
我們這邊假設(shè)是從阿里云進(jìn)行購(gòu)買(mǎi)ECS,自己安裝。
#cd /usr/local
解壓jdk,1.8以上版本皆可
 #tar -zxvf jdk-8u221-linux-x64.tar.gz
將jdk配置到/etc/profile
 #vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH} 
通過(guò)命令source /etc/profile讓profile文件立即生效
 #source /etc/profile
查看是否安裝好
#java -version
只是source /etc/profile如果還報(bào)錯(cuò)nohup: failed to run command ‘java’: No such file or directory
需要重啟才可以生效
#reboot
 ?
4.下載安裝ShardingSphere-Proxy
下載 :: ShardingSphere
下載地址:Apache Downloads
#cd /usr/local
 #wget https://dlcdn.apache.org/shardingsphere/5.0.0/apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz
 #tar -xzvf apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz
解壓好之后目錄結(jié)構(gòu)如下:
conf是配置目錄,bin是啟動(dòng)目錄,lib是庫(kù)目錄。
如果使用mysql需要把mysql對(duì)應(yīng)的jar拷貝到這里。
#cd ./lib
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar?
5.下載安裝配置ShardingSphere-Proxy
回到conf目錄
修改2個(gè)文件其他文件暫時(shí)不用動(dòng)
server.xml和config-sharding.yaml
需要注意的是ShardingSphere-Proxy其他版本例如4.0的配置和5.0有些許差異,特別是其他博文是4.0的例子,不能直接拿來(lái)就用,會(huì)啟動(dòng)報(bào)錯(cuò)。
5.0的配置默認(rèn)都給你注釋了,你就用官方給你的就行。
server.xml
rules:- !AUTHORITYusers:- root@%:root- sharding@:shardingprovider:type: ALL_PRIVILEGES_PERMITTED- !TRANSACTIONdefaultType: XAproviderType: Atomikosprops:max.connections.size.per.query: 1acceptor.size: 16  # The default value is available processors count * 2.executor.size: 16  # Infinite by default.proxy.frontend.flush.threshold: 128  # The default value is 128.# LOCAL: Proxy will run with LOCAL transaction.# XA: Proxy will run with XA transaction.# BASE: Proxy will run with B.A.S.E transaction.proxy.transaction.type: LOCALproxy.opentracing.enabled: falseproxy.hint.enabled: falsequery.with.cipher.column: true# 這個(gè)屬性會(huì)打印sql 語(yǔ)句sql.show: true
# 該屬性會(huì)允許范圍查詢,默認(rèn)為 false ,要是我們分庫(kù)分表是水平切分,可以想得到范圍查詢會(huì)像廣播去查每一個(gè)表,比較耗性能能。allow.range.query.with.inline.sharding: true 
例如你有2個(gè)完全一樣的庫(kù),你有2個(gè)商戶,各自的數(shù)據(jù)進(jìn)各自的庫(kù)。
schemaName: sharding_dbdataSources:his95001:url: jdbc:mysql://localhost:3306/order1001?useUnicode=true&characterEncoding=utf8username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1his95002:url: jdbc:mysql://localhost:3306/order1002?useUnicode=true&characterEncoding=utf8username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1rules:
- !SHARDINGtables:tb_order:actualDataNodes: order1001.tb_order,order1002.tb_ordertb_content:actualDataNodes: order1001.tb_content,order1002.tb_contentdefaultDatabaseStrategy:standard:shardingColumn: tenantidshardingAlgorithmName: database_inlineshardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: order${tenantid} 
需要注意的是數(shù)據(jù)庫(kù)名是? 前綴+租戶id? 不可以有下劃線橫線之類(lèi),記得之前的4.0版本會(huì)出錯(cuò),還有數(shù)據(jù)庫(kù)密碼不能保護(hù)#,其他特殊字符我沒(méi)注意,如果報(bào)錯(cuò)數(shù)據(jù)庫(kù)連不上也是這些問(wèn)題。
啟動(dòng)文件在bin目錄
默認(rèn)是啟動(dòng)3307端口,你可以修改為你需要的端口日志位置,如果JVM需要調(diào)休可以修改對(duì)應(yīng)配置。
?#./bin/start.sh
需要看日志,如果有異常,一開(kāi)始主要是配置異常那么你要適當(dāng)?shù)娜バ薷摹?/p>
#cat ./stdout.log
例如下面是缺少mysql-connector-java-5.1.49.jar?
?成功啟動(dòng)會(huì)提示:frontend.ShardingSphereProxy - ShardingSphere-Proxy start success
6.使用ShardingSphere-Proxy
啟動(dòng)好之后可以使用navicat.exe測(cè)試連接。
我們可以看到現(xiàn)在我們鏈家我們搭建的ShardingSphere-Proxy的服務(wù)器所在的ip+3007端口可以看到代理的數(shù)據(jù)庫(kù)了。
如果你點(diǎn)開(kāi)其中一個(gè)表可以看到數(shù)據(jù)是聚合的。
實(shí)際上你的SQL需要帶對(duì)應(yīng)的租戶id就路由到對(duì)應(yīng)的數(shù)據(jù)庫(kù)了。
7.安裝Zookeeper
https://linuxstyle.blog.csdn.net/article/details/122367289
修改server.yaml? 去掉注釋就行了
#mode:
#  type: Cluster
#  repository:
#    type: ZooKeeper
#    props:
#      namespace: governance_ds
#      server-lists: localhost:2181
#      retryIntervalMilliseconds: 500
#      timeToLiveSeconds: 60
#      maxRetries: 3
#      operationTimeoutMilliseconds: 500
#  overwrite: true 
 
8.最佳實(shí)踐
sharding-jdbc分表查詢優(yōu)化:maxConnectionsSizePerQuery
sharding-jdbc配置maxConnectionsSizePerQuery當(dāng)存在分表,且查詢語(yǔ)句不包含分表鍵時(shí),每個(gè)查詢都需要分解成不同的分表sql查詢數(shù)據(jù)庫(kù),能夠同時(shí)執(zhí)行的sql數(shù)量由此參數(shù)設(shè)置;
這個(gè)數(shù)據(jù)最好=你的分表數(shù)量
sharding-jdbc分表查詢優(yōu)化:maxConnectionsSizePerQuery_臨地的博客-CSDN博客_max.connections.size.per.query
總結(jié)
以上是生活随笔為你收集整理的ShardingSphere-Proxy分库分表以及多租户安装使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 油麦菜可以煲猪脚粥吗
 - 下一篇: android 图片水印处理 文字倾斜处