- 博客(20)
- 资源 (2)
- 收藏
- 关注
原创 带着问题撸源码系列-zookeeper-index
带着问题撸源码系列-zookeeper-源码调试选举过程 附mac环境搭建带着问题撸源码系列-zookeeper-客户端怎么给sever发请求
2020-05-13 11:53:17 206
原创 mybatis uuid主键 auto_increment列 回显id keyGenerator
背景使用tk.mybatis,原来线上用的uuid主键,业务需求新增一个自增的索引列之后,调用insert插入方法,会将传入的对象的id回显;期望的是回显主键uuid,但是实际上回显的是自增id参考作者的文档https://github.com/mybatis-book/book/issues/45单步调试从insert开始一步一步地往里走应该就是这个后置处理的时候会回写id回头看发现是这里产生的generatedkey是可以找到修改的地方了,但是我们没法插手使得他不修改。。.
2020-05-28 15:08:49 493
原创 redis实现分布式锁 单实例情况 多实例情况 RedLock
背景如何用redis实现分布式锁参考https://redis.io/commands/setnx其实redis官网直接就有介绍。注意1、Redlock算法里不推介以下做法;Redlock算法实现起来只是稍微难一丢丢,但是提供了更好的保证,以及容错能力。2、但是我们还是介绍一下这个老办法。3、假设是单实例的,2.6.12版本开始,可能更简单地实现锁,相当于这里讨论的,使用set命令获取锁,再加上简单的Lua脚本来释放锁。这个模式在set命令里有介绍。也就是说,SETNX可以被使用,历史上也
2020-05-27 19:00:38 830
原创 redis set 占多少内存? bitmap呢?
背景判断一个id是否存在,是用redis set好还是用redis bitmap好呢?(id的个数只有100个的情况下)一些理论知识1、在元素比较少的时候,set是不会用hash的结构的,而是使用ziplist的方式存储,判断元素是否存在需要遍历;2、小的数字(<=9999)是不需要额外的存储空间的,会整个redis共享这些数字;实践redis set每次往set添加一个<=9999的数字,占用的内存增加:2Byte可以算到,添加到100个id,60+100*2=260bi
2020-05-26 21:48:35 4071
原创 带着问题撸源码系列-zookeeper-内存的数据如何持久化到硬盘
问题带着问题撸源码系列-zookeeper-内存的数据如何持久化到硬盘猜测这种一般都是有个定时任务往硬盘写吧源码
2020-05-19 17:48:30 242
原创 带着问题撸源码系列-zookeeper-datatree是什么鬼?
问题带着问题撸源码系列-zookeeper-datatree是什么鬼?源码直接看源码就好了其实就是一个树形结构里面先保存了所有的DataNodeKey是节点路径,如/p1/c1,value就是对应的DataNode。DataNode:用一个Set<String>保存这个节点的孩子。String,是下一个节点的名字,如当前是/p1/c1,父亲是/p1,那么他的孩子就是c1。...
2020-05-19 17:45:52 559
原创 带着问题撸源码系列-zookeeper-临时节点[ephemeral]是怎么弄的?我写了一堆临时节点为啥我一掉线就全没了?
问题带着问题撸源码系列-zookeeper-临时节点[ephemeral]是怎么弄的?我写了一堆临时节点为啥我一掉线就全没了?猜测可能是有线程维护着,每个session有一个临时节点列表,一旦客户端不再发心跳就全干掉源码debugrun server 1(follower)debug server 2 (leader)client 请求server2: create -e /t1...
2020-05-19 11:18:41 995
原创 带着问题撸源码系列-zookeeper-客户端发写请求,最终怎么通过2PC同步到集群所有机器?
问题带着问题撸源码系列-zookeeper-客户端发写请求,最终怎么通过2PC同步到集群所有机器?猜测we all know the 2PC, but how exactly does it work?理论上,就是leader接收到请求,然后发给Prepare,让小伙伴们准备好,过半数人回复ok了之后,leader回复客户端,然后再发Commit请求让小伙伴们真正提交源码Follower接收到客户端的写请求,会先根据责任链调下一个Processor,然后把写请求转发给Leader。leader
2020-05-14 19:06:56 278
原创 带着问题撸源码系列-zookeeper-客户端先写后读,怎么保证能读到写的数据?
问题带着问题撸源码系列-zookeeper-客户端先写后读,怎么保证能读到写的数据?猜测从我们的系列文章上一篇:带着问题撸源码系列-zookeeper-客户端发读请求给follower,是转发给leader读还是读自己?分析过程中可以看到,在处理请求的时候,有一些神奇的队列帮助处理这个问题。我们猜测就是通过这些队列,把读请求放在写请求后边。下面让我们来探讨细节吧。读源码由于上一篇:带着问题撸源码系列-zookeeper-客户端发读请求给follower,是转发给leader读还是读自己?
2020-05-14 15:33:12 571
原创 带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?
问题带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?参考思考了颇久实在没找到突破的方法,只好找网上文章找突破口了:添加链接描述读源码在这里配置每个RequestProcessor的关系,先调用哪个再调用哪个:org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#setupRequestProcessors可以看到是可以看到,第一个是FollowerRequestProc
2020-05-14 11:42:31 266
原创 带着问题撸源码系列-zookeeper-客户端发读请求给follower,是转发给leader读还是读自己?
问题带着问题撸源码系列-zookeeper-客户端发读请求给follower,是转发给leader读还是读自己?猜测读自己就行了吧。不过可能要考虑当前有没有在写之类的。读源码参考写请求的分析还把断点打在消费queue消息这儿设置条件断点,如果是ping(request.type==11)请求咱就不断点了。回答问题...
2020-05-13 19:02:49 747 4
原创 带着问题撸源码系列-zookeeper-客户端发写请求给follower,是转发给leader写?
问题带着问题撸源码系列-zookeeper-客户端发写请求给follower,是转发给leader写?猜测是要转发给leader写预读源码首先得看下在哪接受请求呢?由于之前在带着问题撸源码系列-zookeeper-客户端怎么给sever发请求 有看见clientCnxn,所以我们猜测接收请求是在ServerCnxnBTW, Cnxn是什么鬼????? /** * Interface to a Server connection - represents a connection fr
2020-05-13 15:06:27 730
原创 带着问题撸源码系列-zookeeper-客户端怎么给sever发请求
问题客户端怎么给server发请求?猜测parse 输入的command 然后通过某种方式发给server。预读代码从客户端main代码org.apache.zookeeper.ZooKeeperMain看起,看下怎么给server发请求的。慢慢追踪到这:org.apache.zookeeper.ZooKeeperMain#processZKCmd就是这里:假设我们现在要发一个create /test实现类就是CreateCommandparse不管看exec函数一通操作后走到了
2020-05-13 11:37:43 220
原创 带着问题撸源码系列-zookeeper-源码调试选举过程 附mac环境搭建
参考https://blog.csdn.net/po_lao/article/details/52562590过程从github clone到本地安装ant来编译brew install ant换方式https://juejin.im/post/5c7be8546fb9a049c6449089https://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper/3.4.13/zookeeper-3.4.13-sources.jar下载
2020-05-12 16:37:30 323
原创 ZooKeeper 选举过程 源码
参考:https://www.bilibili.com/video/BV1tt41137sT?p=4 视频中带注释的源码:https://github.com/boomblog/zookeeper-vip1/blob/master/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java 启动 传参 脚本启动的时候 .sh 发现调用了一个类 传入配置文件参数 就启动了 我们可以通过idea 加入参数,也能启动。
2020-05-11 17:11:56 168
原创 多进程 多线程 有什么区别? 详解
据说这个问题很重要,要从多个方面总结。参考多线程和多进程的区别(小结)多线程还是多进程的选择及区别0、教科书上的一句话进程是资源分配的最小单位,线程是CPU调度的最小单位。1、共享的变量与私有的变量同一进程的不同线程会共享进程内存空间中的全局区和堆。线程私有的是栈和寄存器。因此。局部变量都是线程私有的。全局变量、静态变量、分配于堆的变量都是共享的。
2020-05-09 18:43:20 132
原创 linux 进程间通信简介(IPC)
参考文章《Linux环境下C编程指南》 杨树青 王欢引文 进程间通信(IPC)是用于处理一个多进程系统中各个进程之间的协调。所谓进程间通信,就是指多个进程之间相互通信,交换信息的方法。常见的进程间通信的方法包括以下几种。共享内存信号量管道命名管道消息队列套接口全双工管道 其中,共享内存、信号量、消息队列、管道和命名管道只适用于本地进程间通信,套接口和全双工管道则可以用于远程通信,因
2020-05-09 18:42:45 485
原创 ZooKeeper ZAB协议 详解
参考:B站大法好:https://www.bilibili.com/video/BV1U5411t7Mp?from=search&seid=11109207762490056623 选举 每个机器保存zxid(日志id),自己的机器id(myid) 选举规则,按照<zxid,myid>排序 zxid大的是老大 zxid相同的情况下,myid大的是老大 初始化: 先说结论: 按机器id顺序启动,中间那个机器是leader details
2020-05-09 16:03:08 154
翻译 Raft原理:作者亲自上阵讲解
参考视频:https://www.youtube.com/watch?v=vYp4LYbnnW8&feature=youtu.be步骤分解1.Leader选举选一个server当leader检测到crashes,就选个新的leader2.复制Log(正常情况)Leader接受client请求,本地append logleader将log复制到其他server(覆写不一致的地方)3.安全保持logs是一致的只有获得最新的logs的servers可以成为leaderServer
2020-05-09 11:52:39 581
原创 Multi-Paxos Raft 原理 流程
Multi-Paxos1、客户端给server发送command2、server使用paxos协议,选择command3、server等待前一个log entries被applied,然后apply一个新的command到状态机4、server状态机的结果给客户端。解答以下问题:来了一个客户端请求,要用哪个log entry?性能优化:选个leader...
2020-05-08 15:34:49 420
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人