查看: 93|回复: 0

高级java工程师常见面试题(持续更新)

[复制链接]

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-6-23 17:06:58 | 显示全部楼层 |阅读模式
redis的集群部署方式有哪些?

方式1:主从模式

  • 主库:所有的写操作都在主库发生,然后主库同步数据到从库,同时也可以进行读操作;
  • 从库:只负责读操作



  • 复制偏移量 offset:主服务器和从服务器会维护一个复制偏移量,主每次向从传递 N 个字节后,会将自己的复制偏移量加上 N;从收到主的 N 个字节数据,也会将自己的复制偏移量加上 N。通过主从的偏移量对比可以知道数据是否一致。
  • 增量同步:从把当前的偏移量告诉主,主计算偏移量差距,然后把两者之间相差的命令操作同步给从。
  • 全量同步:从首次加入集群,发生的是全量同步,主库通过 bgsave 命令生成 RDB 文件,然后将 RDB 文件传送到从库。
缺点:主节点故障,集群无法进行工作,需要人工干预,可用性低。
方式2:哨兵模式
什么是哨兵机制:sentinel(哨兵机制)是 Redis 集群实现高可用的重要策略,哨兵节点是特殊的 Redis 服务,不提供读写功能,主要用于监控 Redis 中的实例节点,如果主出现故障,在从服务器中选取新主。
如何监控:

  • 哨兵通过 PING 命令检测它和从库、主库之间的连接情况,如果发现响应超时就会认为服务已下线。但会存在误判,如果误判的节点是从,影响不大,拿掉一个从节点,对整体影响不大;如果误判主节点,影响就很大了。
  • 如何减少误判?引入哨兵集群,一个哨兵节点可能会误判,引入多个哨兵节点一起做决策,就能减少误判。当大部分(N/2 + 1)哨兵认为主库下线,主库才会真正被下线。



图片来源:https://mp.weixin.qq.com/s?__biz=MzI3MjY1ODI2Ng==&mid=2247486094&idx=1&sn=f727b9fe6f53f4ebc5280dd09d6161ed&chksm=eb2e70bbdc59f9ad8157859f0c6eb5fa881c9e147d7e03ca9693633f7d2bff7215d0f813c847&scene=27

主观下线和客观下线:

  • 哨兵节点发送ping命令,当超过一定时间后,如果节点未回复,则哨兵认为主观下线。
  • 如果该节点为主,哨兵会进行故障切换,询问其他哨兵节点是否认为该主节点是主观下线,当达到指定数量,就会认为是客观下线,此时会进行主从切换操作。
如何选主:

  • 过滤无效机器:已下线,最近5秒没有心跳等
  • 根据slave-priority设置节点选主的优先级,如果优先级相同,根据复制偏移量再排序
缺点:

  • 只有一个主机处理写请求,写操作受单机瓶颈影响
  • 集群里所有节点保存的都是全量数据,浪费内存空间,没有真正实现分布式存储。
方式3:Redis Cluster

  • redis cluster主要是针对海量数据+高并发的场景,如果数据量不大,使用sentinel就够了。
  • Redis Cluster采用虚拟哈希槽分区而非一致性hash算法,一个切片集群共有16384个哈希槽,每个键会被映射到一个哈希槽。如果集群中有N个实例,那么,每个实例上的槽个数为16384/N个,每一个分区内的master节点负责维护一部分槽。
  • 官方推荐,至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。



图片来源:https://mp.weixin.qq.com/s?__biz=MzI3MjY1ODI2Ng==&mid=2247486094&idx=1&sn=f727b9fe6f53f4ebc5280dd09d6161ed&chksm=eb2e70bbdc59f9ad8157859f0c6eb5fa881c9e147d7e03ca9693633f7d2bff7215d0f813c847&scene=27

如何保证消息队列的高可用?


什么是ZAB 协议?

ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子 广播协议。
ZAB 协议包括两种基本的模式:崩溃恢复和消息广播。
当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障 导致不存在过半的服务器与 Leader 服务器保持正常通信时,所有进程(服务 器)进入崩溃恢复模式,首先选举产生新的 Leader 服务器,然后集群中 Follower 服务器开始与新的 Leader 服务器进行数据同步,当集群中超过半数 机器与该 Leader 服务器完成数据同步之后,退出恢复模式进入消息广播模 式,Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。

什么是paxos帕克索斯算法?




分布式事务的解决方案?



















分布式与集群的区别是什么?

分布式: 一个业务分拆多个子业务,部署在不同的服务器上
集群: 同一个业务,部署在多个服务器上。比如之前做电商网站搭的 redis 集群以及 solr集群都是属于将 redis 服务器提供的缓存服务以及 solr 服务器提供的搜索服务部署在多个服务器上以提高系统性能、并发量解决海量存储问题。

AOF文件太大怎么办?




zset跳表了解吗?




Redis 主从同步是怎么实现的?

Redis 主从同步策略:主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步,如不成功,则进行全量同步。
1. 全量同步
master 服务器会开启一个后台进程,用于将 redis 中的数据生成一个 rdb 文件,将 rdb 文件传递给 slave 服务器,而 slave 服务器会将 rdb 文件保存在磁盘并通过读取该文件将数据加载到内存,在此之后 master 服务器会将在此期间缓存的命令通过 redis 传输协议发送给 slave 服务器,然后 slave 服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性。
2. 增量同步
master给每个slave维护了一份同步日志和同步标识,当主从连接断掉之后,slave主动尝试和 master 服务器进行连接,如果从服务器携带的偏移量标识还在 master 服务器上的同步备份日志中,那么就从 slave 发送的偏移量开始继续上次的同步操作,如果 slave发送的偏移量已经不再 master 的同步备份日志中,则必须进行一次全量更新。

Redis 哈希槽的概念?

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群 有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置 哪个槽,集群的每个节点负责一部分 hash 槽。

mysql的主从复制原理?

为什么需要主从复制?

  • 主从复制是读写分离的前提,提升性能
  • 主从复制是故障切换的前提,提升可用性
主从复制的原理:



  • 主记录binlog日志(记录所有修改操作:insert、delete、update、create等)
  • 从启动IO线程,读取主的binlog日志,写入relay log(中继日志)
  • 从启动SQL线程,回放relay log

如何进行数据分片?

为什么需要数据分片?
MySQL单表容量超过 1千万 时,查询性能明显下降。这时候就要引入数据分片策略。
如何数据分片?
数据分片的分类:垂直拆分/水平拆分、分库/分表
1. 垂直分库:大系统拆分为多个小系统


2. 垂直分表

  • 把一个表的多个字段拆成多个表,冷热拆分:热字段一个表,冷字段一个表,提升查询性能。
  • 垂直分片的缺点:分库后无法Join,只能通过接口聚合方式解决,提升开发复杂度。如果表字段之间关联性强,优先水平拆分。
3. 水平分库


4. 水平分表


5. 垂直拆分&水平拆分相结合:先梳理好模块,做垂直拆分;再根据表数据,做水平拆分。

数据分片有哪些常用的分片规则?

1. Hash取模:id%分表数量


优点:数据分片均匀
缺点:扩容时,映射关系发生变化,需要迁移旧数据。
2. 数值Range:按照id值切分


优点:扩展方便
缺点:导致查询不均匀,如:按时间字段分片,最近数据频繁读写,历史数据很少读写。
3. 一致性Hash
将 2^32 想象成一个圆 → 确定服务器在哈希环的位置:hash(服务器的IP) % 2^32 → 数据映射到哈希环上:hash(图片名称) % 2^32 → 沿顺时针方向遇到的第一个服务器就是图片存放的服务器


优点:节点的增减都只需重定位环空间中的一小部分数据
缺点:数据倾斜


解法:虚拟节点
虚拟节点均匀分布,一个实际物理节点可以对应多个虚拟节点

分库分表有哪些常用的中间件?


  • 分库分表中间件Sharding-Sphere [ʃɑːdɪŋ sfɪə]
Sharding-JDBC 最早是当当网使用的一款分库分表框架,2017年开始对外开源,现已更名为 ShardingSphere,它是一款分布式数据库中间件, 提供数据分片、读写分离、加密等能力。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表