锁的用途:是在访问一个资源时实现排他性,禁止其他程序的对资源的访问。分布式锁可以对分布式服务(多机器多进程-多线程)在进程之外使用分布式锁,在进程内部使用JVM锁降低对分布式锁的请求量。多把分布式锁并行处理比一把锁性能会有提升。
两类分布式锁
类cas自旋式分布式锁询问的方式 尝试加锁 (对锁provider io较多) CAP模型属于AP,可用性 , 无一致性算法 , 性能好---mysql redis event事件通知后续锁的变化 轮训向外的过程(对锁provider io较少) CAP模型属于CP,一致性 , ZAB一致性算法实现 , 稳定性好 --- zk etcd
redis : worker 单线程 ,串行处理请求,对锁的多个不通请求一定是有顺序的 (方法setnx + timeout) 客户端出问题 timeout可用于防止死锁。 当一个客户端获取锁后,另外的客户端会通过IO发送setnx指令 做自旋,不断大量请求redis。 可以通过redis发布订阅,阻塞队列+超时(client+redis)降低自旋io。 客户端执行时间超过锁的timeout,会出现锁不一致,可以设置watch dog监控客户端状态无异常时对锁加超时时间。 锁上加标示UUID,防止误删。 redis单机挂了,会引入redlock(redis 主从复制,实现ha 解决redis单点故障)
zookeeper ,etcd ,集群部署,分布式锁,分布式ID,分布式配置,分布式注册发现,分布式HA
zk :增删改 入口是leader节点,两阶段提交,过半节点通过,性能低于redis(数据通信同步过程),leader选举先看谁的数据新,数以一样新看server ID大小决定谁是leader. session : 客户端连接后会产生session,session会同步到zk其他节点。 path node: 持久节点(客户端创建后永远存在),临时节点node会绑定session,客户端连着就不删除,客户端不连着了出问题,就删除。 watch: 监控回调,监控节点事件,例如节点的delete ,create,change ,通过锁的变化回调需要加锁的client,client再去抢锁。