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

简介: 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

实现环境:

image

一,安装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
目录
相关文章
|
15天前
|
运维 监控 NoSQL
两张流程图带你学会SpringBoot整合Redis主从复制、哨兵模式并搞懂其工作流程
两张流程图带你学会SpringBoot整合Redis主从复制、哨兵模式并搞懂其工作流程
29 0
|
15天前
|
NoSQL Redis Docker
【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)下
【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)
44 0
|
15天前
|
存储 NoSQL Redis
【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)上
【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)
33 0
|
1月前
|
监控 NoSQL Redis
Redis主从复制-最终章
Redis主从复制-最终章
30 0
|
1月前
|
NoSQL 容灾 Redis
Redis主从复制(配置步骤 一主二仆)
Redis主从复制(配置步骤 一主二仆)
37 0
|
2月前
|
负载均衡 NoSQL Redis
【Redis 系列】redis 学习十,Redis 集群搭建和主从复制
【Redis 系列】redis 学习十,Redis 集群搭建和主从复制
|
2月前
|
监控 NoSQL Redis
Redis主从复制 - 实现原理
有3种配置方式: (1)配置文件 在从服务器的配置文件中加入:slaveof <masterip> <masterport> (2)启动命令 redis-server启动命令后加入 --slaveof <masterip> <masterport> (3)客户端命令 Redis服务器启动后,直接通过客户端执行命令:slaveof <masterip> <masterport>,则该Redis实例成为从节点。
|
2月前
|
NoSQL Redis
Redis主从复制 - 实战搭建
可以看到当前机器的角色是 master,从市 slave
Redis主从复制 - 实战搭建
|
2月前
|
缓存 NoSQL Redis
【2023】Redis主从复制模式集群
【2023】Redis主从复制模式集群
111 0
|
3月前
|
负载均衡 监控 NoSQL
Redis主从复制和哨兵模式的原理及其在实际应用中的使用场景
Redis主从复制和哨兵模式的原理及其在实际应用中的使用场景
54 1
推荐文章
更多