redis主从集群部署+哨兵模式并设置开机自启动及集成SpringBoot

目录

1、redis安装部署

2、主从配置

3、哨兵模式配置

4、部署验证

5、配置redis哨兵开机自启动

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

7、验证效果


1、redis安装部署

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

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

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

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

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

 4)进入/data/redis/redis-6.2.6/log,创建日志文件

 5)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

2、主从配置

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 <password> 命令提供密码,默认关闭
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 <password> 命令提供密码,默认关闭
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 <password> 命令提供密码,默认关闭
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防止访问请求被拒绝

3、哨兵模式配置

1)修改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防止访问请求被拒绝

2)启动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。

4、部署验证

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

 可以看出哨兵部署正常。

3)验证主从数据是否同步

[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"

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

4)容灾切换演示

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

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

 

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

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

5、配置redis哨兵开机自启动

1)在/etc/init.d目录下创建 redis_master文件

touch redis_master

2)redis_master编辑配置如下:

vi /etc/init.d/redis_master

#!/bin/sh
# chkconfig: 2345 10 90 
#redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。
# description: Start and Stop redis  
 
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO


REDISPORT=6379
REDIS_SENTINELPORT=26379
EXEC=/data/redis-6.2.6/sbin/redis-server
CLIEXEC=/data/redis-6.2.6/sbin/redis-cli
CLIEXEC_SENTINEL=/data/redis-6.2.6/sbin/redis-sentinel
PIDFILE=/data/redis-6.2.6/redis_${REDISPORT}.pid
#Redis配置文件位置
CONF="data/redis-6.2.6/sbin/redis.conf"
#sentinel 配置位置
SlCONF="data/redis-6.2.6/sbin/sentinel.conf --sentinel"
REDISPASSWORD="cib@123456"
sleep 10

case "$1" in 
    start)  
        if [ -f $PIDFILE ]  
        then 
            echo "$PIDFILE exists, process is already running or crashed."
        else
            echo "Starting Redis server..."
			#redis启动在这里 配置从服务器启动sentinel在这里加上 $EXEC $SlCONF即可 SlCONF是上面定义好从服务器地址
            $EXEC $CONF  
			$EXEC $SlCONF 
        fi 
        if [ "$?"="0" ]  
        then 
            echo "Redis is running..."
        fi 
        ;;  
    stop)  
        if [ ! -f $PIDFILE ]  
        then 
            echo "$PIDFILE exists, process is not running."
        else
            PID=$(cat $PIDFILE)  
            echo "Stopping..."
			# -a $REDISPASSWORD 这里是redis服务密码 关闭redis服务需要该密码支持
			$CLIEXEC -a $REDISPASSWORD -p $REDISPORT shutdown 
            $CLIEXEC -p $REDIS_SENTINELPORT shutdown  
            sleep 2 
            while [ -x $PIDFILE ]  
            do
                echo "Waiting for Redis to shutdown..."
                sleep 1 
            done 
            echo "Redis stopped."
        fi 
        ;;  
    restart|force-reload)  
        ${0} stop  
        ${0} start  
        ;;  
    *)  
        echo "please use start or stop as first argument." 
        exit 1 
		;;
esac

 以上配置保存好执行以下命令即可启动和停止

/etc/init.d/redis_master start       //启动redis服务

/etc/init.d/redis_master stop       //关闭redis服务

service redis_master start        //启动redis服务
service redis_master stop        //关闭redis服务
chkconfig redis_master on       //设为开机启动
chkconfig redis_master off       //设为开机关闭

3)编辑rc.local文件设置开机自启动

vi /etc/rc.local

添加以下命令:

/etc/init.d/redis_master restart

 4)最后修改rc.local文件的执行权限--一定要执行

chmod +x  /etc/rc.local


chmod 755 /etc/rc.local

5)重启服务器

reboot

6)查看进程

ps -ef | grep redis

 6、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);
    }
}

7、验证效果

猜你喜欢

转载自blog.csdn.net/huanglm_OneWholeLife/article/details/124462133