- 博客(45)
- 收藏
- 关注
原创 个人网站搭建
说明:这篇文章是在这篇文章的基础上写的。就是说基础组网、如何使用https协议、网关服务器nginx转发等在gitlab线上发布中已经包含了。现在是修改原配置,添加新服务。
2025-09-24 14:21:57
730
原创 go 持续集成、持续部署之gitlab流水线+docker-compose踩坑之旅
go docker-compose对比开发环境配置的生产环境配置优化-优快云博客。接下来,我们期望打包、部署配置在gitlab pipeline中运行,实现持续集成、持续部署。web-framework不需要main.go使用,但构建要求必须提供main.go,不然报错。
2025-09-23 17:42:50
875
原创 go docker-compose对比开发环境配置的生产环境配置优化
这篇文章对比配置完开发环境,写的生产环境配置的优化项。核心目标是减小镜像体积,提高安全性,解决开发环境配置切换为生产环境配置出现的问题。go docker-compose启动前后端分离项目 踩坑之旅-优快云博客。
2025-09-10 17:40:38
924
原创 go docker-compose启动前后端分离项目 踩坑之旅
解决方案:数据卷不能写E:/goland/testdata/redis_data,要写/E:/goland/testdata/redis_data。注意:我把git安装在/usr/local/git/bin,如果goland提示git找不到,可以configure修改一下文件路径。说明:这部分信息仅作为踩坑记录,这次我失败了。虽然扩容成功,但虚拟机变得不能用了,无法上网和ssh连接,我找不到问题在哪里。最终,我选择了重新创建一台centos7虚拟机,一开始就给了8G内存,4核,100G的硬盘空间。
2025-09-07 15:22:39
852
原创 go 开发环境配置 air + dlv debug 踩坑之旅
开启远程调试后,delve会以“服务端”模式运行(–headless)并监听指定端口(–listen=:2345),即使被调试的进程重启,调试工具仍能保持服务状态,等待新进程连接或重新附加。PID(进程ID)是操作系统为每个运行中的进程分配的唯一标识,每个新的进程PID都是唯一且不同的。,原来的dlv attach就失效了(因为dlv attach是通过PID绑定到特定进程的),需要重新配置dlv attach。原来我本地开发就是运行项目,改了代码,然后重新运行(关闭原来的程序)。
2025-08-31 16:55:24
890
原创 gitlab私有化部署 项目迁移踩坑之旅
注意:centos7 当前状态是防火墙(firewalld)关闭状态,如果此时开启firewalld,录入规则会被重置掉;*: iptables配置后立即生效,持久化需要单独配置:iptables-save > /etc/sysconfig/iptables。注意:不能使用网关服务器的22端口转发,网关服务器的22端口需要用来登录网关服务器,不能占用。如图,因为网关服务器没有公钥,又没配置ssh转发,所以无法识别。注意:阿里云ECS安全组是实例级别的控制,防火墙是实例内的控制,这两个都需要配置;
2025-08-12 16:02:48
1094
原创 centos7 个人网站搭建之gitlab私有化部署实现线上发布
自动申请和配置免费的 SSL 证书,实现网站的 HTTPS 加密访问。如果python3-certbot-nginx插件下载失败了,就尝试问AI进行手动配置。原因:域名绑定IP时,大陆服务器需要备案,试用机器不支持备案。注意:过程中需要一些认证、审核,比如注册局审核,一般等待几分钟就能收到成功短信。问题原因:.conf文件名称不是域名。centos7 gitlab 申请域名 绑定云服务器。注意:免费证书有数量限制,7天内同一域名最多申请5个。个人域名下可以访问私有化部署的gitlab账号。
2025-08-05 13:20:03
628
原创 centos7 gitlab私有化部署搭建 踩坑之旅
由于我只是学习使用,那就这样吧(…可视化编排支持能力有限,比如邮件不能发送到qq邮箱,指定分支代码提交commit包含关键字打tag也不支持,自定义脚本想做这件事也遇到许多问题:指定镜像跑脚本失败,不知道是为什么,日志也输出失败;指定端口是否会阻塞gitlab其他服务的运行,如gitlab中的puma运行在8080端口,如果指定访问端口是8080,会阻塞puma服务,导致服务无法运行。我没有选择docker安装,因为docker安装每次要启动,而且由于我用docker做实验,常清空镜像和容器,容易误操作。
2025-08-04 13:17:17
822
原创 centos7 安装docker docker-compose
当前用户没有加入用户组,不加sudo(变root),是看不了doker server信息、跑不了docker server命令。* 网盘资源来源于网络,此文章记录使用步骤、踩坑。centos7官方不再维护,需要调整下。* 登出前确保你知道账号密码。
2025-07-25 16:11:12
596
原创 ubuntu 安装docker
:docker资源在国外,访问慢(无法访问),安装镜像加速器加快资源访问;有vpn可以不装加速器,这里只给了阿里云的镜像加速器;我测试时,阿里云镜像用不了,https://docker.xuanyuan.me/这个能用。镜像加速器不能用也可能有别的原因,比如防火墙开着,不允许通过;当前用户没有加入用户组,不加sudo(变root),是看不了doker server信息、跑不了docker server命令。镜像加速器可以多配几个,有的可能有时候用不了;由于镜像加速器不太好用,我就买了vpn。
2025-07-25 14:59:51
887
原创 ubuntu 开启ssh踩坑之旅
若为inactive,表示未开启仅应用底层规则,相当于允许所有端口通过;我当前是一个普通用户,需要使用sudo命令;ubuntu中没有sshd命令,只有ssh,指的就是sshd。注意:错误信息是参考,比如密码错误日志不一定是密码错误。实时查看日志,尝试连接时此处会实时打印相应日志;如果修改过密码,命令。更新系统安装包列表,没有更新安装包。若开启防火墙了,需要允许ssh端口通过。// -y 表示所有的问题选yes。// 更新系统软件包列表和源信息。需要先输入当前密码,再设置新密码。// 设置密码(普通用户)
2025-07-17 13:41:14
649
原创 mysql 散记:innodb引擎和memory引擎对比 sql语句少用函数 事务与长事务
隐式字符编码转换,比如:t1的字符集是utf8mb4,t2的字符集是utf8;长事务会导致undo log很大,innodb_undo_tablespaces = 2(2个独立的表空间文件), 方便回滚清理。读(select …查询语句定义的虚拟表,相当于持久化的查询语句别名。如果调用时函数作用在参数上就不影响索引选择,但函数作用在列上,就会导致索引失效。时只是做了记录,到执行第一条读写语句时才真正开启事务,分发事务ID。innodb引擎是索引组织表(B+树),memory引擎是堆组织表(数组)
2025-07-11 18:20:30
705
原创 mysql 数据备份与数据恢复
在start slave之前,先执行change replication filter replicate_do_table=(tbl_name),让临时库只同步误操作的表;如果时间过了太久,线上备库没有完整的binlog,我们可以把缺的binlog从binlog备份中找到塞到线上备库里,然后建立主备关系。注意:mysqldump是单线程的、而且回放binlog时不仅只回放这个表而是全部,所以会比较慢。在从binlog中取出0点后的日志,应用误删数据前的日志和误删数据后(找对应的GTID)的日志。
2025-07-11 16:43:14
328
原创 mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
后来引入online DDL:插入临时表时,记录操作日志到row log中,重建表完成后重放,此时重建表是在引擎层(inplace)完成的 // 不需要重建整个表,二十在原表数据文件上直接修改。为了防止数据丢失:sync_binlog=1,innodb_flush_log_at_trx_commit=1 事务提交立即写盘(redo log与binlog 配置 “双1”)。0关闭,SSD(固态硬盘)不用开,因为SSD刷的快,不开可以减少sql语句执行等待的时间。共享空间中,即使删表,空间也不会回收。
2025-07-11 16:26:10
594
原创 mysql中的自增ID
id=10, auto_increment=11,如果这时删除id=10的数据,auto_increment=11,如果此时插入数据,新数据的id=11(// 注意:表中id不是连续的);select不像insert…用完会重置到0,但mysql分配线程ID时加了逻辑限制要求唯一:重置0之后,mysql会遍历thread_id_counter,直至找到一个没有被正在用的thread_id,分配给新线程。也有步长是2的情况,比如双主的主备结构,一个机器的自增ID用奇数,一个机器的自增ID用偶数,步长都是2。
2025-07-11 16:23:27
748
原创 mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
由于join buffer优化,导致被驱动表被多次扫描,就算lru 有young区、old区,热数据也有被顶掉的风险。所以慎用BLJ,最好在被驱动表上建索引,如果仅临时操作一次,建索引比较浪费,可以考虑使用临时表。按照MMR的思路,NLJ本来是从t1一条一条取数据去t2 a索引上找的,我们可以每次多取点(看join buffer的大小)到join buffer上排个序再一起MRR,去a索引上找。增加old区,因为全表扫描的冷数据不会变频繁访问,所以一般就在old区,对young区正常业务的缓存影响减小。
2025-07-10 19:52:55
877
原创 mysql 可用性的保障机制:主讲主从复制机制
同时,控制binlog_group_commit_sync_delay、binlog_group_commit_sync_no_delay_count 多攒点binlog一起提交,通过延迟,增加并发量。两个主节点,你复制我的日志,我复制你的日志,但怎么区分出来我复制你的日志是你执行了的的新日志,不是我传给你的我的日志呢(我不需要复制我的日志,循环复制)不过有个问题:一组事务这个粒度很大,而且同时只有一组事务committing完成在从库复制,要等这组复制完再进行下一组的复制,有空白期,并发能力不够。
2025-07-09 23:40:14
963
原创 mysql 故障检测与处理
一主多从,主库A挂了,找出新的主库B后就要同步位点。因为原来节点B也是A的从库,本地记录的A的位点。但相同的日志,A的位点和B的位点是不同的。比如:延迟从库被选为新主库,就会在主库删除数据宕机后,其他库的数据比延迟从库多,就会报错停下来需要人工处理,判断一下是误删还是正常删除再恢复主从关系。如果B在算差值时,发现有从库需要的日志但在B上没有,认为有问题,直接返回错误:Slave has more GTIDs than the master。一主多从,主库A挂了,找出新的主库B后就要同步数据(主从切换)。
2025-07-09 23:35:14
681
原创 mysql count(*)、order by、group by的执行逻辑
针对方案二,随机取三个字段就是:随机个最大、最小行数(N最小,M最小,R中间),取出limit N, M-N+1这些行,在里面拿出这三行数据。sort buffer大小(sort_buffer_size)不够,就需要存到磁盘上,存在多个文件中,多个文件分别完成排序后再进行归并排序。对于只需要几个返回值,不需要全量排序,innodb使用优先队列算法,扫描所有数据和堆上的数据对比,堆上只放最大的三个。问题:主键ID不连续,可能有空洞。而且随机概率不平均,比如ID排布 1,2,3,8,9,4000,40001。
2025-07-09 16:08:18
665
原创 mysql 索引
change buffer主要节省的是写操作时需要随机读磁盘的IO消耗,redo log主要节省的是写时需要随机写磁盘的IO消耗(转为顺序写)。唯一索引找到就返回,普通索引找到下一个不满足的就返回,所以普通索引比唯一索引查找次数的多。当name,age都需要独立索引,还需要联合索引时,推荐创建age单独索引,(name, age)联合索引。二级索引的叶子节点上存这主键索引,主键索引越小(比如int < varchar),二级索引的检索效率越好。原则:尽可能少的创建索引,索引(数据块*)的大小尽可能小。
2025-07-08 20:58:46
628
原创 mysql中的锁
同时当前线程也只能读t1,不能写t1,可以写t2;执行alter table t add c int写操作前,判断前面是否有长事务(大查询),选择一:等待长事务执行完成;此时,整个表不能读写,等待sessionA、sessionB的完成;如果需要写热点表,虽然数据量不大,但请求频繁,需要设置任务超时时间,改不了也不要影响其他语句,等有空再改;超时时间不好设置,太短容易误伤业务,太长也不好,都等待很长时间,都没执行 //mysql中的锁:全局锁,表锁、元数据锁(MDL),行锁、间隙锁等。
2025-07-08 19:00:05
1329
原创 mysql 一条语句的执行流程
write_pos是当前记录的位置,write_pos到check_point的绿色部分还能写入,其余位置是新的写入。复用连接的问题(长连接问题):连接在断开时才会释放占用资源,而不是用完就释放;在流程图的时机B崩溃:redo log处于prepare状态,写入binlog完成:服务重新启动时,认为事务提交成功,回放事务,将redo log prepare状态改为commit。在流程图的时机A崩溃:redo log处于prepare状态,未写入binlog: 服务重新启动时,认为事务提交失败,回滚事务。
2025-07-08 17:31:20
833
原创 go web框架实现与使用
Server定义、路由树、context上下文、AOP方案(Middleware)、静态资源服务与文件处理、页面渲染template、Session、优雅退出。测试代码:web/test/graceful_shutdown_test.go 注意:该代码必须放在main函数下运行,test文件下无法监听到退出信号。支持路由:静态路由、参数路由(/a/:id)、正则匹配、动态路由(通配符 /a/*),路由命中优先级按照前面的顺序。测试代码:web/test/server_route_test.go。
2025-06-19 00:37:34
1033
原创 go orm框架 支持分库分表查询
ORM框架支持基于Builder模式构建SQL查询,利用reflect与unsafe技术处理结果集,同时具备元数据维护、中间件集成、链式调用、事务管理和分库分表查询能力。duplicateKey语句: on conflict columnName do update set col1=exclued.col1。duplicateKey语句:on duplicate key update col1=values(col1)维护数据结构(如User)和数据库中相应表、字段的关系。quoter -> 双引号。
2025-06-18 22:34:59
672
原创 go 并发队列、优先级队列、延迟队列
好处:b.queue = b.queue[1:]会引起内存频繁分配,ringBuffer复用固定资源。等待时使用for,而不是if // 广播唤醒多个,但只有一个抢到了锁,其他需要重新等待枪锁。好处: ringBuffer使用固定内存,可能实际不需要,链表支持动态连接。ringBuffer比链表的优势:支持复杂操作,如随机访问。由于sync.cond没有超时控制,所以自行设计cond。ringBuffer替代[]*T。链表替代ringBuffer。使用cond进行超时阻塞控制。
2025-06-17 15:17:28
595
原创 go 服务注册与发现
注册中心连接不上服务端会进行重试,若多次重试连接不上,就认为服务端挂了,通知客户端。可能是因为客户端和服务端中有防火墙,当服务端连接不上时,客户端需要从本地的可用节点列表中移除相应的服务实例;从可用性的角度考虑,客户端继续服务,并尝试重新连接注册中心,这段时间使用缓存数据。若是服务端主动续约,没有心跳的情况:取决于租约超时时间和注册中心租约超时重试机制。从一致性的角度考虑,客户端立即终止服务调用,直到与注册中心恢复连接。若是注册中心主动与服务端保持心跳的情况:取决于心跳重试的次数和间隔。
2025-06-09 19:55:14
1025
原创 go 连接池
在简单tcp服务中,每次请求耗费一个连接net.dial()。所以我们可以考虑复用连接,实现连接池。说明:仅简单测试,未提供完备测试用例。
2025-06-09 14:29:54
273
原创 go 缓存
一般情况下,击穿不会有问题,访问一次db就能回写redis;key数量超大时,需要限制,比如限制轮询key的个数或者轮询时长。问题:定时轮询不能访问到所有key,所以有过期key没处理,不能单独定时轮询。大量goroutine同时访问一个key时,singleflight会让其他的原地等待,只有一个访问db。存在第三方比如bloomFilter,先确认db上是否hasKey,存在再请求db。穿透:大量不存在的key访问redis不存在,打到db上。击穿:key不在缓存中,但在db中。
2025-06-03 16:32:31
409
原创 go 任务池
任务池用来管理并发任务,没有任务池面临的问题:并发任务来一个开一个goroutine。无缓冲缓冲小了会阻塞任务提交;缓冲过大会导致资源浪费。快任务、慢任务分开放在两个任务池中配置、处理。// 这篇文章我喜欢他的场景示例和数据对比。task pool中task介绍。// todo: 压缩图片上传。
2025-05-30 13:43:30
400
原创 go 消息队列 涉及channel、ring buffer
文章主要是针对消息队列的思考,消息队列核心实现使用了channel、ring buffer和map结构。文章开篇介绍了channel的实现原理,然后是对消息队列的分析与实现,其中消息缓冲使用ring buffer存储,所以在文章第三部分介绍了ring buffer。
2025-05-29 15:33:19
381
原创 go 文件上传系统
文件上传系统是前后端分离项目,实现普通文件上传、大文件分片上传功能;大文件分片上传提供断点续传、并发上传等能力,通过分片md5、文件md5验证完整性。
2025-04-28 09:58:56
315
原创 go 用户身份认证的核心机制
readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/single_sign_on/readme.md。readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/oauth2/readme.md。readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/sso/readme.md。
2025-04-08 10:12:52
308
原创 单点登录&OAuth2.0
在多系统共存环境下,一个系统登录后,其他系统无需登录;即一处登录后获得所有系统信任。全局独一份内容,比如是否登录存中央session中;个性信息存在自己的服务中。说明:此处代码实现分别存储session的sso。多设备指手机、笔记本、电脑等,需要分别登录。负载均衡、熔断限流、来源验证 // 最好网关做。鉴权:是合法用户的你有哪些权限。
2025-04-02 17:11:11
467
原创 Cookie、Session和Token的关系和区别
Cookie是服务端发送给浏览器并储存在本地的一小段文本数据(通常<=4KB),浏览器后续请求自动携带该数据回传服务端核心作用会话跟踪:记录用户行为,如购物车商品身份认证:存储用户登录后的身份标识,如session_idSession是服务器为每个用户分配的唯一会话标识,存储用户登录状态或临时数据与cookie的关系服务端通过Cookie将session_id返回客户端客户端后续请求携带该id,服务端通过该id从内存或数据库中查找对应的会话数据为什么需要Session。
2025-04-02 16:58:17
530
原创 go 微服务架构
比如缓存模式下,正常情况下,缓存中查不到就查询数据库;当触发限流后,缓存中查不到可以返回默认值或错误。可以结合failover考虑,返回客户端302重定向,让客户端重新找一个可用节点。当触发限流后,服务接收到请求直接返回202,再异步处理请求。触发限流后直接返回固定响应这一步可以在服务拦截器里实现。故障检测触发限流,限流缓解故障影响、检测优化限流策略。微服务框架服务于微服务架构,核心:通信、治理。漏桶、令牌桶、固定窗口、滑动窗口。go 微服务框架-广播实现讲解。分而治之,独立部署、治理。
2025-03-20 18:36:45
444
原创 go 代码生成技术
编译器地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4下载 win-64版本,把bin文件夹的路径放到环境变量path下相关教程:https://blog.youkuaiyun.com/weixin_51952373/article/details/123098967命令:go install github.com/golang/protobuf/protoc-gen-gogitee: https://gitee.com/luyue_
2025-03-17 14:59:24
438
原创 go 原子操作、加锁、MVCC多版本并发控制
MVCC是Mysql InnoDB用于进行数据并发访问控制的协议。MVCC主要是通过版本链实现的。在InnoDB引擎里面,每行都有额外两列:trx_id和roll_ptr。trx_id表示修改该行数据的事务ID。roll_ptr表示回滚指针。InnoDB引擎通过回滚指针将不同版本串联起来,构成版本链。这些串联起来的历史版本,存在undolog里面。当某一事务发起查询时,MVCC会根据事务的隔离级别生成相应的read view, 返回合适的数据。
2025-02-26 11:15:10
586
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅