Ubuntu Server 20.04搭建Redis集群
1.准备
安装编译环境gcc、pkg-config等
$ sudo apt install gcc automake autoconf libtool make pkg-config
之前安装 kvm 准备三台虚拟机:192.168.2.31,192.168.2.32,192.168.33
解压缩Redis
$ tar -zxvf redis-6.2.4.tar.gz
部署示意图如下:

2.安装和配置
Redis要求至少需要三个 master 节点,而每个 master 节点至少有一个 slaver 节点,也就是一个最小集群有 6 个 节点。所以每台虚拟机装2个节点,这里配置好一个,然后复制到另外的虚拟机。
2.1安装和配置Redis
进入redis目录并编译
$ cd redis-6.2.4
$ sudo mkdir /usr/local/redis-node1
$ make
$ sudo make install PREFIX=/usr/local/redis-node1
复制源码包的到,修改内容:
bind 192.168.2.31 # 绑定本机IP,多个IP由空格隔开
daemonize yes # 后台启动
port 7001 # 分别是7001,7002,7003,7004,7005,7006
cluster-enabled yes # 开启cluster
cluster-config-file nodes.conf # 节点配置文件,开启集群后会自动生成
cluster-node-timeout 15000 # 超时时间
appendonly yes # 开启aof
然后同样的方式设置好两台虚拟机,或者写个脚本运行安装。或者把刚才安装好的文件夹直接复制过去。
2.2 安装redis-trib工具(可选)
是官方提供的的管理工具,5.0以后版本不安装这个,新版的redis-cli来创建。
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.
All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.
Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]
Example:
redis-cli --cluster create --replicas 1 192.168.2.31:6379 192.168.2.32:6379 192.168.2.33:6379
To get help about all subcommands, type:
redis-cli --cluster help
默认位于源码包的src目录下,但因该工具是用ruby开发的,所以需要准备相关的依赖环境。复制redis解压文件src下的文件到目录。
$ sudo cp redis-trib.rb /usr/local/redis-cluster
安装Ruby环境
$ sudo apt install ruby
$ sudo apt install rubygems
如果上面命令出现提示 ,说明已经安装过,那么不用安装了。如果出现下面提示则需要手动安装。
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package rubygems
官网下载地址: https://rubygems.org/pages/download
$ wget -c https://rubygems.org/gems/rubygems-update-3.2.24.gem
$ sudo gem install -l rubygems-update-3.2.24.gem
Successfully installed rubygems-update-3.2.24
Parsing documentation for rubygems-update-3.2.24
Installing ri documentation for rubygems-update-3.2.24
Done installing documentation for rubygems-update after 184 seconds
1 gem installed
镜像配置参考:https://gems.ruby-china.com/
3.启动
3.1启动Redis
切换到运行目录并启动。
$ cd /usr/local/redis-node1/bin
$ ./redis-server ../redis.conf
查看运行状态。
$ ps -ef | grep redis
ubuntu 60641 1 0 15:26 ? 00:00:01 /usr/local/redis-node1/bin/redis-server 192.168.2.31:7001 [cluster]
ubuntu 60753 60728 0 15:36 pts/1 00:00:00 grep --color=auto redis
3.2启动Redis集群
使用redis-trib.rb创建集群(redis 5.0 之前)。
$ ./redis-trib.rb create --replicas 1 192.168.2.31:7001 192.168.2.31:7002 192.168.2.32:7003 192.168.2.32:7004 192.168.2.33:7005 192.168.2.31:7006
使用redis-cli创建(redis 5.0 之后)。
$ ./redis-cli --cluster create 192.168.2.31:7001 192.168.2.31:7002 192.168.2.32:7003 192.168.2.32:7004 192.168.2.33:7005 192.168.2.31:7006
下面写个脚本来执行,记得设置执行权限。
192.168.2.32和33机子脚本如下,注意修改路径地址:
#!/bin/bash
echo "开始启动redis..."
echo "start node3"
cd /usr/local/redis-node3/bin/
./redis-server ../redis.conf
echo "start node4"
cd /usr/local/redis-node4/bin/
./redis-server ../redis.conf
ps aux|grep redis
192.168.2.31脚本如下:
#!/bin/bash
echo "开始启动redis..."
echo "start node1"
cd /usr/local/redis-node1/bin/
./redis-server ../redis.conf
echo "start node2"
cd /usr/local/redis-node2/bin/
./redis-server ../redis.conf
echo "启动redis集群..."
/usr/local/redis-node1/bin/redis-cli --cluster create 192.168.2.31:7001 192.168.2.31:7002 192.168.2.32:7003 192.168.2.32:7004 192.168.2.33:7005 192.168.2.33:7006 --cluster-replicas 1
将以上脚本保存为
$ sudo chmod 777 start.sh
$ sudo ./start.sh
先启动32和33的redis,再启动31脚本,完成后通过命令查看
$ ps aux| grep redis
root 61242 0.2 0.0 57908 5872 ? Ssl 15:55 0:00 ./redis-server 192.168.2.31:7001 [cluster]
root 61248 0.2 0.0 57908 5716 ? Ssl 15:55 0:00 ./redis-server 192.168.2.31:7002 [cluster]
ubuntu 61293 0.0 0.0 6432 736 pts/2 S+ 15:55 0:00 grep --color=auto redis
启动成功消息:
开始启动redis...
start node1
start node2
启动redis集群...
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.2.32:7004 to 192.168.2.31:7001
Adding replica 192.168.2.33:7006 to 192.168.2.32:7003
Adding replica 192.168.2.31:7002 to 192.168.2.33:7005
M: 85f13db76f2c3b18cb03add1891ba4674a0c3cee 192.168.2.31:7001
slots:[0-5460] (5461 slots) master
S: 81b63565b539e14f04229bb0e47aef48b9a87c3b 192.168.2.31:7002
replicates 8a7d413afcd89d7530d266e3e2b388ce8fdc7ed2
M: e7b1ffb5b177e84671cacfb93a34bfeae07ff419 192.168.2.32:7003
slots:[5461-10922] (5462 slots) master
S: 24d847500109adcb4b3c724899cd18a39bac6768 192.168.2.32:7004
replicates 85f13db76f2c3b18cb03add1891ba4674a0c3cee
M: 8a7d413afcd89d7530d266e3e2b388ce8fdc7ed2 192.168.2.33:7005
slots:[10923-16383] (5461 slots) master
S: 9d7150bf1e0273c7718cc7258c51c205bd7ca195 192.168.2.33:7006
replicates e7b1ffb5b177e84671cacfb93a34bfeae07ff419
Can I set the above configuration? (type 'yes' to accept): 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 192.168.2.31:7001)
M: 85f13db76f2c3b18cb03add1891ba4674a0c3cee 192.168.2.31:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 9d7150bf1e0273c7718cc7258c51c205bd7ca195 192.168.2.33:7006
slots: (0 slots) slave
replicates e7b1ffb5b177e84671cacfb93a34bfeae07ff419
S: 81b63565b539e14f04229bb0e47aef48b9a87c3b 192.168.2.31:7002
slots: (0 slots) slave
replicates 8a7d413afcd89d7530d266e3e2b388ce8fdc7ed2
M: e7b1ffb5b177e84671cacfb93a34bfeae07ff419 192.168.2.32:7003
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 8a7d413afcd89d7530d266e3e2b388ce8fdc7ed2 192.168.2.33:7005
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 24d847500109adcb4b3c724899cd18a39bac6768 192.168.2.32:7004
slots: (0 slots) slave
replicates 85f13db76f2c3b18cb03add1891ba4674a0c3cee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4.问题
启动过程中可能出现如下错误:
192.168.2.31 Node is not empty. Either the node already knows other nodes (check with CLUSTER
解决方法,依次删除三台虚拟机中的以下文件,然后重新启动32,33,再启动31。
rm appendonly.aof
rm dump.rdb #
rm nodes-7002.conf # 你的节点配置文件