官方文档:https://redis.io/topics/cluster-tutorial
同时还参考了这位作者的步骤:https://www.jianshu.com/p/813a79ddf932,但他是所有节点都放置在了同一台机器,所以不存在防火墙拦截端口问题。
我搞了两台机器,ip分别为10.10.0.34和10.10.0.35,在35上部署了四个节点,在34上部署了两个节点,当然你最好是每台上面各三个节点。
1 在34和35都建立目录/usr/local/redis-cluster,目录位置看个人喜好,在35的redis-cluster下建立7001-7004四个目录,在34的redis-cluster下建立7005和7006两个目录。
2 源码安装redis,我安装的版本是6.0.8
make
make install PREFIX=/usr/local/redis-cluster
这一步如果你事先已经安装redis可以省略。
3 34和35上的防火墙添加端口例外,
3.1 添加redis面向客户端的端口例外
我在35上的4个实例面向客户端的监听端口是7001、7002、7003和7004,34上是7005和7006。
我的系统是centos 7,通过firewalld进行配置。
安装firewalld:
yum install firewalld firewall-config
firewalld相关操作:
systemctl enable firewalld
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
按照下列命令添加7001-7006的端口例外:
firewall-cmd --add-port=7001/tcp --permanent
3.2 添加redis集群内部端口的例外,此端口默认为面向客户端的端口+10000,所以要添加17001-17006的端口例外。
firewall-cmd --add-port=17001/tcp --permanent
4 拷贝redis源码src目录下的redis.conf到redis-cluster目录下的7001-7006目录里,然后分别编辑以下选项:
daemonize yes #后台启动
port 7001 #面向客户端的端口,从7001到7006
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file nodes.conf #自动生成,nodes.conf分别在各个子目录生成,名字随意
cluster-node-timeout 15000
appendonly yes #增强的持久化方式
同时注释掉bind 127.0.0.1
5 在35的redis-cluster目录下创建脚本 start-all.sh,然后chmod 777 start-all.sh,34同理,内容如下:
cd 7001
../bin/redis-server ./redis.conf
cd ..
cd 7002
../bin/redis-server ./redis.conf
cd ..
cd 7003
../bin/redis-server ./redis.conf
cd ..
cd 7004
../bin/redis-server ./redis.conf
cd ..
6 确认系统安装了ruby,并且保证ruby版本大于2.3(具体值我忘了,本来我yum install ruby 安装的是2.0.x,然后gem install redis提示我ruby 版本太低)
最好通过rvm安装ruby,参考我另一篇文章:https://blog.csdn.net/wutaozhao/article/details/109227172
7 安装好ruby后,gem install redis
8 在34和35分别执行./start-all.sh
9 ps -aux | grep redis,确保各个节点都正常启动
10 通过redis-cli创建集群
./bin/redis-cli --cluster create 10.10.0.35:7001 10.10.0.35:7002 10.10.0.35:7003 10.10.0.35:7004 10.10.0.34:7005 10.10.0.34:7006 --cluster-replicas 1
11 碰到以下提示,输入yes即可
如果你看到以下提示:All 16384 slots covered,说明集群创建成功。
注意:如果你一直卡在waiting for the cluster to join,很有可能是步骤3.2没有执行。
12 验证
引用官方的例子,如下:
$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"