Kubeadm 安装 Kubernetes V1.22.2 踩坑手记
记录一下最近在云服务器上折腾最新版 Kubernetes 遇到的一些坑。
使用 Docker 作为 Container Runtimecgroup 驱动
kubeadm 支持在执行kubeadm init时,传递一个KubeletConfiguration结构体,KubeletConfiguration结构体包含cgroupDriver字段,用于控制 kubelet 的 cgroup 驱动。
注意:如果没有在KubeletConfiguration中设置cgroupDriver字段,kubeadm init会将它设为默认值systemd。
Kubernetes 官方推荐使用systemd设为默认 cgroup 驱动。
特别注意:如果使用Docker作为容器运行时,Docker 默认的驱动类型为cgroupfs,需要修改成native.cgroupdriver=systemd。
编辑/etc/docker/daemon.json文件,修改 docker 的 cgroup 驱动类型
12345{ "exec-opts": ["native ...
上海居住证积分流程梳理
因为一些不重要的原因最近在办上海居住证积分,顺便整理下流程,方便后面其他人可以参考。
居住证就是自己想办法办居住证(因为上海的房东嫌麻烦很少有愿意给办的,但总归有办法。)
积分办理1. 联系你司的相关人事专员,他会帮你通过公司名义在上海人力资源和社会保障公共服务平台上注册你的个人账号并告知你。2. 你通过该账号和对应密码登录上海人力资源和社会保障公共服务平台,然后填写几页个人信息(备注:这上面有两项住址信息,一个是户籍所在地也就是身份证上地址,一个是你办理的上海市居住证上的地址,务必一字不差填对)。
备注: 此处填写的个人经历,如果之前公司社保有代缴或者自己找的代缴,一定要填写实际代缴的公司信息,不然会被打回的(我就是遇到了这个问题!)。具体社保缴费记录可以参考这个链接查看明细:https://www.sohu.com/a/409435421_120209938
3. 填写完成后告知人事专员,让他帮看下有没有问题,有的话做修改。没问题他会告知你按照这个网址上的内容准备材料: http://jzzjf.rsj.sh.gov.cn/jzzjf/pingfen/bszn4.jsp 。因 ...
Redis 知识梳理
数据结构常用的五种类型
String
常用命令
get、set、incr、decr、mget
使用场景
key-value缓存
计数
Hash
redis hash 是一个String类型的field和value映射表。
常用命令
hget、hset、hgetall
使用场景
用户对象信息
List
list 是简单的字符串列表,我们可以在列表的头部或尾部插入元素。
实现方式
双向链表,redis的list的每个元素都是String类型的双向链表
常用命令
lpush(左进)、rpop(右出)、rpush(右进)、lpop(左出)、lrange(获取列表片段lrange key start end)
使用场景
粉丝列表
消息队列
Set
set 是String类型的无序集合,集合是通过hashtable实现的。与数学中的集合类似,redis 中的集合可以取交集、并集、差集等。因为set中的元素是没有顺序的,所以对 set 的添加、删除、查找的复杂度都是O(1)
实现方式
Set内部实现是一个 value 永远为 null 的HashMap。
...
Kafka 知识梳理
kafka 是一种高吞吐量,分布式,基于发布/订阅的消息系统。
特点
吞吐量高、延迟低
每个topic可以支持consumer group(多个consumer)对partition进行操作
扩展性好
集群支持热扩展
持久性、可靠性好
消息数据是被持久化到本地磁盘的,并且支持数据备份
高并发
支持千级别客户端同时读写
核心概念
Broker
kafka 服务器,负责消息存储和转发
Topic
消息主题,用于分类消息
Partition
topic的分区(sharding),每个topic可以有多个partition,对应topic的消息保存在这些partition上,单partition的消息是有序的。同一个topic的多个partition不保证有序。
Offset
消息在partition上的位置,也表示消息的唯一序号。
Producer
消息生产者
Consumer Group
消息消费者consumer的组
Controller BrokerKafka使用Zookeeper保存了集群的broker、topic、partiti ...
类微博/微信朋友圈 feed 流系统设计
写扩散(push)
为每个用户维护一个订阅列表,记录该用订阅/关注的用户的消息的索引(一般为消息ID、类型、发布时间等基础数据)。
读扩散 (pull)
为每个用户维护一个发送列表,记录这个用户所有发布的消息索引。
混合模式 (push + pull)
使用场景写扩展更适用于粉丝/好友低于某个阈值的场景,比如刘亦菲子微博有将近7000万粉丝,如果采用写扩散的方式来做,那么每当她发布一条微博就会产生将近7000万条队列消息,试想一下如果有100个相同体量的微博博主,每天每个人发布一条微博就会产生7亿条队列消息,对消息系统的压力是巨大的。
同样的,读扩散则更适用于粉丝/好友高于某个阈值的场景。
在一个庞大的类微博 feed 流系统中更合适的场景应该是基于某个阈值,同时使用读扩散和写扩散来实现内容的发布和拉取。
缓存feed list 缓存可以使用 redis 的 zset 结构存储
1zadd user_id 1618035919 creator_id:feed_id
「牧羊少年奇幻之旅」读书笔记
读书是一遍遍的走向未来,又一遍遍的回到过去。– @吴伯凡
第一次接触这本书是源于听喜马拉雅的一档电台节目,《东吴同学会》第二季的最后一期节目的最后,吴伯凡老师简单讲了这个少年的故事,推荐了这本书。吴老师说你不受梦想的蛊惑、不向未来出发,你是不知道自己起点的价值,
这本是关于信仰和天命的书,讲的是一个从小就不甘于平凡、向往外面的世界的少年在梦境的指引下,放下了自己熟悉的大草原和羊群踏上寻找宝藏以及寻找宝藏经历生死一路成长的故事。读这本书,每个人可能都能Get到自己深思的点。
在如今浮躁的大环境里,我们都在为生活/生存耗费了大部分的精力,连安静的坐下来读会书都很难(ps:我说我自己)。但在读这个故事的时候会发现自己这一路成长着实和牧羊少年有些相像,牧羊少年在寻找宝藏的过程中找到了自己内心心爱的女人,学会了很多东西,对人世间的事有了很好的观察与了解。自己何尝不是如此,当你认识越多的人、见到更多的物、读过更多的书、走过多一些的路,你会发现自己的心气是有变化的,你不会固执的以为自己所有的观点都是对的,你慢慢会学着倾听他人表达的想法,也会学着换个角度思考问题。也许就是罗翔老师说的那句 ...
(手机/相机)摄影方法论
好的照片
明确的主题
主体突出
画面简洁
光的应用
侧光
有立体感
逆光
剪影
黄金时间
日出后两小时内
日落前两小时内
室内
靠近窗户或打开室内灯(台灯)
手机闪光灯
1-1.5 米内使用
背景要有一些亮度,不然只有主体很亮,没有层次感。
手电筒做光源
构图
点构图
中心点构图
画面主体放在中心点
三分点构图
画面主体放在三分点
线构图
对称线构图
沿画面的水平或者垂直中线构图
三分线构图
画面的水平或垂直元素安排在三分线上。
注意:水平三分线构图要留意强调的部分,垂直三分线构图拍摄任务注意人物的朝向
对角线构图
利用照片对角线进行构图,有延展感,视觉冲击
注意事项:建议把画面主体聚焦在三分点上
曲线构图
利用自然存在的曲线或者认为只在的曲线进行构图
引导线构图
利用画面中的线条,把观众的目光吸引到画面主体上
注意事项:引导的主体建议处于画面中心点或者三分点
黄金分割构图
新手不建议使用,掌握好三分线构图就好
面构图
前景构图
在画面中加入前景
注意事项:前景和画面主题要有一定联系
框架构图
把例如门、窗等框架作为一种前景 ...
分布式架构中的”一致性“
一致性什么是 CAP
Consistent
一致性
同样的数据在分布式系统中所有地方都是被复制成相同的。
Available
可用性
所有在分布式系统活跃的节点都能处理操作且响应查询。
Partition Tolerant
分区容错性
在两个复制系统之间,如果发生了计划之外的网络连接问题,有一套容错性设计来保证。
CAP 是分布式系统中进行平衡的理论。一般情况下,CAP 理论任务你不能同时拥有上述三种,只能同时选择两种。
数据一致性
复制是导致出现数据一致性问题的唯一原因
强一致性(线性一致性)和弱一致性
强一致性
系统中的某个数据被成功更新后,后续任何对于该数据的读操作都将得到更新后的值。简而言之就是,在任意时刻,所有节点的数据是一样的。
写时复制,复制是同步的。主库需要等待从库的确认,确认从库已经收到写入操作。
缺点是,保证了强一致性,必然会损耗可用性。
弱一致性
复制是异步的。不需要等待从库响应。
半同步概念使一个从库保证和主库是强一致性,其他从库保持弱一致性。如果强一致性从库出现问题,则使另一个从库和主库保持强一致性。这样可以确保永 ...
「深入学习 Golang」之 切片(slice)、数组(array)
数组
数组是由相同类型元素组合成的数据结构,计算机会为数组分配一块连续的内存来保存其中的元素。我们可以利用数组中元素的索引,快速访问元素对应的存储地址。
Go 语言中数组在初始化之后大小是无法改变的。
存储元素类型相同,但大小不同的数组在 GO 语言中是完全不同的
创建123arr1 := [3]uint64{1,2,3} // 显示指定数组大小arr2 := [...]uint64{1,2,3} // 在编译期间通过源码对数组大小进行推导
如果数组中元素个数小于或等于4个,那么所有的变量都会直接在栈上初始化;如果数组元素大于4个,变量就会在静态存储区初始化然后拷贝到栈上。
访问和赋值数组在内存中就是一连串的内存空间,表示数组的方法是一个指向数组开头的指针、数组中元素的数量以及数组中元素类型站的空间大小。
如果我们不知道数组中元素的数量,访问时就可能发生越界,数组访问越界是非常严重的错误。
对数组的访问和复制需要同时依赖编译器和运行时,它的大多数操作在编译期间都会转换成对内存的直接读写,在中间代码生产期间还会插入运行时方法panicI ...
「深入学习 Golang」之 GPM
相关术语runtimeruntime在 Golang 程序中很重要,runtime包含了调度、内存、垃圾回收、内部数据结构、定时器和各种系统调用的封装等。
schedulerscheduler是指调度器,主要工作是将准备好运行的Goroutine分散到工作线程中执行。
TLS(thread local storage)TLS代表每个线程中的本地数据,每个线程写入 TLS 的数据相互独立互不影响,Golang 的协程非常依赖 TLS 机制。TLS 里会存储当前线程中的Goroutine和其所属的Machine实例。
spiningspining表示重复某块代码。
systemstack、mcall 或 asmcgocallTODO 这个没看懂。。。。。。
调度模型(GPM)线程模型Golang 中的goroutine和go scheduler的底层实现都是属于两级线程模型
KSE是操作系统本身内核态的线程的简称(Kernel Scheduler Entities)。
我们现在的计算机语言,可以狭义的认为是一种“软件”,它们中所谓的“线程”,往往是用户态的线程,用户态线程和操作系统 ...