之前在OEL上装过一次redis集群,具体操作步骤没记,今天在自己的虚拟机CenterOS装一套开发环境,遇到点坑,干脆回忆了一下,把具体过程记录下来备忘,也给大家同步一下。
一、安装Redis
到redis官网https://redis.io/download下载redis的release包,上传到linux,我这里是以前下载好的redis-3.0.6.tar.gz。
解压
tar -xvf redis-3.0.6.tar.gz
二、创建cluster目录
我这里准备搭建3主3从的redis cluster集群,于是,我在redis同级创建了目录redis-cluster目录
mkdir redis-cluster
对应6个实例,分别创建一个工作目录
mkdir 7000 7001 7002 7003 7004 7005
在每个实例工作目录中创建redis.conf文件,最小配置信息如下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
其中port根据每个节点需要对应修改
三、启动实例
分别进入刚才创建的实例主目录,启动6个实例
cd ~/redis-cluster/7000
../../redis-3.0.6/src/redis-server redis.conf &
四、安装ruby和gem
我这里下意识的直接使用yum安装了ruby和gem
yum install ruby
yum install rubygems
安装非常顺利,然而,当我执行
gem install redis
出现了问题
原来Centos默认支持ruby到2.0.0,但是gem要求ruby要大于2.2.2
于是,尝试了网上的方法,通过安装RVM更新ruby版本
curl -L get.rvm.io | bash -s stable
直接报错,说是SSL证书有问题,有人写了解决办法就是安装openssl,然后生成私钥,但是我觉得太麻烦了,参考https://blog.csdn.net/dawn_chen121/article/details/51084447
后来我找到一个比较简单可行的脚本,更改命令为
curl -sSL https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash
脚本来源不清楚了,但是确实装好了RVM
接着,应用RVM
source /usr/local/rvm/scripts/rvm
查看rvm库中已知的ruby版本
rvm list known
安装一个ruby版本
rvm install 2.6
使用一个ruby版本
rvm use 2.6
卸载一个已知版本
rvm remove 2.0.0
查看版本
ruby --version
再安装redis
gem install redis
然而,虽然没有出问题,但是最后一个命令跑了5分钟了才下载了500K,全部跑完居然要3个小时,果断直接ctrl+c取消了
然后网上下载了一个ruby2.5.1的安装包
然后解压编译
tar -xvf ruby-2.5.1.tar.gz
./configure
make && make instal
OK,1分钟就安装好了。
再次执行gem install redis,安装成功。
五、启动集群
cd redis-3.0.6/src/
./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
出现信息
./redis-trib.rb:1573: warning: key "threshold" is duplicated and overwritten on line 1573
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 3702ba353af705e021f1ac2463dd1f6395b3f581 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: e7aa916df30bd9ff09e8b68732fab86b07037b45 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: f93b9a715d091a55a09601ec19f8485f940f40c5 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: cf0a61e9cb71efa017de3db8ca2ca0c94623dec5 127.0.0.1:7003
replicates 3702ba353af705e021f1ac2463dd1f6395b3f581
S: d7a34a190ab3814cfc25833641b99ee7cae33693 127.0.0.1:7004
replicates e7aa916df30bd9ff09e8b68732fab86b07037b45
S: 704de83f29c2f56ee305d93f63adea24d5a479c0 127.0.0.1:7005
replicates f93b9a715d091a55a09601ec19f8485f940f40c5
Can I set the above configuration? (type 'yes' to accept): yes
脚本自动分配了主从方案,问我同意不,我其实是想看看如果不同意会怎么样,但是懒得折腾了,直接yes
然后,配置成功
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 3702ba353af705e021f1ac2463dd1f6395b3f581 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: e7aa916df30bd9ff09e8b68732fab86b07037b45 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: f93b9a715d091a55a09601ec19f8485f940f40c5 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
M: cf0a61e9cb71efa017de3db8ca2ca0c94623dec5 127.0.0.1:7003
slots: (0 slots) master
replicates 3702ba353af705e021f1ac2463dd1f6395b3f581
M: d7a34a190ab3814cfc25833641b99ee7cae33693 127.0.0.1:7004
slots: (0 slots) master
replicates e7aa916df30bd9ff09e8b68732fab86b07037b45
M: 704de83f29c2f56ee305d93f63adea24d5a479c0 127.0.0.1:7005
slots: (0 slots) master
replicates f93b9a715d091a55a09601ec19f8485f940f40c5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
16384是分片的数量,7000节点储存0-5460的数据,从库为7003,7001存储5461-10922,从库为7004,7002存储10923-16383,从库为7005,所有节点接受配置。至此,集群搭建完毕,随便连接哪一个节点端口都可以访问整个集群。