系统学习Linux-Redis集群

news2025/2/9 9:15:01

目录

一、Redis主从复制

概念

作用

缺点

流程

二、Reids哨兵模式(sentinel)

概念

作用

缺点

结构

搭建

三、redis集群

概述

原理

架构细节

选举过程

实验环境模拟


一、Redis主从复制

概念

是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。

作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

缺点

故障恢复无法自动化;

写操作无法负载均衡;

存储能力受到单机的限制。

流程

第一步:若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步连接。

第二步:无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。 

第三步:后台进程完成缓存操作之后,Maste机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

第四步:Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。


搭建主(我的实验主机为192.168.0.50)

修改配置文件 vim /etc/redis.conf

bind  0.0.0.0

port  6379

protected-mode = no

daemonize = yes

[root@localhost redis]# vim /etc/redis.conf
bind  0.0.0.0
port  6379
protected-mode = no
daemonize = yes
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# netstat -anptu | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      65188/redis-server  

搭建从(把主配置文件复制到opt下)

cp /etc/redis.conf /opt/redis_6380.conf -p

修改配置文件

bind  0.0.0.0

port  6380

protected-mode = no

daemonize = yes

slaveof 192.168.115.160 6379

[root@localhost opt]# cp /etc/redis.conf /opt/redis_6380.conf -p
修改vim以下选项
bind  0.0.0.0
port  6380
protected-mode = no
daemonize = yes
slaveof 192.168.115.160 6379

开启并测试
[root@localhost opt]# redis-server /opt/redis_6380.conf 
[root@localhost opt]# netstat -anptu | grep 6380
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      65497/redis-server 
 
登陆6379端口创建数据
[root@localhost opt]# redis-cli -p 6379
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> keys *
1) "test"
2) "liweijias"
3) "liweijia"
127.0.0.1:6379> save
OK
127.0.0.1:6379> exit

登陆6380查看是否存在
[root@localhost opt]# redis-cli -p 6380
127.0.0.1:6380> get test
"123"
127.0.0.1:6380> 

开启多个主从复制

cp redis_6380.conf redis_6381.conf 
cp redis_6380.conf redis_6382.conf 
修改配置端口6381、6382

修改好后开启从服务

for i in 1 2;do redis-server /opt/redis_638${i}.conf;done

netstat -anptu | grep redis

[root@localhost opt]# for i in 1 2;do redis-server /opt/redis_638${i}.conf;done
[root@localhost opt]# netstat -anptu | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      65188/redis-server  
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      65497/redis-server  
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      65693/redis-server  
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      65698/redis-server  
tcp        0      0 192.168.0.50:35500      192.168.0.50:6379       ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:6379       192.168.0.50:35500      ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:33343      192.168.0.50:6379       ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:6379       192.168.0.50:33236      ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:33236      192.168.0.50:6379       ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:6379       192.168.0.50:33343      ESTABLISHED 65188/redis-server  

验证

[root@localhost opt]# redis-cli -p 6381
127.0.0.1:6381> keys *
1) "liweijia"
2) "liweijias"
3) "test"
127.0.0.1:6381> exit
[root@localhost opt]# redis-cli -p 6382
127.0.0.1:6382> keys *
1) "liweijia"
2) "test"
3) "liweijias"
127.0.0.1:6382> 

二、Reids哨兵模式(sentinel)

概念

是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。

依托于主从模式

作用

监控:哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

通知(提醒):哨兵可以将故障转移的结果发送给客户端。

缺点

写操作无法负载均衡

存储能力受到单机的限制

哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

结构

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

数据节点:主节点和从节点都是数据节点。

搭建

配置文件目录 vim /etc/redis-sentinel.conf 

(关闭保护模式
protected-mode no
Redis哨兵默认的监听端口
port 26379

指定日志存放路径
logfile "/var/log/sentinel.log"
指定数据库存放路径
dir "/var/lib/redis"
修改 指定该哨兵节点监控192.168.163.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.163.10 6379 2
判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel down-after-milliseconds mymaster 30000
故障节点的最大超时时间为180000(180秒)
sentinel failover-timeout mymaster 180000)

bind 0.0.0.0

port 26379

daemonize  yes

sentinel monitor mymaster 192.168.115.160 6379 2

启动:redis-sentinel  配置文件路径

[root@localhost opt]# vim /etc/redis-sentinel.conf 
bind 0.0.0.0
port 26379
daemonize  yes
sentinel monitor mymaster 0.0.0.0 6379 2
复制到opt
[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6380.conf
[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6381.conf
[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6382.conf
[root@localhost opt]# ls
redis_6380.conf  redis_6382.conf           redis-sentinel_6381.conf
redis_6381.conf  redis-sentinel_6380.conf  redis-sentinel_6382.conf
每个监听端口改成对应
[root@localhost opt]# vim redis-sentinel_6380.conf 
[root@localhost opt]# vim redis-sentinel_6381.conf 
[root@localhost opt]# vim redis-sentinel_6382.conf 

挨个启动

sentinel的就是哨兵端口

[root@localhost opt]# redis-sentinel redis-sentinel_6380.conf 
[root@localhost opt]# redis-sentinel redis-sentinel_6381.conf 
[root@localhost opt]# redis-sentinel redis-sentinel_6382.conf 
[root@localhost opt]# 
[root@localhost opt]# !net
netstat -anptu | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      65188/redis-server  
tcp        0      0 0.0.0.0:26380           0.0.0.0:*               LISTEN      66295/redis-sentine 
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      65497/redis-server  
tcp        0      0 0.0.0.0:26381           0.0.0.0:*               LISTEN      66306/redis-sentine 
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      65693/redis-server  
tcp        0      0 0.0.0.0:26382           0.0.0.0:*               LISTEN      66325/redis-sentine 
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      65698/redis-server  
tcp        0      0 127.0.0.1:41234         127.0.0.1:6379          ESTABLISHED 66306/redis-sentine 
tcp        0      0 127.0.0.1:26382         127.0.0.1:49904         ESTABLISHED 66325/redis-sentine 
tcp        0      0 192.168.0.50:51396      192.168.0.50:6380       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:6381       192.168.0.50:43298      ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:35500      192.168.0.50:6379       ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:6380       192.168.0.50:51386      ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:43272      192.168.0.50:6381       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:34642      192.168.0.50:6382       ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:51384      192.168.0.50:6380       ESTABLISHED 66295/redis-sentine 
tcp        0      0 127.0.0.1:41258         127.0.0.1:6379          ESTABLISHED 66325/redis-sentine 
tcp        0      0 127.0.0.1:49904         127.0.0.1:26382         ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:34680      192.168.0.50:6382       ESTABLISHED 66325/redis-sentine 
tcp        0      0 127.0.0.1:26381         127.0.0.1:53226         ESTABLISHED 66306/redis-sentine 
tcp        0      0 127.0.0.1:6379          127.0.0.1:41258         ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:6382       192.168.0.50:34664      ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:6382       192.168.0.50:34666      ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:51386      192.168.0.50:6380       ESTABLISHED 66295/redis-sentine 
tcp        0      0 127.0.0.1:6379          127.0.0.1:41234         ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:6382       192.168.0.50:34642      ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:6382       192.168.0.50:34680      ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:6380       192.168.0.50:51384      ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:6379       192.168.0.50:35500      ESTABLISHED 65188/redis-server  
tcp        0      0 127.0.0.1:6379          127.0.0.1:41256         ESTABLISHED 65188/redis-server  
tcp        0      0 127.0.0.1:41220         127.0.0.1:6379          ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:51424      192.168.0.50:6380       ESTABLISHED 66325/redis-sentine 
tcp        0      0 192.168.0.50:6381       192.168.0.50:43260      ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:34640      192.168.0.50:6382       ESTABLISHED 66295/redis-sentine 
tcp        0      0 127.0.0.1:26382         127.0.0.1:49906         ESTABLISHED 66325/redis-sentine 
tcp        0      0 192.168.0.50:33343      192.168.0.50:6379       ESTABLISHED 65698/redis-server  
tcp        0      0 192.168.0.50:6380       192.168.0.50:51396      ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:34678      192.168.0.50:6382       ESTABLISHED 66325/redis-sentine 
tcp        0      0 127.0.0.1:49906         127.0.0.1:26382         ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:34664      192.168.0.50:6382       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:43296      192.168.0.50:6381       ESTABLISHED 66325/redis-sentine 
tcp        0      0 192.168.0.50:43260      192.168.0.50:6381       ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:6381       192.168.0.50:43296      ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:6381       192.168.0.50:43272      ESTABLISHED 65693/redis-server  
tcp        0      0 127.0.0.1:41236         127.0.0.1:6379          ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:43270      192.168.0.50:6381       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:6380       192.168.0.50:51424      ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:6381       192.168.0.50:43258      ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:6382       192.168.0.50:34640      ESTABLISHED 65698/redis-server  
tcp        0      0 127.0.0.1:6379          127.0.0.1:41236         ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:6381       192.168.0.50:43270      ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:34666      192.168.0.50:6382       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:6380       192.168.0.50:51398      ESTABLISHED 65497/redis-server  
tcp        0      0 127.0.0.1:6379          127.0.0.1:41218         ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:43258      192.168.0.50:6381       ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:6382       192.168.0.50:34678      ESTABLISHED 65698/redis-server  
tcp        0      0 127.0.0.1:6379          127.0.0.1:41220         ESTABLISHED 65188/redis-server  
tcp        0      0 127.0.0.1:53226         127.0.0.1:26381         ESTABLISHED 66325/redis-sentine 
tcp        0      0 127.0.0.1:53224         127.0.0.1:26381         ESTABLISHED 66295/redis-sentine 
tcp        0      0 192.168.0.50:6380       192.168.0.50:51422      ESTABLISHED 65497/redis-server  
tcp        0      0 192.168.0.50:51398      192.168.0.50:6380       ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:6379       192.168.0.50:33236      ESTABLISHED 65188/redis-server  
tcp        0      0 192.168.0.50:43298      192.168.0.50:6381       ESTABLISHED 66325/redis-sentine 
tcp        0      0 127.0.0.1:41218         127.0.0.1:6379          ESTABLISHED 66295/redis-sentine 
tcp        0      0 127.0.0.1:41256         127.0.0.1:6379          ESTABLISHED 66325/redis-sentine 
tcp        0      0 192.168.0.50:33236      192.168.0.50:6379       ESTABLISHED 65693/redis-server  
tcp        0      0 192.168.0.50:6379       192.168.0.50:33343      ESTABLISHED 65188/redis-server  
tcp        0      0 127.0.0.1:26381         127.0.0.1:53224         ESTABLISHED 66306/redis-sentine 
tcp        0      0 192.168.0.50:51422      192.168.0.50:6380       ESTABLISHED 66325/redis-sentine 
tcp6       0      0 :::26380                :::*                    LISTEN      66295/redis-sentine 
tcp6       0      0 :::26381                :::*                    LISTEN      66306/redis-sentine 
tcp6       0      0 :::26382                :::*                    LISTEN      66325/redis-sentine 

kill 65188

停止master后,slave会通过选举产生新的master

哨兵配置文件会自动修改监听的master节点地址为新的master节点地址

[root@localhost redis]# cat sentinel.log 
66325:X 08 Aug 2023 21:30:53.397 * +sentinel-address-switch master mymaster 127.0.0.1 6382 ip 127.0.0.1 port 26381 for 173ee2660ae9d9a867379fdb95dfd003436919db


三、redis集群

概述

Redis3.0版本以上开始支持cluster,采用的是hashslot(hash槽),可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散到群集的多台机器上。

原理

当客户端向群集中任一节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己。如果键所在的槽正好指派给了当前节点,那么节点直接执行这个命令;如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)正确的节点,并再次发送之前想要执行的命令.
群集角色有Master和Slave.Master之间分配slots,一共16384个slot,Slave向它指定的Master 同步数据,实现备份。当其中的一个Master无法提供服务时,该Master的Slave将提升为Mester,以保证群集间 slot 的完整性,当其中的某一个Master和它的Slave都失效,导致了slot不完整,群集失效,这时就需要人工去处理了。
群集搭建好后,群集中的每个节点都会定期地向其他节点发送PING消息,如果接收PONG消息的节点没有在规定的时间内返回PONG 消息,那么发送PNG消息的节点就会将其标记为疑似下线(probable fail,PFAL)。各个节点会通过互相发送消息的方式来交换群集中各个节点的状态信息。如果在一个群集里面,半数以上的主节点都将某个主节点×报告为疑似下线,那么这个主节点×将被标记为已下线(FAL),同时会向群集广播一条关于主节点×的FAL消息,所有收到这条FAL消息的节点都会立即将主节点×标记为已下线。
当需要减少或者增加群集中的机器时,我们需要将已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且将相关槽所属的键值对从源节点移动到目标节点。
Redis群集的重新分片操作是由Redis的群集管理软件redis—trib负责执行的,不支持自动的分片,而且需要自己计算从哪些节点上迁移多少 Slot。在重新分片的过程中,群集不需要下线,并且源节点和目标节点都可以继续处理命令请求。

总结:Redis Cluster是一个无中心的结构,每个节点都保存数据和整个群集的状态。每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且会与其他节点定时发送心跳信息,能够及时感知群集中异常的节点。

架构细节

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

(2)节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才生效。

(3)客户端与 redis 节点直连,不需要中间代理(proxy)层,客户端不需要连接群集所有节点,连接群集中任何一个可用节点即可。

(4)redis-cluster 把所有的物理节点映射到【0-16383】slot 上,cluster 负责维护 node<->slot<->key。

选举过程

选举过程是群集中所有master参与,如果半数以上master节点与当前 master 节点通信超时(cluster—node—timeout),认为当前 master 节点挂掉。以下两种情况为整个群集不可用(cluster_state:fail),当群集不可用时,所有对群集的操作都不可用,收到((error)CLUSTEFDOWN The cluster is down)错误。

如果群集任意 master挂掉,且当前 master 没有 slave,则群集进入 fail状态,也可以理解成群集的slot映射【0 ~16383】不完整时进入fail状态。

默认情况下,每个群集的节点都使用两个TCP端口.一个是6379,一个是16379;6379服务于客户端的连接,16379 用于群集总线,即使用二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测、配置更新、故障转移授权等。如果开启了防火墙,需要开放这两个端口。
 


实验环境模拟

为了方便实验操作架构好基础环境后

使用finalshell

安装epel源

yum -y install epel-release

更新可以再次输入安装命令

安装redis

yum -y install redis

创建redis目录方便管理

mkdir /etc/redis

查看

rpm -ql redis

[root@localhost ~]# rpm -ql redis
/etc/logrotate.d/redis
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/systemd/system/redis-sentinel.service.d
/etc/systemd/system/redis-sentinel.service.d/limit.conf
/etc/systemd/system/redis.service.d
/etc/systemd/system/redis.service.d/limit.conf
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
/usr/lib/systemd/system/redis-sentinel.service
/usr/lib/systemd/system/redis.service
/usr/libexec/redis-shutdown
/usr/share/doc/redis-3.2.12
/usr/share/doc/redis-3.2.12/00-RELEASENOTES
/usr/share/doc/redis-3.2.12/BUGS
/usr/share/doc/redis-3.2.12/CONTRIBUTING
/usr/share/doc/redis-3.2.12/MANIFESTO
/usr/share/doc/redis-3.2.12/README.md
/usr/share/licenses/redis-3.2.12
/usr/share/licenses/redis-3.2.12/COPYING
/usr/share/man/man1/redis-benchmark.1.gz
/usr/share/man/man1/redis-check-aof.1.gz
/usr/share/man/man1/redis-check-rdb.1.gz
/usr/share/man/man1/redis-cli.1.gz
/usr/share/man/man1/redis-sentinel.1.gz
/usr/share/man/man1/redis-server.1.gz
/usr/share/man/man5/redis-sentinel.conf.5.gz
/usr/share/man/man5/redis.conf.5.gz
/var/lib/redis
/var/log/redis
/var/run/redis

 复制配置文件到创建的文件夹中并修改配置文件

[root@localhost ~]# cp /etc/redis.conf /etc/redis/redis1_6379.conf
[root@localhost ~]# cp /etc/redis.conf /etc/redis/redis2_6380.conf
[root@localhost ~]# vim /etc/redis/redis1_6379.conf
  61 bind 192.168.0.41
  80 protected-mode no
  84 port 6379            端口
 128 daemonize yes        前台后载
 247 dir /var/lib/redis/redis_6379/

[root@localhost ~]# vim /etc/redis/redis1_6379.conf
  61 bind 192.168.0.41
  80 protected-mode no
  84 port 6379            
 128 daemonize yes        
 247 dir /var/lib/redis/redis_6379/

redis-server2/3同样操作
创建var/lib/redis/redisn_63目录

redis-server1
[root@localhost redis]# mkdir /var/lib/redis/{redis1_6379,redis2_6380}
redis-server2
[root@localhost redis]# mkdir /var/lib/redis/{redis3_6379,redis4_6380}
redis-server3
[root@localhost redis]# mkdir /var/lib/redis/{redis5_6379,redis6_6380}

启动检测一下redis-server /etc/redis/

[root@localhost redis]# redis-server /etc/redis/redis1_6379.conf 
[root@localhost redis]# redis-server /etc/redis/redis2_6380.conf
[root@localhost redis]# ss -anl
tcp   LISTEN     0      128          192.168.0.41:6379                *:* 
tcp   LISTEN     0      128          192.168.0.41:6380                *:*            
[root@localhost redis]# ps aux | grep redis
root      43351  0.0  0.2 143056  5184 ?        Ssl  13:43   0:00 redis-server 192.168.0.41:6379
root      43617  0.0  0.2 143056  5184 ?        Ssl  13:43   0:00 redis-server 192.168.0.41:6380
root      48439  0.0  0.0 112824   980 pts/1    R+   13:45   0:00 grep --color=auto redis

另外两台相同原理操作,并测试是否成功开启


构建集群首先分别配置集群文件

vim /etc/redis/redis1_6379.conf

vim /etc/redis/redis1_6380.conf

[root@localhost ~]# vim /etc/redis/redis1_6379.conf
721 cluster-enabled yes
729 cluster-config-file nodes-6379.conf
735  cluster-node-timeout 15000

[root@localhost ~]# vim /etc/redis/redis2_6380.conf
721 cluster-enabled yes
729 cluster-config-file nodes-6380.conf
735  cluster-node-timeout 15000

redis3_6379.conf、redis4_6380.conf、redis5_6379.conf、redis6_6380.conf、

相同原理配置文件

再次测试查看是否正常开启

[root@localhost redis]# redis-server /etc/redis/redis1_6379.conf 
[root@localhost redis]# redis-server /etc/redis/redis2_6380.conf 

[root@localhost redis]# ss -anl
tcp   LISTEN     0      128          192.168.0.41:6379                *:* 
tcp   LISTEN     0      128          192.168.0.41:6380                *:*  
tcp   LISTEN     0      128          192.168.0.41:16379               *:* 
tcp   LISTEN     0      128          192.168.0.41:16380               *:*  


[root@localhost redis]# redis-server /etc/redis/redis3_6379.conf 
[root@localhost redis]# redis-server /etc/redis/redis4_6380.conf 

[root@localhost redis]# ss -anl
tcp   LISTEN     0      128          192.168.0.42:6379                *:* 
tcp   LISTEN     0      128          192.168.0.42:6380                *:*  
tcp   LISTEN     0      128          192.168.0.42:16379               *:* 
tcp   LISTEN     0      128          192.168.0.42:16380               *:*  

[root@localhost redis]# redis-server /etc/redis/redis5_6379.conf 
[root@localhost redis]# redis-server /etc/redis/redis6_6380.conf 

[root@localhost redis]# ss -anl
tcp   LISTEN     0      128          192.168.0.43:6379                *:* 
tcp   LISTEN     0      128          192.168.0.43:6380                *:*  
tcp   LISTEN     0      128          192.168.0.43:16379               *:* 
tcp   LISTEN     0      128          192.168.0.43:16380               *:*  

保持开启状态将其他节点加入集群

[root@localhost redis]# redis-cli -h 192.168.0.41
192.168.0.41:6379> CLUSTER MEET 192.168.0.41 6380
OK
192.168.0.41:6379> CLUSTER MEET 192.168.0.42 6379
OK
192.168.0.41:6379> CLUSTER MEET 192.168.0.42 6380
OK
192.168.0.41:6379> CLUSTER MEET 192.168.0.43 6379
OK
192.168.0.41:6379> CLUSTER MEET 192.168.0.43 6380
OK

查看所有集群节点
192.168.0.41:6379> CLUSTER NODES
2e51f0d376f5382a1c669bdd3ef9da8f8289c7a1 192.168.0.43:6380 master - 0 1691736056897 5 connected
128fb6b084d1a6c4f30b6c753e03a2da79529a87 192.168.0.43:6379 master - 0 1691736054888 4 connected
bd29d86f90b57707c7405d00b93bb158cb1b28cd 192.168.0.42:6380 master - 0 1691736055894 0 connected
4526894ae49d9bebaf87c45b04df5a913ede9d29 192.168.0.41:6380 master - 0 1691736052878 1 connected
699c0687c3ced2116811d7ddac856bff7670b65c 192.168.0.41:6379 myself,master - 0 0 3 connected
1bda15593547a80fce4b08d7cbb1e7040db67c65 192.168.0.42:6379 master - 0 1691736053883 2 connected

其中92.168.0.41:6379 myself,master - 0 0 3 connected 能够看到主节点是登陆分配那个

[root@localhost redis]# exit

分配slot(以下操作均要退出数据库)

根据实验环境分别分配slot
[root@localhost redis]# redis-cli -h 192.168.0.41 -p 6379 cluster addslots {0..5461}
OK
[root@localhost redis]# redis-cli -h 192.168.0.42 -p 6380 cluster addslots {5462..10922}
OK
[root@localhost redis]# redis-cli -h 192.168.0.43 -p 6380 cluster addslots {10923..16383}
OK
[root@localhost redis]# 

建立主从关系(根据上面给到的mac地址)

redis3为redis1的slave

[root@localhost redis]# redis-cli -h 192.168.0.41 -p 6380 cluster replicate 699c0687c3ced2116811d7ddac856bff7670b65c
OK

redis5为redis4的slave

[root@localhost redis]# redis-cli -h 192.168.0.43 -p 6379 cluster replicate bd29d86f90b57707c7405d00b93bb158cb1b28cd
OK

redis2为redis6的slave

[root@localhost redis]# redis-cli -h 192.168.0.41 -p 6380 cluster replicate 2e51f0d376f5382a1c669bdd3ef9da8f8289c7a1
OK

添加完成后查看集群状态

192.168.0.41:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:3
cluster_stats_messages_sent:3663
cluster_stats_messages_received:3663
192.168.0.41:6379> 

添加数据测试

这里显示移动到12767 因redis采用的是hash槽随机分配值速度快的同时,也有一个缺点要去他分配的值才可执行:12767所以要到redis-server3服务器实现创建数据和查看

192.168.0.41:6379> set zhangsan 123.com
(error) MOVED 12767 192.168.0.43:6380

根据值去对应服务器创建
[root@localhost redis]# redis-cli -h 192.168.0.43 -p 6380
192.168.0.43:6380> set lisi 123.com
OK
192.168.0.43:6380> 

并查看不到
[root@localhost redis]# redis-cli -h 192.168.0.41 -p 6379
192.168.0.41:6379> keys *
(empty list or set)
需要到他的从查看
[root@localhost redis]# redis-cli -h 192.168.0.41 -p 6380
192.168.0.41:6380> keys *
1) "lisi"

注:一定看好各自的主从关系,如果填乱

重置集群命令(每个节都要重置)

cluster reset

数据的key不能相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux查看进程绑定cpu核是否成功

运行top命令&#xff0c;可以看到进程以及进程cpu占有率 然后查看是否有P属性&#xff0c;这个属性用来查看进程绑定的cpu核 这里没有看到cpu占用核心 运行top后&#xff0c;按 " f "键进入top配置界面&#xff0c;然后按上下键选择P选项&#xff0c;此时可以看到P选…

(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)

目录 1、桥接模式&#xff08;Bridge Pattern&#xff09;含义 2、桥接模式应用场景 3、桥接模式的UML图学习 4、C实现桥接模式的示例 1、桥接模式&#xff08;Bridge Pattern&#xff09;含义 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#…

不基于比较的排序:基数排序

本篇只是讨论桶排序的具体实现&#xff0c;想了解更多算法内容可以在我的博客里搜&#xff0c;建议大家看看这篇排序算法总结&#xff1a;排序算法总结_鱼跃鹰飞的博客-CSDN博客 桶排序的原理&#xff1a; 代码&#xff1a;sort1是一个比较二逼的实现方式浪费空间&#xff0c;s…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

IT运维:使用数据分析平台监控PowerStore存储(进阶)

概述 本文基于《IT运维&#xff1a;使用鸿鹄监控PowerStore存储》&#xff08;以下简称原文&#xff09;文章进行了优化。主要优化部分包括存储日志进入到鸿鹄后&#xff0c;如何进行字段抽取&#xff0c;以及图表的展示。 字段抽取&#xff1a;由原来采用视图的方式&#xff0…

Rider无法识别Todo Comment

最近因为vs code很难识别到代码中的usage和definition&#xff0c;改用Rider了。 但是一开始就哪里有点不对&#xff0c; 比如我主题的颜色总是有些地方无法识别出来。比如我每次从Unity中点击脚本文件&#xff0c;都只能识别到某一个特定的文件夹&#xff0c;而不能打开整个…

机器人技术及其影响

目录 1.概念 2.发展 3.应用领域 4.对人类的益处 1.概念 机器人是指能够自主执行任务的机械设备或电子设备。它们通常具有一定的感知、决策和执行能力&#xff0c;能够接收和处理来自外部环境的信息&#xff0c;并做出相应的行动。 机器人的形态和功能各异&#xff0c;可以是…

Python接口测试- requests 发送 post 请求的几种方法

前言&#xff1a; POST 请求用于向服务器发送数据。与 get 相比更安全&#xff0c;同时 post 请求一般会带来数据的更改。 GET 请求不论我们怎么构造&#xff0c;最终都是通过 URL 向服务器传递数据&#xff0c;而 post 通过消息体&#xff08;报文主体&#xff09;发送请求。…

简单的职员管理系统 SpringBoot企业员工信息java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 简单的职员管理系统 SpringBoot 系统有1权限&#xf…

海外电子商务源代码跨境系统开发,Java现成代码全开源

海外电子商务跨境系统的开发是一个复杂的过程&#xff0c;而利用现成的Java代码进行开发可以节省时间和成本。下面是海外电子商务跨境系统开发的全开源步骤。 第一步&#xff1a;需求分析和规划 在开发海外电子商务跨境系统之前&#xff0c;需要进行需求分析和规划。这包括确定…

迅镭激光PL12050重载型激光切管机中标国内知名企业美的集团!

近日&#xff0c;迅镭激光重型激光切管机中标国内知名企业——美的集团! 成立于2002年的菱王电梯&#xff0c;是美的集团暖通与楼宇事业部旗下的专业电梯品牌 &#xff0c;业务覆盖电(扶)梯的研发、设计、制造、销售、安装和维保&#xff0c;自主研发的8m/s超高速电梯和8吨超重…

使用雅克比矩阵计算Rossler映射的lyapunov exponent图谱

Rossler映射如下: 雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次:…

selenium爬虫与配置谷歌浏览器的driver问题

用selenium爬虫时&#xff0c;明明已经安装了selenium模块&#xff0c;程序却运行不了。在使用selenium之前必须先配置浏览器对应版本的webdriver 本文主要涉及驱动有问题driver 网上有很多手动的方法&#xff08;查看谷歌浏览的版本然后在其他博主分享的webdriver中下载与自己…

MySQL存储结构及索引

文章目录 MySQL结构1.2存储引擎介绍1.3存储引擎特点InnoDB逻辑存储结构 MyISAMMemory区别及特点存储引擎选择 索引索引概述索引结构BTreeHash索引分类聚集索引&二级索引索引语法SQL性能分析索引优化最左前缀法则范围查询字符串不加引号模糊查询or连接条件数据分布影响覆盖索…

13个Python最佳编程技巧,越早知道越好

每天我们都会面临许多需要高级编码的编程挑战。你不能用简单的 Python 基本语法来解决这些问题。在本文中&#xff0c;我将分享 13 个高级 Python 脚本&#xff0c;它们可以成为你项目中的便捷工具。如果你目前还用不到这些脚本&#xff0c;你可以先添加收藏&#xff0c;以备留…

js迭代器与生成器

目录 迭代器next可迭代对象自定义类的迭代迭代器的中断 生成器生成器函数返回值与传递参数生成器的提前结束生成器的语法糖使用生成器实现自定义类迭代 async和awaitawait 迭代器 迭代器&#xff08;iterator&#xff09;&#xff0c;可以把它当做是一个接口&#xff0c;用户可…

Vue3 Props组件简单应用(子组件获取父组件数据)

去官网学习→Props | Vue.js 运行示例&#xff1a; 代码&#xff1a;App.vue <template><img alt"Vue logo" src"./assets/logo.png"><!-- 传递数据 key value--><Mycomponent :dataTest"content" :dataNmub&…

GPT-3.5 人工智能还是人工智障?——西红柿炒钢丝球!!

人工智能还是人工智障&#xff1f;——西红柿炒钢丝球 西红柿炒钢丝球的 基本信息西红柿炒钢丝球的 详细制作方法材料步骤 备注幕后花絮。。。。。。。。。关于GPT-3.5&#xff0c;你的看法&#xff1a; 西红柿炒钢丝球的 基本信息 西红柿炒钢丝球是一道具有悠久历史的传统中式…

leetcode经典算法——快速幂

实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 暴力方法肯定是循环循环n次&#xff0c; 每一次*x 显然此方法遇到大的数字会超时 那么我们要引进一个思想&#xff0c;快速幂算法 例如&#xff1a; x^97 我们可以看出&a…

柜柜软件报价单滑动闪屏解决办法

柜柜下载地址:家具设计软件免费下载-家居设计软件手机版下载-柜柜App官网 出现的问题现象: 原因:笔记本使用的集成显卡,切换到独立显卡即可解决 异常修复.