面试
redis 单线程速度为什么快 redis 基于Reactor 模式开发网络事件处理器、文件事件处理器,它是单线程的。 cpu 上下文切换
Redis 分布式锁 利用setnx 保证,若key存在,则获取不到锁 利用lua脚本来保证多个redis的原子性 考虑锁过期,需要额外的看门狗定时任务来监听锁是否需要续约 redis锁挂掉后,采用红锁的方式来同时向N/2+1个节点申请锁,只有都申请到锁才能证明获取锁成功
redis 持久化 RDB redis DataBase 将某时刻的内存快照snapshot ,以二进制的方式写入磁盘 手动触发 save 命令 使redis处于阻塞状态,直到RDB持久化完成,才会响应其他客户端发来的命令。生产环境慎用 bgsave 命令 fork 出紫禁城进行持久化,主进程只在fork过程中有短暂的阻塞,子进程创建后,主进程可以响应客户端请求。 COW 写时拷贝 拷贝副本 自动触发 save m n 在m秒,若干有n个键发生改变,则自动触发持久化,通过bgsave执行,若设置多个、只要满足其一就会茶法,配置文件有默认配置(可注释) flushall 用于清空redis所有的数据库,flushdb 清空当前redis所在的库数据(默认0数据库),会清空RDB文件,同时生成dump.rdb,内容为空 主从同步 全部同步会触发bgsave命令,生成rdb文件
优点 1、整个redis只存在一个 dump.rdb,方便持久化 2、容灾性好 3、性能最大化,fork子进程完成写操作 4、相对数据集大时,比AOF的启动效率更高
缺点: 1、数据安全性低。数据可能会丢失 2、
mysql 主从复制 数据可以从数据库服务器主节点复制到一个或者多个从节点 默认采取 异步复制方式,数据更新在远程连接上进行
持久化的两种方式 RDB redis of DataBase 快照 在指定时间间隔内将内存中的数据集快照写入到磁盘,snapshot 将快照文件直接写入到内存 单独创建fork 子进程进行持久化 先写入临时文件 等持久化结束,替换上一次持久化的文件 缺点:最后一次持久化后的数据可能丢失 优点:节省磁盘空间 恢复速度快 fork 复制一份父进程 linux 写时复制 父进程和子进程会共同使用一段物理内存 保存的文件 配置文件 redis.conf dbfilename dump.rdb 在哪开启的redis,文件就生成在哪 自动保存设置 save 900 1 save 300 10 save 60 10000
stop-writes-on-bgsave-error yes 无法进行磁盘写入,则关闭写操作 edbcompression yes 进行rdb保存时,将文件压缩 rdbchecksum yes 使用CRC64算法进行数据校验 有开销 config get dir 查询rdb 文件的位置
AOF append-only file 只追加文件 以日志形式来记录每个写操作,将执行过的所有写指定记录下来,只许追加文件但一颗改写文件,启动之初会获取该文件重新构建数据。 优点:备份机制更加稳健 丢失数据概率更低 缺点:恢复数据速度慢 每次读写都同步,有性能压力 appendonly no redis-check-aof –fix appendonly.aof 恢复数据库 同步频率 Rewrite 文件追加 重写机制 复制为临时文件 最后rename
主从复制 Master/slaver 主 写为主,从 读为主 配从不配主 (1)拷贝 多个redis.conf 文件 include (2)开启daemonize yes
info replication 打印主从复制的相关信息 slaveof 成为某个实例的从服务器
面试考点 切入点问题 数据保持一致,主从关系在,数据一致 从机不能进行写’ 主机shutdown 后 从机会原地待命,主机显示为down
复制原理 每次从机联通时,往主机发送sync指令 主机进行存盘操作,发送RDB文件,发送给从机 从机获取RDB文件后,进行全盘加载 薪火相传 上一个slave 可以作为下一个slave 的 Master 链条 去中心化 slave no one 不做其他服务器的从服务器
哨兵模式 sentinel 反客为主 自动版 如果发生故障,根据投票数自动将从库转化为主库 留言协议 投票协议 新建 sentinel.conf sentinel monitor mymaster 127.0.0.1 6379 1 mymaster 监控对象起的服务器的名字 1 为至少有多少个哨兵同意迁移的数量
新主登基 启动 redis-sentinel sentinel.conf 选择优先级靠前的 优先级 redis.conf slave-priority 100 选择偏移量最大的 偏移量是指获取原主数据最多的 选择runid 最小的从服务 每个实例启动后会随机生成一个40位的runid
集群 水平扩容 启动N个redis节点 分区partition 提供一定程度的可用性 即时一部分失效或无法通信,集群也可以继续处理 安装ruvy环境 yum install ruby yum install rubygems 执行 rpm -Uvh *。RPM
设置集群模式 cluster-enabled yes 打开集群 cluster-config-file nodes-6381.conf 节点的配置文件 cluster-node-timeout 15000 设置超时时间
集群方案 哨兵模式 sentinel 集群监控:负责监控 master 和 slave 是否正常工作 消息通知 故障转移 配置中心