目录
1、redis安装部署
2、主从配置
3、哨兵模式配置
4、部署验证
5、配置redis哨兵开机自启动
6、Springboot集成redis集群配置方式
7、验证效果
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
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防止访问请求被拒绝
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。
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主从哨兵模式成功部署完成。
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
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);
}
}