redis一主多从高可用集群搭建

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后不小心加了空格,导致这个错误产生,去掉空格后,运行成功。

猜你喜欢

转载自blog.csdn.net/qq_41255610/article/details/79662973