主从复制

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文件中的数据进行修改,修改五个
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"
3、分别启动三个配置文件,然后使用ps命令查看三个进程是否启动了
sudo redis-server /etc/redis/6379.conf
sudo redis-server /etc/redis/6380.conf
sudo redis-server /etc/redis/6381.conf
image-20230705094811490
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,就可以看到主从复制的信息。
image-20230705095105788
image-20230705095122275
总结
1、==从机上是不能进行写操作的。==
2、==如果主机挂掉了, 那么从机会立马感知到主机的掉线,会记录主机的状态为down,但是从机不会成为新的主机,只会默默等待主机的上线。==
3、==如果不想将某台机器作为任何机器的从机,可以执行slaveof no one.==
二、哨兵模式
redis的传统的主从复制, 当主机挂掉之后,从机不会成为主机,那么如果有新的写操作,是无法进行的,所以可以使用哨兵模式。
哨兵模式会执行两个协议, 流言协议(造谣)、投票协议(少数服从多数)
配置步骤
1、在/etc/redis下面添加一个文件,sentinel.conf,然后添加一行命令
redis
#哨兵     监视    主机名       主机ip    port  票数
sentinel monitor master6379 127.0.0.1 6379   1
2、启动哨兵的配置文件sudo redis-sentinel /etc/redis/sentinel .conf,哨兵就启动了,会监视主机
3、将主机断掉之后, 然后哨兵会进行留言协议与投票协议,然后将这一票投递给6380或者6381, 谁得到这一票谁就是主机。
三、面试常考题(==重要==)
1、==缓存雪崩==
问题:== 大量的数据在同一时间失效了 导致本来可以在缓存中查找的数据现在找不到,就只能到底层数据库中进行查找,那么底层数据库的压力会比较大。 ==
解决方案:==1、可以让key不过期 2、将数据分散时间失效==
image-20230705102745061
2、==缓存击穿==
问题:==当 热点数据key 从缓存内失效时, 大量访问同时请求这个数据 ,就会将查询下沉到数据库层,此时数据库层的负载压力会骤增,我们称这种现象为"缓存击穿"。==
解决问题:==1、 延长热点数据的过期时间或者设置为永不过期 2、 加锁,让大量请求互斥访问数据库 ==
image-20230705105357866
3、==缓存穿透==
问题:== 要访问的数据在缓存中没有 并且在底层数据库中也不存在该数据 ,那么当大量请求过来之后,会造成底层数据库的压力比较大,但是数据在数据库依旧没有。==
解决方案:== 可以设置key与空的键值对,存在缓存中map ,查询的时候,可以通过value进行体现==
image-20230705110139641
四、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)
在编译的时候,g++ xxx.cc -lhiredis