本次目标:
redis主从:
redis高可用:
程序联调:
真实环境:
准备
准备服务器: 这里为了演示简单只使用三台linux 服务器,两台作为redis主从,一台部署java应用程序 :
分别为 172.26.139.217(作为redis主节点) 172.26.139.210(作为redis从节点), 172.26.139.214(作为应用部署服务器)。
安装redis: 分别在两台服务器上安装好redis,本次演示redis版本3.2.8
配置主从
1、修改主节点上的redis.conf
配置修改,其他配置可根据需求设置
bind 0.0.0.0 #代表任何IP都可以访问
protected-mode no#关闭保护模式,开启则于bind限制IP访问
daemonize yes #设置成后台启动
全量配置如下
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
tcp-backlog 511
timeout 0
tcp-keepalive 300
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
#
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
2、修改从库redis.conf
配置修改,这里与master不同的是需要设置主库的IP和端口
bind 0.0.0.0 #代表任何IP都可以访问
protected-mode no#关闭保护模式,开启则于bind限制IP访问
daemonize yes #设置成后台启动
slaveof 172.26.139.217 6379 #主节点的
#masterauth <master-password> #master节点的密码,没有密码则可去掉
全量配置如下
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slaveof 172.26.139.217 6379
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
3、主从测试
1、分别启动master和slave节点
./data/redis-3.2.8/src/redis-server /data/redis-3.2.8/redis.conf
2、连接master节点,查看节点信息,看见如下效果则说明主从配置成功
3、连接slvae节点,查看节点信息
配置高可用
1、修改master和slave节点的sentinel.conf
修改配置
protected-mode no
daemonize yes
sentinel monitor mymaster 172.26.139.217 6379 1 #配置redis master节点的IP 和端口,当1个节点于master失联则认为master挂了 ,“mymaster”自由定义,每个sentinel一致则可
#sentinel auth-pass mymaster 123456 #master节点密码,如果无密码则可去掉
全量配置如下:
protected-mode no
port 26379
dir /tmp
daemonize yes
sentinel monitor mymaster 172.26.139.217 6379 1
sentinel down-after-milliseconds ard-master 30000
sentinel parallel-syncs ard-master 1
sentinel failover-timeout ard-master 180000
2、启动master和sentinel服务
命令
./data/redis-3.2.8/src/redis-sentinel /data/redis-3.2.8/sentinel.conf
3、测试高可用
停掉master节点
查看原来的slave节点信息,看是否被竞选成了新的master
spring boot整合
1、在yml 里面配置redis 和sentinel的信息
spring:
2、config配置类,配置redis连接信息
import
3、编写测试类
添加个定时任务,用于等下测试master挂了之后看能不能连上新选取的master节点
4、把jar包部署到服务器
把spring boot项目打成jar包传到服务器
注意:部署jar包的服务器必须和redis的服务器在同一个局域网,要不然程序会连接不上。
5、启动jar包看是否能正常连接redis
命令: java -jar test.jar
如上图,已经成功连接redis并获取值
6、关闭一个master节点,看重新选主后java程序是否能正常连接
关闭master节点
查看slave节点是否已经成为新的master
查看程序是否自动连接新的master节点
如上图,程序也能正确连接新的master节点,至此 redis 高可用一套体系搭建成功
搭建过程中可能遇到的问题
1、应用程序要和redis 、sentinel 一个内网,因为程序里面从sentinel获取的redis地址都是内网地址,要不然会一直连接不上。
2、关闭服务器防火墙、redis 和sentinel都关闭保护模式
3、主库有密码则需要在redis.conf sentinel.conf 设置连接密码
4、应用程序启动时有可能会报错如下:
java.net.UnknownHostException: iz8vb9p8wvn5u653upigu0z: iz8vb9p8wvn5u653upigu0z: System error
解决方案host文件添加iz8vb9p8wvn5u653upigu0z 和IP的映射:
编辑hosts文件:vim /etc/hosts
添加如下配置映射
启动配置:service network restart
5、每次哨兵重新选主后会修改 redis.conf 和 sentinel.conf里面的主从配置信息,如果发现故障后,下次重启如果想要恢复原来的主从配置则要注意把各个节点redis.conf 和sentinel.conf配置还原。