redis集群(redis集群三种方式的优缺点)
本篇文章给大家谈谈redis集群,以及redis集群三种方式的优缺点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Redis Cluster集群的搭建
- 2、Redis集群模式
- 3、redis集群主数据都是一致的吗为什么?
- 4、redis cluster集群部署
- 5、redis集群 不停服务,重启某一服务器怎么做?
Redis Cluster集群的搭建
搭建集群工作需要以下三个步骤:
1)准备节点。
2)节点握手。
3)分配槽。
Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置cluster-enabled yes,让Redis运行在集群模式下。建议为集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把6个节点配置统一放在conf目录下,集群相关配置如下:
其他配置和单机模式一致即可,配置文件命名规则redis-{port}.conf,准备好配置后启动所有节点。
Cluster集群启动过程如下图:
每个节点目前只能识别出自己的节点信息,可以执行cluster nodes命令获取集群节点状
态。
节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通告升茄信的第一步,由客户端发起命令:cluster meet{ip}{port}
cluster meet命令是一个异步命令,执行之后立刻返回。内部发起与目标节点进行握手通信,握手通信过程:
1)节点6379本地创建6380节点信息对象,并发送meet消息。
2)节点6380接受到meet消息后,保存6379节点信息并回复pong消息。
3)之后节点6379和6380彼此定期通过ping/pong消息进行正常的节点通
信。
分别执行meet命令让其他节点加入到集群中,
最后执行cluster nodes命令确认6个节点都彼此感知并组成集群。
节点建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据读写都被禁止,通过cluster info命令可以获取集群当前状态。
Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过cluster addslots命令为节点分配槽。这里利用bash特性批量设置槽(slots),命令如下:
执行cluster info查看集群状态,如下所示:
当前集群状态是OK,集群进入在线状态。所有的槽都已经分配给节点,执行cluster nodes命令可以看到节点和槽的分配关系:
集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从袜察节点负责复制主节点槽信息和相关的数据。使用cluster replicate{nodeId}命令让一个节点成为从节点。其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID,命令如下:
Redis集群模式下的主从复制使用了之前介绍的Redis复制流程,依然支持全量和部分复制。复制(replication)完成后,整个集群的结构如图:
集群搭建需要很多步骤当集群节点众多时,必然会加大搭建集群的复杂度和运维成本。因此Redis官方提供了redis-trib.rb工具方便我们快速搭建集群。
redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。
1、安装Ruby:
2、安装rubygem redis依赖:
3、安装redis-trib.rb:
4、安装完Ruby环境后,执行redis-trib.rb命令确认环境是否正确,输出如
下:
首先我们跟之前内容一样准备好节点配置并启动:
启动好6个节点之后,使用redis-trib.rb create命令完成节点握手和槽分配过程,命令笑睁如下:
--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
如果部署节点使用不同的IP地址,redis-trib.rb会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配操作。
集群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作,命令如下:
[img]Redis集群模式
拓扑结构介绍:
192.168.43.70 redis01 (6379,6380)
192.168.43.71 redis02 (6379,6380)
192.168.43.72 redis03 (6379,6380)
OS : CentOS Linux release 7.7.1908 (Core)
Redis : redis-5.0.9.tar.gz
根据实验我们统计出MS对应关系,一共是3对MS("A","B","C"),分别为租缺:
"A" - 192.168.43.70:6379(Master) - 192.168.43.71:6380(Slave)
"B" - 192.168.43.71:6379(Master) - 192.168.43.72:6380(Slave)
"C" - 192.168.43.72:6379(Master) - 192.168.43.70:6380(Slave)
---- ------ ----- --------- --------- -- ------ --
| -- | 6379 | 6380 |
---- ------ ----- --------- --------- -- ------ --
|192.168.43.70 | "A" | "C" |
|192.168.43.71 | "B" | "A" |
|192.168.43.72 | "C" | "B" 棚型穗 |
---- ------ ----- --------- --------- -- ------ --
注意: 每台服务器启动2个Redis实例进行测试,端口分别为6379与6380。
参阅:《redis的安装配置》
[root@redis01 redis]# mkdir /usr/local/链卜redis_6379
[root@redis01 redis]# mkdir /usr/local/redis_6380
[root@redis01 redis]# cat redis_6379.conf
bind 192.168.43.70 127.0.0.1
daemonize yes
port 6379
dir "/usr/local/redis_6379"
logfile "/var/log/redis_6379.log"
pidfile "/var/run/redis_6379.pid"
cluster-enabled yes
cluster-config-file redis_6379.conf
cluster-node-timeout 15000
appendonly yes
appendfilename aof-6379.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
[root@redis01 redis]# cat redis_6380.conf
bind 192.168.43.70 127.0.0.1
daemonize yes
port 6380
dir "/usr/local/redis_6380"
logfile "/var/log/redis_6380.log"
pidfile "/var/run/redis_6380.pid"
cluster-enabled yes
cluster-config-file redis_6380.conf
cluster-node-timeout 15000
appendonly yes
appendfilename aof-6380.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
[root@redis01 redis]#
[root@redis01 src]# ./redis-server ../redis_6379.conf
[root@redis01 src]# ./redis-server ../redis_6380.conf
[root@redis01 src]# ps -ef | grep redis
root 24438 1 0 16:14 ? 00:00:00 ./redis-server 192.168.43.70:6379 [cluster]
root 24443 1 0 16:14 ? 00:00:00 ./redis-server 192.168.43.70:6380 [cluster]
root 24450 1238 0 16:15 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]# netstat -anultp | grep redis
tcp 0 0 127.0.0.1:16379 0.0.0.0:* LISTEN 24438/./redis-serve
tcp 0 0 192.168.43.70:16379 0.0.0.0:* LISTEN 24438/./redis-serve
tcp 0 0 127.0.0.1:16380 0.0.0.0:* LISTEN 24443/./redis-serve
tcp 0 0 192.168.43.70:16380 0.0.0.0:* LISTEN 24443/./redis-serve
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 24438/./redis-serve
tcp 0 0 192.168.43.70:6379 0.0.0.0:* LISTEN 24438/./redis-serve
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 24443/./redis-serve
tcp 0 0 192.168.43.70:6380 0.0.0.0:* LISTEN 24443/./redis-serve
[root@redis01 src]#
选择任意一节点执行:
[root@redis01 src]# ./redis-cli --cluster create 192.168.43.70:6379 192.168.43.70:6380 \
192.168.43.71:6379 192.168.43.71:6380 192.168.43.72:6379 \
192.168.43.72:6380 --cluster-replicas 1
Performing hash slots allocation on 6 nodes...
Master[0] - Slots 0 - 5460
Master[1] - Slots 5461 - 10922
Master[2] - Slots 10923 - 16383
Adding replica 192.168.43.71:6380 to 192.168.43.70:6379
Adding replica 192.168.43.72:6380 to 192.168.43.71:6379
Adding replica 192.168.43.70:6380 to 192.168.43.72:6379
M: 21c8a195443f80d9a34714370e2bdad5fa1a302c 192.168.43.70:6379
slots:[0-5460] (5461 slots) master
S: cd878e102829bc46e8251a81a466438e13adbb41 192.168.43.70:6380
replicates 9a6f102b66cf56eca259ef4405a61c506c4dc2fb
M: 4fbd33604f9a7546a8f8b709427e4b3aeb757fc3 192.168.43.71:6379
slots:[5461-10922] (5462 slots) master
S: 47f5f3d12040ce9cf93c5fd6088be35d4c5b667f 192.168.43.71:6380
replicates 21c8a195443f80d9a34714370e2bdad5fa1a302c
M: 9a6f102b66cf56eca259ef4405a61c506c4dc2fb 192.168.43.72:6379
slots:[10923-16383] (5461 slots) master
S: df2d579ac711c222d53b38d7f2449dfd83a630b8 192.168.43.72:6380
replicates 4fbd33604f9a7546a8f8b709427e4b3aeb757fc3
Can I set the above configuration? (type 'yes' to accept): yes # 这里敲:yes
Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
Performing Cluster Check (using node 192.168.43.70:6379)
M: 21c8a195443f80d9a34714370e2bdad5fa1a302c 192.168.43.70:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 4fbd33604f9a7546a8f8b709427e4b3aeb757fc3 192.168.43.71:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: cd878e102829bc46e8251a81a466438e13adbb41 192.168.43.70:6380
slots: (0 slots) slave
replicates 9a6f102b66cf56eca259ef4405a61c506c4dc2fb
M: 9a6f102b66cf56eca259ef4405a61c506c4dc2fb 192.168.43.72:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 47f5f3d12040ce9cf93c5fd6088be35d4c5b667f 192.168.43.71:6380
slots: (0 slots) slave
replicates 21c8a195443f80d9a34714370e2bdad5fa1a302c
S: df2d579ac711c222d53b38d7f2449dfd83a630b8 192.168.43.72:6380
slots: (0 slots) slave
replicates 4fbd33604f9a7546a8f8b709427e4b3aeb757fc3
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.
[root@redis01 src]#
[root@redis01 src]# ./redis-cli -c -p 6379 # -c 表示加入集群中
127.0.0.1:6379 cluster nodes
4fbd33604f9a7546a8f8b709427e4b3aeb757fc3 192.168.43.71:6379@16379 master - 0 1598949484973 3 connected 5461-10922
cd878e102829bc46e8251a81a466438e13adbb41 192.168.43.70:6380@16380 slave 9a6f102b66cf56eca259ef4405a61c506c4dc2fb 0 1598949485980 5 connected
9a6f102b66cf56eca259ef4405a61c506c4dc2fb 192.168.43.72:6379@16379 master - 0 1598949483000 5 connected 10923-16383
21c8a195443f80d9a34714370e2bdad5fa1a302c 192.168.43.70:6379@16379 myself,master - 0 1598949481000 1 connected 0-5460
47f5f3d12040ce9cf93c5fd6088be35d4c5b667f 192.168.43.71:6380@16380 slave 21c8a195443f80d9a34714370e2bdad5fa1a302c 0 1598949484000 4 connected
df2d579ac711c222d53b38d7f2449dfd83a630b8 192.168.43.72:6380@16380 slave 4fbd33604f9a7546a8f8b709427e4b3aeb757fc3 0 1598949485000 6 connected
127.0.0.1:6379
127.0.0.1:6379 set test 'test redis cluster.'
- Redirected to slot [6918] located at 192.168.43.71:6379
OK
192.168.43.71:6379 get test
"test redis cluster."
192.168.43.71:6379
采用去中心化的思想,没有中心节点的说法,它使用hash slot方式将16348个hash slot覆盖到所有节点上,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot,
并在访问key的时候就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据,redis cluster中每个master都会持有部分slot,
比如有3个master,那么可能每个master持有5000多个hash slot。如果增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去。
节点之间使用轻量协议通信减少带宽占用性能很高,自动实现负载均衡与高可用,自动实现failover并且支持动态扩展,官方已经玩到可以1000个节点,实现的复杂度低。
在redis cluster写入数据的时候,其实是你可以将请求发送到任意一个master上去执行。但是,每个master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,
找到key对应的hashslot,找到hashslot对应的master。如果对应的master就在自己本地的话,set mykey1 v1,mykey1这个key对应的hashslot就在自己本地,那么自己就处理掉了。
但是如果计算出来的hashslot在其他master上,那么就会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令。
默认情况下,redis cluster的核心的理念,主要是用slave做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的。
redis cluster默认是不支持slave节点读或者写的,只有在Master出现故障的时候,Slave会自动转化为Master进行读写操作,跟我们手动基于replication搭建的主从架构不一样的。
跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的
集中式:好处在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到; 不好在于,所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力
gossip:好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新,有一定的延时,降低了压力; 缺点,元数据更新有延时,可能导致集群的一些操作会有一些滞后
每个节点都有一个专门用于节点间通信的端口,就是自己提供服务的端口号+10000,比如7001,那么用于节点间通信的就是17001端口
每隔节点每隔一段时间都会往另外几个节点发送ping消息,同时其他几点接收到ping之后返回pong
故障信息,节点的增加和移除,hash slot信息,等等
其内部中也需要配置主从,并且内部也是采用哨兵模式,如果有半数节点发现某个异常节点,共同决定更改异常节点的状态,如果改节点是主节点,
则对应的从节点自动顶替为主节点,当原先的主节点上线后,则会变为从节点。如果集群中的master没有slave节点,则master挂掉后整个集群就会进入fail状态,
因为集群的slot映射不完整。如果集群超过半数以上的master挂掉,无论是否有slave,集群都会进入fail状态。
参阅:
redis集群主数据都是一致的吗为什么?
是的。
Redis集群是通过分片来实现横向扩展的,即将数缓简据分散存储在不同的节点上,每个节点只负责一部分数据的读写操作。因此,在集群中,每个节点都存储着不同的数据片段,主节点和从节点之间也会进行数据同步,以保证数据的一致性。
在Redis集群中,每个主节点都会有若干个从节点,从节点会对主节点进行复制,并且主节点和从节点都使用相同的数据持久化机制,如AOF或RDB。这些机制保证了主节点和从节点的数据是一致的。
同时,Redis集群还提供了一个内置的集群状态检查机制,可以确保集群中的所有节点都处于正常状态。如果某个团陵节点出现故障或下线,集群会自动将该节点的数据重新分配到其他节点上,以保证数据的一致性和可靠性。
因此,可以说Redis集群中的主节点数据是一致的,这是由塌哪戚于集群的复制和同步机制以及状态检查机制所保证的。
redis cluster集群部署
一.服务器设置准备
1. 将6379端口在尺咐液防火墙看开启
[root@redis1 ~]#vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
注:必须加在 REJECT 前面。
2.修改Selinux参数
[root@redis1 ~]#vi /etc/selinux/config
SELINUX=disabled
注:分别在其它几个节点上同样配置防火墙和 SELINUX。
二.安装Redis
1.安装系统组件
安装gcc、tcl
yum install –y gcc-c++
yum install –y tcl
2.安装redis
2.1.解压 Redis 到/usr/local目录下
[root@redis1 ~]# tar -zxvf /root/software/redis-3.2.6.tar.gz -C /usr/local/
2.2.在解压后的目录中进行 make 和 make test
[root@redis1 ~]# cd /usr/local/redis-3.2.6
[root@redis1 redis-3.2.6]# make
[root@redis1 redis-3.2.6]# make test
注:要检查 make 和 make test 的结果是否都正确,如果报错,针对性检查并安装系统缺少的组件。
2.3. 复制 redis-server 和 redis-cli 到/usr/local/bin 目录简岁下:
[root@redis1 redis-3.2.6]# cd src
[root@redis1 src]# cp redis-server /usr/local/bin/
[root@redis1 src]# cp redis-cli /usr/local/bin/
2.4验证 Redis 安装是否成功:
[root@redis1 ~]# redis-server
[root@redis1 ~]# redis-cli
注:安装其它 5 台服务器
三.配置集群模式
1.配置 redis.conf
1.1 配置 redis.conf
[root@redis1 ~]# mkdir /etc/redis
[root@redis1 ~]# cd /etc/redis
[root@redis ~]# vi redis.conf
port 6379
daemonize yes
cluster-enabled yes
cluster-config-file /etc/redis/nodes.conf
cluster-node-timeout 5000
appendonly yes
requirepass Ab123456
注 1:cluster-node-timeout 是集群中各节点相互通讯时,允陵物许“失联”的最大毫秒数,本演示
中配置的为 5 秒,如果超过 5 秒某个节点没有向其它节点汇报成功,认为该节点挂了。
注 2:requirepass 是 Redis 访问密码,为了安全起见,该参数建议必须配置,从但客户端
Jedis 版本必须使用 2.8.x 以上的版本,否则需要通过扩展 JedisCluster 来实现对密码访问的
支持。此外几个 Redis 节点的密码应该设置为相同的。
注 3:分别在其它几个节点上创建与上面相同的 redis.conf 文件,内容也相同。
注 4:重启/重建 Redis 集群时,必须删除去/etc/redis/nodes.conf 文件。
1.2以次启动所有节点
[root@redis1 ~]# redis-server /etc/redis/redis.conf
[root@redis2 ~]# redis-server /etc/redis/redis.conf
[root@redis3 ~]# redis-server /etc/redis/redis.conf
[root@redis4 ~]# redis-server /etc/redis/redis.conf
[root@redis5 ~]# redis-server /etc/redis/redis.conf
[root@redis6 ~]# redis-server /etc/redis/redis.conf
2.安装 Redis 集群所需的 Ruby 工具
2.1安装 Ruby 工具:
Redis 集群需要借助其它工具将相关节点加入到 Cluster 中,而这个工具是由 Redis 提供
一个名为 redis-trib.rb 的 ruby 脚本,否则接下来创建 cluster 会失败。
[root@redis1 ~]# cd /usr/local/redis-3.2.6/src
[root@redis1 src]# yum install –y ruby
[root@redis1 src]# yum install -y rubygems
[root@redis1 src]# gem install redis --version 3.0.0
[root@redis1 src]# gem list
2.2 设置 Ruby 连接 Redis 的密码:
[root@redis1 ~]# vi /usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb
:password = "Ab123456"
注:分别在其它几个节点上用同样的方式安装好 Ruby 工具
3 利用redis-trib.rb 创建 Redis集群
3. 1. 在 src 目录下运行以下脚本:
[root@redis1 ~]# cd /usr/local/redis-3.2.6/src
[root@redis1 src]# ./redis-trib.rb create --replicas 1 10.50.130.101:6379 10.50.130.102:6379
10.50.130.103:6379 10.50.130.104:6379 10.50.130.105:6379 10.50.130.106:6379
注 1:只需在其中某个个节点执行以上脚本(本例在第一个节点执行)。
注 2:利用 redis-trib 创建 Cluster,只需要操作一次即可,假设系统关机、重启,把所有的
节点全部关闭之后,下次重启后,即自动进入 Cluster 模式,不用现次执行 redis-trib.rb cteate
命令。
3.2查看 Cluster 进程:
[root@redis1 ~]# ps -ef|grep redis
[root@redis2 ~]# ps -ef|grep redis
[root@redis3 ~]# ps -ef|grep redis
[root@redis4 ~]# ps -ef|grep redis
[root@redis5 ~]# ps -ef|grep redis
[root@redis6 ~]# ps -ef|grep redis
3.3 查看节点属性(Master/Slave)
[root@redis1 ~]# cd /usr/local/redis-3.2.6/src
[root@redis1 src]# ./redis-trib.rb check 10.50.130.101:6379
[root@redis1 src]# ./redis-trib.rb check 10.50.130.102:6379
[root@redis1 src]# ./redis-trib.rb check 10.50.130.103:6379
[root@redis1 src]# ./redis-trib.rb check 10.50.130.104:6379
[root@redis1 src]# ./redis-trib.rb check 10.50.130.105:6379
[root@redis1 src]# ./redis-trib.rb check 10.50.130.106:6379
3.4查看节点/集群信息
redis-cli 客户端登录到任一个节点,查看:
4.Jedis 测试 Redis 集群
redis集群 不停服务,重启某一服务器怎么做?
为了将一台服务器进行关机和重启,您可以按照以下步骤进行操作:
关闭所有正在运行的 Redis 实例。
使用以下命令将需要关机的服务器加入集群:
Copy coderedis-cluster add-node 服务器 IP:端口
其中 服务器 IP 是需要加入集群的服务器 IP 地址,端口 是该服务器的 Redis 端口号。
使用以下命令将需要重启的服务器从集群中移除:
Copy coderedis-cluster remove-node 服务器 IP:端口
其腊伏中 服务器 IP 是需要移除集群的服务器 IP 地址,端口 是该服务器的 Redis 端口号。
关机并重启需要关机的服务器。
Copy codesudo systemctl stop 服务器名称 顷尺sudo systemctl restart 服务器名称
其中 服务器名称 是需要关机和重启的服务器名称。
检查 Redis 集群是否正常工作。
您可以使用以轮乎携下命令检查 Redis 集群是否正常工作:
Copy coderedis-cluster status
如果一切正常,则应该可以看到所有服务器的状态都为 "Online"。
请注意,在操作 Redis 集群时必须非常小心,以免误操作导致数据丢失。如果您不确定如何操作 Redis 集群,请寻求专业人员的帮助。
Try again
7站VPS导航为您回答 选购VPS上
关于redis集群和redis集群三种方式的优缺点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。