分布式

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位

分布式锁:

  1. 数据库:使用for update 实现

  2. 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,红锁,可以依赖多个节点,发给三个有两个成功就成功

  3. zookeeper: 分布式协调服务,是目录结构。实现原理:创建临时有序节点,判断最小就是持有锁 tryLock: 判断节点序号是否是最小,是获取到锁,如果不是,监听前一个节点,等待唤醒

HashMap:

1.8 : 链表长度大于8时,会变成红黑树,新增时加到列表的尾部,解决1.7死锁问题

# 数据库扩展

  • 水平切分:数据库结构一模一样,存储根据一定规则把数据分散到不同的数据库中,如:取余方式决定存放到哪个数据库
  • 垂直切分: 将不同的表分到不同数据库,分片只把表的字段拆分到不同数据库,如:根据业务类型分库
  • 读写分离:主(master)节点写,从节(slave)点只读

mycat: 数据库分库分表中间件

逻辑数据库,客户端直接操作这些逻辑数据库