系统学习Linux-Redis集群
目录
一、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.conf61 bind 192.168.0.4180 protected-mode no84 port 6379 端口128 daemonize yes 前台后载247 dir /var/lib/redis/redis_6379/[root@localhost ~]# vim /etc/redis/redis1_6379.conf61 bind 192.168.0.4180 protected-mode no84 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不能相同
相关文章:
系统学习Linux-Redis集群
目录 一、Redis主从复制 概念 作用 缺点 流程 二、Reids哨兵模式(sentinel) 概念 作用 缺点 结构 搭建 三、redis集群 概述 原理 架构细节 选举过程 实验环境模拟 一、Redis主从复制 概念 是指将一台Redis服务器的数据,复制…...
【每日随笔】帝王心术 ② ( 如何培养下一代 | 重点培养孩子某一项特长 | 价值观培养 | 独立思考 | 人性和谋略教育 | 资源传承 | 人生指引 )
文章目录 一、重点培养孩子某一项特长二、价值观培养三、独立思考四、人性和谋略教育五、资源传承六、人生指引 一、重点培养孩子某一项特长 很多人 作为 父母 , 教育孩子 , 没有出息的占大多数 ; 父母 教育 孩子 , 给孩子培训 , 一般都给报个兴趣班 , 如果兴趣班的种类超过两…...
Git简介
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式&#x…...
STM32入门学习之定时器输入捕获
1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下: 假设定时器是向上计数。在图中,t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先,设置定时器为上升沿捕获,如此一来,在t1时刻可…...
贪心算法:基础入门篇
贪心算法:基础入门篇 文章目录: 贪心算法:基础入门篇一、认识贪心算法二、常见贪心问题2.1 纸牌问题2.2 背包问题(基础版)2.3 简单数学证明问题 三、总结 一、认识贪心算法 在求最优解的问题中,以某种贪心…...
【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法
Windows10下启动RocketMQ报错:找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明,下载rocketmq-all-5.1.3-bin-release.zip,解压配置环境变量后,执行如下命令:…...
深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级)
深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级) 一.进程概念(PCB/task_struct)二.查看进程(top/ps)三.创建进程(fork)四.进程状态(僵尸进程/孤儿进程)五.进程优先级(PRI/NI) 一.进程概念(PCB/task_struct) 1.什么…...
Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。标题取自其中一则分享,不代表全部内容都是该主题,特此声明。 本周刊精心筛选国内外的 250 信息源,为你挑选最值得分享的文章、教程、开源…...
基于Java+SpringBoot+Vue的网吧管理系统设计与实现(源码+LW+部署文档等)
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...
redis设置database 不生效剖析
设置database 不生效剖析 前言配置加载类问题commons-pool 对象池 主页传送门:📀 传送 前言 事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候,发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好…...
汽车及汽车零部件行业云MES解决方案
汽配行业现状: 随着经济全球化进程加快,一直走在智能化改造,数字化转型前沿的汽车行业企业,面临的信息化需求也日益增加,不管德系,美系还是日系供应链的各大厂商,均将企业信息化,数字…...
算法工程师-机器学习面试题总结(4)
深度学习 DNN 描述一下神经网络?推导反向传播公式? 神经网络(Neural Network)是一种模拟人脑神经系统的计算模型。它由许多节点(神经元)和连接它们的权重组成,这些节点和权重可以学习和调整&a…...
Linux学习之awk函数
awk里边的函数分为内置函数和自定义函数。 内置函数有下边的几种: 算术函数(arithmetic) 字符串函数(string) 输入/输出函数和通用函数(input/output, and general) 自定义函数格式如下…...
Redis的数据结构到底是一种什么样的结构?
有了上一篇NoSQL的基础,我们也都知道了Redis就是一种典型的NoSql,那我们就先简简单单的介绍一下Redis: Redis是什么? Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储系统…...
eclipse 导入项目js报错问题
eclipse 导入项目后会出现项目中的js文件报错(红叉),如下图所示,有时候报错的文件很多,需要集中处理。 解决办法: 右键项目名称》Properties》MyEclipse》JavaScript》Include Path,在右侧选择“…...
《HeadFirst设计模式(第二版)》第七章代码——外观模式
代码文件目录: Subsystem: Amplifier package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** Author 竹心* Date 2023/8/8**///扬声器 public class Amplifier {int volume 0;//音量public void on(){System.out.println("The amplifier …...
前端杂项-个人总结八股文的背诵方案
个人总结八股文的背诵方案 URL到显示网页的过程 浏览器解析URL,获取协议,主机名,端口号,路径等信息,并通过DNS查询将主机名转换为对应的IP地址浏览器与服务器建立TCP,进行三次握手。浏览器向服务器发送HT…...
利用 3D 地理空间数据实现Cesium的沉浸式环境
推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎,Cesium 创建了 3D Tiles,这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…...
微服务——ES实现自动补全
效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法,按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…...
北斗+5G 织就精确定位的“天罗地网”
今年,邓中亮更忙了。 外部会议,内部讨论,课题研究,还有疫情困扰期间没能出的差铆足劲似的补上,一天里,从离开床和回到床中间的时间都被工作冠名了。 北京邮电大学教授邓中亮 忙碌的加速键在2020年按下暂停…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
