Bootstrap

Ubuntu Server 20.04搭建Redis集群

1.准备

安装编译环境gcc、pkg-config等

$ sudo apt install gcc automake autoconf libtool make pkg-config

官网下载Redis:

之前安装 kvm 准备三台虚拟机:192.168.2.31,192.168.2.32,192.168.33

安装 kvm 虚拟机:

解压缩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 # 你的节点配置文件