Redis学习+集群搭建+持久化+主从复制(详细学习)(中)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis学习+集群搭建+持久化+主从复制(详细学习)(中)

五,主从复制

1.redis主从复制

为解决单点故障把数据复制到一个或多个副本副本服务器(从服务器),实现故障恢复和负载均衡

2.开启第二台服务器,安装redis

(1)把第一台服务器的redis安装目录,scp到第二台服务器上
scp -rp /opt/redis_cluster/ root@192.168.8.20:/opt
(2)在第二台服务器上,make install安装redis
  cd /opt/redis_cluster/redis
  make install
  vim /opt/redis_cluster/redis_6379/conf/6379.conf 
  修改:
  bind 127.0.0.1 192.168.2.2
  slaveof 192.168.2.1 6379
  保存退出
(3)启动服务
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
(4)主服务器上新建键值,测试从服务器自动同步
(5)从服务器在同步过程中,只能复制主数据库的数据,不能手动添加修改数据;

如果从服务器非要修改数据,需要断开同步:

redis-cli slaveof no one

六,redis集群

一,redis集群的概念

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。


Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的错误。


Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。


redis集群提供了以下两个好处:

将数据自动切分到多个节点的能力

当集群中的一部分节点失灵或无法进行通信,仍然可以继续处理命令请求能力

二,集群redis部署

环境:

redis1-2:192.168.2.1

redis2-3:192.168.2.2

redis3-4:192.168.2.3

实现环境:

一,安装redis

1.redis1部署
1.安装redis
[root@localhost ~]# tar -xf /mnt/redis-5.0.7.tar.gz -C /opt/
[root@localhost ~]# /opt/redis-5.0.7
[root@localhost redis-5.0.7]# make && make install
[root@localhost ~]# ln -s  /opt/redis-5.0.7/ /opt/redis   #做一个软链接,方便以后更新

注意(当make编译时出现问题,大多数原因是缺少gcc编译器):[root@localhost redis-5.0.7]# yum -y install gcc gcc-c++

2.创建配置文件存放位置
[root@localhost ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
[root@localhost ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
3.编写redis配置文件
[root@localhost ~]# cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.2.1
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
4.创建6381端口的redis
[root@localhost ~]# cd /opt/redis_cluster/
[root@localhost redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
[root@localhost redis_cluster]# sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf
5.启动redis
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
6.传递redis
[root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.2:/opt
[root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.3:/opt
2.redis2部署
1.重新安装一下redis
[root@localhost ~]# cd /opt/redis
[root@localhost redis]# make install
2.更改配置文件中的IP地址
[root@localhost redis]# find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#192.168.2.1#192.168.2.2#g"
3.创建存放数据的目录
[root@localhost redis]# mkdir -p /data/redis_cluster/redis_{6380,6381}
4.开启redis服务器
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
3.redis3部署(同redis2除IP外)

二,手动配置节点发现

节点发现使用命令: CLUSTER MEET {IP} {PORT}

提示:在集群内任意一台机器执行此命令就可以

1.添加节点在192.168.2.1:6380
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6380
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6380
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678676225000 4 connected
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678676226000 0 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678676226199 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678676224000 1 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678676223000 2 connected
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678676227207 3 connected
2.redis cluster通信流程

redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。

通信过程:

1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000).


2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息


3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,


只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。


通讯消息类型:


Gossip

Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。

常见 Gossip 消息分为:ping、 pong、 meet、 fail 等


meet

meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换


ping

ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。


pong

Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。

  • fail

fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。

3.redis cluster手动分配槽位

注意:虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态。 反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.

[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster addslots {0..5460}
OK
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6380 cluster addslots {5461..10922}
OK
[root@localhost ~]# redis-cli -h 192.168.2.3 -p 6380 cluster addslots {10923..16383}
OK

查看:

[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678677991468 4 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678677992477 0 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678677990459 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678677991000 1 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678677992000 2 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678677993485 3 connected 5461-10922
4.手动分配集群高可用
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6381 cluster replicate d9ea4f26b2221a5497d78326a7c1aff828e98426  #输入第二台6380的ID
OK
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6381 cluster replicate b6f47e859ad6a3b9b238778d1cf0df4f95710a1f  #输入第三台6380的ID
OK
[root@localhost ~]# redis-cli -h 192.168.2.3 -p 6381 cluster replicate 9f48a4262474744dc22524b28096ccba111d236d  #输入第一台6380的ID
OK
5.redis cluster ASK路由介绍

在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点

如果节点是自身,则处理键命令;

否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.

知道了ask路由后,我们使用-c选项批量插入一些数据

1.编写创建键值对脚本
[root@localhost ~]# vi input_key.sh
#!/bin/bash
for i in $(seq 1 10000)
do
    redis-cli -c -h 192.168.2.1 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done
#保存退出
#运行测试
bash input_key.sh

测试

[root@localhost ~]# redis-cli -c -h 192.168.2.1 -p 6380
192.168.2.1:6380> get k_10000
-> Redirected to slot [12695] located at 192.168.2.3:6380 #存放到了2.3上的第12695槽位
"v_10000"
192.168.2.3:6380> get k_1000
-> Redirected to slot [79] located at 192.168.2.1:6380 #存放到了2.1上的第79槽位
"v_1000"
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
52 0
|
15天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
1月前
|
NoSQL Redis
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
|
1月前
|
消息中间件 存储 缓存
深入理解Redis集群主从复制原理
该文章主要探讨了Redis集群中的主从复制原理,包括为何需要主从复制、配置方法、复制流程以及一些高级特性。
深入理解Redis集群主从复制原理
|
1月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
42 0
|
1月前
|
缓存 NoSQL Redis
redis数据持久化之RDB和AOF
redis数据持久化之RDB和AOF
|
4月前
|
NoSQL Redis
03- Redis的数据持久化策略有哪些 ?
Redis的数据持久化包括两种策略:RDB(全量快照)和AOF(增量日志)。RDB在指定时间间隔将内存数据集保存到磁盘,而AOF记录所有写操作形成日志。从Redis 4.0开始,支持RDB和AOF的混合持久化,通过设置`aof-use-rdb-preamble yes`。
50 1
|
2月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
3月前
|
存储 缓存 JSON
Redis-持久化-淘汰机制-IO策略
Redis-持久化-淘汰机制-IO策略
|
4月前
|
存储 NoSQL 关系型数据库
Redis持久化策略AOF、RDB详解及源码分析
Redis持久化策略AOF、RDB详解及源码分析