分布式系统常见问题

高并发,可扩展,高可用。

主从切换

负载均衡调度算法

可扩展

注册中心集群 注册中心和服务端长连接

  1. Redis和Memcach有什么区别
    Redis支持持久化。
    集群中每个实例之间互相感知。而MC通过客户端进行路由。

  2. kafka和rocketmq区别,设计思想。

3.spring cloud 和dubbo和service mesh思想

4.如何保证高并发服务的高可用。

分布式缓存搭建

  1. 客户端进行路由。 MemCached, 一致性HASH算法。虚拟节点

脑裂问题如何解决

总结netty。

Hystrix的设计原则包括:

资源隔离
熔断器
命令模式

加权轮询算法

【结合实际项目场景】
多级缓存如何做
消息队列如何保障一致性
分布式一致性,生产环境中出现的分布式一致性场景
分布式事务解决方案!
缓存和DB数据一致性
最终一致性
缓存一致性问题
多个服务之间事务协调,一致性问题。
高并发问题,除了熔断限流服务保护,软负载加机器,数据库缓存水平扩展以外,还有没有其他问题要考虑的。
热点数据发现问题

程序排查问题:
偶尔CPU飙高,部分响应超时。

详细地描述用户从前端发起一个请求到后端服务的整个流程,甚至细化到IP层。

红包问题

nginx 负载均衡
cdn 使用原理
web 安全

mq消息发送一致性问题

  1. rocketMQ事务型消息
  2. 本地事务入库消息。异步发送消息,如果消息发送成功则删除消息,如果发送失败则消息保留,继续重试。

缓存一致性方案问题
1.

缓存:
Redis
Memcached
Tair

三者区别及优劣:

  1. 是否持久化。
    Redis有基于全量的持久化,和基于增量模式的持久化。
    全量生成rdb文件,全量的持久化有两种方式,一种是SAVE命令,可以由客户端显示触发,也可以在redis shutdown时触发,这个命令就像普通命令一样,单线程串行执行,将Redis当前状态写入磁盘作为快照保存
    这个过程中其他所有命令都无法执行。相对于SAVE还有BGSAVE命令,顾名思义(backgroud save)后台保存,会fork一个子进程进行保存。由于fork了子进程,涉及父进程内存的赋值,其存在
    期间会增加服务器内存的开销,当内存开销高不得不使用虚拟内存时,BGSAVE的fork会阻塞服务器运行。所以可以设置定时BGSAVE进行自动全同步。

还有基于AOF追加增量的持久化。在每次执行命令后,将命令加到缓冲区末尾。 每次执行完写命令后,判断是否要将缓冲区落到磁盘。
有三种策略:always 每次执行完命令调用fsync, every second每秒调用和no不显示调用,由操作系统决定。 AOF重写操作
来压缩AOF文件,重写不需要读取原来的AOF文件,而是根据当前数据库状态来重写。

  1. 负载均衡的机制,集群部署的区别,如何扩容,高可用的实现。
    集群部署:
    Redis集群部署,集群之间互相感知,每个实例都保留着以它的视角看整个集群的状态。负载均衡采用槽指派的方式,如果指令请求的当前key不在当前实例中,就
    返回MOVED消息和该key所在的实例给客户端,由客户端重新找到指定的实例。客户端收到槽i的MOVED错误后,客户端会记录下来,每次遇到关于操i的命令时,都
    直接去指定的节点查询。

Memcached集群部署需要使用Memcached客户端来实现,集群中的机器互不感知。客户端需要Memcached协议,然后实现sharding机制,故障转移等,可以有多种实现,如Spymemcached,Xmemcached。

如何扩缩容:
对于Redis集群通常采用重新分片的方式,将槽从一个节点改到另一个节点,可以动态扩容。如果处于迁移过程中,一个槽中的部分key分别分散在两个节点中,那么可以节点会先在自己这里找,找到就返回,
否则返回客户端ASK错误,指引客户端去新的目标节点。通过向服务端发送CLUSTER ADDSLOTS来指派槽,CLUSTER KEYSLOT “key” 来看key在哪个槽。重新分片,redis-trib,首先向目标节点发送
CLUSTER SETSLOT IMPORTING 让目标节点准备好导入某个槽,然后向源节点发送CLUSTER SETSLOT MIGRATING 让源节点准备好迁移某个槽,然后
再用MIGRATE一个key一个key的迁移到目标节点。

对于Memcached,可以采用ZooKeeper来管理,新节点上线时,将节点添加到ZooKeeper上。Memcached监听Zookeeper节点状态,类似注册发现的机制,然后客户端根据获取到的服务器节点信息
进行软负载,采用一致性hash的方式。

高可用实现:
Redis集群中每个Master可以有一个到多个slave, 当一个节点没有Slave时,可以将其他Master的Slave机器变成它的。所以集群中保留master * 2 +1个节点就可以保证高可用。
Redis集群也可以读写分离,slave可以设置为READONLY模式。
redis主从支持failover主从切换, sentinel机制。sentinel之间两两长连接,同时向master发送心跳包,当master未正确响应时,将Master置为主观不可用,然后向其他sentinel进行确认,
一旦发现主观不可用数量超过临界值,则设置为客观不可用,进入failover流程。sentinel之间通过类似于raft协议实现选举,由选举出的leader执行failover操作。

而Memcached本身不支持任何fail-over和高可用机制。面对单点故障可以使用主从模式解决,而主从模式不是master-slave同盟国不的方式,而是由客户端进行双写来实现,双写时
要注意主从的一致性。
可以通过客户端来实现failover机制,比如Spymemcached实现三种容错机制。Redistribute(重新分配),Retry(重试), Cancel。如果路由到失败节点,则根据策略选择下一个节点,
有点是可以提高可用性,一个节点挂掉会failover到其他节点,缺点是会导致大量回源,节点启动后会再次回源。
Memcached的高可用和扩展机制依赖外部系统的协助,比如Mcrouter。

  1. 功能上的区别。
    redis 有多种数据结构,而Memcached只有key-value。
    redis 可以做一些业务操作,比如lua,watch,事务。

  2. 内存管理的区别。
    Memcached采用Slab + Chunk的机制进行内存管理,避免了频繁向操作系统申请和释放内存,同时也解决了内存碎片的问题。Slab就是一组大小相等的Chunk块,根据存储数据的大小决定
    存入哪个chunk中。这种方式会导致一定的内存浪费,比如chunk是112字节,存储的数据是100字节,会导致12字节的浪费。

key过期机制的实现。

缓存常见问题:

  1. 缓存更新,缓存一致性问题。
  2. 缓存高可用实现,热点数据处理问题。
  3. 缓存穿透问题。
  4. 使用上的注意点,容量及主从复制可能出现的问题,集群上等待。

缓存架构的设计

  1. 读写策略,分布策略,过期策略。
  2. 读写分离,key的Hash算法,数据分散均衡。
  3. 冷热数据分离,过期数据更快从内存中剔除。

分布式系统中出现的问题

  1. 脑裂双主问题,Lease机制。
  2. Paxos及Raft协议

你可能感兴趣的:(中间件)