面试过程中有几个回答的不太好,整理回顾
1.zk在什么时候会发生脑裂,zk集群要配置多少台,为什么?
先说结论:zk的目前3的版本实现中不会发生脑裂
原因是zk选主遵循Quorums机制,说人话就是选主的成功需要N/2的节点投票成功。举个例子,比如目前异地的2个机房A和B分别部署了5+3一共8台,leader在A机房,此时突然两个机房无法互通,那B机房的节点会尝试选主,但并没有大于N/2个成功投票,故不会脑裂。然后你会说leader在B机房咋办呢,A机房选主不是大于N/2了吗,如果这个时候网络不通他们就相安无事,如果网络同了。老leader发起同步请求,follower会拒绝(选主后epoch+1),这样老leader就知道自己大势已去变为follower。
配置奇数台,和Quorums有关,主要是节省资源。
2.扩容的时候比如数据库sharding、rehash为什么都是2的幂
主要和扩容的算法有关,不管是位与还是取模,如果不是2的幂,转换为二进制的时候最后一位是0,导致hash后末位永久为0,导致有一半的空间无法利用,分布不均衡。
3.为什么要尽量避免锁升级?
偏向锁升级为自旋锁,自旋也是消耗性能的;自旋锁升级为重量级锁,会涉及到系统调用,用户态到内核态到转换。还有一种可能是升级后有一个降级的过程。这里需要引入jvm安全点的概念,简单说就是达到一定的条件,会发生GC,GC过程中会检测是否需要有降级的锁,会消耗一定的性能(这个答案没有完全考究)