自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(197)
  • 资源 (8)
  • 收藏
  • 关注

原创 以系统方式看世界,就是以不同角度看世界

我们在学习一个复杂系统的时候,会把它分成若干小系统,单独研究一个小系统的时候,会尽量不去想它与其它系统的联系和作用,把一个大系统分解成若干小系统的思维,其实也是从不同角度看一个大系统,例如人体的免疫系统,如果只看免疫系统的工作,不考虑运动、神经、消化系统,就是从免疫系统的角度看人体,但是其实各子系统之间是有联系和交互的(否则这些子系统就没有价值了)。有了一定生活经验的人,会知道许多看似是一个整体事物,其实是由若干个小系统组织而成,例如一个汽车,一台电脑,一个人体,一个国家,一门语言。

2024-04-23 09:40:50 29

原创 opengauss pending启动转主备代码分析

在这些信号处理函数中启动线程(walreceiver、walwriter、walsender等),启动线程调用initialize_util_thread() ,可以在postmaster.cpp中搜initialize_util_thread,查看启动线程的位置。而在 pending 状态启动时,就已经调用了与各种 wal record 对应的 resource manager 的redo函数了,也就是说如果有问题,在pending启动时就会有问题。

2024-04-22 17:50:39 63

原创 自主创新就是要先接受自己不完美的解决方案并寻求完善

自主创新就是要接受自己的不足,接受自己的无能为力,并且承担代价,然后逐渐改进,逐渐寻找突破,这也是所谓的工程思维,今天看PG代码时,从README说明里看到许多他们对PG解决一个问题时不足的讨论,他们也承认是有不完美的,但是在一定场景下不会出大问题,问题是,如果不接受这个不完美的解决方案,就被问题卡住,无法前进。当我们自己发明创造解决方案时,也会遇到不完美的解决方案问题,就觉得我们的不行,不如别人的,有时干脆就放弃了,觉得白努力。这其实就是不明白要接受自己的不完美,并持续改进下去。

2024-04-18 17:48:33 143

原创 valgrind 是个啥?

m->msg开始sizeof (struct rawmsg)大小的内存,标记为未定义(初始化)的内存,如果没有这个宏,memcheck仿真cpu会认为这块内存是已经被初始化的,因为前面调用了memset,而memcheck仿真cpu会监视memset,这个宏在需要重用一块内存时使用。当然,不可能真的为进程地址空间的每个字节,分配记录其属性的bitmap,因为这些bitmap本身也占用地址空间的字节,memcheck只记录被客户程序触及到的进程地址空间字节的属性,未触及到的字节的属性,应该有办法压缩表示。

2024-04-09 11:21:44 903

原创 编写 PG extension 时,work_mem 和 maintenance_work_mem的作用

从PG内核编程的角度看,其实backend进程在做上述操作时,也可以不参考这两个参数,而是直接按需分配内存,但是这样,有可能单个backend进程占用的内存太大,把整个计算机的内存都占满了,所以DBA要对每个backend进程占用的内存的上限,做一个限制,当达到这个限制,就采取其它策略,或执行失败,就像单个进程的out of memory。这两个参数在官网都有描述,都是一个backend进程在做工作时,需要用到的内存的参考,也都是给每个backend自己用做参考的,不是全局的。

2024-04-08 15:46:43 162

原创 PG 的 Extension 是个啥?

以前,对于编写PG的Extension一直有一种神秘感,虽然知道PG的Extension,除了SQL脚本创建一堆PG对象外,最难以捉摸的就是so库了,但是对于这个so库到底可以做到哪些,还是不明朗,到底这个扩展能让PG扩展成什么样?是想把PG改成什么样都可以吗?在执行 CREATE EXTENSION XXX 时,PG会先加载so文件,然后执行sql脚本,加载到内存的so文件就是PG内核的一部分了,其中(so)的代码基本上就可以调用PG内核的任何接口函数,使用PG内核提供的基础设施了。

2024-04-07 17:20:58 163

原创 pg_config.h

与pg_congfig.h对应的,还有一个pg_config_manual.h,这个不是configure生成的,一般用于developer调试,里面也可以设置一些编译后不可变的或默认的内核配置。既然是编译时设置,通过修改configure,也可以将git commit的版本号加进去,这样数据库运行时可以查到可执行文件对应的代码版本。这个头文件是编译PG时configure生成的,configure命令行中的设置,可以反映到这个文件中的宏定义。一般用于一些编译后不可变或者默认的PG内核配置。

2024-04-07 16:53:29 111

原创 PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned)

它的实现原理也颇为简单,简单地说就是分配略大于 size + alignto 的一块内存,这样,无论返回的地址是否按照 alignto对齐,在这块内存中总能找到alignto对齐的地址,而且这个对齐地址其后面,可用内存一定大于需要的内存size。有时内存地址的对齐,需要大于MAXALIGN,这时可以用 BUFFERALIGN,它返回最接近输入数字(大于)且能整除32的数。在PG源码中,MAXALIGN这个宏,返回最接近输入数字(大于)且能整除8的数,仅此而已。“CPU访问对齐的地址性能更高”

2024-04-07 16:39:12 216 1

原创 C++ 内存分配时地址对齐

如果希望在堆中分配的内存时,返回地址按照特定长度对齐,可以使用 aligned_alloc。因此在C++中,有时会希望在堆或栈中分配内存时,返回的地址能按照特定的长度对齐。如果数据地址的对齐与CPU相兼容,那么CPU读写内存时性能会更高。// 输出的地址总是按照4096对齐。

2024-04-07 14:23:08 172

原创 在 PostgreSQL Extension 中使用 MemoryContext

MemoryContext可以理解成是一种类,整个backend进程,以它为节点连城一个树型结构,没个模块的内存分配创建一个MemoryContext,挂到backend的树中,然后这个模块所以需要的内存都在这个MemoryContext里分配,当这个模块的生命周期结束,就销毁这个MemoryContext,在其中分配的内存也全部被释放,如果这个MemoryContext由子树,子树所管理的内存也一起释放。

2024-04-07 13:52:25 157

原创 编译时表达式 constexpr

1、用constexpr修饰的函数或变量,表示可以在编译时计算,但是,如果代码中有对于这个函数的调用,并不意味着编译时一定会执行这个函数,只有这个函数返回了一个变量,然后代码中调用这个函数将返回值赋值给constexpr变量,才会导致编译时执行这个语句。2、除了上述特性,constexpr修饰的变量和函数,隐式的具备了const和inline的特性。// 这句编译时不会执行,只有运行时才会执行。有些傻逼为了用C++的新特性而用新特性,错误的使用constexpr会导致误解,非常蛋疼。

2024-04-02 17:04:30 181

原创 运行时断言(assert)与编译时断言(static_assert)

在代码中写assert,debug版本不定义NDEBUG,release版本定义NDEBUG,这就是assert的使用场景。assert是运行时断言,如果在编译时定义了NDEBUG宏,则assert语句会被忽略掉(丢弃)。static是编译时断言,用来判断编译时的constexpr,如果断言中是false,则编译错误。这里所描述的是GNU编译器。

2024-04-02 16:16:59 220

原创 gdb 打印C++ std::vector里的元素

参考上面的文章,总结如下:$2 = 78$3 = 78$4 = 0$5 = -53。

2024-03-29 11:34:16 190

原创 RMAN 备份恢复、删除归档

通过设置备份策略,决定哪些备份是obsolete,obsolete的备份并不会自动删除,需要手工删除:list backupreport obsoletedelete obsolete使用RMAN既可以做单独的tablespace备份,datafile备份,也可以做全库备份:backup database format '/u01/app/oracle/backup-rman/db_%d_%T_%U.bak';或直接backup database;会备份到db_recovery_file_

2024-03-26 11:33:35 954

原创 制作 configure 文件极简教程

如果要发布自己的源码,而自己的源码想通过configure,make,make install 编译安装,那么要为自己的源码建立 configure 文件,这个configure 文件不是手写的,而是autoconf生成的,这个生成过程是怎样的呢?上面的文章就举了一个极简的例子,让人有个很快的初步认识。

2024-03-25 17:43:10 168

原创 Makefile的override

将的很好,简单的说,如果在Makefile中有override CPPFLAGS +=-fPIC,无论用户在 make CPPFLAGS=XXX 这里怎样设置,最终编译时都会把-fPIC加到CPPFLAGES里,一般用于添加通用的选项。简单的理解就是编译时要加 -fPIC,告诉编译器生成Position Independent Code,试过。可以成功编译,不过看到其它的解决方案是在Makefile中加。

2024-03-25 16:26:30 201

原创 Oracle 数据泵 导入导出 最简说明

数据泵可以对含有CLOB,BLOB等字段的表导出数据,是应用场景最广的一种导入导出方法,我觉得要比SQL Developer好用,不过需要能够登录数据库所在主机的操作系统。

2024-02-28 18:28:02 584

原创 Unix Domain Socket 比 localhost(127.0.0.1)更快

2、localhost(127.0.0.1)和本机IP是一样的,虽然不走网卡,但是都要走内核的 TCP/IP协议栈,这带来一定的CPU开销。1、localhost(127.0.0.1)、本机IP 和 Unix Domain Socket 都是不走网卡的,这节省了网卡的IO。使用socket进程间通讯,有很好的兼容和复用性,本机的socket进程间通讯,最好选用Unix Domain Socket。

2024-02-28 15:01:05 392 1

原创 什么是代码混淆

code obfuscation 指将代码中有描述性,易于理解的变量名、函数名、类名等,替换成毫无意义的字符串,让阅读代码的人难以读懂,提出这个概念的人认为这样可以保护脚本的逻辑不被人盗取,尤其是网页脚本。

2024-02-28 09:28:30 160

原创 OpenEuler 静默安装 Oracle19c

我一般都是用runInstaller和dbca的图形界面安装Oracle,但是这次安装,受到网络限制,不能用弹出窗口,只能用静默方式,还是使用这些可执行程序,不过要加一个 -silent 选项,参考了网上的文章,加上自己的实际情况,Oracle19c的静默安装包括四部分:1、runInstaller 静默安装软件19c软件包2、netca静默配置网络3、dbca静默建库4、导入表结构和数据。

2024-02-23 16:59:16 1076

原创 Doris中的本地routineload环境,用于开发回归测试用例

上面这些都弄好后,执行 ./run-thirdparties-docker.sh -c kafka,就会下载镜像,创建kafka和zookeeper的容器,配置好网络,并向kafka写入数据,这些数据在 doris/docker/thirdparties/docker-compose/kafka/scripts 目录下,对应着 doris/regression-test/suites/load_p0/routine_load/ 里的测试用例用到的表。

2024-02-05 17:22:35 886

原创 使用debezuim,实现PG同步Oracle

还可以将逻辑变更读出,给自己写的应用程序,例如jdbc就有逻辑复制功能,debezuim就是利用这个功能。jdbc的逻辑复制其实是利用了logical decoding功能,需要一个插件,调用插件时向它传参数,每个插件的参数会不同。使用wal2json直接decode出来的,是完整的数据,但是到了debezuim,就只有很短的字符串了。逻辑复制有一个限制是,不能捕获大对象变更,但是这里不要误会,表中的bytea列不是大对象,这种列可以存1g的数据,但它不算大对象,大对象是另一种概念。

2024-02-05 11:40:52 402

原创 记 doris 加载压缩文件(lzo、snappy)pr

这里要分清两个概念:lzo是压缩算法,它只管把一块大的数据压缩成一块小的数据,但是要把一个文件分成几个数据块来压缩,压缩以后怎么保存到磁盘,以便于解压缩,这些lzo是不管的,也不会做规定,于是就有了lzop,它是一个把普通文件做lzo压缩和解压的工具(可执行程序),它定义了保存lzo压缩文件的格式,可以理解lzop是保存用lzo压缩算法压缩以后的数据的一个容器(包装盒),而这个lzop也是有格式的。解压时,接受一个已压缩的数据块,解压以后的数据块,放在另一个内存地址,解压后的大小,作为参数返回。

2024-02-01 16:14:09 829

原创 单机搭建hadoop环境(包括hdfs、yarn、hive)

然后,下载hadoop安装包,这个包就包括了hdfs服务器和yarn服务器的执行文件和配置脚本。首先,要配置好Java的JAVA_HOME和PATH(etc/hadoop/hadoop-env.sh里的JAVA_HOME要改为本机的JAVA_HOME),还是有ssh本机的免密码登录。etc/hadoop/hdfs-site.xml (dfs.namenode.name.dir 和 dfs.namenode.data.dir)是服务器上存储元数据和数据的目录。yarn服务器,yarn的前提是hdfs服务器,

2024-01-28 16:56:36 1418

原创 为什么需要数据仓库

OLTP环境也会存储历史数据,但这些历史数据并不是业务运行所需的,这些历史数据需要经常归档到数据仓库,并且在OLTP数据库中删除。相比之下,事务环境适用于连续处理事务,通常应用于订单录入以及财务和零售事务。它们并不依赖历史数据。环境下,用户常常需要归档历史数据,或删除历史数据来提高性能。

2024-01-22 14:32:24 621 1

原创 docker 和 k8s

https://www.runoob.com/docker/docker-architecture.htmldocker由dockerd来接受客户端的命令,它可以下载、管理镜像,创建、管理容器。由一个镜像可以创建多个容器,系统中运行的虚拟实体,就是容器。dockerd也可以管理容器与宿主机之间的端口,网络,目录映射。每个容器由自己的ip吗?是的容器可以启动,也可以停:docke...

2024-01-22 14:28:08 810 1

原创 Doris 的 RPC

gRPC 的 message 和 thrift 的 struct 定义的结构体数据,转化为 java、cpp 代码后,类型名称都不变,且FE、BE中都是相同的名称,内部结构也相同,thrift 以 T 开头,gRPC 以 P 开头,都可以在 gensrc 下搜索到,注意,sourceinside,不具备分析 proto 和 thrift 源文件的能力。RPC调用存在一个同步调用和异步调用问题,thrift 和 gRPC 都支持同步和异步,客户端和服务端都有对应的同步和异步接口。

2024-01-22 14:27:46 421

原创 LSM树适合磁盘的NoSQL,B+树适合SSD

如果用SSD那么B+树的随机读取的性能问题就没有了,尤其是有了持久内存,B+树将是更适合OLTP场景的数据结构。如果数据持久化到磁盘,LSM树的读写性能要比B+树要好,但是在事务约束的情况下,LSM的是否存在性能问题?

2023-12-04 17:21:05 122

原创 Doris 提交 PR 和 github 的提交权限问题

主要流程参考官方文档:代码提交指南 - Apache Dorisgithub的代码库,使用https地址clone,上传(push)会有个认证问题,参考下面的解决: git报错#Support for password authentication was removed on August 13,2021. Please use a personal...-CSDN博客一些注意点(坑):1、提交PR时,如果要在这个PR分支上提交多次,不要用 --amend,每次修改用独立的commit2、提交完PR可能要

2023-12-01 16:18:27 266

原创 BE的参数

BE的配置文件be.conf里的参数,可以通过REST API 修改,例如:也可以通过REST API查看:也可以通过web浏览器查看:

2023-11-29 16:52:43 75

原创 记 Doris 回归测试S3导入load_parallelism > 1

经社区小伙伴提示,可能时CA证书的路径不对,doris找不到,调试doris BE端代码发现,doris和S3通讯用的是aws sdk,endpoint没有处理直接传给aws client,aws client再去选择https协议,找CA证书,而我没有aws sdk代码,不知道aws sdk到哪里找CA证书。(后来我猜测aws cli应该是自带CA证书的)注意,BE底层是用AWS SDK访问S3服务的,而 AWS SDK 默认是走https,就是说这里如果只传入域名,走的是https协议使用端口443。

2023-11-29 16:26:47 882

原创 S3 的概念和使用

工作需要测试数据库从 S3(Simple Storage Service)导入数据文件,公司有私有S3环境。S3是一种对象存储,数据模型很简单,就是key-value,key就是一个任意字符串,value是一个文件。S3的功能是上传一个文件,并且标记为key,以后就用key获取这个文件。

2023-11-22 16:43:42 3283

原创 Opengauss到Oracle增量同步, 使用debezium

zookeeper和kafka都是java程序,注意配置一下java运行环境,我使用的是Java HotSpot 1.8,只要配置好JAVA_HOME和PATH两个环境变量即可,JAVA_HOME指向JDK解压后的目录,启动脚本会优先到JAVA_HOME里去找Java运行环境。kafka的配置文件是config/server.properties,设置log.dirs,这是kafka存消息数据的目录,会占用较大磁盘,9092,kafka和zookeeper,客户端和kafka直接都是通过网络读写数据的。

2023-11-15 14:55:49 389

原创 PostgreSQL basebackup备份和恢复

备份和恢复分为逻辑和物理,这里指物理备份和恢复。PG的物理备份依赖basebackup,这差不多就是数据目录的拷贝,还依赖归档日志。恢复分为完全恢复和PITR恢复,它们都需要归档日志,它们关键的差别是,PITR需要设置postgresql.conf中的参数recovery_target_time,还有PITR时,PG服务器恢复完后是只读状态,需要手动执行select pg_wal_replay_resume(),这样,其实是让管理员确认,恢复是否满足期望。

2023-10-27 17:14:27 489

原创 vacuum full table释放表占用的空间

表经过一系列删改操作后,虽然空间可以被重复使用,但空间并不一定释放,给操作系统,vacuum full tablename,可以对表的空间进行碎片整理和释放,但是这样会锁住表。

2023-10-27 14:14:11 296

原创 pg_rman 的编译和使用

下载地址:代码由日本电信的运维团队维护。针对不同的PostgreSQL版本,使用不同的分支编译,我的PG版本试12.6,对应的分支为REL_12_STABLE。pg_rman的编译要依赖PG的源码,或者是包含PG头文件和库文件的PG安装包,我之前从源码编译安装了PG,所以只要设置了PATH和LD_LIBRARY_PATH就行,本质上,编译pg_rman时,是使用了PG安装文件中的pg_config,来设置头文件和库文件的编译选项。

2023-10-07 18:21:32 227

原创 etcd\Patroni\PostgreSQL使用SSL、TLS、HTTPS

澄清:SSL/TLS并不是TCP一种加密的TCP协议,而是在TCP协议之上,HTTPS在SSL/TLS之上,TLS是新版本的SSL。除了HTTPS,其他基于TCP/IP的网络通讯,也可以使用SSL/TLS。

2023-08-23 16:47:31 117

原创 Doris的执行计划生成、分发与执行

2、如果执行计划中有多个fragment,会分两步,第一步是FE调用BackendServiceClient::execPlanFragmentPrepareAsync()下发fragment,在BE端响应了这个RPC后,会根据fragment信息,重建ExecNode组成的执行计划树,但是不执行,当把所有fragment的执行计划树都重建好了,即prepare完毕。注意,不管哪种情况,fragment信息通过rpc到达BE后,其中plan都有一个reconstruct的过程!

2023-08-18 17:59:45 1045

原创 Apache Doris 2.0.0 特性分析

doris可以查询外部表,包括: Hive、Iceberg、Hudi、Elasticsearch、JDBC、Paimon 早期版本中,FE通过BE节点查询外部表,并且在BE节点内执行join、sort、agg等计算, 这些BE节点同时也负责doris的内部表的存储和计算, 新版本改造了BE节点,通过修改配置,它可以仅用于查询外表时的计算,内部表数据不会存到它上面, 这种BE称为“计算节点”,而既存储内部表数据又执行计算的BE节点称为“混合节点”。上面冷热分层的逻辑,也可以只作用于分区数据。

2023-08-17 17:38:03 1589

原创 Doris 的批量更新

2、更新操作,底层实现,就是先把新数据生成并写入新的segment文件,旧数据的segment文件不会修改,但是其中被更新的记录会被标记删除,每个segment有一个deletebitmap对象标记哪些记录被删除,deletebitmap不存储在segment文件中,而是存储在同一个BE节点的rocksdb中,这是个内嵌在BE代码中的key-value数据库,可见,更新时,旧的数据文件不会被修改,只是增加新的segment文件和deletebitmap信息,效率是很高的。

2023-08-17 14:27:18 1773

CMU 5-721 Advanced Database System 课件PPT(1-25课完)

数据库实现,CS 5-721 PPT,Prof. Andy Pavlo

2024-01-18

POI数据集PostGIS数据集

经纬度点,数据集,PostGIS经纬度测试数据,坐标,亲测可用 1,百里香奶油草莓基地,劳动路707弄169临,31.44512325,121.3128429,上海市;嘉定区,公司企业;公司企业,13738470228 10,EVCARD电动汽车分时租赁,亨嘉庄东南50米(徐星路西),31.47498901,121.2580786,上海市;嘉定区,生活服务;其它生活服务, 19,上海野生动物园游客服务中心,南六公路178号,31.05707954,121.7114324,上海市;浦东新区,休闲娱乐;旅游景点, 28,南汇?界浜水蜜桃基地,沔新路与申瓦路交叉口南150米,31.131024

2020-09-25

Adobe AIR Scratch2必备

Adobe AIR windows下安装文件,安装Scratch2必备环境。

2018-02-26

mysql expert

mysql expert 代码,mysql expert 代码,mysql expert 代码

2017-10-11

SQ_Guide_M5

guide m5

2017-08-28

postgreSQL源码

PostgreSQL from github

2017-08-23

Database System The Complete Book 2nd Edition

数据库实现的好书

2017-08-17

Making it Big in Software

Making it Big in Software好书

2017-08-17

bc开发工具

bc开发工具

2017-08-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除