• Redis的几种高可用集群方案


    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()
    }
    

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

  • 相关阅读:
    WebPlayer9电影整站系统第三方电影批量添加工具
    Delphi执行SQL提示“不正常地定义参数对象”,“提供了不一致或不完整的信息”错误
    IIS控制大全
    Redis慢查询日志
    Redis短结构
    分布式AKF拆分原则
    Redis分片
    Redis的bitmap从基础到业务
    什么是CAP?
    Redis面试题
  • 原文地址:https://www.cnblogs.com/smartrui/p/12406178.html
Copyright © 2020-2023  润新知