redis 6.2.1 - 主从 + 哨兵 + 集群

本文详细介绍了Redis的主从模式配置,包括下载、安装、配置修改、启动以及验证主从关系。接着,阐述了哨兵系统的设置,解释了哨兵如何监控和实现故障转移。最后,讲解了Redis集群的搭建过程,并展示了Java连接Redis集群的方法。内容涵盖了Redis高可用性和扩展性的关键实践。
摘要由CSDN通过智能技术生成

一、主从模式

        1.下载页面:https://download.redis.io/releases/  我下载的 redis-6.2.1

        2.解压 :tar -zxvf redis-6.2.1 进入 :cd redis-6.2.1

        3.编译并指定位置安装 : make PREFIX=/ruojian/redis-6.2.1 install,分别安装在主机192.168.5.1(主),192.168.5.2(从)

        4.修改 192.168.5.1 配置文件

                daemonize no  -->  daemonize yes (后台程序方式运行)

                pidfile /var/run/redis_6379.pid    -->   pidfile /ruojian/redis-6.2.1/redis_6379.pid

        5.修改 192.168.5.2 配置文件

                daemonize no  -->  daemonize yes (后台程序方式运行)

                pidfile /var/run/redis_6379.pid    -->   pidfile /ruojian/redis-6.2.1/redis_6379.pid

                slaveof 192.168.5.1 6379   :增加一行

        6.分别启动 :/ruojian/redis-6.2.1/bin/redis-server /ruojian/redis-6.2.1/redis.conf

        7.在 192.168.5.1 上进入 redis-cli (配置环境变量方便使用)执行 info 命令

  

                当前为 master ,slave 数量为 1

        8.在 192.168.5.2 上进入 redis-cli 执行 info 命令

                我这里是在一台主机上开了两个端口测试的 所以 master ip 是本机 正常是  192.168.5.1

        9.在 master 上面可以读和写,在 slave 上只能读,写的时候会提示  你不能写一个只读从。

        10.主从分别执行 monitor 命令进入到 redis 监控模式

                再开一个 redis-cli 窗口执行选择数据库 读写命令,可以看见监控窗口有每一条命令的记录

                当 slave 上线时 master 会执行一次 PING 命令

                当 master 执行 set 命令时,可以看见 slave 监控窗口也出现 set 命令

                正常情况 slave 会每隔 10 秒向 master 发送一次 ping 命令

二、哨兵

        1.复制 sentinel.conf 配置文件三份 26380.conf, 26381.conf, 26382.conf

        2.分别修改 ip :port 为 26380,26381,26382

        3.设置监控的 master 主服务器,服务器ip和端口 (三个配置文件一样)

                sentinel monitor mymaster 127.0.0.1 6381 2 (文件中有个默认的 叫 mymaster,需要注释掉)

        4.启动 redis 一主两从: /ruojian/redis-6.2.1/bin/redis-server /ruojian/redis-6.2.1/redis.conf

        5.启动三个 sentinel :/ruojian/redis-6.2.1/bin/redis-sentinel /ruojian/redis-6.2.1/26380.conf

                Sentinel会根据Master的配置自动发现Master的Slaves

        6.通过命令查看 master是6381,kill 掉之后 sentinel 日志发生变化

                主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移,

        7.重新启动 6381 ,日志显示 slave 上线,master 还是 6380,不会回到 6381

        8.工作原理(摘抄自 https://www.cnblogs.com/maybesuch/p/10257374.html ) :

  1. master 状态监测,如果 master 异常,则会进行 master-slave 转换,将其中一个 slave 升级为 master,将之前的 master 降级为 slave
  2. master-slave 转换后,master_redis.conf、slave_redis.conf 和 sentinel.conf 的内容都会发生改变,master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
  3. 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
  4. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
  5. 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  6. 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
  7. 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
  8. 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
  9. 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
  10. 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

三、集群

        1.安装好单机 redis

        2.将 daemonize no  -->  daemonize yes (后台程序方式运行) 

        3.将 # cluster-enabled yes 的注释打开

                

        4.redis 集群至少需要3个节点,因为投票机制是需要超过半数支持才会同意,要保证集群的高可用,每个节点至少需要1个从节点,所以需要6个节点

        5.把 redis.conf 复制到 bin 目录里面去,

        6.创建目录 cluster ,把 bin 目录中的文件复制到 cluster 下的 redis01 目录中,删除 dump.rdb 文件

                cp -r bin/ /ruojian/redis-6.2.1/cluster/redis01 :最后一个目录可以不存在,会自动创建 (必须保证 cluster 目录存在 )

        ​​​​​​​        

        7.把 redis01 复制5分 分别为 02 03 04 05 06,分别修改端口为 6380 6381 6382 6383 6384 6385

        ​​​​​​​        

        8.编写脚本批量启动 runAll.sh ,添加可执行权限 chmod +x runAll.sh

        ​​​​​​​        

        9.启动6个节点

        ​​​​​​​        

        10.创建集群 :redis-cli --cluster create --cluster-replicas 1 192.168.5.14:6380 192.168.5.14:6381 192.168.5.14:6382 192.168.5.14:6383 192.168.5.14:6384 192.168.5.14:6385

                 --cluster-replicas 1 :集群主节点需要多少个从节点,每个主节点设置1个从节点,所以我们创建了6个节点

   ​​​​​​​        ​​​​​​​        

        11.如果遇到 [ERR] Node 192.168.5.14:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

                删除每一个节点下的这两个文件

        ​​​​​​​        ​​​​​​​

                再重新创建集群

        ​​​​​​​        

        12.选择集群中任意一个节点连接:redis-cli -p 6380

                cluster info :查询集群信息

                cluster nodes : 查询集群节点信息

        ​​​​​​​        

        13.设置密码(6个节点需要单独设置),不重启

        ​​​​​​​        

                config set masterauth 123456

                config set requirepass 123456

                auth  123456

                config rewrite

        14.Java 连接集群

                a.创建 Spring Boot 项目导入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
        </dependency> 

                b.编辑 application.yml 文件

server:
  port: 9550

spring:
  redis:
    database: 0
    password: 123456
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    timeout: 10000
    cluster:
      nodes:
        - 192.168.5.14:6380
        - 192.168.5.14:6381
        - 192.168.5.14:6382
        - 192.168.5.14:6383
        - 192.168.5.14:6384
        - 192.168.5.14:6385

                c.编写测试接口

		@Autowired
		private RedisTemplate<String, String> rt;
		
		@RequestMapping(value="/set/{key}/{value}")
		public String set(@PathVariable String key, @PathVariable String value){
		    ValueOperations<String, String> redisValue=rt.opsForValue();
		    redisValue.set(key, value);
		    return redisValue.get(key);
		}
		
		@RequestMapping(value="/get/{key}")
		public String get(@PathVariable String key){
		    ValueOperations<String, String> redisValue=rt.opsForValue();
		    return redisValue.get(key);
		}

                d.测试链接 http://localhost:9550/set/123/123456789

                e.服务器查询结果

                       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若如初见淡似雪丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值