Redis的几种高可用集群方案
Redis的高可用方式及常用集群方式一般有:
- 主从模式
- 哨兵模式
- 集群模式
当然也有第三方代理模式,如codis等,这种不在这里讨论之列。
我刚好学习到这里,我就简单记录下这几种模式的配置 。老鸟及不感兴趣的,可以就此飘过。
Redis的安装及单实例的启动,这里就不再赘述了,确实比较简单。
一 主从模式
这个模式就是解决单台机器的内存性能问题,可以把主实例和从实例放到不同的机器上面。从机器可以作备份使用,当master主机出现故障后,可以将某一台slave提升为master。一定程度上提高缓存的高性能,如果能接受一定的延迟,也可以做一个主从分离,所有的读都从slave上来,提高性能。
配置很简单,可以在配置文件或命令行中配置,直接加上 slaveof host:ip
redis-6380.conf
Slaveof 127.0.0.1:6379
或
127.0.0.1:6380>127.0.0.1:6379
然后分别启动Redis的主从实例就行了。
主从模式,虽然比单实例的可用性要好一些,但是生产环境基本上是不太会用的。因为他没有故障转移和监测。如果master挂了,还需要手动切到slave上面去。你的应用程序连接地址也得做相应的改动。这确实有点麻烦,所以感觉这个模式有点尴尬。
二 哨兵模式
这个模式呢,和主从模式有点像,他是基于主从模式的。他提供了对master的监控和故障转移,当master节点出现故障后,可以自动通过选举选出一台slave做master,待master故障恢复后,再切回来,这就大大提高了可用性了,且哨兵之间也可以做集群部署,相互监测。防止单个哨兵死掉的情况。
在redid-sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 1
上面的配置加上就行了,6379后面那个1表示需要几个哨兵节点同意后,才启动故障转移。
哨兵模式的启动模式有两种方式:
redis-sentinel sentinel-26379.conf
redis-server sentinel-26379.conf --sentinel
因为哨兵模式也是一种特殊的Redis节点,所以可以使用redis-cli连接
redis-cli -p 26379
127.0.0.1:26379> info sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=127.0.0.1:6379,slaves=1,sentinels=1
要求不高的场合下,其实哨兵模式一般的公司用就足够了。
三 集群模式
许多不同的主从实例组成大的集群,多主多从,一个主从实例死掉后,内部可以转到其它的主从实例上面。至少需要三个主节点才能让集群正常运行起来。
先配置几台机器出来,我本地用的伪集群模式,就是只有一台机器,然后用不同的端口来启动。
建立一个目录,比如叫redis-cluster。然后在这个目录下面建立6381-6386子目录。
在6381中建立配置文件redis.conf,内容如下:
daemonize yes
pidfile redis_6381.pid
logfile redis_6381.log
appendonly yes
bind 127.0.0.1
port 6381
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
其中cluster开头的这些,是集群的一些配置,同理,在其它目录也加上上面的配置,只不过,将6381换成相应的端口就行了。
然后再分别启动6381-6386的单实例
redis-server 6381/redis.conf
redis-server 6382/redis.conf
验证有无启动成功
ps -ef | grep redis
redis-server 127.0.0.1:6381 [cluster]
后面带[cluster]这个就表示行了。
上面只是启动了几台实例,要变成集群模式,还需要最后一步,使用redis-trib,不过我本地用的是redis5.0,已经推荐用redis-cli这种方式了,如果用redis-trib,这个还需要安装ruby环境。我这里就以redis-cli为例了
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386
出现如下的输出,表示集群就创建成功了。
这个命令我简单说下,通过上面那个命令就可以将刚才我们的机器变成集群模式,且配置了主从。主要就是cluster-replicas后面那个1, 这个1表示主从实例的一个比值(主/从),比如上面的就是主从为1:1,那么6381-6383为主,6383为6381的从,其它依次类推。
测试一下,我这里用Go简单的试了下集群的设置和读取,用的是go-redis包。
package main
import (
"fmt"
"github.com/go-redis/redis"
"time"
)
func testClient() {
client := redis.NewClusterClient(&redis.ClusterOptions{
Addrs:[]string{"127.0.0.1:6381","127.0.0.1:6382","127.0.0.1:6383","127.0.0.1:6384","127.0.0.1:6385","127.0.0.1:6386",},
})
statuscmd :=client.Set("name","lc",60 * time.Second)
if statuscmd.Err() != nil {
fmt.Println(statuscmd.Err())
}
stringcmd :=client.Get("name")
fmt.Println(stringcmd.String())
}
func main() {
testClient()
}
到这里,几种模式的配置就完了,其实还是挺简单的,如果要深入了解更高级的,就自已去参照相应的文档了,我也是记录我的学习过程,更高级的也没有研究过。