Redis cluster集群部署详细讲解

集群Redis cluster

1.集群介绍

Redis Cluster是redis的分布式解决方案,在3.0版本正式推出。

当遇到单机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。

Redis cluster之前的分布式方案有两种:

1)客户端分区方案,有点逻辑分区可控,缺点是需要自己处理数据路由,高可用和故障转移等。
2)代理方案,优点是简化客户端分布式逻辑和升级维护便利,缺点加重架构部署和性能消耗。

2.数据分布

分布式数据库首先要解决吧整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Rredis Cluster采用哈希分片规则。

3.集群Redis cluster

1.槽位分配slot

2.65534个槽位

3.每个槽都得分配到位,有一个槽没有分配,整个集群不可用。

4.序号不一定要连续,最重要的是每个节点的槽位数量要大致相同,运行2%的误差。

5.集群通讯端口为配置文件里的port加10000,比如6380,通讯端口是16380

6.集群转移切换全自动,不需要手动更改

7.集群配置文件动态更新

8.代码连接redis集群需要插件更新驱动

9.集群内的消息传递是同步的

10.集群内的所有已经发现的节点配置文件是自动更新的。

3.1.集群环境

请添加图片描述

4.部署操作

4.1.配置文件

创建一下对应的文件目录

db1、db2、db3先给这几个机器创建目录。
[root@localhost redis_cluster]# mkdir -p /opt/redis_cluster/redis_6381/{conf,pid,log}
[root@localhost redis_cluster]# mkdir -p /opt/redis_cluster/redis_6380/{conf,pid,log}
[root@localhost redis_cluster]#mkdir /data/redis_cluster/redis_6381
[root@localhost redis_cluster]#mkdir /data/redis_cluster/redis_6380

内容都是一样的只需要根据自己的情况修改一下IP就行,三台机器一样的操作

cat >/opt/redis_cluster/redis_6381/conf/redis_6381.conf<<EOF
bind 192.168.40.2
port 6381
daemonize yes
pidfile "/opt/redis_cluster/redis_6381/pid/redis_6381.pid"
logfile "/opt/redis_cluster/redis_6381/log/redis_6381.log"
dbfilename "redis_6381.rdb"
dir "/data/redis_cluster/redis_6381/"
cluster-enabled yes
cluster-config-file nodes_6381.conf
cluster-node-timeout 15000
EOF
cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.40.2
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/log/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

redis集群不仅需要开通redis客户端连接端口比如6380,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口+1000

4.2.配置redis集群自动发现

先启动三个节点的服务

请添加图片描述

然后我们来配置redis集群的自动发现

这样把其他几个节点的端口也进行自动发现。
192.168.40.5:6380> CLUSTER MEET 192.168.40.5 6381
192.168.40.5:6380> CLUSTER MEET 192.168.40.1 6381
192.168.40.5:6380> CLUSTER MEET 192.168.40.1 6380
192.168.40.5:6380> CLUSTER MEET 192.168.40.2 6380
192.168.40.5:6380> CLUSTER MEET 192.168.40.2 6381

使用命令查询,会发现多出来其他节点的信息

可以去其他两个节点查看一下是否同步过来了,三个节点都已经发现的了对应的信息。

192.168.40.5:6380> CLUSTER NODES
8dafec60cce26a31db7a572781a4a142cef5afc8 192.168.40.5:6381 master - 0 1654524226664 0 connected
84a879f92a71ce681fea90bfb1f0580e065665aa 192.168.40.1:6381 handshake - 1654524218830 0 0 connected
03b15eff66eec33ed10c688d96433df406ba22c6 192.168.40.5:6380 myself,master - 0 0 1 connected
8df440140f0e6726e46276d91971a7e1e41dd1c7 192.168.40.1:6380 handshake - 1654524220151 0 0 connected
88cfb82f60c2c3bad1bff680ecf46d6587860308 192.168.40.2:6380 handshake - 1654524223713 0 0 connected
068edbb27ed5c3ae6846c7871edf8aa539bfedda 192.168.40.2:6381 handshake - 1654524228290 0 0 connected


还有配置文件中的相关信息,三个节点的内容是一样的
[root@localhost redis_cluster]# cat redis_6380/nodes_6380.conf 
40346157be5f5a04d8885dd8505da410cc82f0c2 192.168.40.2:6380 master - 0 1654524526563 4 connected
8dafec60cce26a31db7a572781a4a142cef5afc8 192.168.40.5:6381 master - 0 1654524525544 2 connected
ed3bf0674ec300001f0a366d2959fe5c15ad9ea7 192.168.40.2:6381 master - 0 1654524528705 0 connected
4c824b30bfb0e44aa3ee6e45818e8c6b528f969d 192.168.40.1:6381 master - 0 1654524527583 3 connected
932ae32e441ada1089d35144200315905e97997d 192.168.40.1:6380 myself,master - 0 0 5 connected
03b15eff66eec33ed10c688d96433df406ba22c6 192.168.40.5:6380 master - 0 1654524528602 1 connected
vars currentEpoch 5 lastVoteEpoch 0

5.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消息交换。

通讯示意图:
请添加图片描述

6.Redis Cluster 手动分配槽位

虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因此并没有给节点分配槽位,而且必须是所有的槽位都分配完成后整个集群是可用的状态。

反之,也就是说只有一个槽位没有分配,那么整个集群就是不可用的。

目前是没有分配槽位的情况下
测试命令:
[root@localhost ~]# redis-cli -h 192.168.40.5 -p 6380
192.168.40.5:6380> set k22 v1
(error) CLUSTERDOWN Hash slot not served
#发现执行的报错的
#执行这个命令CLUSTER INFO
192.168.40.5:6380> CLUSTER INFO
cluster_state:fail   #集群状态目前是失败的
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6   #集群数量是6个
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:18869
cluster_stats_messages_received:18813

6.1.分配槽位操作

我们槽位一共是有16384个
db01   192.168.40.5  0-5460
db02   192.168.40.1  5461-10922
db03   192.168.40.2  10923-16384

命令:#在服务器中执行分配对应的槽位
redis-cli -h 192.168.40.5 -p 6380 cluster addslots {0..5461}
redis-cli -h 192.168.40.1 -p 6380 cluster addslots {5462..10922}
redis-cli -h 192.168.40.2 -p 6380 cluster addslots {10923..16383}

#查询槽位分配成功的情况
192.168.40.1:6380> CLUSTER NODES
9ab7887766fb733ea9ba8b9077c493a604e8eaf4 192.168.40.2:6380 master - 0 1655214041555 3 connected 10923-16383
8787c7146d996e1a9721cce8d7f0191a01a7df27 192.168.40.1:6381 master - 0 1655214037526 2 connected
a5a381d1196111efaa97519b450b150487524245 192.168.40.5:6380 master - 0 1655214042561 5 connected 0-5461
e5dad803a672ae4a78761f7e6ce58f67941b8fb1 192.168.40.2:6381 master - 0 1655214043569 0 connected
27c999eb5f011491803f4493826791b101e6b1df 192.168.40.5:6381 master - 0 1655214040548 4 connected
7094c6f0782084271a2705a2bfdd99a7780cd0d1 192.168.40.1:6380 myself,master - 0 0 1 connected 5462-10922

6.2.配置主次交叉复制

上面我们的槽位已经是分配完成了,现在我们来配置cluster集群的主从关系。

命令是CLUSTER REPLICATE

#我们进入6381的端口是需要根据他最前面的“e5dad803a672ae4a78761f7e6ce58f67941b8fb1”这个来指集群的信息,配置交叉复制。
[root@localhost redis_cluster]# redis-cli -h 192.168.40.5 -p 6381
192.168.40.5:6381> CLUSTER NODES
e5dad803a672ae4a78761f7e6ce58f67941b8fb1 192.168.40.2:6381 master - 0 1655214861385 0 connected
7094c6f0782084271a2705a2bfdd99a7780cd0d1 192.168.40.1:6380 master - 0 1655214856351 1 connected 5462-10922
9ab7887766fb733ea9ba8b9077c493a604e8eaf4 192.168.40.2:6380 master - 0 1655214859373 3 connected 10923-16383
a5a381d1196111efaa97519b450b150487524245 192.168.40.5:6380 master - 0 1655214858365 5 connected 0-5461
27c999eb5f011491803f4493826791b101e6b1df 192.168.40.5:6381 myself,master - 0 0 4 connected
8787c7146d996e1a9721cce8d7f0191a01a7df27 192.168.40.1:6381 master - 0 1655214862393 2 connected
192.168.40.5:6381>

#上面有详细的图来解释交叉复制。
db01
192.168.40.5:6381> CLUSTER REPLICATE 7094c6f0782084271a2705a2bfdd99a7780cd0d1
OK
db02
192.168.40.1:6381> CLUSTER REPLICATE 9ab7887766fb733ea9ba8b9077c493a604e8eaf4
OK
db03
192.168.40.2:6381> CLUSTER REPLICATE a5a381d1196111efaa97519b450b150487524245
OK

配置完成后再次查询发现会有三个6381的节点变成slave,这样我们的交叉复制就配置完成了

192.168.40.5:6381> CLUSTER NODES
e5dad803a672ae4a78761f7e6ce58f67941b8fb1 192.168.40.2:6381 slave a5a381d1196111efaa97519b450b150487524245 0 1655215163610 5 connected
7094c6f0782084271a2705a2bfdd99a7780cd0d1 192.168.40.1:6380 master - 0 1655215166631 1 connected 5462-10922
9ab7887766fb733ea9ba8b9077c493a604e8eaf4 192.168.40.2:6380 master - 0 1655215164618 3 connected 10923-16383
a5a381d1196111efaa97519b450b150487524245 192.168.40.5:6380 master - 0 1655215165624 5 connected 0-5461
27c999eb5f011491803f4493826791b101e6b1df 192.168.40.5:6381 myself,slave 7094c6f0782084271a2705a2bfdd99a7780cd0d1 0 0 4 connected
8787c7146d996e1a9721cce8d7f0191a01a7df27 192.168.40.1:6381 slave 9ab7887766fb733ea9ba8b9077c493a604e8eaf4 0 1655215162602 3 connected

7.redis cluster故障切换

来模拟一下故障切换的功能,目前的架构是三主三从交叉复制的结构,主服务器宕机的情况下从服务器会自动顶替,但是主服务器恢复后,之前的主服务器不会自动恢复,需要我们来手动指定。
请添加图片描述

下面我们把db01的6380接口给关掉,然后db03的6381会变成主服务器。
[root@localhost ~]# ps -ef |grep redis
root       3289      1  0 20:15 ?        00:00:01 redis-server 192.168.40.5:6379
root       3297      1  0 20:16 ?        00:00:02 redis-server 192.168.40.5:6381 [cluster]
root       3696      1  0 20:32 ?        00:00:01 redis-server 192.168.40.5:6380 [cluster]
root       3700   3149  0 20:33 pts/1    00:00:00 redis-cli -h 192.168.40.5 -p 6380
root       4370   3709  0 21:03 pts/2    00:00:00 grep --color=auto redis
[root@localhost ~]# kill -9 3696
[root@localhost ~]# ps -ef |grep redis
root       3289      1  0 20:15 ?        00:00:01 redis-server 192.168.40.5:6379
root       3297      1  0 20:16 ?        00:00:02 redis-server 192.168.40.5:6381 [cluster]
root       3700   3149  0 20:33 pts/1    00:00:00 redis-cli -h 192.168.40.5 -p 6380
root       4405   3709  0 21:03 pts/2    00:00:00 grep --color=auto redis

#可以看到6380端口已经被kill掉了,我们在查询一下集群情况

请添加图片描述

我们关闭db01的6380后可以看到
db03:192.168.40.2:6381已经是变成主了
db01:192.168.40.5的6380已经变成了从服务器

然后我们来启动db01的6380端口

[root@localhost redis_cluster]# redis-server redis_6380/conf/redis_6380.conf 
[root@localhost redis_cluster]# ps -ef |grep redis
root       3289      1  0 20:15 ?        00:00:02 redis-server 192.168.40.5:6379
root       3297      1  0 20:16 ?        00:00:03 redis-server 192.168.40.5:6381 [cluster]
root       3700   3149  0 20:33 pts/1    00:00:00 redis-cli -h 192.168.40.5 -p 6380
root       4620      1  0 21:12 ?        00:00:00 redis-server 192.168.40.5:6380 [cluster]
root       4624   3709  0 21:12 pts/2    00:00:00 grep --color=auto redis

7.1.手动恢复主服务器

#我们可以在db01的6380端口来执行这个命令,来把slave给升级为master
192.168.40.5:6380> CLUSTER FAILOVER
OK

请添加图片描述
可以看到我们的节点已经是恢复到db01上了。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Kubernetes(k8s)是一个流行的容器编排平台,可以用于部署和管理Redis Cluster集群。要部署Redis Cluster集群,您需要创建一个Kubernetes集群,并使用Kubernetes对象(如Deployment、Service和ConfigMap)来定义Redis Cluster的各个组件。您还需要使用Redis官方提供的Redis Cluster镜像来创建Redis节点,并使用Kubernetes的网络和存储资源来确保Redis节点之间的通信和数据持久性。最后,您需要使用Kubernetes的监控和日志记录工具来监视和管理Redis Cluster集群的状态和性能。 ### 回答2: Kubernetes是一种流行的容器编排平台,可以轻松地部署各种应用程序和服务。Redis是一个开源的内存键值数据库,广泛用于缓存和存储解决方案。在生产环境中,我们通常需要对Redis进行集群部署,以提高性能和可用性。在这篇文章中,我们将介绍如何使用Kubernetes部署Redis Cluster集群。 1. 创建Redis镜像 首先,我们需要创建一个Redis Docker镜像,并将其推送到Docker Hub等镜像仓库中。这个过程比较简单,我们可以从Docker官方网站下载Redis的Dockerfile,并进行一些基本的修改。例如: - 安装一些必要的依赖项,如wget和tar。 - 下载和解压Redis源代码。 - 编译Redis,并将其放置在/usr/local/bin目录下。 - 拷贝启动脚本和Redis配置文件到镜像中。 2. 编写Redis Cluster配置文件 接下来,我们需要编写一个Redis Cluster配置文件,用于指定每个Redis节点的端口和IP地址等信息。Redis Cluster要求至少有3个主节点和3个从节点,因此我们需要至少6个Redis节点来构建集群。例如: port 6379 cluster-enabled yes cluster-node-timeout 15000 cluster-config-file /data/nodes.conf cluster-require-full-coverage no appendonly yes dir /data/ daemonize no logfile "" 3. 部署Redis Cluster 现在,我们可以使用Kubernetes来部署Redis Cluster集群。我们需要使用StatefulSet控制器来生成一组具有唯一名称和稳定网络标识符的Redis Pod。此外,我们还需要使用Service来创建一个Redis Headless服务,并允许Pod之间相互发现和通信。例如: apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 template: metadata: labels: app: redis spec: containers: - name: redis image: my-redis-image:latest command: ["redis-server"] args: ["--appendonly", "yes"] ports: - containerPort: 6379 name: redis volumeMounts: - name: data mountPath: /data volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi apiVersion: v1 kind: Service metadata: name: redis-cluster spec: clusterIP: None ports: - name: redis port: 6379 selector: app: redis 4. 启动Redis Cluster 最后,我们可以启动Redis Cluster集群。首先,我们需要使用kubectl命令创建StatefulSet和Headless Service: kubectl create -f redis-cluster.yaml 然后,我们可以检查StatefulSet和Service是否成功创建: kubectl get statefulset kubectl get service 最后,我们可以使用kubectl命令进入Redis Pod,并运行redis-cli命令来验证集群是否正常工作: kubectl exec redis-cluster-0 redis-cli -c cluster info 总之,使用Kubernetes部署Redis Cluster集群比较简单,只需要做好上述几个步骤即可。在实际生产环境中,我们需要注意确保每个Redis节点之间的网络通信和数据同步,以提高集群的性能和可用性。 ### 回答3: Redis是一种快速的开源键值数据库,它的性能是其他NoSQL解决方案无法匹敌的。而Kubernetes是一个开源的容器编排引擎,负责在容器集群中自动化地部署、扩展和运行容器化应用程序。通过结合Kubernetes和Redis,我们可以快速构建一个高性能的Redis Cluster集群。 首先,我们需要设置Redis Cluster节点。因为Redis Cluster需要在一组单独的Redis实例之间进行数据分片,所以必须创建多个Redis实例来配置集群。因此,在Kubernetes中创建Redis Cluster时,最好使用StatefulSet,这样可以保证每个实例都有唯一的标识符和网络标识符。 接下来,我们创建一个Redis镜像,并将其推送到容器仓库。我们还需要为Redis Cluster创建一个配置文件,以确保各个节点能够正确地彼此通信。这里有一些要注意的事项,如: 1. 配置文件中必须使用静态IP地址来分配节点,否则它们将无法正确地通信。 2. 每个Redis实例还需要独立的持久化存储来保存数据,因此需要为每个节点分配一个存储卷。 3. 我们需要使用Kubernetes Service来将Redis Cluster公开给集群内的其他服务。 4. 对于Redis Cluster来说,最好使用至少6个节点用于数据分片。 接下来,我们使用Kubernetes YAML文件创建Redis Cluster。首先,创建一个名为“redis-cluster.yaml”的文件,并将以下内容复制并粘贴。注意,这里的配置文件和镜像名称都需要修改。 --- apiVersion: v1 kind: Service metadata: name: redis-cluster labels: app: redis-cluster spec: ports: - port: 6379 name: redis clusterIP: None selector: app: redis-cluster --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: redis:5.0.1-alpine command: - redis-server args: - /data/redis.conf ports: - containerPort: 6379 volumeMounts: - name: redis-data mountPath: /data - name: redis-config mountPath: /data/redis.conf subPath: redis.conf volumes: - name: redis-data persistentVolumeClaim: claimName: redis-data - name: redis-config configMap: name: redis-config --- apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.conf: |- port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 最后,我们需要使用kubectl工具将YAML文件应用于Kubernetes集群。使用以下命令: kubectl apply -f redis-cluster.yaml 完成这些步骤后,Redis Cluster集群应该已经成功地部署到了Kubernetes集群中。我们可以使用特定的redis-cli命令将各个节点添加到集群中: redis-cli --cluster create 192.168.0.2:6379 192.168.0.3:6379 192.168.0.4:6379 192.168.0.5:6379 192.168.0.6:6379 192.168.0.7:6379 --cluster-replicas 1 这个命令将在所有节点之间创建数据分片,并将第7个节点设置为冗余备份。这样我们就创建了一个可靠的、高性能的Redis Cluster集群,可以在Kubernetes集群中自动部署、扩展和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值