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还真是一个非常实用的中间件,现在大家的开发过程一定也是离不开它了,简直强无敌!😏😏😏