YashanDB数据库主备高可用架构通常 (崖山海战)
YashanDB数据库是片面自主设计研发,允许集中式、散布式和共享存储部署架构以及混合负载场景的超融合数据库。本文简明引见了YashanDB的特性和部署架构,并部署1主1备的测试环境,验证数据库访问操作、主备切换高可用环节,以了解。
1、YashanDB基本引见
崖山数据库系统YashanDB是一种新型的数据库治理系统,由深圳计算迷信钻研院自主设计研发。它在经典数据库通常的基础上,融入了原创的有界计算通常、近似计算通常、并行可裁减通常和跨模融算计算通常。YashanDB在部署形式上允许单机/主备、共享集群、散布式等多种部署形式,笼罩OLTP/HTAP/OLAP买卖和剖析混合负载场景,允许大规模并发事务处置和混合事务-剖析处置、在线实时剖析、海量数据查问减速以及异构数据融合处置场景。
1.1YashanDB数据库外围特性
YashanDB数据库是片面自研的国产数据库,满足实时性和高并发下的性能和稳固性要求,同时具有干流的信创变革生态,合乎运行迁徙的规范。关键有以下特性:
1.2YashanDB数据库部署架构
YashanDB在部署架构上分为单实例的主备部署、散布式部署以及共享集群的部署形式,部署架构如下图所示:
三种部署形式区分实用于不同的场景,各自特性如下:
1.3YashanDB数据库内核架构
YashanDB数据库的内存架构如图,关键包括以下局部:
关于散布式架构,还有MDS元数据治理、CMS散布式集群治理和GTS散布式全局期间治理等线程;关于共享存储架构,还有共享集群间的同步信息处置、GRC全局资源访问控制、GLS全局锁服务和GCS全局缓存服务等专有线程。
2、YashanDB主备部署通常
2.1环境预备
2.1.1主备集群主机信息
1)YashanDB数据库1主1备部署主机信息如下:
操作系统 |
内存 |
YashanDB版本 |
角色 |
|
192.168.112.121 |
_7.4_x86_64 |
1核 |
23.1.1.100 |
主节点 |
192.168.112.122 |
Centos_7.4_x86_64 |
1核 |
23.1.1.100 |
备节点 |
2)装置自动端口
3)封锁防火墙
##封锁防火墙#systemctlstopfirewalld##封锁开机自启#systemctldisablefirewalld##审核防火墙形态#systemctlstatusfirewalld●firewalld.service-firewalld-dynamicfirewalldaemonLoaded:loaded(/usr/lib/systemd/system/firewalld.service;disabled;vendorpreset:enabled)Active:inactive(dead)Docs:man:firewalld(1)
4)开启SSH服务
##审核ssh服务#systemctlstartsshd.service##审核ssh服务#systemctlstatussshd.service●sshd.service-OpenSSHserverdaemonLoaded:loaded(/usr/lib/systemd/system/sshd.service;enabled;vendorpreset:enabled)Active:active(running)sinceThu2023-11-2309:13:12CST;1h38minagoDocs:man:sshd(8)man:sshd_config(5)
2.1.2创立用户yashan并参与sudoer中
##1、创立用户#useradd-d/home/yashan-myashan#passwdyashan##2、性能sudoers#chmod+w/etc/sudoers#在/etc/sudoers参与内容yashanALL=(ALL)NOPASSWD:ALL#chmod-w/etc/sudoers##3、检查用户#idyashanuid=1002(yashan)gid=1002(yashan)groups=1002(yashan)
2.1.3装置目录布局
一切装置YashanDB的实例节点上必定布局的两个目录:
2.2主备节点装置
2.2.1装置包和性能文件
1)解压装置包
#tar-xzvfyashandb-personal-23.1.1.100--x86_64.tar.gz-C/usr/local/yashandb/install
2)在主备节点创立装置目录
#mkdir/usr/local/yashandb
3)口头yasbootpackage命令生成性能文件
#cd/usr/local/yashandb/install#./bin/yasbootpackagesegen--clusteryashandb-uyashan-pxxxx--ip192.168.112.121,192.168.112.122--port22--install-path/usr/local/yashandb/yasdb_home--data-path/usr/local/yashandb/yasdb_data--begin-port1688--node2192.168.112.121ip:192.168.112.121cpucoresislessthan2ip:192.168.112.121memroyislessthan4096MB192.168.112.122ip:192.168.112.122cpucoresislessthan2ip:192.168.112.122memroyislessthan4096MBhostid|group|node_type|node_name|listen_addr|replication_addr|>cluster="yashandb"create_simple_schema=falseuuid="655eb2496767a825e8dda1d6c4da4d4e"yas_type="SE"[[group]]group_type="db"name="dbg1"[group.config]CHARACTER_SET="utf8"ISARCHIVELOG=trueREDO_FILE_NUM=4REDO_FILE_SIZE="128M"[group.create_sql][[group.node]]>#./bin/yasbootpackageinstall-thosts.toml-i/usr/local/src/yashandb-personal-23.1.1.100-linux-x86_64.tar.gz-fcheckinginstallpackage...installversion:yashandb23.1.1.100host0001100%[====================================================================]6shost0002100%[====================================================================]6supdatehosttoyasom...
注:指定参数-f不强迫校验环境能否满足部署条件,否则会揭示:
192.168.112.121ip:192.168.112.121cpucoresislessthan2ip:192.168.112.121memroyislessthan4096MB
2.2.3数据库部署
1)口头部署命令
$./bin/yasbootclusterdeploy-tyashandb.tomltype|uuid|name|hostid|index|status|return_code|progress|cost------------------------------------------------------------------------------------------------------------task|3190567c61c193bc|DeployYasdbCluster|-|yashandb|SUCCESS|0|100|59------+------------------+--------------------+--------+----------+---------+-------------+----------+------taskcompleted,status:SUCCESS
2)失效环境变量
#部署命令成功口头后将会在$YASDB_HOME目录下的conf文件夹中生成<<集群称号>>.bashrc环境变量文件$cd/usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/conf#如~/.bashrc中已存在YashanDB相关的环境变量,将其肃清$catyashandb.bashrc>>~/.bashrc$source~/.bashrc
3)开机后启动命令
yashootprocessyasomstart-cyashandbyasbootprocessyasagentstart-cyashandbyasbootclusterstart-cyashandb
2.2.4修正sys用户口令
经过yasboot工具设置集群内一切节点sys用户的明码
#./bin/yasbootclusterpassset-nxxxx-cyashandbtype|uuid|name|hostid|index|status|return_code|progress|cost----------------------------------------------------------------------------------------------------------task|ce83dacc3c2e4246|YasdbPasswordSet|-|yashandb|SUCCESS|0|100|2------+------------------+------------------+--------+----------+---------+-------------+----------+------taskcompleted,status:SUCCESS
2.2.5验证装置
1)检查数据库形态
$./bin/yasbootclusterstatus-cyashandb-dhostid|node_type|nodeid|pid|instance_status|>$./bin/yasbootsql-dsys@192.168.112.121:1688YashanDBSQLPersonalEditionRelease23.1.1.100x86_64pleaseinputpassword:xxxxConnectedto:YashanDBServerPersonalEditionRelease23.1.1.100x86_64-X8664bitLinuxSQL>SELECTSTATUSFROMV$INSTANCE;SELECTSTATUSFROMV$INSTANCE;STATUS-------------OPEN1rowfetched.SQL>SELECT>SQL>createuseryasuser01identifiedby"YashanDB01";createuseryasuser01identifiedby"YashanDB01";Succeed.SQL>grantDBAtoyasuser01;grantDBAtoyasuser01;
2)切换用户登录
#./bin/yasbootsql-dyasuser01@192.168.112.121:1688Connectedto:YashanDBServerPersonalEditionRelease23.1.1.100x86_64-X8664bitLinuxSQL>SELECT>SQL>createtablespacets01;createtablespacets01;#删除表空间SQL>droptablespacets01;
删除表空间自动会保管文件,假设再创立相反的表空间称号时,会揭示文件曾经存在,但是在备节点观察时该文件曾经删除了。
YAS-02044file'/usr/local/yashandb/yasdb_data/db-1-1/dbfiles/TS010'alreadyexists
在删除表空间时指定删除文件datafiles
SQL>droptablespacets02includingcontentsand>##1、创立表tb01,表空间为TS01createtableifnotexiststb01(idintNOTNULL,c1intNOTNULLDEFAULT'0',c2char(120)NOTNULLDEFAULT'',c3char(60)NOTNULLDEFAULT'')TABLESPACETS01;##检查创立的表SQL>SELECTTABLE_NAME,TABLE_TYPEFROMUSER_TABLES;TABLE_NAMETABLE_TYPE--------------------------------------------------------------------------TB01HEAP##2、创立索引SQL>createuniqueindexuniq_ix01ontb01(id);SQL>createindexix_c1ontb01(c1);##检查索引SQL>SELECT*FROMUSER_INDEXES;INDEX_NAMEINDEX_TYPETABLE_OWNERTABLE_NAMETABLE_TYPEUNIQUENESSCOMPRESSIONPREFIX_LENGTHTABLESPACE_NAMEINI_TRANSMAX_TRANSPCT_FREELOGGINGBLEVELLEAF_BLOCKSDISTINCT_KEYSAVG_LEAF_BLOCKS_PER_KEYAVG_DATA_BLOCKS_PER_KEYSTATUSNUM_ROWSSAMPLE_SIZELAST_ANALYZEDPARTITIONEDTEMPORARYGENERATEDVISIBILITY>mysql>SELECT*INTOOUTFILE'/tmp/sbtest.sbtest1.csv'->FIELDSTERMINATEDBY','->ENCLOSEDBY'"'->LINESTERMINATEDBY'n'->FROMsbtest1whereid<10000;QueryOK,9999rowsaffected(0.09sec)
2)经常使用yasldr工具将csv格局数据导入到表里
#./yasldryasuser01/xxxxbatch_size=4032LOAD/>登录到表中检查数据状况
SQL>selectcount(1)fromtb01;COUNT(1)---------------------99991rowfetched.
3)经常使用exp和imp导出和导入到新表
#1、经常使用exp命令将yasuser01用户下一切数据导出至export.yasuser01.data文件中[yashan@tango-DB01~]$expyasuser01/YashanDB01FILE=export.yasuser01.datOWNER=yasuser01YashanDBExportPersonalEditionRelease23.1.1.100x86_640e623bdexportterminatedsuccessfully[yashan@tango-DB01~]$lltotal1892-rw-r-----1yashanyashan1936736Nov2319:54export.yasuser01.dat#2、经常使用imp命令将导出数据导入到yasuser02中[yashan@tango-DB01~]$impyasuser02/YashanDB02FILE=export.yasuser01.datFROMUSER=yasuser01TOUSER=yasuser02YashanDBImportPersonalEditionRelease23.1.1.100x86_640e623bdimportterminatedsuccessfully##检查表数据状况SQL>SELECTtable_nameFROMUSER_TABLES;TABLE_NAME----------------------------------------------------------------TB011rowfetched.SQL>selectcount(1)fromtb01;COUNT(1)---------------------99991rowfetched.
3、系统高可用验证
3.1主备切换验证
3.1.1主节点缺点
在1主1备的部署架构下,不同于1主多备的Raft协定智能选举,主节点缺点经过yasom仲裁,自动是不开启的。
1)经常使用命令开启election
[yashan@tango-DB01~]$yasbootelectionenableon-cyashandbresult:Succeed
检查仲裁选举的参数性能
[yashan@tango-DB01~]$yasbootelectionconfigshow-cyashandbProtectionMode:MAXIMUMPROTECTIONMembers:[1-1:1]-Primary>$yasbootelectionenableoff-cyashandb$yasbootelectionconfigset-kFailoverThreshold-v2-cyashandb$yasbootelectionenableon-cyashandb$yasbootelectionconfigshow-cyashandb
2)审核主备集群的形态
[yashan@tango-DB01~]$yasbootclusterstatus-cyashandb-dhostid|node_type|nodeid|pid|instance_status|>[yashan@tango-DB01~]$ps-fu$USERUIDPIDPPIDCSTIMETTYTIMECMDyashan18741011:14?00:00:10/usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasom-cyashandb-l192.168.112.121:1675-dyashan19521011:16?00:01:17/usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasagent-cyashandb-l192.168.112.121:1676-dyashan950911716:23?00:01:47/usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasdbopen-D/usr/local/yashandb/yasdb_data/db-1-1[yashan@tango-DB01~]$kill-995091
检查yasom.log日志,能看到failover切换信息
2023-11-2516:47:38DEBUG[yasom]replication.go:188processreplicationevent:failover2023-11-2516:47:38INFO[yasom]task.go:24callyasagentapisuccess:NodeAPI.ExecSQL,getresult:{"connection":"DISCONNECTED","status":"NORMAL","time_since_last_msg":"2"}2023-11-2516:47:38ERROR[yasom]task.go:21callyasagentapifailed:NodeAPI.ExecSQL,err:YAS-00402failedtoconnectsocket,errno111,errormessage"Connectionrefused"2023-11-2516:47:38INFO[yasom]task.go:24callyasagentapisuccess:NodeAPI.ExecSQL,getresult:{"database_role":"STANDBY","status":"NORMAL","switchover_status":"NOTALLOWED"}2023-11-2516:47:38INFO[yasom]replication.go:231executefailoversqlcommandonnode1-2:2,nextresetidis12023-11-2516:47:40INFO[yasom]task.go:24callyasagentapisuccess:NodeAPI.ExecSQL,getresult:{}2023-11-2516:47:40INFO[yasom]replication.go:246failoversucceeds
4)检查主备形态,备节点曾经更新为主节点
[yashan@tango-DB02~]$yasbootclusterstatus-cyashandb-dhostid|node_type|nodeid|pid|instance_status|>[yashan@tango-DB02~]$yasbootclusterstatus-cyashandb-dhostid|node_type|nodeid|pid|instance_status|>SQL>SELECT>SQL>SELECTconnection,status,peer_addr,transport_lag,apply_lagFROMV$REPLICATION_STATUS;CONNECTIONSTATUSPEER_ADDRTRANSPORT_LAGAPPLY_LAG---------------------------------------------------------------------------------------------------------------------------CONNECTEDNORMAL192.168.112.121:168900
3)在备机口头switchover切换操作,此时主机的一切事务终止,且switchover口头环节中,客户端不可衔接主机。
SQL>alter>[yashan@tango-DB01~]$yasbootclusterstatus-cyashandb-dhostid|node_type|nodeid|pid|instance_status|>[yashan@tango-DB01~]$yasbootnodeswitchover-cyashandb-n1-1|key|value|-----------------------------------------------+------|clusterName|yashandb|thegrouptypeofinputnodeis|db|thegroupnameofinputnodeis|dbg1|theroleofinputnodeis|standby|theprimarynodenameofinputnode'sgroupis|1-2SwitchoverneedprimarynodeandselectednodeallareopenandnormalAreyousureyouwanttoswitchovernode1-1toprimary:[yashandb][yes/no]:yestype|uuid|name|hostid|index|status|return_code|progress|cost-------------------------------------------------------------------------------------------------------------task|839275bfbfccf242|SwitchoverYasdbCluster|-|dbg1|SUCCESS|0|100|2------+------------------+------------------------+--------+-------+---------+-------------+----------+------taskcompleted,status:SUCCESS
其中参数-n为要升主的节点ID(例如1-1,可以经过clusterstatus命令检查,不须要冒号及前面的数字)。审核主备节点形态,确认曾经出现了切换。
3.2表的闪回操作
YashanDB提供的闪回性能,当用户误操作等要素造成表的数据被删除,经常使用闪回性能可以检查过去的数据形态,并在期间上倒回指定期间点的数据,无需从备份中复原数据。注:该性能只对行存表(HEAP表)有效
3.2.1delete操作闪回
#1、删除表tb01数据SQL>deletefromtb01whereid<100;99rowsaffected.SQL>selectcount(1)fromtb01;COUNT(1)---------------------99001rowfetched.#2、开启rowmovementSQL>ALTERTABLEtb01ENABLEROWMOVEMENT;Succeed.#3、表数据闪回(经过期间戳闪回)SQL>FLASHBACKTABLEtb01TOTIMESTAMPTO_TIMESTAMP('2023/11/2320:18:00','yyyy/mm/ddhh24:mi:ss');FLASHBACKTABLEtb01TOTIMESTAMPTO_TIMESTAMP('2023/11/2320:18:00','yyyy/mm/ddhh24:mi:ss');Succeed.#4、检查数据前往反常SQL>selectcount(1)fromtb01;COUNT(1)---------------------99991rowfetched.
3.2.2drop表操作闪回
#1、开启了回收站ALTERSYSTEMSETRECYCLEBIN_ENABLED=ON;#2、删除表SQL>droptabletb01;#3、查问回收站能否存在TB01表SQL>SELECTobject_nameFROMDBA_RECYCLEBINWHEREoriginal_name='TB01';OBJECT_NAME----------------------------------------------------------------BIN$2260#4、表结构及表数据闪回SQL>FLASHBACKTABLE"BIN$2260"TOBEFOREDROP;#5、表和索引已复原SQL>SELECTtable_nameFROMUSER_TABLES;TABLE_NAME----------------------------------------------------------------TB01SQL>SELECTINDEX_NAMEFROMUSER_INDEXESWHERETABLE_NAME='TB01';INDEX_NAME----------------------------------------------------------------UNIQ_IX01IX_C1
3.2.3truncate表闪回
#1、开启了回收站ALTERSYSTEMSETRECYCLEBIN_ENABLED=ON;#2、TRUNCATE表操作SQL>truncatetabletb01;#3、查问回收站能否存在TB01表SQL>SELECTobject_nameFROMDBA_RECYCLEBINWHEREoriginal_name='TB01';OBJECT_NAME----------------------------------------------------------------TB01#4、表结构及表数据闪回SQL>FLASHBACKTABLE"TB01"TOBEFORETRUNCATE;#5、表数据已复原SQL>selectcount(1)fromtb01;COUNT(1)---------------------9999
4、总结
本文简明引见了YashanDB的特性以及部署架构,并测试部署了1主1备的环境启动性能性验证。总结上去有以下几点:
数据库架构选型与落地,看这篇就够了
随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的 磁盘 、 IO 、 系统开销 ,甚至 性能 上的瓶颈,而单台服务器的 资源终究是有限 的。
因此在面对业务扩张过程中,应用程序对数据库系统的 健壮性 , 安全性 , 扩展性 提出了更高的要求。
以下,我从数据库架构、选型与落地来让大家入门。
数据库会面临什么样的挑战呢?
业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。
为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。
将数据库的写操作和读操作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。
这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读操作的场景。
因为主从的数据是相同的,一旦主库宕机的时候,从库可以 切换为主库提供写入 ,所以这个架构也可以提高数据库系统的 安全性 和 可用性 ;
优点:
缺点:
在数据库遇到 IO瓶颈 过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由 热点业务 的 密集IO请求 影响了其他正常业务,所以垂直分库也叫 业务分库 。
优点:
缺点:
在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。
这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。
但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈(单个服务器的IO有上限)。
所以水平分表主要还是针对 数据量较大 ,整体业务 请求量较低 的场景。
优点:
缺点:
四、分库分表
在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。
所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。
分库分表能够有效地缓解单机和单库的 性能瓶颈和压力 ,突破IO、连接数、硬件资源等的瓶颈。
优点:
缺点:
注:分库还是分表核心关键是有没有IO瓶颈 。
分片方式都有什么呢?
RANGE(范围分片)
将业务表中的某个 关键字段排序 后,按照顺序从0到一个表,到一个表。最常见的就是 按照时间切分 (月表、年表)。
比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。
优点:
缺点:
HASH(哈希分片)
将订单作为主表,然后将其相关的业务表作为附表,取用户id然后 hash取模 ,分配到不同的数据表或者数据库上。
优点:
缺点:
讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此, 我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构 。
那么,我们应该如何选择数据库架构呢?
虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。
混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。
1、对事务支持
分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。
2、多库结果集合并 (group by,order by)
由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等操作,一般应对这种多库结果集合并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。
3、数据延迟
主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。
4、跨库join
分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。
5、分片扩容
水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。
6、ID生成
分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。
一、应用层依赖类(JDBC)
这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的 sharding-jdbc 、蘑菇街的TSharding等。
此类中间件的基本思路就是重新实现JDBC的API,通过重新实现 DataSource 、 PrepareStatement 等操作数据库的接口,让应用层在 基本 不改变业务代码的情况下透明地实现分库分表的能力。
中间件给上层应用提供熟悉的JDBC API,内部通过 sql解析 、 sql重写 、 sql路由 等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据 结果合并 处理成ResultSet返回给应用层。
优点
缺点
二、中间层代理类(Proxy)
这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个 代理层 ,上层应用以 标准的MySQL协议 来连接代理层,然后代理层负责 转发请求 到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。
所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然 支持所有的编程语言 。
在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是Http协议请求。
比较有代表性的产品有开创性质的Amoeba、阿里开源的Cobar、社区发展比较好的 Mycat (基于Cobar开发)等。
优点
缺点
JDBC方案 :无中心化架构,兼容市面上大多数关系型数据库,适用于开发高性能的轻量级 OLTP 应用(面向前台)。
Proxy方案 :提供静态入口以及异构语言的支持,适用于 OLAP 应用(面向后台)以及对分片数据库进行管理和运维的场景。
混合方案 :在大型复杂系统中存在面向C端用户的前台应用,也有面向企业分析的后台应用,这个时候就可以采用混合模式。
JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP 应用;Proxy 提供静态入口以及异构语言的支持,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC 、 Sharding-Proxy 和 Sharding-Sidecar (计划中)这3款相互独立的产品组成,他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
ShardingSphere提供的核心功能:
Sharding-Proxy
定位为透明化的 数据库代理端 ,提供封装了 数据库二进制协议的服务端版本 ,用于完成对 异构语言的支持 。
目前已提供MySQL版本,它可以使用 任何兼容MySQL协议的访问客户端 (如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。
向 应用程序完全透明 ,可直接当做MySQL使用。
适用于任何兼容MySQL协议的客户端。
Sharding-JDBC
定位为 轻量级Java框架 ,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为 增强版的JDBC驱动,完全兼容JDBC和各种ORM框架 。
以电商SaaS系统为例,前台应用采用Sharding-JDBC,根据业务场景的差异主要分为三种方案。
分库(用户)
问题解析:头部企业日活高并发高,单独分库避免干扰其他企业用户,用户数据的增长缓慢可以不分表。
拆分维度:企业ID分库
拆分策略:头部企业单独库、非头部企业一个库
分库分表(订单)
问题解析:订单数据增长速度较快,在分库之余需要分表。
拆分维度:企业ID分库、用户ID分表
拆分策略:头部企业单独库、非头部企业一个库,分库之后用户ID取模拆分表
单库分表(附件)
问题解析:附件数据特点是并发量不大,只需要解决数据增长问题,所以单库IO足以支撑的情况下分表即可。
拆分维度:用户ID分表
拆分策略:用户ID取模分表
问题一:分布式事务
分布式事务过于复杂也是分布式系统最难处理的问题,由于篇幅有限,后续会开篇专讲这一块内容。
问题二:分布式ID
问题三:跨片查询
举个例子,以用户id分片之后,需要根据企业id查询企业所有用户信息。
sharding针对跨片查询也是能够支持的,本质上sharding的跨片查询是采用同时查询多个分片的数据,然后聚合结果返回,这个方式对资源耗费比较大,特别是对数据库连接资源的消耗。
假设分4个数据库,8个表,则sharding会同时发出32个SQL去查询。一下子消耗掉了32个连接;
特别是针对单库分表的情况要注意,假设单库分64个表,则要消耗64个连接。如果我们部署了2个节点,这个时候两个节点同时查询的话,就会遇到数据库连接数上限问题(mysql默认100连接数)
问题四:分片扩容
随着数据增长,每个片区的数据也会达到瓶颈,这个时候需要将原有的分片数量进行增加。由于增加了片区,原先的hash规则也跟着变化,造成了需要将旧数据做迁移。
假设原先1个亿的数据,hash分64个表,现在增长到50亿的数据,需要扩容到128个表,一旦扩容就需要将这50亿的数据做一次迁移,迁移成本是无法想象的。
问题五:一致性哈希
首先,求出每个 服务器的hash值 ,将其配置到一个 0~2^n 的圆环上 (n通常取32)
其次,用同样的方法求出待 存储对象的主键 hash值 ,也将其配置到这个圆环上。
然后,从数据映射到的位置开始顺时针查找,将数据分布到找到的第一个服务器节点上。
一致性hash的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。
所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。
好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。
老规矩,一键三连,日入两千,点赞在看,年薪百万!
7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。
曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。
技术公众号 【架构师修行录】 号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。
交个朋友,一起成长!
数据库系统通常采用几级结构
三级结构。 数据库系统采用三级模式结构,包括外模式、概念模式和内模式。 外模式对应用户视图,定义特定用户组或应用程序所需的数据子集和操作方式。 概念模式是整个数据库系统中的全局逻辑结构描述,独立于具体应用程序,反映了组织对存储在数据库中信息内容及其关系上达成一致意见后形成共识。 内部/物理架构则将逻辑存储结构映射到实际存储设备上,与底层文件管理器紧密相关。 这种三级结构提供了逻辑独立性和物理独立性,在数据管理、应用开发和维护方面具有灵活性,使不同用户能够根据需求访问数据库保持相对稳定。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。