小威哥教你傻瓜式搭建【redis-cluster+predixy】

3,411 阅读5分钟

1:前言

小威哥因为工作的需要,需要自己搭建一套redis集群方案(因为没钱买云服务🤣🤣🤣),看了网上很多的方案,最终选择了redis-cluster+predixy的方案,部署方案什么的网上也没什么很详细的资料,目前项目已经运行了几个月,比较稳定没啥问题,所以在此分享。




2:主流的redis高可用方案

目前主流的redis集群方案有两大类:

  • 第一类是redis官方的redis-cluster,是一种去中心化的分片式集群,使用一致性hash算法进行分片。这种方法部署比较简单,不需要额外的组件,但是需要一个smart client充当proxy代理的作用,比如java的jediscluster或者redisson。
  • 第二类是类似codis,predixy等的代理软件,可以对redis的集群进行代理,这样客户端可以只使用单点的jedis什么的,非常方便。

搜索了很多资料之后,我这里决定使用predixy(可以支持redis-cluster)+redis-cluster的组合去使用,io速度也是非常的快。




3:搭建redis-cluster集群

  • 从redis官方网站下载gz包,解压,,进入目录make,然后进入src目录执行make install

  • 我们这里采用3主3从的最基本配置,编写好每个实例的conf文件,比如第一台叫redis-7001.conf,主要的配置如下:

port 7001  # 配置实例端口
dbfilename 7001-dump.rdb # 配置rdb文件名
cluster-config-file nodes-7001.conf # 配置cluster生成节点数据的文件名,注意如果要重启服务,重新组成cluster集群需要删除所有的这个文件。
pidfile /var/run/redis_7001.pid # 配置pid文件名和存储目录
dir /data/redis-data # 生成的文件存储目录(包括rdb文件和node的conf文件)

daemonize yes # 作为守护线程运行
bind 0.0.0.0 # 不绑定ip
logfile "" 
protected-mode no # 关闭保护模式
requirepass 123456 # 密码 (全部实例设置成同一个)
masterauth 123456 # 从节点访问主节点的密码(和上面的密码一样并且,全部实例设置成同一个)
cluster-node-timeout 12000 # 超时时间
cluster-enabled yes #开启cluster

## 其余配置比如aof什么的视情况自己改就好了
  • 配置完成后直接启动,进入redis的src目录,执行 ./redis-server redis-cluster-conf/redis-7001.conf

  • 同样的方法配置其他5个节点

  • 成功启动后查看进程(ps -ef|grep redis)可以看到 如下信息:

  • 现在6个节点就是等待组成cluster的状态了。

  • 接下来,我们只需要输入一个命令就可以完成cluster的通信组装:

./redis-cli -a sjwkk123456 --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

这个命令执行后会帮你自动分配N主N从以及一致性hash的slot分布,你需要输入yes就好了。so easy!😉😉😉

  • 好了,如果成功完成以上步骤,我们就可以使用redis-cli客户端的命令查看我们的集群状态:
可以指定进群的任意一个节点

./redis-cli -c -h 127.0.0.1 -p 7001 -a 123456

进入cli命令界面之后可以输入cluster info查看集群信息,以及输入 cluster nodes查看节点信息:

自此redis-cluster的搭建大功告成!




4:部署运行predixy

  • 首先我们去 github.com/joyieldInc/… 进行下载以及按照文档进行部署。

  • 完成之后我们进入目录的conf目录,我们主要配置【predixy.conf】和【cluster.conf】以及【auth.conf】这3个文件

  • 首先我们来配置 auth.conf这个文件,这个文件很简单,是配置身份验证的。

## 很简单,其他全部注释掉,配置好我们的密码就可以了。密码直接配置成redis的实例的一样或者不一样都行,就是访问predixy代理的密码。
Authority {
    Auth "123456" {
        Mode admin
    }
}
  • 然后配置cluster.conf文件,这个文件主要配置redis的cluster信息
ClusterServerPool {
    MasterReadPriority 100  #这个是主节点访问权重,如果是只把备节点用作备份不去做读写分离,直接将这个配置成100只去读主节点就好了。
    Password sjwkk123456 # redis实例的访问密码
    StaticSlaveReadPriority 0  # 读写分离功能,从静态redis slave节点执行读请求的优先级,所谓静态节点,是指在本配置文件中显示列出的redis节点,不指定的话为0
    DynamicSlaveReadPriority 0 # 功能见上,所谓动态节点是指在本配置文件中没有列出,但是通过redis sentinel动态发现的节点,不指定的话为0
    RefreshInterval 1 # predixy会周期性的请求redis sentinel以获取最新的集群信息,该参数以秒为单位指定刷新周期,不指定的话为1秒
    ServerTimeout 1 # 请求在predixy中最长的处理/等待时间,如果超过该时间redis还没有响应的话,那么predixy会关闭同redis的连接,并给客户端一个错误响应,对于blpop这种阻塞式命令,该选项不起作用,为0则禁止此功能,即如果redis不返回就一直等待,不指定的话为0
    ServerFailureLimit 10 # 一个redis实例出现多少次才错误以后将其标记为失效,不指定的话为10
    ServerRetryTimeout 1 # 一个redis实例失效后多久后去检查其是否恢复正常,不指定的话为1秒
    KeepAlive 120 #predixy与redis的连接tcp keepalive时间,为0则禁止此功能,不指定的话为0
    Servers {
    ## 配置所有节点地址就好了
        + 127.0.0.1:7001
        + 127.0.0.1:7002
        + 127.0.0.1:7003
        + 127.0.0.1:7004
        + 127.0.0.1:7005
        + 127.0.0.1:7006
    }
}
  • 然后配置predixy.conf文件,这是个总配置文件
# 一些端口什么的随自己配置了,主要配置下执行哪几个子conf文件,禁用掉 sentinel和try就好了,sentunel和cluster只能二选一,try就是测试的。
Include auth.conf
Include cluster.conf
# Include sentinel.conf
# Include try.conf
  • 好了,然后我们启动predixy
nohup src/predixy conf/predixy.conf  >/dev/null 2>&1 &

成功之后,我们使用redis cli就像直接使用redis单点一样进入predixy的端口就好了,尝试下set,get成功了的话就OK了!

5:总结

网上很多资料其实都很不靠谱,小威哥搭建的过程中也踩了很多坑,还是要多学习,多实践。话说redis还真是一个非常实用的中间件,现在大家的开发过程一定也是离不开它了,简直强无敌!😏😏😏