Redis的几种高可用集群配置

628 阅读4分钟

Redis的高可用方式及常用集群方式一般有:

  1. 主从模式
  2. 哨兵模式
  3. 集群模式

当然也有第三方代理模式,如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()
}

到这里,几种模式的配置就完了,其实还是挺简单的,如果要深入了解更高级的,就自已去参照相应的文档了,我也是记录我的学习过程,更高级的也没有研究过。