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、验证效果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)