Redis集群搭建方案
这里使用三个哨兵节点监控一主双从三个Redis实例来实现高可用架构
搭建一主双从实例
服务器使用情况,这里使用了两台服务器做高可用部署,如果有条件可以用三台服务器,配置类似
名称 | 身份 | 名称 | IP:端口 |
---|---|---|---|
节点1 | master | redis-1 | 192.168.1.101:6379 | |
节点2 | slave1 | redis-2 | 192.168.1.102:6379 | |
节点3 | slave2 | redis-3 | 192.168.1.103:6380 |
docker部署Redis集群
docker部署Redis主从集群
节点1上创建redis配置文件,命名为redis.conf,文件内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
节点1上创建redis配置文件,命名为redis.conf,文件内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
replica-announce-ip 192.168.1.101
replica-announce-port 6379
master-announce-ip 192.168.1.101
master-announce-port 6379
replica-announce-ip和master-announce-ip均设置为节点1自身的ip地址
节点1上运行docker命令,启动redis master服务
docker run -d --name redis-1 \
-p 6379:6379 \
-v $PWD/redis.conf:/etc/redis/redis.conf\
redis:6.0.16 redis-server /etc/redis/redis.conf
节点2上创建redis配置文件,命名为redis-slave.conf,文件内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
replicaof 192.168.1.101 6379
replica-announce-ip 192.168.1.102
replica-announce-port 6379
master-announce-ip 192.168.1.102
master-announce-port 6379
replicaof 设置节点1(master)的ip地址,根据实际情况进行ip地址的调整
replica-announce-ip和master-announce-ip均设置为节点2自身的ip地址
节点2上运行docker命令,启动redis slave服务
docker run -d --name redis-2 --net iot \
-p 6379:6379 \
-v $PWD/redis-slave.conf:/etc/redis/redis.conf \
redis:6.0.16 redis-server /etc/redis/redis.conf
节点3上创建redis配置文件,同样命名为redis-slave.conf,文件内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
replicaof 192.168.1.101 6379
replica-announce-ip 192.168.1.103
replica-announce-port 6379
master-announce-ip 192.168.1.103
master-announce-port 6379
replicaof 同样设置节点1(master)的ip地址,根据实际情况进行ip地址的调整
节点3上运行docker命令,启动redis slave服务
docker run -d --name redis-3 --net iot \
-p 6379:6379 \
-v $PWD/redis-slave.conf:/etc/redis/redis.conf \
redis:6.0.16 redis-server /etc/redis/redis.conf
docker部署sentinel集群
节点1上创建sentinel配置文件,命名为sentinel.conf,内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
port 26379
sentinel monitor redis-server 192.168.1.101 6379 2
sentinel down-after-milliseconds redis-server 10000
节点1上运行如下docker命令,启动sentinel服务:
docker run -d --name sentinel-1 \
-p 26379:26379 \
-v $PWD/sentinel.conf:/etc/redis/sentinel.conf \
redis:6.0.16 redis-sentinel /etc/redis/sentinel.conf
同样在节点2上创建sentinel配置文件,命名为sentinel.conf,内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
port 26379
sentinel monitor redis-server 192.168.1.101 6379 2
sentinel down-after-milliseconds redis-server 10000
节点2上启动sentinel服务:
docker run -d --name sentinel-2 \
-p 26379:26379 \
-v $PWD/sentinel.conf:/etc/redis/sentinel.conf \
redis:6.0.16 redis-sentinel /etc/redis/sentinel.conf
同样在节点3上创建sentinel配置文件,命名为sentinel.conf,内容如下:
bind 0.0.0.0
protected-mode no
daemonize no
port 26379
sentinel monitor redis-server 192.168.1.101 6379 2
sentinel down-after-milliseconds redis-server 10000
节点2上启动sentinel服务:
docker run -d --name sentinel-3 \
-p 26379:26379 \
-v $PWD/sentinel.conf:/etc/redis/sentinel.conf \
redis:6.0.16 redis-sentinel /etc/redis/sentinel.conf
SpringBoot配置
在SpringBoot配置application.yml中,增加一下的配置即可
spring:
redis:
sentinel:
master: redis-server
nodes: 192.168.1.101:26379,192.168.1.101:26379,192.168.1.101:26380
部署流程
- redis安装
两台服务器都先安装服务,注意先安装gcc和make
cd /home
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz
cd ./redis-6.2.6
make
make install
- 修改默认的配置文件(192.168.13.52,192.168.13.53)
vim /home/redis-6.2.6/redis.conf
设置,找到对应的配置然后修改
# 设置可以远程访问
bind 0.0.0.0
protected-mode no
# 可以后台运行
daemonize no
- 修改192.168.13.53 服务器上的配置文件slave1
cd /home/redis-6.2.6
vim redis-6379.conf
输入以下内容
# 应用基础配置
include /home/redis-6.2.6/redis.conf
# 从节点配置
replicaof 192.168.13.52 6379
- 修改192.168.13.53 服务器上的配置文件slave2
cd /home/redis-6.2.6
vim redis-6380.conf
输入以下内容
# 应用基础配置
import /home/redis-6.2.6/redis.conf
# 端口
port 6380
# 从节点配置
replicaof 192.168.13.52 6379
- 每个conf文件对应一个应用实例,使用redis-server命令启动redis服务
192.168.13.52执行
cd /usr/local/bin
./redis-server /home/redis-6.2.6/redis.conf
192.168.13.53执行
cd /usr/local/bin
./redis-server /home/redis-6.2.6/redis-6379.conf
192.168.13.53执行
cd /usr/local/bin
./redis-server /home/redis-6.2.6/redis-6380.conf
任意一台服务器,连接节点后检查集群状态
redis-cli //连接实例
> info replication
界面应该展示
role: master or slave
可以通过任意的客户端软件写入master节点信息,然后观察slave节点是否数据会同步,(经过测试,slave节点不可写入,只能从master节点写入)
搭建哨兵节点
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最少是3个节点的哨兵
服务器使用情况
身份 | IP:端口 | 配置地址 |
---|---|---|
哨兵1 | 192.168.13.52:26379 | /home/redis-6.2.6/sentinel.conf |
哨兵2 | 192.168.13.53:26379 | /home/redis-6.2.6/sentinel.conf |
哨兵3 | 192.168.13.53:26380 | /home/redis-6.2.6/sentinel-26380.conf |
- 在192.168.13.52,192.168.13.53 修改sentinel.conf
vim /home/redis-6.2.6/sentinel.conf
修改其中的配置
# 后台运行
daemonize yes
# 记录下日志,默认日志会扔到/dev/null
logfile /var/log/sentinel.log
# 改一下哨兵监控的master节点信息
sentinel monitor mymaster 192.168.13.52 6379 2
- 192.168.13.53复制一个配置文件命名为sentinel-26380.conf,作为第三个节点的哨兵配置文件
cd /home/redis-6.2.6/
cp sentinel.conf sentinel-26380.conf
- 修改第三个哨兵的配置文件
vim /home/redis-6.2.6/sentinel-26380.conf
# pid file
pidfile "/var/run/redis-sentinel-26380.pid"
# 记录下日志,默认日志会扔到/dev/null
logfile /var/log/sentinel-26380.log
# 修改以下变量
port 26380
- 挨个启动3个哨兵
192.168.13.52
cd /usr/local/bin
./redis-sentinel /home/redis-6.2.6/sentinel.conf
192.168.13.53
cd /usr/local/bin
./redis-sentinel /home/redis-6.2.6/sentinel.conf
192.168.13.53
cd /usr/local/bin
./redis-sentinel /home/redis-6.2.6/sentinel-26380.conf
- 验证部署结果
cd /usr/local/bin
# 注意这里是哨兵的端口号
./redis-cli -p 26379
sentinel master mymaster
# 应该输出master哨兵信息
sentinel slaves mymaster
# 应该输出2个slave信息
sentinel sentinels mymaster
# 应该输出除了当前哨兵以外的哨兵信息
- springboot相关配置,使用StringRedisTemplate可以测试写入情况
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.13.52:26379,192.168.13.53:26379,192.168.13.53:26380
- 经过测试,当关闭当前连接的哨兵,或者连接中的redis实例,都会自动切换到另外的redis实例上,并且master-slave关系会被自动修改