Redis 一主两从高可用环境搭建
Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据。特殊的,一个从机同样可以设置为一个 Redis Server 的主机,这样一来 Master-Slave 的分布看起来就是一个有向无环图 DAG,如此形成 Redis Server 集群,无论是主机还是从机都是 Redis Server,都可以提供服务。
环境:centos6.5,由于是测试,现在将三个redis放在一台机器上。
一、安装redis
1.下载、解压
[root@bmsoft home]# cd bmsoft/
[root@bmsofthome]# wget http://download.redis.io/releases/redis-3.2.6.tar.gz
[root@bmsoft bmsoft]# tar -zxvf redis-3.2.6.tar.gz
2.将解压后的文件分别放到/bmsoft下的三个文件夹redis1、redis2、redis3中,其中我们将reids1设为主机master目录,redis2和redis3设为从机slaver目录。
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis1
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis2
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis3
3.下面挨个开始编译,以redis1为例
[root@bmsoft bmsoft]# cd redis1/redis-3.2.6
[root@bmsoft bmsoft]# make
上面这个命令在redis1、redis2、redis3各执行一遍。
提示:如果编译失败可能是没有安装gcc和gcc-c++,有可能还要安装tcl,具体问题具体对待,因为redis编译时需要一些环境支持。
二、配置redis.conf
安装完毕就要开始配置了。由于是一主多从的架子,所以我选择redis1为主,redis2、redis3为从。在每个redis解压目录下都有一个redis.conf,先修改主redis的配置。
以下所有配置如果在redis.conf文件用#注释掉,请打开注释,否则无效。
1.主节点redis1的redis.conf配置
bind 0.0.0.0 //默认是127.0.0.1,如果用其他ip,springboot连接redis可能不会太顺利
Protected-mode no
port 7000
daemonize yes //redis可以带配置文件后台运行
pidfile "/var/run/redis_7000.pid" //对应7001,7002
dir “/home/bmsoft/redis1/data” //对应所在文件夹
slave-priority 100
appendonly yes
appendfsync everysec
2.从节点redis2的redis.conf配置
bind 本机ip //默认是127.0.0.1, 我在本文档中就用127.0.0.1
Protected-mode no
port 7001
daemonize yes //redis可以带配置文件后台运行
pidfile "/var/run/redis_7001.pid"
dir “/home/bmsoft/redis2/data” //对应所在文件夹
slaveof 127.0.0.1 7000 //地址为主机的ip +端口
slave-read-only yes //由于是从机设置为只读
slave-priority 90 //当master挂掉的时候sentinel会选择slave-priority较小的值作为新的master
appendonly yes
appendfsync everysec
3.从节点redis3的redis.conf配置
bind 本机ip //默认是127.0.0.1, 我在本文档中就用127.0.0.1
Protected-mode no
port 7002
daemonize yes //redis可以带配置文件后台运行
pidfile "/var/run/redis_7002.pid"
dir “/home/bmsoft/redis3/data” //对应所在文件夹
slaveof 127.0.0.1 7000 //地址为主机的ip +端口
slave-read-only yes //由于是从机设置为只读
slave-priority 80 //当master挂掉的时候sentinel会选择slave-priority较小的值作为新的master
appendonly yes
appendfsync everysec
注:刚开始redis1一直bind的是127.0.0.1,可是发现springboot一直连接不上,显示connect refused,后来换成0.0.0.0,redis2和redis3的slaveof的主机IP也换成了0.0.0.0,查之后(./redis-cli -p 端口号 info Replication)发现主机下面一个从机也没有了。后来发现,如果redis1改成0.0.0.0,redis2和redis3的slaveof后面的主机值还是127.0.0.1的话就可以了。
三、配置setinel.conf
1.在配置setinel.conf之前,我们来了解下redis的Setinel系统:
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
3.配置setinel.conf
在每个redis的目录下,与redis.conf并列的各有一个sentinel.conf文件,这就是哨兵的配置。每个redis都有一个哨兵,其配置基本相同。分别罗列如下:
1.1 redis1下的sentinel.conf
protected-mode no
port 27000
dir "/home/bmsoft/redis1/temp"
Daemonize yes
sentinel monitor redis1 服务器ip 7000 2
sentinel down-after-milliseconds redis1 10000
sentinel failover-timeout redis1 60000
1.2 redis2下的sentinel.conf
protected-mode no
port 27001
dir "/home/bmsoft/redis2/temp"
Daemonize yes
sentinel monitor redis1 服务器ip 7000 2
sentinel down-after-milliseconds redis1 10000
sentinel failover-timeout redis1 60000
1.3 redis3下的sentinel.conf
protected-mode no
port 27002
Daemonize yes
dir "/home/bmsoft/redis3/temp"
sentinel monitor redis1 服务器ip 7002 2
sentinel down-after-milliseconds redis1 10000
sentinel failover-timeout redis1 60000
四、启动redis和sentinel
1.依次启动redis1、redis2、redis3
cd /bmsoft/redis1/redis-3.2.6/src
./redis-server /home/bmsoft/redis1/redis.conf
cd /bmsoft/redis2/redis-3.2.6/src
./redis-server /home/bmsoft/redis2/redis.conf
cd /bmsoft/redis3/redis-3.2.6/src
./redis-server /home/bmsoft/redis3/redis.conf
2.依次启动每台redis的哨兵
1.cd /bmsoft/redis1/src
2../redis-sentinel /home/bmsoft/redis1/sentinel.conf
3.cd /bmsoft/redis2/src
4../redis-sentinel /home/bmsoft/redis2/sentinel.conf
5.cd /bmsoft/redis3/src
6../redis-sentinel /home/bmsoft/redis3/sentinel.conf
五、查看各个redis的状态
查看redis1、redis2、redis3的redis状态命令如下
1.cd /crmtestXieHao/redis1/src
2../redis-cli -h 127.0.0.1 -p 7000 info Replication
3../redis-cli -h 127.0.0.1 -p 7001 info Replication
4../redis-cli -h 127.0.0.1 -p 7002 info Replication
由于主redis1是可读可写的,从redis2和redis3是只读的,所以可以先上redis1的客户端插入数据
cd /bmsoft/redis1/src
./redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> set name bmsoft
ok
127.0.0.1:7000> get name
"bmsoft"
从redis测试
./redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> set ll test
(error) READONLY You can't write against a read only slave.
127.0.0.1:7000> get name
"bmsoft"
六、failover失效测试
1.将master主redis关闭模拟宕机
可以看到日志
23833:X 05 May 07:55:47.967 # +switch-master redis1 127.0.0.1 7000 127.0.0.1 7002
哨兵将挂机的7000主redis切换成7001的redis节点。哨兵模式下,系统会根据我们配置在redis.conf中的slave-priority,选出slave-priority值最小的推举成新的master主节点。如果之前的主节点再次启动,将会以从节点的形式挂到主节点下,就不逐一测试了,这样之前的主节点重启之后成为了从节点。
1.1停止master
[bmsoft@bmsoft src]$ ./redis-cli -p 7000
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> shutdown·
not connected>
1.2由于之前在redis.conf文件中,7002端口的slave-priority设置的较小,所以哨兵模式根据小的值将其设置为master,查看7002端口的状态
[bmsoft@bmsoft src]$ ./redis-cli -p 7002 info Replication
Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7001,state=online,offset=18097,lag=1
master_repl_offset:18097
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:18096
可以看到7002的role已经变成了master
1.3这时再启动之前关闭的7000端口,原主节点
[bmsoft@bmsoft src]$ ./redis-server /home/bmsoft/redis0/redis.conf
[bmsoft@bmsoft src]$ ./redis-cli -p 7000 info Replication
Replication
role:slave
master_host:127.0.0.1
master_port:7002
可以看到原主节点7000的role已经变成了slave从机了
经过以上步骤,redis一主多从便完成了!!
七.Springboot连接redis集群
application.properties文件配置redis和哨兵服务
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
#sentinel
#哨兵监听redis server名称
spring.redis.sentinel.master=redis1
#哨兵的配置列表
spring.redis.sentinel.nodes=122.112.210.226:27000,122.112.210.226:27001,122.112.210.226:27002
#sentinel
坑:报错信息Can connect to sentinel, but redis1 seems to be not monitored…
由于不小心将spring.redis.sentinel.master=redis1,redis1后不小心加了空格,导致这个错误产生,去掉空格后,运行成功。