- 博客(76)
- 资源 (5)
- 收藏
- 关注
原创 【mysql】BIGINT UNSIGNED字段被表示为float科学计数法 & 丢失精度问题
发现数据库存储的 creator 内容是但是查询结果却被变成了一个科学计数法的 string:creator 的类型明明是一个为什么会被扫描成一个 float 格式的字符串的呢?
2025-06-03 18:33:19
605
原创 用户配置文件.bash_profile .bashrc .profile .zprofile .zshrc傻傻分不清楚
某些 linux 环境(如 ubuntu) 默认不创建 .bash_profile 文件,而是使用 .profile 文件来代替,其作用与 .bash_profile 相同。.zprofile 类似于 bash 的 .bash_profile,.zshrc 类似于 bash 的 .bashrc。使用 bash 作为用户默认 shell 的环境,会使用 .bashrc 和 .bash_profile 配置文件。对 bash 用户:建议写在 .bash_profile 中,如果没有则写在 .profile中。
2025-04-15 14:52:19
1019
原创 【数据库】达梦arm64安装
我选择的安装类型是:1典型安装,我的安装位置是:/home/dmdba/dmdbms。并未自动创建和启动,还需要手动启动(搞不懂为什么不自动启动)。选飞腾、鲲鹏都可以,都是arm架构的。[INFO] 启动DmAPService服务成功。上述安装完成后发现, 主数据库服务。[INFO] 安装达梦数据库完成。是否输入Key文件路径?后面安装完可以删除此目录。
2025-04-03 18:57:10
1167
原创 【mysql】日志:binLog、redoLog和undoLog
bin log 有自己独立的日志缓冲区,mysql 会给每一个工作线程分配一个 bin log 的缓冲区,名为 bin_log_buffer。undo log 不是直接写到磁盘文件中的,也是先写到内存,再由后台线程刷到磁盘,其写入的内存缓冲区名为 undo_log_buffer。redo log 不是直接写到磁盘中的,也是先写到内存再刷到磁盘,其写入的内存缓冲区名为 redo_log_buffer。可以看出,sql 的写流程中用到了三种日志:undo log、redo log 和 bin log。
2025-04-01 18:44:20
744
原创 分布式环境下的主从数据同步
在数据实际写入存储之前,先记录所有变更到日志(prepare状态),等待后台异步刷盘后,再将日志中的变更更新到数据文件(commit状态),所以 WAL 本质上是一种。这种方式适用于大多数类型的数据库。如 mysql 的 redoLog,etcd 的 raft log,pg 的 WAL,都是用的预写日志方式。这种方式由于复制的是原始数据,不会出现数据不一致的情况,但是缺点是数据量大,磁盘 IO、网络开销也高。记录每行数据的变化,当数据被修改时,生成的日志包含被修改行的唯一标识,以及所有列的新值。
2025-03-31 16:54:00
1067
原创 【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用较复杂,路由、绑定等操作增加了学习成本Kafka:适用于高吞吐量场景,配置灵活但复杂
2025-03-27 15:43:07
1316
原创 订单自动关闭方案设计
使用时间轮就是将所有 订单到期检查任务 分配到一个时间轮中,时间轮按照固定的时间间隔进行周期性旋转。当时间轮旋转到某个槽位时,触发该槽中对应的任务。redis stream:生产者将到期时间放入消息,消费者消费时检查是否到期,未到期则放回队列。分布式问题:容易出现单点故障,需要设计分布式时间轮,增加主备模式、负载均衡算法,设计复杂。时间不精准:定时任务是基于固定的频率执行的,如果要保证精准度就要增加频率,不易控制。kafka:生产者将到期时间放入消息,消费者消费时检查是否到期,未到期则放回队列。
2025-02-12 15:03:16
599
原创 【学到了】一个关闭channel避免panic的写法
如果 close 是幂等的,则可能需要额外的状态变量来跟踪通道的实际状态,增加了复杂性和出错的可能性。通过不使 close 成为幂等操作,Go 强制开发者思考并正确处理通道的生命周期,鼓励他们写出更加健壮和易于理解的代码。意图表达:关闭通道是一个具有特定意义的操作,意味着不再会有更多的数据被发送到这个通道。如果 close 是幂等的,那么这种类型的错误可能更难以被发现,因为它们不会导致程序立即崩溃。如果 close 是幂等的,可能会掩盖一些逻辑错误,比如意外地多次关闭同一个通道。,如竞态条件或逻辑错误。
2025-02-12 10:29:26
349
原创 【时间轮】TimeWheel原理:实现高效任务管理
使用时间轮,把大批量的调度任务全部都绑定到同一个的调度器上面,使用一个调度器来进行所有任务的管理(插入、删除、触发操作的时间复杂度通常为 O(1)),能很好的适应高并发环境,高效管理各种延时任务、定时任务。随着时间推进,当原本定时为 255s 的任务还剩下 55s 的时间时,会进行 时间轮降级,将这个剩余时间为 55s 的任务放到第二层(作为一个55s后执行的任务,放到对应槽中)单层时间轮实现简单,适用于时间跨度较小的场景。当任务的到期时间超过了当前时间轮所表示的时间范围时,就会添加到上层时间轮中。
2025-02-11 10:22:33
704
原创 【traefik】forwadAuth中间件跨namespace请求的问题
这个请求是一个跨 namespace 的请求,即 traefik-ingress-controller(在 ns: traefik 下)经过中间件请求 http://whoami-svc:80/forwardAuth 时,当你的 traefik 需要使用跨 namespace 的功能时,最好在 address 中配置完整的、携带 ns 名称的域名。,而 ns: traefik 中并没有 whoami-svc 这个 service,因此解析失败。位于哪个命名空间,它都能正确解析到目标服务。
2025-01-09 11:56:29
710
原创 【traefik】设置跨域请求头cors-headers
导致的,也就是https://b.example.com/is-login这个API没有在响应中包含Access-Control-Allow-Origin头,因此浏览器阻止了来自https://a.example.com的请求。如果请求来源是http协议而非https,是无法通过credentials=true携带请求头的,这是因为浏览器不允许从一个非安全的环境(http)向安全环境(https)发送凭据,防止安全风险。同源请求(即在b.example.com下的请求)不受影响。
2025-01-08 10:14:03
912
原创 【消息队列】ubuntu单机版RocketMQ安装
admin/admin (定义在src/main/resources/users.properties中)http://{你的主机地址}:38080。
2024-12-12 09:25:16
404
原创 【mysql】锁机制 - 4.插入意向锁
假设存在两条值分别为 4 和 7 的记录,两个不同的事务分别试图插入值为 5 和 6 的两条记录,每个事务在获取插入行上独占的(排他)锁前,都会获取(4,7)之间的间隙锁,但是因为数据行之间并不冲突,所以两个事务之间并不会产生冲突(阻塞等待)。Time2:事务2获得了意向排他锁和 (20, 30) 范围的间隙锁(意向锁和意向锁之间不会冲突,间隙锁和间隙锁之间也不会冲突)插入意向锁和间隙锁不能共存,即:两个事务不能在同一时间内,一个拥有间隙锁,另一个拥有该间隙的插入意向锁。等待20-30记录的插入意向锁。
2024-11-18 16:03:18
1092
原创 【mysql】锁机制 - 3.意向锁
是为了而设置的一种预判机制,即在一个操作发起实际资源的锁申请行为之前,先对更粗力度的资源发起一个加锁意向声明。
2024-11-18 15:47:27
733
原创 【mysql】锁机制 - 2.行锁/间隙锁/临键锁
唯一索引等值查询:当查询的记录存在,临键锁会退化成行锁当查询的记录不存在,临键锁会退化成间隙锁非唯一索引等值查询:当查询的记录存在,会加临键锁和间隙锁两把锁当查询的记录不存在,只会加临键锁,然后退化为间隙锁非唯一索引和主键索引的范围查询的区别:唯一索引在满足条件时,临键锁退化为间隙锁和记录锁非唯一索引范围查询,临键锁不会退化为间隙锁和记录锁。
2024-10-20 15:07:12
1812
2
原创 【消息队列】RabbitMQ实现消费者组机制
发送消息到交换机,交换机会自动分发给所有绑定到它的队列,也就是发送一条消息至 exchange_user 交换机,那么消息会被投递给队列 exchange_user_consumer_user_rpc 和 队列 exchange_user_consumer_org_rpc。在生产者初始化时,需要先将交换机和队列的关系绑定好,以避免此场景发生:生产者先启动,未绑定交换机和队列,发送了消息到交换机,此时无法投递到具体队列。消费者后启动,即便做了交换机和队列绑定,也无法消费到历史消息。考虑以下业务需求——
2024-10-19 15:21:50
1624
原创 【消息队列】使用redis stream消息队列做服务间的数据同步
这类专业的队列中间件,在使用时一般都是部署一个集群,生产者在发布消息时,队列中间件通常会写'多个节点',以此保证消息的完整性。这样即便其中一个节点挂了,也能保证集群的数据不丢失。Redis Streams 是一种持久化的消息队列实现,可以用于构建复杂的事件驱动应用程序和服务,Streams 允许你按顺序添加消息到一个逻辑有序的流中,并支持多消费者模型。提供了可以指定队列最大长度的功能,在添加消息时,可以设置 MAXLEN 来指定队列的最大长度,如果超过限制,redis 会把最早的消息删除,这样就避免了。
2024-09-14 21:11:20
948
原创 【traefik】使用forwardAuth中间件做网关层的全局鉴权
1 forwardAuth中间件1 forwardAuth中间件将认证逻辑委托给一个外部服务服务返回 2XX code 表示鉴权通过,traefik 将继续请求业务服务服务返回其他 code 表示鉴权失败,traefik 会将请求挡住,直接返回未认证错误。
2024-09-11 14:24:45
474
原创 SSO单点登录&Oauth2/CAS认证
和OAuth 相比,CAS 不区分 access_token 和 refresh_token,也不考虑 token 过期的刷新,TGT 也可以重复使用(OAuth 的 code 码使用一次即失效),认证中心只需发放、管理 TGT/ST即可。用户在认证中心完成认证之后,认证中心在自己的域名下会写入一个 Cookie,各个子业务系统去请求认证中心的“检查用户是否登录”的接口时,浏览器会携带上此 Cookie,从而获取到用户的登录态。由于此时用户在认证中心已经登录过了,所以会直接携带用户的凭证回到业务系统 B。
2024-09-07 16:16:16
1726
原创 【mysql】锁机制 - 1.自增锁
自增锁是一种表级锁,在使用自增主键(AUTO_INCREMENT)时,为了保证数据唯一性,在插入数据时,innodb 会对自增字段进行加锁,以确保并发情况下每条记录都能够获得唯一的自增值。如事务 A 正在插入数据,则另一个事务 B 尝试 INSERT 语句,B 会被阻塞住,直至 A 释放自增锁。
2024-08-18 17:19:51
809
原创 【mysql】并发 Insert 的死锁问题:Deadlock found when trying to get lock; try restarting transaction
这样可以控制多个事务锁定资源的顺序,也就是在一个事务中,执行子查询会锁定 pid 所在的行(X锁),直至 Insert 结束,此过程中其他事务不能在对相同行加 X锁或S锁,需等待前一个事务完成后才能继续执行。`,导致事务在计算 display_order 值的过程中,锁定相关行。如果多个事务同时执行插入操作,锁定相同的行,就会导致互相等待的情况,出现死锁。但是不能完全解决问题,当多个并发事务语句中的 pid 相同时,仍会锁定相同行,导致死锁。:使用事务,先执行子查询,获取数据后在同一个事务中执行插入。
2024-08-14 18:39:29
911
原创 【etcd】4.boltdb存储引擎(一):boltdb的核心思想
每个 db 会有个默认的 root bucket,以此为起点可以衍生出一个 bucket B+ 树,每个 bucket 下的数据又是一颗 B+树。freelist page:存储空闲 page 信息,哪些 page 空闲可用,哪些 page 将被事务释放(全局维度,相当于 go 语言中的 heap,以空间换时间,缓存并管理空闲 page 以供复用,减少与操作系统的交互频率)memory-mapping,是内核的一个概念,它隐藏了与磁盘交互的细节,使用方能够像访问内存中的字节数组一样读取磁盘文件中的内容。
2024-06-30 17:39:21
941
原创 【k8s】8.k8s的网络模型(二):Flannel网络模型
flannel 通过该配置可以将网卡的 IP、MAC 信息存储到 etcd 中,这样,flannel 就知道所有的节点分配的 IP 段及 VTEP 设备的 IP 和 MAC 信息,并且所有节点的 flanneld 都可以感知到节点的添加和删除操作,就可以动态的更新本机的转发配置。上述介绍都是基于 VXLAN 实现的 Flannel 网络,VXLAN 适用于三层可达的网络环境,对集群的网络要求很宽松,但是同时由于会通过 VTEP 设备进行额外封包和解包,因此给性能带来了额外的开销。
2024-06-29 17:26:30
1132
原创 【k8s】7.k8s网络模型(一):容器网络接口CNI,VXLAN网络
VXLAN 虚拟可扩展的局域网(Virtual eXtensible Local Area Network),是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络。由于k8s容器的所有流量都会打到网桥上,那么可以直接将 VTEP 设备插到网桥上,容器流量通过网桥发至 VTEP 设备,再经过 VXLAN 网络转发出去。创建在原有的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 VXLAN。)设备,负责 VXLAN 协议报文的封包和解包,也就是在虚拟报文上封装。
2024-06-29 15:29:32
964
原创 【k8s】6.pod控制器(二):pod拓扑分布约束,优先级与抢占,pod驱逐
比如 kubelet 还来不及驱逐,Node 上的资源就被耗尽导致宕机,此时 control-plane 无法正常和该节点通信,拿不到节点上的 Pod 的状态,因此会做最坏的打算,认为这些 Pod 都挂了,因此会将该 Node 上的所有 Pod 都驱逐到其他节点重新跑起来,以保证高可用。node-eviction-rate: 驱赶 Node 的速率,由令牌桶流控算法实现,默认为 0.1,即每秒驱赶 0.1 个节点(注意这里不是驱赶 Pod 的速率,而是驱赶节点的速率,相当于每隔 10s,清空一个节点)
2024-06-23 19:31:32
1253
1
原创 【k8s】5.pod控制器(一):pod生命周期,健康检查,滚动更新,重启与崩溃
又称为控制器,是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。k8s提供几种资源作为工作负载:无状态的:Deployment, Replicaset有状态的:Statefulset守护进程:Daemonset批处理:Job, Cronjob。
2024-06-16 18:47:05
1223
1
原创 【k8s】4.调度器的调度策略:节点选择器,节点亲和性,污点与容忍,pod亲和性
1 节点的调度策略我们可以在node节点上定义的一些规则,来决定上。1.1 节点选择器nodeSelector这是一种较常用也是较简单的方式,将pod调度到指定label的node上,可以满足一般情况下的调度需求。这样pod就会被调度到有对应标签的节点上了。如果找不到任何一个node有nodeSelector定义的标签,pod是会一直Pending的~1.2 节点亲和性。
2024-06-16 17:13:50
1097
原创 【k8s】3.k8s的调度过程:一个deployment的创建过程
deployment controller:监听deployment的创建事件,创建相应的replicaset副本集(控制副本数量)。replicaset controller:监听replicaset的创建事件,创建相应的pod。预选:遍历k8s集群中所有的pod,根据节点亲和性、污点、容忍、硬件资源计算等,选出符合要求的ndoe最为预选node。controller manager监听到etcd中的事件,对于不同的资源,触发不同的处理方式。以上三种接口是k8s定义的标准,具体的实现都是由插件完成的。
2024-06-16 14:59:35
1149
原创 【traefik】traefik性能测试
无论是将业务节点增到6个,traefik节点增到3个,还是增加并发,都不能提升cpu利用率,nginx、traefik、业务pod的cpu都打不满。在12核机器上,单 nginx 节点cpu最多不到3核,单traefik不到2核,每个业务pod不到1核....将traefik服务增加至3节点,业务服务6节点,并对业务服务重新分配节点确保负载均衡,进行测试,发现性能没有明显变化。以下 traefik 服务为单pod,业务服务为3pod,且limit限制4个cpu、2G内存。请求traefik入口。
2024-05-18 15:54:53
1143
原创 !真是一场酣畅淋漓的docker & k8s安装大战
1 环境mac m2(arm芯片)ubuntu 24.04docker 20.10.10k8s 1.23.1(单机)2 离线安装docker 20.10 arm版我这里要指定版本安装,所以用的离线安装方式。阿里docker镜像源在这里找:https://mirrors.aliyun.com/docker-ce/linux/static/stable/完整安装过程:
2024-05-01 04:33:51
2407
2
原创 【traefik】基于k8s搭建traefik, nginx与traefik共存
ingress controller 负责解析 Ingress 的反向代理规则,当它收到请求后就会根据规则将请求转发到对应的 Service。每种边缘路由都有自己的 ingress controller,如 nginx ingress controller。此toml文件是静态的,不会热更新,关于动态配置文件下一篇再聊。检查pod 状态是否正常即可。
2024-04-27 23:16:32
3207
原创 【网络】http2.0
http1.x的传输单位是报文段,http2.0将传输单位切分为更小的帧(报文段的一个数据块),多个帧可以并行乱序发送,根据帧首部的流标识重新组装,提高传输速度。并且通讯双方各自存储一份头部字段表,不需要再重复发送header,如果header发生了变化,则只需将变化的部分加入到header帧中,更新头部字段表即可。服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。对http1.x主要是性能上的提升,且对1.x兼容。
2024-04-27 19:39:04
154
原创 【网络】http & https
服务器申请CA证书:服务器向一个可信的证书颁发机构(CA)申请一个数字证书,包含了服务器的公钥和一些其他信息,并由CA使用其私钥进行签名。客户端生成预主密钥并加密:客户端生成一个预主密钥(Pre-Master Secret),使用之前从CA中提取出的公钥对预主密钥进行加密,将加密后的预主密钥发送给服务器。生成会话密钥:客户端和服务器都拥有了相同的预主密钥,使用预主密钥等信息,计算出会话密钥(Session Key),用于后续的加解密。客户端的CA公钥与CA对服务器提供的公钥进行签名的私钥是一对。
2024-04-27 19:37:27
615
原创 【网络】tcp
接收方收到数据后,会对数据进行同样的校验和计算,并与发送方的校验和进行比对。所以在server发送ACK后,需要等待client的close()信号,表示对方已经确定没有数据传输了,再发送FIN信号。中告诉发送方其当前可用的缓冲区大小,发送方则根据这个信息来调整发送速率,避免发送过多的数据导致接收方无法及时处理。为每个数据段分配一个唯一的序列号,接收方在收到数据后,会向发送方发送一个包含接收到的数据段序列号的确认应答(如果发送方没有收到确认应答,或者序列号不连续,它会重新发送丢失或损坏的数据段。
2024-04-27 19:31:33
677
原创 【数据库】elasticsearch
当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。在创建索引时,可以指定主分片的数量,一旦索引创建完成,主分片的数量就不能再更改。副本分片与主分片分布在不同的节点上,当主分片所在的节点出现故障时,副本分片可以接管主分片的工作,确保服务的连续性。副本是主分片的完全复制,用于提供数据的冗余备份,增强数据的可用性和容错能力。
2024-04-27 19:17:49
604
2
原创 【数据库】mongo
而多键索引主要用于支持包含数组或嵌套文档的字段的查询,它允许数据库系统对数组中的每个元素进行索引。索引大小:非聚簇索引的大小通常取决于索引字段的值和指针的大小。而多键索引可能会增加索引的大小,因为对于每个数组元素,索引条目:非聚簇索引的索引条目是指向数据行的指针和索引字段的值。而多键索引的索引条目是数组元素或嵌套文档本身。索引本身是在高速缓存当中,相比磁盘IO操作会有大幅的性能提升。面向文档 的存储方式(bson),模式自由,不需要字段定义。单字段索引、复合索引、多键索引、哈希索引、文本索引。
2024-04-27 19:11:24
321
原创 【数据库】mysql
同样,如果查询条件包含范围查询,如a=1 and b>2 and c=3,那么索引匹配在b字段上就会停止,因为b字段是一个范围查询,它之后的字段(如c字段)将无法使用索引。一个表可以有多个非聚簇索引,因为非聚簇索引只是数据的副本,并不会改变数据的物理存储顺序。优化查询计划:查询优化器生成一个或多个可能的查询执行计划,优化器会评估每个计划的成本(磁盘/CPU/内存),选择成本最低的。在一个事务内执行相同的查询,但由于其他事务插入了满足其查询条件的新行,导致第二次查询返回了更多的行。
2024-04-27 19:08:07
991
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人