本次目标:

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





redis bind 绑定地址 redis bind ip_IP


redis bind 绑定地址 redis bind ip_redis bind 绑定地址_02


2、连接master节点,查看节点信息,看见如下效果则说明主从配置成功


redis bind 绑定地址 redis bind ip_IP_03


3、连接slvae节点,查看节点信息


redis bind 绑定地址 redis bind ip_redis_04


配置高可用

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


redis bind 绑定地址 redis bind ip_IP_05


redis bind 绑定地址 redis bind ip_IP_06


3、测试高可用

停掉master节点


redis bind 绑定地址 redis bind ip_redis集群配置bind ip_07


查看原来的slave节点信息,看是否被竞选成了新的master


redis bind 绑定地址 redis bind ip_redis集群配置bind ip_08


spring boot整合

1、在yml 里面配置redis 和sentinel的信息


spring:


2、config配置类,配置redis连接信息


import


3、编写测试类

添加个定时任务,用于等下测试master挂了之后看能不能连上新选取的master节点



4、把jar包部署到服务器

把spring boot项目打成jar包传到服务器

注意:部署jar包的服务器必须和redis的服务器在同一个局域网,要不然程序会连接不上。


redis bind 绑定地址 redis bind ip_IP_09


5、启动jar包看是否能正常连接redis

命令: java -jar test.jar


redis bind 绑定地址 redis bind ip_服务器_10


如上图,已经成功连接redis并获取值

6、关闭一个master节点,看重新选主后java程序是否能正常连接

关闭master节点


redis bind 绑定地址 redis bind ip_redis bind 绑定地址_11


查看slave节点是否已经成为新的master


redis bind 绑定地址 redis bind ip_redis bind 绑定地址_12


查看程序是否自动连接新的master节点


redis bind 绑定地址 redis bind ip_redis bind 绑定地址_13


如上图,程序也能正确连接新的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

添加如下配置映射


redis bind 绑定地址 redis bind ip_redis bind 绑定地址_14


启动配置:service network restart

5、每次哨兵重新选主后会修改 redis.conf 和 sentinel.conf里面的主从配置信息,如果发现故障后,下次重启如果想要恢复原来的主从配置则要注意把各个节点redis.conf 和sentinel.conf配置还原。