相关文章:
redis主从复制(读写分离)
redis哨兵模式
Redis配置详解
一、Redis主从搭建
本文讲解用的是Redis5.0.10搭建一主二从
Redis官方下载连接:http://download.redis.io/releases/
IP | PORT | 哨兵端口 | |
---|---|---|---|
Redis-master | 192.168.118.130 | 6379 | 26379 |
Redis-slave01 | 192.168.118.129 | 6379 | 26379 |
Redis-slave02 | 192.168.118.130 | 6379 | 26379 |
江湖规矩,一般将哨兵(sentinel)端口设置为Redis端口前加2,其实没有什么要求,可以随便设置,只要不要端口冲突。 |
1、Linux下安装Redis
主服务器192.168.118.130
- 下载Redis5.0.10.tar.gz,并上传只Linux服务器->解压
# 将redis解压到当前目录
tar -zxvf redis-5.0.10.tar.gz
# 将解压好的文件夹移到/usr/local下,并改名为redis
mv redis-5.0.10 /usr/local/redis
- 编译redis
# 安装redis编译必备工具
yum install gcc-c++
# 进入redis目录下
cd /usr/local/redis
# 执行编译
make
走到下图结果,算是编译完成了
# 再执行下面语句
make install
2、Redis配置
- 梳理文件,编写启动,停止脚本
在配置redis.conf之前,我需要按我的习惯将各文件梳理一下
# 进入redis主目录
cd /usr/local/redis
# 创建目录bin(启动,停止命令),conf(配置文件),logs(日志),data(持久化数据)
mkdir bin
mkdir conf
mkdir logs
mkdir data
# 将redis目录下的redis.conf文件拷贝一份至conf文件夹下(redis主目录下的配置文件不动,作为备份)
cp redis.conf ./conf/
# 进入bin目录,在bin目录下写redis启动脚本,停止脚本
cd /usr/local/redis/bin
touch start.sh stop.sh
chmod 777 start.sh stop.sh
start.sh 脚本内容
#!/bin/sh
#您可以在此处修改redis-server和conf的所在路径
REDIS_SERVER="/usr/local/redis/src/redis-server"
REDIS_CLI="/usr/local/redis/src/redis-cli"
REDIS_CONF="/usr/local/redis/conf/redis.conf"
if [ ! -e $REDIS_SERVER ]; then
echo "$REDIS_SERVER does not exist!"
exit -1
fi
if [ ! -e $REDIS_CONF ]; then
echo "$REDIS_CONF does not exist!"
exit -1
fi
cmd="ps -ef | grep ${REDIS_SERVER} | grep -v grep | grep -v vim | grep -v defunct | awk '{ print \$2 }'"
#echo $cmd
PID=$(eval ${cmd})
#echo $PID
if [ $PID"e" != "e" ]; then
echo "redis-server is running, can't start"
exit -1
else
$REDIS_SERVER $REDIS_CONF &
fi
startfail=1
for i in `seq 0 180`
do
PID=$(eval ${cmd})
#echo $PID
if [ $PID"e" != "e" ]; then
${REDIS_SERVER} --version
echo "Redis server is started..."
startfail=0
break
fi
sleep 1
done
exit $startfail
stop.sh脚本内容
#!/bin/sh
#您可以在此处修改redis-server的所在路径
REDIS_SERVER="/usr/local/redis/src/redis-server"
cmd="ps -ef | grep ${REDIS_SERVER} | grep -v grep | grep -v vim | grep -v defunct | awk '{ print \$2 }'"
#echo $cmd
PID=$(eval ${cmd})
if [ ${PID}"e" = "e" ]; then
echo "redis-server is not started"
exit -1
else
kill $PID
fi
stopfail=1
for i in `seq 0 30`
do
PID=$(eval ${cmd})
#echo $PID
if [ ${PID}"e" != "e" ]; then
echo "redis-server is still running, waiting to stop[${i}]..."
else
echo "redis-server is stoped"
stopfail=0
break
fi
sleep 1
done
exit $stopfail
- 配置redis.conf
我这边只记录我修改了的配置项
# 这里配置是本机的网卡地址,表示外部通过什么网卡来连接访问redis,
# 配置0.0.0.0或者不配置表示所有网卡都可以,具体解释请看本文开始的【Redis配置详解】
bind 0.0.0.0
# 后台进程运行
daemonize yes
# redis日志
logfile "/usr/local/redis/logs/redis.log"
# redis持久化文件目录
dir "/usr/local/redis/data"
# redis密码
requirepass "123456"
# 最大redis内存,达到这个就会触发内存淘汰机制
maxmemory 500M
# 内存淘汰策略
maxmemory-policy volatile-lru
# 开启aof
appendonly yes
# 这是作为从服务器向主服务器连接时必备的密码,为什么这台服务器作为主节点也要配置这个参数呢,
# 其实在主服务宕机后又重启时,这台机器会成为slave节点,这时候如果没有这个配置项,会连不上
masterauth '123456'
- 配置其余两台从redis服务
所有配置同主服务器,只需要在redis.conf中加入一条
# 指定主服务器
replicaof 192.168.118.130 6379
- 分别启动三台redis服务器(./start.sh)
# 进入主服务器客户端
[root@localhost redis]# /usr/local/redis/src/redis-cli -h 192.168.118.130 -p 6379
# 输入密码鉴权
192.168.118.130:6379> auth 123456
# 查看redis相关信息,我们这里只关注redis的主从配置信息
192.168.118.130:6379> info
到这里Redis主从就搭建好了!!!
二、Redis哨兵模式搭建
虽然redis主从已经搭建完毕,但是当主节点宕机时,从节点并不会接手主节点的工作,只会傻傻得在那里不停地尝试连接主节点。然而这并不是我们想要的,我们希望主节点挂了后,从节点可以顶上去,让服务继续使用。
- sentinel.conf配置,我们将redis主目录下的sentinel.conf复制一份进conf中
cd /usr/local/redis
cp sentinel.conf ./conf/
- sentinel.conf配置详解
# 哨兵sentinel实例运行的端口
port 26379
# 守护进程模式
daemonize yes
# 开启守护进程时,哨兵进程id记录地址
pidfile /var/run/redis-sentinel.pid
# 指明日志文件名
logfile "sentinel.log"
# 进程工作目录
dir "/usr/local/redis/logs"
# 哨兵节点定期监控,master-name为自定义的主节点名称,master-ip为主节点ip,master-port为主节点端口号,
# quorum设置为2就代表至少要有两个哨兵认为主节点故障了,才算主节点客观下线了,一般设置为sentinel节点数的一半加一。
# 这里面的master-name自定义,但是需要所有sentinel配置文件中一致
sentinel monitor mymaster 192.168.118.130 6379 2
# 每个哨兵节点会定期发送ping命令来判断Redis节点和其余的哨兵节点是否是可达的,
# 如果超过了配置的times时间没有收到pong回复,就主观判断节点是不可达的,times的单位为毫秒。
sentinel down-after-milliseconds mymaster 30000
# 当哨兵节点都认为主节点故障时,哨兵投票选出的leader会进行故障转移,选出新的主节点,原来的从节点们会向新的主节点发起复制,
# 这个配置就是控制在故障转移之后,每次可以向新的主节点发起复制的节点的个数,最多为nums个,因为如果不加控制会对主节点的网络和磁盘IO资源很大的开销。
sentinel parallel-syncs mymaster 1
# 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
sentinel failover-timeout mymaster 180000
# redis的密码
sentinel author-pass mymaster 123456
#避免脚本重置,默认值yes,避免一个简单的安全问题(设置为yes就行,无需理会)
sentinel deny-scripts-reconfig yes
# 重命名你认为危险的命令,使之更安全
# SENTINEL rename-command mymaster CONFIG GUESSME
- 编写哨兵启动,停止脚本
同样在bin文件夹中
touch start-sentinel.sh stop-sentinel.sh
chmod 777 start-sentinel.sh stop-sentinel.sh
start-sentinel.sh脚本内容
#!/bin/sh
#您可以在此处修改redis-server和conf的所在路径
SENTINEL_SERVER="/usr/local/redis/src/redis-sentinel"
SENTINEL_CONF="/usr/local/redis/conf/sentinel.conf"
if [ ! -e $SENTINEL_SERVER ]; then
echo "$SENTINEL_SERVER does not exist!"
exit -1
fi
if [ ! -e $SENTINEL_CONF ]; then
echo "$SENTINEL_CONF does not exist!"
exit -1
fi
cmd="ps -ef | grep ${SENTINEL_SERVER} | grep -v grep | grep -v vim | grep -v defunct | awk '{ print \$2 }'"
#echo $cmd
PID=$(eval ${cmd})
#echo $PID
if [ $PID"e" != "e" ]; then
echo "sentinel-server is running, can't start"
exit -1
else
$SENTINEL_SERVER $SENTINEL_CONF &
fi
startfail=1
for i in `seq 0 180`
do
PID=$(eval ${cmd})
#echo $PID
if [ $PID"e" != "e" ]; then
${SENTINEL_SERVER} --version
echo "sentinel server is stared..."
startfail=0
break
fi
sleep 1
done
exit $startfail
stop-sentinel.sh脚本内容
#!/bin/sh
#您可以在此处修改redis-server的所在路径
SENTINEL_SERVER="/usr/local/redis/src/redis-sentinel"
cmd="ps -ef | grep ${SENTINEL_SERVER} | grep -v grep | grep -v vim | grep -v defunct | awk '{ print \$2 }'"
#echo $cmd
PID=$(eval ${cmd})
if [ ${PID}"e" = "e" ]; then
echo "sentinel-server is not started"
exit -1
else
kill $PID
fi
stopfail=1
for i in `seq 0 30`
do
PID=$(eval ${cmd})
#echo $PID
if [ ${PID}"e" != "e" ]; then
echo "sentinel-server is still running, waiting to stop[${i}]..."
else
echo "sentinel-server is stoped"
stopfail=0
break
fi
sleep 1
done
exit $stopfail
- 启动sentinel(哨兵)
在启动哨兵前,确保你的redis服务是启动的,启动后可观察sentinel.conf,可以发现,sentinel会向sentinel.conf文件中拼接主从信息,哨兵节点信息。
还可以通过sentinel.log日志文件的日志信息查看哨兵的相关配置情况!!!
这时候我们可以停掉Redis主节点来验证哨兵。
通过一系列验证,你或许会发现Redis哨兵重新选举主节点后会将这个被选中的节点的redis.conf修改掉,具体的为删掉replicaof 配置项,而原来的主节点则添加replicaof 配置项,并指向新的主节点。所以旧的主节点再次启动就成从节点了。
三、springboot整合
配置:
spring.application.name=spring-boot-redis
server.port=8080
# 哨兵监听的redis server的名称
spring.redis.sentinel.master=mymaster
# 哨兵配置列表
spring.redis.sentinel.nodes=192.168.118.129:26379,192.168.118.130:26379,192.168.118.131:26379
# redis密码
spring.redis.password=123456
可无:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
// hash的key也采用String的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
return template;
}
}
测试: