消费者可以订阅有一个或多个channel,消费者为阻塞式等待
优点:
缺点
两者都开启时,AOF优先级高于RDB
将内存中的所有数据记录到磁盘中,当Redis实例故障重启后,从磁盘中读取快照文件,恢复数据,Redis在停机时会自动执行一次RDB,宕机不会执行RDB
SAVE:由主进程执行,将数据写进磁盘,由于redis是单线程的,写入磁盘较慢,因此这种方式较少使用,多用于Rdis停机时使用
BGSAVE:开启一个子线程,由子线程执行将数据写入磁盘的操作
redis.conf文件中设置
#900秒内,如果至少有1个key被修改,则执行bgsave,如果是save""则表示禁用RDB
save 900 1
save 300 10
save 60 10000
#是否压缩,建议不开启,压缩也会消耗cpu,磁盘的存储不值钱,不建议开
rdbcompression yes
#RDB文件名称
dbfilename dump.rdb
#文件保存的路径目录
dir ./
即使设置了自动存储,但是如果在自动存储的时间间隔内服务器宕机了,数据会丢失
将Redis的所有操作命令记录在AOF文件之中,类似于命令日志
redis.conf文件中配置
#是否开启AOF功能,默认是no
appendonly yes
#AOF文件的名称
appendfilename "appendonly.aof"
#表示每执行一次写命令,立即记录到AOF文件
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
由于AOF记录的是命令而RDB记录的是最后的值,会导致AOF文件体积过大,因此可以使用BGREWRITEAOF命令来重写,该命令会将操作语句简化,只操作最后一次的语句,用最少命令达到相同效果,重写是异步执行的
通过直接在控制台输入BGREWRITEAOF
即可重写AOF文件
可在redis.conf中配置自动重写AOF文件
#AOF文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
#AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
Redis写少读多,因此主写从读,
注意:需要开启RDB持久化,AOF不行,因为在从节点连接上主节点时,主节点会把自己的RDB文件给从节点
prot 端口号
slaveof 主节点ip和端口
docker run -itd --name redis-slave2 -v /usr/server/redisServer/redisSlave2.conf:/redisConfig/redisSlave2.conf -p 7003:7003 redis:latest redis-server /redisConfig/redisSlave2.conf
docker exec -it 容器名 /bin/bash
进入从节点内部redis-cli -p 从节点端口
启动服务即可主节如何判断从节点是否是第一次来同步数据:
repl_baklog数据结构是一个循环数组,只要两者的数据差距小于数组大小,不会覆盖之前数据,都可进行同步,如果覆盖了只能去做全量同步保持数据一致性了
当主节点宕机时,选择从节点作为主节点,哨兵机制用于监测节点是否出故障
基于心跳机制,每隔一秒哨兵集群中的每个哨兵向需要检测的redis集群ping一下(哨兵之间也会相互检测),如果一个哨兵没有得到响应则认为该节点出现故障被称为主观下线(因为不排除网络问题),如果有多半的哨兵ping不通同一个节点则认为该节点出现了故障,称之为客观下线
slaveof no one
命令,让该节点成为masterslave of 新master地址和端口
的命令,让这些slave成为新master的从节点,开始从新的master上同步数据。port 16379//哨兵节点的端口
sentinel monitor master 172.17.0.4 6379 2//这里的2表示有几个哨兵节点
logfile "sentinel1.log"
chmod -R 777 /usr/server/redisServer
docker run -itd --name redis-sentinel1 -v /usr/server/redisServer:/redisConfig:z -p 16379:16379 redis:latest redis-server /redisConfig/sentinel1.conf --sentinel
/*
*:z:防止linux中的selinux安全机制阻止哨兵模式的启动,如果该机制关闭可以不加
*这里的启动将文件目录映射,两者文件的改动会互相影响
*--sentinel:表示以哨兵模式启动该节点,妈的吃亏提取文字把l弄成1搞了半天(╯▔皿▔)╯
*/
info sentinel
基于P2P去中心化架构,采用了槽(Slot)的机制,可以简单理解为n个主从架构组合在一起对外服务。Redis Cluster要求至少需要3个master才能组成一个集群,同时每个master至少需要有一个slave节点。
底层是通过CRC16算法对键进行计算的到一个hash值再通过对16384取余得到需要存储到哪个节点,cluseter集群中的主节点之间会互相监测,当有一个主节点宕机后,他的从节点会成为主节点,该集群等于主从加哨兵
port 6379
dir /redisConfig
logfile cluster-m1.log //指定日志名
cluster-enabled yes //开启cluster模式
cluster-config-file nodes-6379.conf //指定生成文件名,该文件会自动生成
port 6380
dir /redisConfig
logfile cluster-m2.log
cluster-enabled yes
cluster-config-file nodes-6380.conf
port 6381
dir /redisConfig
logfile cluster-m3.log
cluster-enabled yes
cluster-config-file nodes-6381.conf
port 16379
dir /redisConfig
logfile cluster-s1.log
cluster-enabled yes
cluster-config-file nodes-16379.conf
port 16380
dir /redisConfig
logfile cluster-s2.log
cluster-enabled yes
cluster-config-file nodes-16380.conf
port 16381
dir /redisConfig
logfile cluster-s3.log
cluster-enabled yes
cluster-config-file nodes-16381.conf
docker run -itd --name redis-m1 -v /usr/server/redisServer:/redisConfig:z -p 6379:6379 redis:latest redis-server /redisConfig/cluster-m1.conf
docker run -itd --name redis-m2 -v /usr/server/redisServer:/redisConfig:z -p 6380:6380 redis:latest redis-server /redisConfig/cluster-m2.conf
docker run -itd --name redis-m3 -v /usr/server/redisServer:/redisConfig:z -p 6381:6381 redis:latest redis-server /redisConfig/cluster-m3.conf
docker run -itd --name redis-s1 -v /usr/server/redisServer:/redisConfig:z -p 16379:16379 redis:latest redis-server /redisConfig/cluster-s1.conf
docker run -itd --name redis-s2 -v /usr/server/redisServer:/redisConfig:z -p 16380:16380 redis:latest redis-server /redisConfig/cluster-s2.conf
docker run -itd --name redis-s3 -v /usr/server/redisServer:/redisConfig:z -p 16381:16381 redis:latest redis-server /redisConfig/cluster-s3.conf
cluster info
命令查看节点信息redis-cli -p 6379 cluster meet 172.17.0.6 6380
redis-cli -p 6379 cluster meet 172.17.0.5 6381
redis-cli -p 6379 cluster meet 172.17.0.4 16379
redis-cli -p 6379 cluster meet 172.17.0.3 16380
redis-cli -p 6379 cluster meet 172.17.0.2 16381
#这里的6379是因为进入到的这个主节点的redis服务端口为6379,这里的命令是将其他的节点与这个节点相连
#!/bin/bash
for i in $(seq 0 5460) ##给主节点分配的槽位下标
do
/usr/local/bin/redis-cli -h 172.17.0.7 -p 6379 cluster addslots $i ##主节点的ip和端口
done
bash /redisConfig/setHashSlots.sh
命令,执行脚本,有多少个主节点,执行多少次,只要在cluster节点的容器中执行就行cluster nodes
命令查看cluster集群中所有的节点cluster的idcluster replicate 主节点的node_id
命令指定主节点cluster replicate 新主节点
设置其为主节点redis-cli --cluster reshard 172.17.0.2:6379 --cluster-from 主节点1,主节点2,主节点3 --cluster-to 新的主节点--cluster-slots 1024
#从主节点1、2、3中每个给新主节点分配1024个哈希槽
#172.17.0.2:6379表示由这个主节点分配,这里随便写一个主节点的IP都可以
通过cluster failover命令手动让cluser集群中的某哥master宕机,其子节点会成为新的master,当服务器需要维护时可以这样做,宕机过程中写操作将阻塞
cluster-require-full-coverage false
即可,但仍保证不了数据完整性,只能保证可用性cluster-node-timeout
来及时监测节点业务名:数据名:id
的格式,业务就是这是是实现什么功能的,数据名就是这个id时来源于代码中的哪个实体,id就是实体对应的idobject encoding 键名
查看编码方式原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。