分布式
Hyman 2020/11/23 笔记分布式
# 分布式事务
Eureka:核心注册表信息, 对外提供http接口,底层存储结构
concurrentHashMap<String, Map<stirng,Lease<instanceInfo>>
1
事务管理者(TC/TM):统计事务状态信息,判断事务是否提交还是回滚。groupId传到另外一个系统
TC:全局事务协调者-计算
TM:全局事务管理者-创建事务提交
RM:资源管理器-DataSourceProxy,ConnectionProxy
TCC:业务有侵入性
# 分布式事务解决方案
- 消息队列 增加消息队列 发送消息放在事务提交成功后,消息队列重试 2PC(两阶段提交):发送消息(不能被消费) > 本地事务 > 发送可消费 RabbitMQ如果没收到提交,会去询问
- AT 特点业务无侵入,正常事务步骤: 建立连接 > 开启事务 > 执行方法 > wait >提交事务 创建代理Connection,注意close不能关闭,只有实际commit后close 需要数据库支持事务(innodb)
- TCC 两阶段提交(try,commit,cancel,例如:下单 > 冻结金额(try)> 成功 (commit) or 失败(cancel))
- Saga 异常的时候增加修复方法
- XA 数据库上锁
# 分布式ID
数据库自增。 为了保证高可用,主从模式,存在延迟,主主模式 ,通过设置步长保证两个数据库生成不一样ID,例如:奇、偶数,扩展不好
号段模式-Tinyid。批量获取,用数据库保存当前最大ID和段长
雪花算法:long 64位
分布式锁:
数据库:使用for update 实现
Redis: Lock 加锁使用set ( "key", "value", "NX", "PX", 3000) tryLock setnx unLock: 使用Lua (if redis.call('get', KEY[1]) == ARGV[1] then return redis.call('del', KEY[1]) else return 0 end)判断Value相等才删除
实现组件:Redisson,红锁,可以依赖多个节点,发给三个有两个成功就成功
zookeeper: 分布式协调服务,是目录结构。实现原理:创建临时有序节点,判断最小就是持有锁 tryLock: 判断节点序号是否是最小,是获取到锁,如果不是,监听前一个节点,等待唤醒
HashMap:
1.8 : 链表长度大于8时,会变成红黑树,新增时加到列表的尾部,解决1.7死锁问题
# 数据库扩展
- 水平切分:数据库结构一模一样,存储根据一定规则把数据分散到不同的数据库中,如:取余方式决定存放到哪个数据库
- 垂直切分: 将不同的表分到不同数据库,分片只把表的字段拆分到不同数据库,如:根据业务类型分库
- 读写分离:主(master)节点写,从节(slave)点只读
mycat: 数据库分库分表中间件
逻辑数据库,客户端直接操作这些逻辑数据库