主从复制
15 分钟阅读
•
1276 字
+
1811 词
持久化侧重解决的是Redis数据的单机备份问题
(从内存到硬盘的备份);而
主从复制
则侧重解决数据的
多机热备
。此外,主从复制还可以实现
负载均衡和故障恢复
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);==数据的复制是
单向
的,只能由主节点到从节点。==
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但
一个从节点只能有一个主节点
。
==1.数据冗余==:
主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
==2.故障恢复==:
当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
==3.读写分离==:
在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),
分担服务器负载
;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
==4.高可用基石==:除了上述作用以外,
主从复制还是哨兵和集群能够实施的基础
,因此说主从复制是Redis高可用的基础。
1、在/etc/redis路径下面,将6379.conf文件拷贝两份,分别取名6380.conf与6381.conf。
2、将6380.conf文件与6381.conf文件中的数据进行修改,修改五个
3、分别启动三个配置文件,然后使用ps命令查看三个进程是否启动了
sudo redis-server /etc/redis/6379.conf
sudo redis-server /etc/redis/6380.conf
sudo redis-server /etc/redis/6381.conf
4、分别启动三个客户端,
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
5、在每个客户端下面查看主从复制的信息info replication,发现都是master的身份
6、如果想将6380与6381作为6379的从机,可以在6380与6381下面执行,slaveof 127.0.0.1 6379,就可以看到主从复制的信息。
总结
1、==从机上是不能进行写操作的。==
2、==如果主机挂掉了, 那么从机会立马感知到主机的掉线,会记录主机的状态为down,但是从机不会成为新的主机,只会默默等待主机的上线。==
3、==如果不想将某台机器作为任何机器的从机,可以执行slaveof no one.==
redis的传统的主从复制,
当主机挂掉之后,从机不会成为主机,那么如果有新的写操作,是无法进行的,所以可以使用哨兵模式。
哨兵模式会执行两个协议,
流言协议(造谣)、投票协议(少数服从多数)
1、在/etc/redis下面添加一个文件,sentinel.conf,然后添加一行命令
2、启动哨兵的配置文件sudo redis-sentinel /etc/redis/sentinel .conf,哨兵就启动了,会监视主机
3、将主机断掉之后, 然后哨兵会进行留言协议与投票协议,然后将这一票投递给6380或者6381, 谁得到这一票谁就是主机。
问题:==
大量的数据在同一时间失效了
,
导致本来可以在缓存中查找的数据现在找不到,就只能到底层数据库中进行查找,那么底层数据库的压力会比较大。
==
解决方案:==1、可以让key不过期 2、将数据分散时间失效==
问题:==当
热点数据key
从缓存内失效时,
大量访问同时请求这个数据
,就会将查询下沉到数据库层,此时数据库层的负载压力会骤增,我们称这种现象为"缓存击穿"。==
解决问题:==1、
延长热点数据的过期时间或者设置为永不过期
2、
加锁,让大量请求互斥访问数据库
==
问题:==
要访问的数据在缓存中没有
,
并且在底层数据库中也不存在该数据
,那么当大量请求过来之后,会造成底层数据库的压力比较大,但是数据在数据库依旧没有。==
解决方案:==
可以设置key与空的键值对,存在缓存中map
,查询的时候,可以通过value进行体现==
在编译的时候,g++ xxx.cc -lhiredis
主从复制的
作用主要包括
:
主从复制的配置步骤
redis
port 6380 6381
pidfile "/var/run/redis_6380.pid" "/var/run/redis_6381.pid"
logfile "/var/log/redis_6380.log" "/var/log/redis_6381.log"
dbfilename "dump6380.rdb" "dump6381.rdb"
appendfilename "appendonly6380.aof" "appendonly6380.aof"
二、哨兵模式
配置步骤
redis
#哨兵 监视 主机名 主机ip port 票数
sentinel monitor master6379 127.0.0.1 6379 1
三、面试常考题(==重要==)
1、==缓存雪崩==
2、==缓存击穿==
3、==缓存穿透==
四、hiredis的封装
redis
redisCommand(pc, "set %s %s", key, value);
redisCommand(pc, "lpush %s %d %d %d", mylist, 1,2,3);
redisCommand(pc, "get %s ", key);
set key value
lpush mylist 1 2 3
redis
#连接到redis服务器,传递ip与端口号
redisContext* redisConnect(const char *ip, int port);
#执行命令,将数据存放在redis数据库中(利用可变参数,以及五种数据类型对应的命令)
void *redisCommand(redisContext *c, const char *format...);
#释放上面两个函数的返回结果
void freeReplyObject(void *reply)
void redisFree(redisContext *c)