微信支付用的数据库开源了
腾讯TBase是一款腾讯自研高性能HTAP数据库,提供高性能的OLTP和OLAP能力,同时保证可扩展全局一致性分布式事务(ACID),为用户提供高一致性的分布式数据库服务和高性能的数据仓库服务。一方面解决了传统数据库扩展不足、数据sharding之后数据库事务的严格一致性难题、数据安全、跨地域容灾等问题,同时具备了高性能事务处理、数据治理、混合负载支持等能力。
在OLTP方面,TBase采用MVCC+全局时钟+2PC+SSI的方式来实现全局一致性分布式事务,同时引入大量性能优化的设计来减少全局事务带来的开销。在小规模集群上,TBase能够提供超过300万TPMTotal的事务处理吞吐量(工业界标准TPCC测试集)。
交易毫秒内完成
TBase已经覆盖多个行业的标杆用户,其中对内支持了微信广告、微信支付、腾讯地图等海量数据业务,一笔交易毫秒内即可完成,支撑了微信支付50倍的交易增长。
TBase是一个提供写可靠性,多主节点数据同步的关系数据库集群平台。你可以将TBase配置一台或者多台主机上,TBase数据存储在多台物理主机上面。数据表的存储有两种方式, 分别是distributed或者replicated ,当向TBase发送查询 SQL时,TBase会自动向数据节点发出查询语句并获取最终结果。
TBase采用分布式集群架构(如下图),该架构分布式为无共享(share nothing)模式,节点之间相应独立,各自处理自己的数据,处理后的结果可能向上层汇总或在节点间流转,各处理单元之间通过网络协议进行通信,并行处理和扩展能力更好,这也意味着只需要简单的x86服务器就可以部署TBase数据库集群。
下面简单解读一下TBase的三大模块:
Coordinator:协调节点(简称CN)
业务访问入口,负责数据的分发和查询规划,多个节点位置对等,每个节点都提供相同的数据库视图;在功能上CN上只存储系统的全局元数据,并不存储实际的业务数据。
Datanode:数据节点(简称DN)
每个节点还存储业务数据的分片在功能上,DN节点负责完成执行协调节点分发的执行请求。
GTM:全局事务管理器(Global Transaction Manager)
负责管理集群事务信息,同时管理集群的全局对象,比如序列等。
接下来,让我们来看看如何从源码开始,完成到TBase集群环境的搭建。
TBase源码编译安装1. 创建tbase用户注意:所有需要安装TBase集群的机器上都需要创建
mkdir/datauseradd-d/data/tbasetbase2. 源码获取
git clone https://github.com/Tencent/TBase
cd${SOURCECODE_PATH}rm-rf${INSTALL_PATH}/tbase_bin_v2.0chmod+xconfigure*./configure--prefix=${INSTALL_PATH}/tbase_bin_v2.0--enable-user-switch--with-openssl--with-ossp-uuidCFLAGS=-gmakecleanmake-sjmakeinstallchmod+xcontrib/pgxc_ctl/make_signaturecdcontribmake-sjmakeinstall
本文的使用环境中,上述两个参数如下
${SOURCECODE_PATH}=/data/tbase/TBase-master
${INSTALL_PATH}=/data/tbase/install
4. 集群安装4.1)集群规划
下面以两台服务器上搭建1GTM主,1GTM备,2CN主(CN主之间对等,因此无需备CN),2DN主,2DN备的集群,该集群为具备容灾能力的最小配置
机器1:10.215.147.158机器2:10.240.138.159
集群规划如下:
4.2)机器间的ssh互信配置参考Linux ssh互信配置
4.3)环境变量配置集群所有机器都需要配置
[tbase@TENCENT64~]$vim~/.bashrcexportTBASE_HOME=/data/tbase/install/tbase_bin_v2.0exportPATH=$TBASE_HOME/bin:$PATHexportLD_LIBRARY_PATH=$TBASE_HOME/lib:${LD_LIBRARY_PATH}
以上,已经配置好了所需要基础环境,可以进入到集群初始化阶段,为了方便用户,TBase提供了专用的配置和操作工具:pgxc_ctl来协助用户快速搭建并管理集群,首先需要将前文所述的节点的ip,端口,目录写入到配置文件 pgxc_ctl.conf 中。
4.4)初始化pgxc_ctl.conf文件[tbase@TENCENT64~]$mkdir/data/tbase/pgxc_ctl[tbase@TENCENT64~]$cd/data/tbase/pgxc_ctl[tbase@TENCENT64~/pgxc_ctl]$vimpgxc_ctl.conf
如下,是结合上文描述的IP,端口,数据库目录,二进制目录等规划来写的pgxc_ctl.conf文件。具体实践中只需按照自己的实际情况配置好即可.
#!/bin/bashpgxcInstallDir=/data/tbase/install/tbase_bin_v2.0pgxcOwner=tbasedefaultDatabase=postgrespgxcUser=$pgxcOwnertmpDir=/tmplocalTmpDir=$tmpDirconfigBackup=nconfigBackupHost=pgxc-linkerconfigBackupDir=$HOME/pgxcconfigBackupFile=pgxc_ctl.bak#----GTM----------gtmName=gtmgtmMasterServer=10.215.147.158gtmMasterPort=50001gtmMasterDir=/data/tbase/data/gtmgtmExtraConfig=nonegtmMasterSpecificExtraConfig=nonegtmSlave=ygtmSlaveServer=10.240.138.159gtmSlavePort=50001gtmSlaveDir=/data/tbase/data/gtmgtmSlaveSpecificExtraConfig=none#----Coordinators-------coordMasterDir=/data/tbase/data/coordcoordMasterDir=/data/tbase/data/coordcoordArchLogDir=/data/tbase/data/coord_archlogcoordNames=(cn001cn002)coordPorts=(3000430004)poolerPorts=(3111031110)coordPgHbaEntries=(0.0.0.0/0)coordMasterServers=(10.215.147.15810.240.138.159)coordMasterDirs=($coordMasterDir$coordMasterDir)coordMaxWALsernder=2coordMaxWALSenders=($coordMaxWALsernder$coordMaxWALsernder)coordSlave=ncoordSlaveSync=ncoordArchLogDirs=($coordArchLogDir$coordArchLogDir)coordExtraConfig=coordExtraConfigcat>$coordExtraConfig<<EOF#================================================#Addedtoallthecoordinatorpostgresql.conf#Original:$coordExtraConfiginclude_if_exists='/data/tbase/global/global_tbase.conf'wal_level=replicationwal_keep_segments=256max_wal_senders=4archive_mode=onarchive_timeout=1800archive_command='echo0'log_truncate_on_rotation=onlog_filename='postgresql-%M.log'log_rotation_age=4hlog_rotation_size=100MBhot_standby=onwal_sender_timeout=30minwal_receiver_timeout=30minshared_buffers=1024MBmax_pool_size=2000log_statement='ddl'log_destination='csvlog'logging_collector=onlog_directory='pg_log'listen_addresses='*'max_connections=2000EOFcoordSpecificExtraConfig=(nonenone)coordExtraPgHba=coordExtraPgHbacat>$coordExtraPgHba<<EOFlocalallalltrusthostallall0.0.0.0/0trusthostreplicationall0.0.0.0/0trusthostallall::1/128trusthostreplicationall::1/128trustEOFcoordSpecificExtraPgHba=(nonenone)coordAdditionalSlaves=ncad1_Sync=n#----Datanodes---------------------dn1MstrDir=/data/tbase/data/dn001dn2MstrDir=/data/tbase/data/dn002dn1SlvDir=/data/tbase/data/dn001dn2SlvDir=/data/tbase/data/dn002dn1ALDir=/data/tbase/data/datanode_archlogdn2ALDir=/data/tbase/data/datanode_archlogprimaryDatanode=dn001datanodeNames=(dn001dn002)datanodePorts=(4000440004)datanodePoolerPorts=(4111041110)datanodePgHbaEntries=(0.0.0.0/0)datanodeMasterServers=(10.215.147.15810.240.138.159)datanodeMasterDirs=($dn1MstrDir$dn2MstrDir)dnWALSndr=4datanodeMaxWALSenders=($dnWALSndr$dnWALSndr)datanodeSlave=ydatanodeSlaveServers=(10.240.138.15910.215.147.158)datanodeSlavePorts=(50004540004)datanodeSlavePoolerPorts=(5111051110)datanodeSlaveSync=ndatanodeSlaveDirs=($dn1SlvDir$dn2SlvDir)datanodeArchLogDirs=($dn1ALDir/dn001$dn2ALDir/dn002)datanodeExtraConfig=datanodeExtraConfigcat>$datanodeExtraConfig<<EOF#================================================#Addedtoallthecoordinatorpostgresql.conf#Original:$datanodeExtraConfiginclude_if_exists='/data/tbase/global/global_tbase.conf'listen_addresses='*'wal_level=replicationwal_keep_segments=256max_wal_senders=4archive_mode=onarchive_timeout=1800archive_command='echo0'log_directory='pg_log'logging_collector=onlog_truncate_on_rotation=onlog_filename='postgresql-%M.log'log_rotation_age=4hlog_rotation_size=100MBhot_standby=onwal_sender_timeout=30minwal_receiver_timeout=30minshared_buffers=1024MBmax_connections=4000max_pool_size=4000log_statement='ddl'log_destination='csvlog'wal_buffers=1GBEOFdatanodeSpecificExtraConfig=(nonenone)datanodeExtraPgHba=datanodeExtraPgHbacat>$datanodeExtraPgHba<<EOFlocalallalltrusthostallall0.0.0.0/0trusthostreplicationall0.0.0.0/0trusthostallall::1/128trusthostreplicationall::1/128trustEOFdatanodeSpecificExtraPgHba=(nonenone)datanodeAdditionalSlaves=nwalArchive=n4.5)分发二进制包
在一个节点配置好配置文件后,需要预先将二进制包部署到所有节点所在的机器上,这个可以使用pgxc_ctl工具,执行deploy all命令来完成。
[tbase@TENCENT64~/pgxc_ctl]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCdeployallDeployingPostgres-XLcomponentstoallthetargetservers.Preparetarballtodeploy...Deployingtotheserver10.215.147.158.Deployingtotheserver10.240.138.159.Deploymentdone.登录到所有节点,check二进制包是否分发OK[tbase@TENCENT64~/install]$ls/data/tbase/install/tbase_bin_v2.0binincludelibshare4.6)执行init all命令,完成集群初始化命令
[tbase@TENCENT64~]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCinitallInitializeGTMmaster........Initializedatanodeslavedn001Initializedatanodeslavedn002mkdir:cannotcreatedirectory'/data1/tbase':Permissiondeniedchmod:cannotaccess'/data1/tbase/data/dn001':Nosuchfileordirectorypg_ctl:directory"/data1/tbase/data/dn001"doesnotexistpg_basebackup:couldnotcreatedirectory"/data1/tbase":Permissiondenied4.7)安装错误处理
一般init集群出错,终端会打印出错误日志,通过查看错误原因,更改配置即可,或者可以通过/data/tbase/pgxc_ctl/pgxc_log路径下的错误日志查看错误,排查配置文件的错误
[tbase@TENCENT64~]$ll~/pgxc_ctl/pgxc_log/total184-rw-rw-r--1tbasetbase81123Nov1317:2214105_pgxc_ctl.log-rw-rw-r--1tbasetbase2861Nov1317:5815762_pgxc_ctl.log-rw-rw-r--1tbasetbase14823Nov1407:5916671_pgxc_ctl.log-rw-rw-r--1tbasetbase2721Nov1316:5218891_pgxc_ctl.log-rw-rw-r--1tbasetbase1409Nov1316:2022603_pgxc_ctl.log-rw-rw-r--1tbasetbase60043Nov1316:3328932_pgxc_ctl.log-rw-rw-r--1tbasetbase15671Nov1407:576849_pgxc_ctl.log
通过运行 pgxc_ctl 工具,执行clean all命令删除已经初始化的文件,修改pgxc_ctl.conf文件,重新执行init all命令重新发起初始化。
[tbase@TENCENT64~]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCcleanall[tbase@TENCENT64~]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCinitallInitializeGTMmasterEXECUTEDIRECTON(dn002)'ALTERNODEdn002WITH(TYPE=''datanode'',HOST=''10.240.138.159'',PORT=40004,PREFERRED)';EXECUTEDIRECTEXECUTEDIRECTON(dn002)'SELECTpgxc_pool_reload()';pgxc_pool_reload------------------t(1row)Done.5. 查看集群状态
当发现上面的输出时,集群已经OK,另外也可以通过pgxc_ctl工具的monitor all命令来查看集群状态
[tbase@TENCENT64~/pgxc_ctl]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCmonitorallRunning:gtmmasterNotrunning:gtmslaveRunning:coordinatormastercn001Running:coordinatormastercn002Running:datanodemasterdn001Running:datanodeslavedn001Running:datanodemasterdn002Notrunning:datanodeslavedn002
一般的如果配置的不是强同步模式,gtm salve,dn slave的故障不会影响访问。
6. 集群访问访问TBase集群和访问单机的PostgreSQL基本上无差别,我们可以通过任意一个CN访问数据库集群:例如通过连接CN节点select pgxc_node表即可查看集群的拓扑结构(当前的配置下备机不会展示在pgxc_node中),在Linux命令行下通过psql访问的具体示例如下
[tbase@TENCENT64~/pgxc_ctl]$psql-h10.215.147.158-p30004-dpostgres-Utbasepsql(PostgreSQL10.0TBaseV2)Type"help"forhelp.postgres=#\dDidnotfindanyrelations.postgres=#select*frompgxc_node;node_name|node_type|node_port|node_host|nodeis_primary|nodeis_preferred|node_id|node_cluster_name-----------+-----------+-----------+----------------+----------------+------------------+------------+-------------------gtm|G|50001|10.215.147.158|t|f|428125959|tbase_clustercn001|C|30004|10.215.147.158|f|f|-264077367|tbase_clustercn002|C|30004|10.240.138.159|f|f|-674870440|tbase_clusterdn001|D|40004|10.215.147.158|t|t|2142761564|tbase_clusterdn002|D|40004|10.240.138.159|f|f|-17499968|tbase_cluster(5rows)6.1) 使用数据库前需要创建default group以及sharding
TBase使用datanode group来增加节点的管理灵活度,要求有一个default group才能使用,因此需要预先创建;一般情况下,会将节点的所有datanode节点加入到default group里 另外一方面,TBase的数据分布为了增加灵活度,加了中间逻辑层来维护数据记录到物理节点的映射,我们叫sharding,所以需要预先创建sharding,命令如下:
postgres=#createdefaultnodegroupdefault_groupwith(dn001,dn002);CREATENODEGROUPpostgres=#createshardinggrouptogroupdefault_group;CREATESHARDINGGROUP6.2) 创建数据库,用户,创建表,增删查改等操作
至此,就可以跟使用单机数据库一样来访问数据库集群了
postgres=#createdatabasetest;CREATEDATABASEpostgres=#createusertestwithpassword'test';CREATEROLEpostgres=#alterdatabasetestownertotest;ALTERDATABASEpostgres=#\ctesttestYouarenowconnectedtodatabase"test"asuser"test".test=>createtablefoo(idbigint,strtext)distributebyshard(id);CREATETABLEtest=>insertintofoovalues(1,'tencent'),(2,'shenzhen');COPY2test=>select*fromfoo;id|str----+----------1|tencent2|shenzhen(2rows)7. 停止集群
通过pgxc_ctl工具的stop all命令来停止集群,stop all 后面可以加上参数-m fast或者是-m immediate来决定如何停止各个节点。
PGXCstopall-mfastStoppingallthecoordinatormasters.Stoppingcoordinatormastercn001.Stoppingcoordinatormastercn002.Done.Stoppingallthedatanodeslaves.Stoppingdatanodeslavedn001.Stoppingdatanodeslavedn002.pg_ctl:PIDfile"/data/tbase/data/dn002/postmaster.pid"doesnotexistIsserverrunning?Stoppingallthedatanodemasters.Stoppingdatanodemasterdn001.Stoppingdatanodemasterdn002.Done.StopGTMslavewaitingforservertoshutdown.....doneserverstoppedStopGTMmasterwaitingforservertoshutdown....doneserverstoppedPGXCmonitorallNotrunning:gtmmasterNotrunning:gtmslaveNotrunning:coordinatormastercn001Notrunning:coordinatormastercn002Notrunning:datanodemasterdn001Notrunning:datanodeslavedn001Notrunning:datanodemasterdn002Notrunning:datanodeslavedn0028. 启动集群
通过pgxc_ctl工具的start all命令来启动集群
[tbase@TENCENT64~]$pgxc_ctl/usr/bin/bashInstallingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Installingpgxc_ctl_bashscriptas/data/tbase/pgxc_ctl/pgxc_ctl_bash.Readingconfigurationusing/data/tbase/pgxc_ctl/pgxc_ctl_bash--home/data/tbase/pgxc_ctl--configuration/data/tbase/pgxc_ctl/pgxc_ctl.confFinishedreadingconfiguration.********PGXC_CTLSTART***************Currentdirectory:/data/tbase/pgxc_ctlPGXCstartall结语
本文档只是给用户一个简单的指引,演示如何从源码开始,一步一步搭建一个完整的TBase集群,后续会有更多的文章来介绍TBase的特性使用,优化,问题定位等内容。
腾讯TBase GitHub 开源地址,请搜索关注“腾讯云数据库”官方微信,回复“开源”即可获取。
推荐阅读支撑微信支付的数据库如何提供超300万TPCC事务处理能力?
最佳实践 | 腾讯HTAP数据库TBase助力某省核心IT架构升级
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。