tailscale的设置与安装
先说一下整体的环境和安装方式 pve虚拟机专门开了一个lxc容器,用于安装tailscale,并利用此容器转发流量到局域网内的其他机器上,实现外部访问内网所有机器 由于tailscale本身的中转服务器derp没有中国的节点,测试了一下最近的节点是位于东京的,所以此处选择自己搭建一个中继节点 下面描述一下安装步骤, 总共分为几大步: 使用pve的lxc安装tailscale,并设置转发 搭建自定义的tailscale中继服务器 tailscale网页端配置 PVE LXC安装tailscalelxc模板使用的是Debian 11(bullseye)。 创建一个非特权的CT容器, 模板选择Debian 11(bullseye),其他配置都使用默认配置(网络那儿最好选择DHCP,让路由器自动分配一个IP) 安装完成后, 先不要启动,需要修改一些配置 在pve宿主机中,获取信息, 执行命令和返回结果如下, 记录 10, 200 这两个数字, 后面需要用到 12root@pve:~# ls -al /dev/net/tuncrw-rw-rw- 1 root root 10,...
go中获取某个包下定义的所有变量
有这样一个场景, 我们在e这个包下, 有一个err_code.go文件,在其中自定义了一个错误码结构体和一些错误码,内容如下: 1234567891011package etype ErrCode struct { Code int Msg string}var ( Success = ErrCode{Code: 10000, Msg: ""} UnknownErr = ErrCode{Code: 10001, Msg: "未知错误"} InvalidParams = ErrCode{Code: 10002, Msg: "参数不合法"}) 现在我们想获取到所有这些预先定义的错误码的code,应该如何做呢? 可以借助go标准库中AST语法树的能力遍历所有变量,然后过滤得到我们想要的变量类型, 具体代码如下: 1234567891011121314151617181920212223242526...
mysql是如何解决不可重复读和幻读的
Mysql的默认隔离级别是可重复读。并且在该级别下, 也不会出现幻读(一般意义上的可重复读是存在幻读的), 那么Mysql是如何实现的呢? 不可重复读的解决方案 不可重复读定义:在同一个事务中, 前后两次相同的查询, 返回的结果不一样, 针对的是 update 的操作 结论:通过使用MVCC实现不可重复读。 每个事务在开始的时候, 都会创建一个递增的当前事务版本号。 mysql中每条记录都有两个隐藏字段:创建版本号create_version和删除版本号delete_version。 当记录被insert的时候, 创建版本号就是当前事务的版本号, 删除版本号为null 当记录被delete的时候, 将删除版本号设置为当前事务的版本号 当记录被update的时候, 先进行delete,然后再进行add 对于update的操作, 举例说明一下, 假设刚开始的表数据如下: id name create_version delete_version 1 小明 1 NULL 2 小红 3 NULL 现在要执行如下sql, 假设执行此sql的事务版本号为10: up...
一致性哈希算法解读
首先理解一下哈希函数的意思。 哈希函数 将任意长度的数据映射到有限长度的域上。 本质是对一段数据m进行杂糅,然后输出另一段固定长度的数据h,并将这个h作为这段数据的特征值。 基本原理就是将数据块m分成多段,每一段长度固定(如128位),若某段长度不足,则进行补位(如0或者1),然后对每一块都进行hash运算,再将这些数据进行迭代(比如相邻两段进行异或),最终得到一个数据。 普通哈希取模先来看一下普通哈希取模是什么样的? 1c = hash(key) % n 其中n为节点数目,计算得到的c为对应的节点编号。 假设现在总共有A,B,C三台服务器节点, 现在对某个key值哈希之后得到的值为5, 则c = 5 % 4 = 1, 表示该值存储在B节点上。 现在若需要增加一台服务器节点D,则此时c=5 % 5 = 0,表明该值存储在A服务器上,前后就会出现不一致。 这样当出现服务器新增、删除、宕机的时候,这样就会请求后端数据库,造成缓存穿透。因此普通的哈希取模定位key所在的服务器的方法会有问题。 综上, 普通哈希最大的缺点就是在扩容或缩容的时候,...
mysql事务详解
以下都是针对InnoDb引擎, 描述的都是单机事务,说明一下个人对事务的一些理解。 事务的四大特性这四个特性并不是平级的关系。准确的说, 一致性是最基本的属性,其他的属性都是为了保证一致性而存在的。 Atomicity 原子性 整个事务是一个整体,是程序运行时不可分割的最小工作单位。 一个事务中的所有操作要么全部执行成功,要么全部都不执行。任何一条语句执行失败,都会导致事务回滚。 实现方式:undo log,当执行失败的时候,使用undo log进行回滚。 Isolation 隔离性 一个事务所做的修改在该事务未提交之前,对其他事务不可见。 为什么会出现隔离性的需求? 本质是因为并发, 试想一下, 如果没有并发,所有事务都是串行执行的,那么也就不会存在隔离性的问题了。所以mysql提出了隔离级别的概念, 针对不同的隔离级别,进行不同的处理, 这在下文的隔离级别会有详细描述。 那么, 如何解决并发造成的数据一致性问题? 第一个想法自然是加锁,给数据加锁,相当于让各个事务串行执行,自然就不存在数据一致性的问题了。同时为了提高加锁的效率和粒度,mysql针对锁提出了不同的类别,...
常用正则表达式总结
正则表达式语法 字符 说明 ^ 匹配字符输入的开始 $ 匹配字符输入的结束 \d 数字字符, 等效于[0-9] \s 匹配任何空白字符,包括空格、制表符、换页符等 \S 匹配任何非空白字符 {n} 正好匹配n次 {n,} 至少匹配n次 {n, m} n<=m, 匹配至少n次,至多m次 () 标记一个子表达式的开始和结束位置。子表达式可以供以后使用 * 零次或多次匹配前面的字符或子表达式, 等效于{0,} + 一次或多次匹配前面的字符或子表达式,等效于{1,} ? 零次或一次匹配前面的字符或子表达式,等效于 {0,1} . 匹配除”\r\n”之外的任何单个字符 | 或的关系 \un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 \w 匹配任何字类字符,包括下划线。与”[A-Za-z0-9_]”等效 [\u4e00-\u9fa5] 匹配中文字符 常见示例以Java写法为例, 其他语言类似: 123456789101112131...
还是阳了
还是记录一下为好。时间是2023年5月17号, 我终于还是阳了。 5月17号早上起来的时候, 就感觉头很疼,还以为是昨天晚上吹空调导致的,但是后来越来越疼,于是买了个体温计和检测试剂,不出所所料,确实阳了,当时的体温是38.9度。 前后总共持续4天左右, 除了头疼和发烧, 其他的症状到还好, 但是这个头疼真的很难受,是既不能睡又不能不睡。 之前疫情三年一直都没阳过, 包括最后解封的时候, 我周边的同事都阳了, 就只有我没阳, 还以为自己体质很好(其实我的体质确实感觉还行, 已经有七八年没去过医院,吃过药了,最近的一次生病我记的应该是高中的时候吃东西吃坏肚子)。 但最终还是没躲过去。
红米AC2100 openwrt下无法进入breed
之前的红米路由器AC2100刷的是openwrt,想换回pandavan,使用如下方法无法进入breed的web页面: 先断电,然后找个针戳住路由器背后 Reset 小孔并插电,等路由器蓝灯一直闪烁后,浏览器输入 192.168.1.1,即可进入 breed 网页。 现象是路由器的system一直闪黄灯,突然想到之前刷openwrt的时候, 刷入了官方的bootloader, 所以自然无法进入。下面介绍一下在openwrt的系统下,如何刷breed的bootloader。 在openwrt的web页面,将breed的固件breed-mt7621-xiaomi-r3g.bin上传到/tmp路径下(其他路径也可以),然后ssh进入路由器命令行, 执行 如下命令: 12cd /tmpmtd_write -r write breed-mt7621-xiaomi-r3g.bin Bootloader 之后重启路由器, 登录192.168.1.1就ok了。 上面的操作有一点需要注意,openwrt下ssh的默认用户名和密码, 网上找了半天都没找到(如果有人知道,可以留言告诉我...
从alpine编译nginx的docker镜像
因为需要接入nginx监控,用的是vts模块,原生nginx并没有包含该模块,原本想着用别人已经编译好的, 但是一想后期可能还需要加入其他的模块,所以还是自己编译一个。 下面说一下具体的步骤。 编写dockerfile文件此处用的几个主要软件版本: alpine: 3.17 nginx: 1.22.1 nginx-module-vts: 0.2.1 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748FROM alpine:3.17ENV NGINX_VERSION nginx-1.22.1RUN echo https://mirrors.aliyun.com/alpine/v3.17/main/ > /etc/apk/repositories && \ echo https://mirrors.aliyun.com/alpine/v3.17/community/ >> /etc/apk/repositoriesR...
hexo主题使用css添加网格背景
给hexo的博客添加一个网格背景, 此处不想使用图片, 而是直接使用css来实现,效果图如下: css文件内容如下(文件名background.css): 12345body { background:white; background-image:linear-gradient(90deg,rgba(241,243,244,1) 10%,transparent 0),linear-gradient(rgba(241,243,244,1) 10%,transparent 0); background-size:15px 15px;} 为了各个hexo主题都能通用, 此处使用hexo提供的注入功能将css注入到博客中。 在博客根目录下新建一个scripts文件夹, 然后在该文件下新建一个js文件(命名随便都行),复制如下代码: 1hexo.extend.injector.register('head_end','<link rel="stylesheet" type="text/css&...




