在实际的生活环境中,如果只使用一个redis进行读写操作,那么面对庞大的访问人群是崩溃的,所以可以有几个redis,一个用来做主机,提供修改数据操作,而这个主机用来控制其他redis,即将更新的发送,保证一致性,而其他的redis只能是读操作,无法进行更改数据!
所以大致为一个redis用来写,其他redis复制主redis,但是用户只能读不能写!
那么如何配置呢?
1.在redis.conf中添加 replicaof 主机的ip 端口号
例:
2.在从机中的redis.conf中添加masterauth "主机redis的密码"
例:
如果在运行中想更改关系,比如
A有两个小弟B,C,我们现在让C的主机变为B,可直接使用命令
slaveof 新主库IP 新主库端口
不过如果出现宕机等重启情况,C的主机还是A
因为命令并未更改redis.conf中的配置
从 变为主
slaveof no one
将当前从机变为主机
复制的原理
slave启动,数据清零 当从机的redis启动时,会把自身体的数据清空
首次连接,全量复制 第一次连接会将主机所有数据打包发给从机
保持通信 在每个周期从机给主机发送包保持连接
每次快照,更新从机
从机下线重连,重连续传 master和slave中都有一个offset,根据判断offset来确定从哪个节点重新传输。
缺点:实际中有许多从机,导致主机IO量大,存在复制延时
master挂了后,不能出现临时master替补,无法进行实时操作
由此引入哨兵
哨兵的作用:
1.监控redis的运行状态,包括master和slave
2.当master down机后,自动将slave切换master
保证读写功能稳定
功能
主从监控 消息通知 故障转移 配置中心
哨兵配置sentinel.conf
启动
redis-sentinel sentinel.conf(文件名) --sentinel
相关问题
如果master宕机两台数据能否访问?
不能,此时需通过哨兵选择新的master后才可以继续访问
之前down机的master恢复后,还会不会是老大?
不会,变为slave,只能读不能写
哨兵流程
哨兵监控多个redis运行
当哨兵发现master超过配置的时间未响应包时,便会投票认为该masterdown机
当哨兵投票个数超过指定时,便认为该master宕机
由哨兵组选出一个哨兵将该master移出,并在slave中选出新的master
选新master流程为:
从master下的slave中按条件挑选
权限高>偏移量大(之前复制master的数据最多,完整性最好)>id号
选出的slave 执行slaveof no one变换为master
将原master下的slave归并到新的master,
当已下线的master上线时,新master对其发送slaveof指令将其变为slave。
集群哨兵+主从复制:并不能保证数据的不丢失,所以引出了redis集群
redis集群:提供多个redis节点间共享数据的程序集,支持多个master
用处:
支持多个master,一个down机可用其他master继续修改数据
无需哨兵功能
客户端只需连接集群中某个节点
通过redis槽位实现数据的分布式存储
分片的方法:
取余分片:通过哈希函数转换成值再对某数取余,得到存放位置
缺点,如果出现down机等情况会导致数据混乱,因为取余的数字发生改变
一致性哈希算法:将所有节点和键值对映射到一个环形的哈希空间中,通常是一个虚拟的圆环。这个圆环的范围是从0到最大哈希值。每个节点被映射到环上的一个点,而键值对也被映射到环上的相应位置。当查找一个键时,算法会沿着圆环顺时针方向查找最近的一个节点,然后将键值对存储在这个节点上。
优点:加入和删除节点只会影响哈希环中顺时针方向的相邻节点
缺点:存在数据倾斜的情况(某个点数据特别多)
CRC16算法
产生的hash值有16bit(65536个),但为什么用16384呢?
1.槽位为65536会导致发送的ping包过大
2.redis集群主节点不可能超过1000个,所以够用
3.槽位越小,节点少情况下方便压缩,容易传输
redis集群不保证数据一致性(因为一个redis收到命令后会异步同步给其他redis,此过程中可能出现down机导致数据不一致)
防止路由失效加-c
info replication 查看当前redis的主从关系
cluster failover 主从关系调整
redis-cli -a 密码 --cluster add-node 新机:端口 旧机:端口
redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
reshard(重新分派槽号)各个主机都分部分坑位给新的节点,故新节点槽位段数会有多个。
删除节点 redis-cli -a 密码 --cluster del-node Ip:从机ip+端口 从机6388节点ID
在集群条件下不能进行set等多元素操作,因为操作数据必须在同一个槽中。
可以通过分组进行多组操作
例: mset k1{x} v1 k2{x} v2 这里{x}表示为一个名为x的分组
cluster keyslot 键名 查看该键在哪个槽位
感谢观看!!!