redis主从集群部署+哨兵模式并集成SpringBoot

redis主从集群部署+哨兵模式并集成SpringBoot,第1张

1、redis安装部署

        redis集群部署方式    采用一主二从三哨兵模式。    

把redis上传到/data/redis下并解压,同时在此目录创建redis_1,redis_2,redis_3三个文件夹

 进入redis-6.2.6目录执行以下命令安装redis,详细安装参考​​​​

cd /data/redis/redis-6.2.6
make && make install

 2、创建用于存放数据和日志的目录文件夹。

 3、进入/data/redis/redis-6.2.6/log,创建日志文件

 4、redis-6.2.6复制到新建的redis_1,redis_2,redis_3中

cp -r redis-6.2.6 /data/redis/redis_1
cp -r redis-6.2.6 /data/redis/redis_2
cp -r redis-6.2.6 /data/redis/redis_3

5、主从配置

1)Redis_1作为主节点,redis_2和redis_3作为从节点 

修改redis.conf配置如下:

redis_1-配置:

# 监听端口
port 7000
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode no
//设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭
requirepass 123456
//当 master 服务设置了密码保护时,slave 服务连接 master 的密码
masterauth 123456
//redis数据库文件名称,可以自定义
dbfilename dump_7000.rdb
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
pidfile /data/redis/redis_1/redis-6.2.6/redis_7000.pid
# 日志级别
loglevel notice
# 指定日志文件存放位置
logfile "/data/redis/redis_1/redis-6.2.6/log/redis.log"
# 指定本地数据库存放目录
dir /data/redis/redis_1/redis-6.2.6/data
# 服务器默认(yes)只读
replica-read-only no

redis_2-配置:

# 监听端口
port 7001
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode no
//设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭
requirepass 123456
//当 master 服务设置了密码保护时,slave 服务连接 master 的密码
masterauth 123456
//redis数据库文件名称,可以自定义
dbfilename dump_7001.rdb
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
pidfile /data/redis/redis_2/redis-6.2.6/redis_7001.pid
# 日志级别
loglevel notice
# 指定日志文件存放位置
logfile "/data/redis/redis_2/redis-6.2.6/log/redis.log"
# 指定本地数据库存放目录
dir /data/redis/redis_2/redis-6.2.6/data
# 服务器默认(yes)只读
replica-read-only no
# 用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点。replicaof指定主机(master)的IP地址和端口
replicaof 198.X.X.1 7000

redis_3-配置:

# 监听端口
port 7002
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode no
//设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭
requirepass 123456
//当 master 服务设置了密码保护时,slave 服务连接 master 的密码
masterauth 123456
//redis数据库文件名称,可以自定义
dbfilename dump_7002.rdb
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
pidfile /data/redis/redis_3/redis-6.2.6/redis_7002.pid
# 日志级别
loglevel notice
# 指定日志文件存放位置
logfile "/data/redis/redis_3/redis-6.2.6/log/redis.log"
# 指定本地数据库存放目录
dir /data/redis/redis_3/redis-6.2.6/data
# 服务器默认(yes)只读
replica-read-only no
# 用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点。replicaof指定主机(master)的IP地址和端口
replicaof 198.X.X.1 7000

注意点:IP地址最好不要写127.0.0.1防止访问请求被拒绝

6、哨兵模式配置

修改sentinel.conf配置如下:

redis_1的sentinel.conf配置如下:

# 监听端口
port 8000
//yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode:no
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 哨兵 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis-sentinel.pid 文件,可以通过 pidfile 指定
pidfile "/data/redis/redis_1/redis-6.2.6/redis-sentinel.pid"
# 指定日志文件名。 如果值为空,将强制Sentinel日志标准输出。守护进程下,如果使用标准输出进行日志记录,则日志将发送到/dev/null
logfile /data/redis/redis_1/redis-6.2.6/log/sentinel.log
# 每个长时间运行的进程都应该有一个明确定义的工作目录。对于Redis Sentinel来说,/tmp就是自己的默认工作目录,可以自定义。
dir /data/redis/redis_1/redis-6.2.6
# 指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster 198.X.X.1 7000 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster 123456
# 这里设置了主机多少秒无响应,则认为挂了默认3000
sentinel down-after-milliseconds mymaster 50000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1

redis_2的sentinel.conf配置如下:

# 监听端口
port 8001
//yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode:no
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 哨兵 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis-sentinel.pid 文件,可以通过 pidfile 指定
pidfile "/data/redis/redis_2/redis-6.2.6/redis-sentinel.pid"
# 指定日志文件名。 如果值为空,将强制Sentinel日志标准输出。守护进程下,如果使用标准输出进行日志记录,则日志将发送到/dev/null
logfile /data/redis/redis_2/redis-6.2.6/log/sentinel.log
# 每个长时间运行的进程都应该有一个明确定义的工作目录。对于Redis Sentinel来说,/tmp就是自己的默认工作目录,可以自定义。
dir /data/redis/redis_2/redis-6.2.6
# 指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster 198.X.X.1 7000 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster 123456
# 这里设置了主机多少秒无响应,则认为挂了默认3000
sentinel down-after-milliseconds mymaster 50000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1

redis_3的sentinel.conf配置如下:

# 监听端口
port 8002
//yes    保护模式,只允许本地链接,no保护模式关闭。
protected-mode:no
# 开启保护模式就不能远程连接,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
# 作为守护程序运行,设置为后台启动。
daemonize yes
# 当 哨兵 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis-sentinel.pid 文件,可以通过 pidfile 指定
pidfile "/data/redis/redis_3/redis-6.2.6/redis-sentinel.pid"
# 指定日志文件名。 如果值为空,将强制Sentinel日志标准输出。守护进程下,如果使用标准输出进行日志记录,则日志将发送到/dev/null
logfile /data/redis/redis_3/redis-6.2.6/log/sentinel.log
# 每个长时间运行的进程都应该有一个明确定义的工作目录。对于Redis Sentinel来说,/tmp就是自己的默认工作目录,可以自定义。
dir /data/redis/redis_3/redis-6.2.6
# 指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster 198.X.X.1 7000 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster 123456
# 这里设置了主机多少秒无响应,则认为挂了默认3000
sentinel down-after-milliseconds mymaster 50000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1

注意点:IP地址最好不要写127.0.0.1防止访问请求被拒绝

7、启动redis_1,redis_2,redis_3。启动顺序主-从-哨兵。启动命令如下:

启动主从
1)cd /data/redis/redis_1/redis-6.2.6 进入到redis1的redis-6.2.6目录下
./src/redis-server ./redis.conf
2)cd /data/redis/redis_2/redis-6.2.6 进入到redis2的redis-6.2.6目录下
./src/redis-server ./redis.conf
3)cd /data/redis/redis_3/redis-6.2.6 进入到redis3的redis-6.2.6目录下
./src/redis-server ./redis.conf
启动哨兵
1)cd /data/redis/redis_1/redis-6.2.6 进入到redis1的redis-6.2.6目录下
./src/redis-sentinel ./sentinel.conf
2)cd /data/redis/redis_1/redis-6.2.6 进入到redis2的redis-6.2.6目录下
./src/redis-sentinel ./sentinel.conf
3)cd /data/redis/redis_3redis-6.2.6 进入到redis3的redis-6.2.6目录下
./src/redis-sentinel ./sentinel.conf

启动之后,任何目录下输入:ps -ef|grep redis 查看redis进程。可以看到如下效果表示redis启动成功。下图显示ip应该为大家的服务器ip。

8、部署验证

1、主从部署验证

      进入reids_1服务中,执行以下命令:

cd /data/redis/redis_1/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1 -c -p 7000

info replication

进入reids_2服务中,执行以下命令:

cd /data/redis/redis_2/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1 -c -p 7001

info replication

 进入reids_3服务中,执行以下命令:

cd /data/redis/redis_3/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1-c -p 7002

info replication

可以看出reids_1是主服务,reids_2和reids_3是从服务。

2)哨兵部署验证

进入reids_1(sentinel)哨兵中,执行以下命令:

cd /data/redis/redis_1/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1-c -p 8000

info sentinel

 进入reids_2(sentinel)哨兵中,执行以下命令:

cd /data/redis/redis_2/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1-c -p 8001

info sentinel

 进入reids_3(sentinel)哨兵中,执行以下命令:

cd /data/redis/redis_3/redis-6.2.6

redis-cli -h 1XX.XX.XX.X1-c -p 8002

info sentinel

 可以看出哨兵部署正常。

9、验证主从数据是否同步

[root@MiWiFi-R3-srv redis-6.2.6]# redis-cli -h 1XX.XX.XX.X1 -c -p 7000
1XX.XX.XX.X1:7000> auth 123456
OK
1XX.XX.XX.X1:7000> keys *
1) "a"
1XX.XX.XX.X1:7000> set c 123456
OK
1XX.XX.XX.X1:7000> keys *
1) "c"
2) "a"
1XX.XX.XX.X1:7000> 


[root@MiWiFi-R3-srv redis-6.2.6]# redis-cli -h 1XX.XX.XX.X1 -c -p 7001
1XX.XX.XX.X1:7001> auth 123456
OK
1XX.XX.XX.X1:7001> keys *
1) "a"

 
[root@MiWiFi-R3-srv redis-6.2.6]# redis-cli -h 1XX.XX.XX.X1 -c -p 7002
1XX.XX.XX.X1:7002> auth 123456
OK
1XX.XX.XX.X1:7002> keys *
1) "a"

可以看出,主从数据同步正常。 

10、容灾切换演示

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

这时候重新进一下7001,7002机器:

 

 可以看出哨兵(Sentinel)通过选举机制选举了从机(7001)作为了新的主机

 至此redis主从哨兵模式成功部署完成。

11、Springboot集成redis集群配置方式

application.yml配置如下:

spring:
  redis:
    password: 123456 # Redis服务器连接密码(默认为空)
    timeout: 50000ms # 连接超时时间
    sentinel:
      master: mymaster
      nodes: 1XX.XX.XX.XX:8000,1XX.XX.XX.XX:8001,1XX.XX.XX.XX:8002  #哨兵地址及端口

RedisController:

package andanyoung.redis.rediscluster.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * @author wengly
 * @since 2022/4/25 11:05
 */
@RestController
public class RedisController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @GetMapping("get")
    public String get(String key){

       return stringRedisTemplate.opsForValue().get(key);
    }

    @RequestMapping("put")
    public String put(String key,String value){

          stringRedisTemplate.opsForValue().set (key,value);
          return get(key);
    }
}

12、验证效果

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/786227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存