redis集群(三)linux搭建redis主从+哨兵集群模式

桃扇骨 2022-12-03 01:58 599阅读 0赞

上一篇写了windows环境下搭建redis集群,常用的集群还是搭建在linux服务器上。这里准备了三台可以互相ping通的机器:


























IP地址 端口号 角色
xxx.xx.xxx.151 6379 主机(master)
xxx.xx.xxx.32 6380 从机(slave)
xxx.xx.xxx.126 6381 从机(slave)

一、redis安装部署:首先需要在三台机器上分别安装redis,步骤同前面的单机版安装。

1、下载:到redis官网https://redis.io/download下载后上传到机器上或者使用命令下载:

  1. wget http://download.redis.io/releases/redis-5.0.7.tar.gz

20200901144759151.png

2、安装:

(1)解压安装包:

  1. tar xzf redis-5.0.7.tar.gz

(2)进入解压文件目录使用make命令对解压的 redis 文件进行编译:

  1. cd redis-5.0.7
  2. make

编译完成之后,可以看到解压文件 redis-5.0.7 中会有对应的 src、conf 等文件

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70

(3)编译成功后,进入 src 文件夹,执行 make install 进行 Redis 安装:

  1. cd src/
  2. make install

3、部署:由于 src 下文件非常多,可以将几个常用的命令和 conf 配置文件复制出来进行统一管理:

(1)新建 bin 和 etc 文件夹

  1. cd /root/redis-5.0.7/
  2. mkdir etc
  3. mkdir bin

(2)回到安装目录,将redis.conf复制到 ect 文件夹下:

  1. cp redis.conf /root/redis-5.0.7/etc

(3)进入 src 文件夹下,将mkreleasehdr.shredis-benchmarkredis-check-aofredis-check-rdbredis-cliredis-serverredis-sentinel文件复制到 bin 文件夹:

  1. cd src/
  2. cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /root/redis-5.0.7/bin/

查看复制后的文件,如下

20200901145751993.png

4、启动redis:

切换到 bin 目录,使用./redis-server即可启动 redis 服务,但是这种方式没有指明配置文件,redis 将采用默认配置,所以需要让 redis 按照刚才的配置文件来启动:

  1. cd /root/redis-5.0.7/bin
  2. ./redis-server /root/redis-5.0.7/etc/redis.conf

如我启动151机器:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 1

验证:查看进程 ps axu|grep redis

2020090115024366.png

注意这里ip地址是127.0.0.1而不是0.0.0.0,只是本机能使用,打开redis.conf文件将bind 127.0.0.1改成bind 0.0.0,并重启redis,外部才可以连接上。

通过RedisDesktopManager连接:

20200901153058526.png 20200902113420722.png 20200901155530811.png

5、redis关闭命令:redis-cli -p 6379 shutdown

二、主从配置:主要是修改redis.conf配置文件(/root/redis-5.0.7/etc/redis.conf)

1、主机配置:主机(151机器)需要改动的配置如下:

  1. bind0.0.0.0
  2. port6379
  3. protected-modeno
  4. daemonizeyes
  5. logfile:./redis.log
  6. requirepasswtyy
  7. masterauthwtyy
  • bind:0.0.0.0
    Redis 默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
  • port:6379
    监听端口默认为6379,想改其他也行。
  • protected-mode:no
    关闭保护模式,可以外部访问。
  • daemonize:yes
    设置为后台启动。
  • logfile:./redis.log
    redis 日志文件,生成后在 bin 目录下可找到。
  • requirepass:wtyy
    设置 redis 连接密码。
  • masterauth:wtyy
    slave 服务连接 master 的密码。

    修改配置文件后需要重启redis:

    20200901160200205.png

2、从机配置:从机的配置和主机相似,不同的地方是需要使用replicaof指定主机(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof,目前我使用的5.0.7版本要使用 replicaof :

  1. bind0.0.0.0
  2. port:从机自定义的端口号
  3. protected-modeno
  4. daemonizeyes
  5. logfile:./redis.log
  6. requirepasswtyy
  7. masterauthwtyy
  8. replicaof xxx.xx.xxx.151 6379

同样的需要重启下:

  1. redis-cli -p 从机端口号 shutdown
  2. ps axu|grep redis
  3. cd /root/redis-5.0.7/bin
  4. ./redis-server /root/redis-5.0.7/etc/redis.conf
  5. ps axu|grep redis

3、数据同步:

上面主从节点的配置文件配置好后,重启 redis 服务,进入 bin 目录即可查看配置文件中指定的redis.log日志文件。如果机器开启了防火墙,还需求设置一下防火墙,否则主从机之间无法同步数据,命令如下:

  1. firewall-cmd --add-port=6379/tcp --permanent --zone=public
  2. #重启防火墙(修改配置后要重启防火墙)
  3. firewall-cmd --reload

至此主从结构搭建完毕。验证下:

(1)主151机器:可以看到当前角色为主机(master),并且连接了另外两台从机(slave)

  1. cd /root/redis-5.0.7/bin/
  2. ./redis-cli
  3. auth wtyy
  4. info replication

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 2

(2)从32机器:可以看到当前角色为从机(slave),并指明了主机地址ip和端口6379

  1. cd /root/redis-5.0.7/bin/
  2. ./redis-cli -p 6380
  3. auth wtyy
  4. info replication

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 3

(3)从126机器:可以看到当前角色为从机(slave),并指明了主机地址ip和端口6379

  1. cd /root/redis-5.0.7/bin/
  2. ./redis-cli -p 6381
  3. auth wtyy
  4. info replication

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 4

4、主从复制验证:

现在从项目中往主机写入数据:

  1. server.port=9999
  2. server.context-path=/redisgroup
  3. my.redis.server.host=xxx.xx.xxx.151
  4. my.redis.server.port=6379
  5. my.redis.server.password = wtyy
  6. my.redis.server.jedis.pool.maxTotal=500
  7. my.redis.server.jedis.pool.maxIdle=10
  8. my.redis.server.jedis.pool.maxWaitMillis=5000
  9. my.redis.server.jedis.pool.min-idle=5
  10. my.redis.server.timeout=5000
  11. package com.demo.controller;
  12. import com.demo.config.RedisClient;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.RestController;
  16. import java.security.Key;
  17. @RestController
  18. @RequestMapping("index")
  19. public class IndexController {
  20. @Autowired
  21. private RedisClient redisClient;
  22. private String nameFormat = "redis:name:{name}";
  23. @RequestMapping("/setName")
  24. public void setName(String key,String value){
  25. redisClient.set(nameFormat,value,key);
  26. }
  27. @RequestMapping("/getName")
  28. public String getName(String key){
  29. return redisClient.get(nameFormat,key);
  30. }
  31. }

访问:http://localhost:9999/redisgroup/index/setName?key=user&value=wtyy666,可以看到三台机器都有了同样的数据:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 5watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 6

20200902114143799.png

注意从机只能读不可以写入数据,如把配置改成:

  1. my.redis.server.host=xxx.xx.xxx.126
  2. my.redis.server.port=6381
  3. my.redis.server.password = wtyy

会报错:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 7

而http://localhost:9999/redisgroup/index/getName?key=user读取接口是可以正常返回数据的。

三、哨兵配置:主要是修改sentinel.conf配置文件。这里我们每个redis各部署一个哨兵,三台机器的配置方式相同。

1、同样为了方便管理,首先将sentinel.conf复制到 etc 下

  1. cd /data/redis-5.0.7/
  2. cp sentinel.conf /root/redis-5.0.7/etc/

2、修改sentinel.conf文件,需要改动的配置如下:

  1. //端口默认为26379。
  2. port:26379
  3. //关闭保护模式,可以外部访问。
  4. protected-mode:no
  5. //设置为后台启动。
  6. daemonize:yes
  7. //日志文件。
  8. logfile:./sentinel.log
  9. //指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
  10. sentinel monitor mymaster xxx.xx.xxx.151 6379 2
  11. //当在Redis实例中开启了requirepass,这里就需要提供密码。
  12. sentinel auth-pass mymaster wtyy
  13. //这里设置了主机多少秒无响应,则认为挂了。
  14. sentinel down-after-milliseconds mymaster 3000
  15. //主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
  16. snetinel parallel-syncs mymaster 1
  17. //故障转移的超时时间,这里设置为三分钟。
  18. sentinel failover-timeout mymaster 180000

同样的如果机器开启了防火墙,要把防火墙的26379端口打开:

  1. firewall-cmd --add-port=26379/tcp --permanent --zone=public
  2. #重启防火墙(修改配置后要重启防火墙)
  3. firewall-cmd --reload

3、分别启动三个哨兵:

  1. cd /root/redis-5.0.7/bin/
  2. ./redis-sentinel /root/redis-5.0.7/etc/sentinel.conf

三个哨兵都启动后,可使用如下命令查看哨兵信息

  1. redis-cli -p 26379
  2. info sentinel

可以看到,哨兵已经监听到当前的主机IP端口和运行状态,并且应该有2台从机,3个哨兵:

info\_sentinel.png

但是我的:哨兵显示2个,好像也不影响。

20200902140030297.png

至此,哨兵搭建完成。

4、容灾切换演示:

现在模拟主机宕机,将主机151机器的 redis 服务关闭,如下

20200902141347140.png

这时候重新进一下32机器:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 8

再重新进一下126机器:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 9

发现哨兵(Sentinel)通过选举机制选举了从机(32)作为了新的主机。需要注意的是,主从切换后配置文件已经被自动进行了更改,现在看一下新上位的主机 redis 日志,可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件,并且连接了其他从机:

20200902144650267.png

5、对比演示:在上面的基础上,把151上的redis再启起来,

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 10

现在的情况是:32主,151从,126从。

现在把三台机器上的哨兵都关闭:

20200904101003913.png

20200904101035783.png

20200904101046837.png

再把此时的主机(32机器)上的redis服务关闭:

20200904101314968.png

这时候重新查看下151、126机器上的redis,显示主机32的状态是down,但是151和126仍然都是从机,并没有新的主机产生:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 11 watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfdF95X3k_size_16_color_FFFFFF_t_70 12

由此可见哨兵的主从切换功能。

四、命令总结:

1、启动命令:

  1. cd /root/redis-5.0.7/bin
  2. #启动redis
  3. ./redis-server /root/redis-5.0.7/etc/redis.conf
  4. #启动哨兵
  5. ./redis-sentinel /root/redis-5.0.7/etc/sentinel.conf

2、执行其他命令:注意,启动了哨兵后,哨兵也是一个redis,只不过角色是哨兵。

执行其他命令需要先连接redis服务:

  1. #进入bin目录
  2. cd /root/redis-5.0.7/bin
  3. #连接redis服务,如果端口号是使用默认的6379,直接使用./redis-cli即可
  4. ./redis-cli -p 端口号
  5. #如果没有密码,可以省略这一步
  6. auth 密码

连接redis后就可以执行redis命令了,常用的有:

  1. #查看主/从复制的相关信息
  2. info replication
  3. #查看和集群相关的信息
  4. info cluster
  5. #查看哨兵信息
  6. info sentinel
  7. #关闭redis服务
  8. shutdown

参考:https://blog.csdn.net/xch_yang/article/details/104019552

发表评论

表情:
评论列表 (有 0 条评论,599人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis 哨兵

    前言 在上一篇,我们了解了redis 复制集群的完整的搭建流程,本篇来分享一下如何搭建 redis 哨兵集群。 为什么需要哨兵集群 redis哨兵集群要解决的问题

    相关 Redis-主从模式

    (1)文中例子使用一台服务器搭建Redis集群,有条件的同学可以将Redis服务部署在不同的服务器上。 (2)文中例子为一主三从模式,即一个主服务,三个从服务。 一、搭建