[toc]


系统为 Redhat 7.4

数据库为 Redis 4.0.14


上节说了安装redis 5版本的集群

由于redis 3 和4的集群部署和5不一样,所以单独一篇文章

文章采用4的版本,理论上3也同样适用

如果安装3版本的集群,ruby的redis模块可能需要安装redis-3.0.7.gem

### 1. redis集群规划




| 节点编号| IP地址|端口| 节点类型|配置文件|
| --------- | --------- |--------- |--------- |--------- |--------- |
|1| 172.18.95.83 |6379|主|/home/redis/cluster/6379/redis_6379.conf|
|2| 172.18.95.84 |6379| 主|/home/redis/cluster/6379/redis_6379.conf|
|3| 172.18.95.85 |6379| 主|/home/redis/cluster/6379/redis_6379.conf|
|4| 172.18.95.83 |6380|从|/home/redis/cluster/6380/redis_6380.conf|
|5| 172.18.95.84 |6380| 从|/home/redis/cluster/6380/redis_6380.conf|
|6| 172.18.95.85 |6380| 从|/home/redis/cluster/6380/redis_6380.conf|
|7| 172.18.95.83 |6381|从|/home/redis/cluster/6381/redis_6381.conf|
|8| 172.18.95.84 |6381| 从|/home/redis/cluster/6381/redis_6381.conf|
|9| 172.18.95.85 |6381| 从|/home/redis/cluster/6381/redis_6381.conf|




### 2 安装redis软件

我们首先需要在三台服务器上安装redis以及ruby相关的包

所有安装包也可使用下面链接下载

链接:https://pan.baidu.com/s/1hoDE8WyVyjkc5uXn4uuqtQ 
提取码:jce0



#### 2.1 系统参数调整


在下载安装前需要对系统参数进行调优

[http://www.zhaibibei.cn/redis/config/](http://www.zhaibibei.cn/redis/config/)

#### 2.2 Redis 4.0.14 下载


当前最新的版本为 6.0.5

这次我们使用4.0.14

[http://download.redis.io/releases/redis-4.0.14.tar.gz](http://download.redis.io/releases/redis-4.0.14.tar.gz)




#### 2.3 安装redis

```
yum -y install gcc
cd /tmp
tar zxvf redis-4.0.14.tar.gz -C /usr/local/
cd /usr/local
mv redis-4.0.14/   redis
cd redis/
make
make install
```

#### 2.4 新建redis用户

```
useradd redis
echo "redis" |passwd redis --stdin
```
然后配置环境变量

```
vim /home/redis/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/redis/src
export PATH
```

#### 2.5.新建目录

**三台机器**

```
su - redis
mkdir -p /home/redis/cluster/6379
mkdir -p /home/redis/cluster/6380
mkdir -p /home/redis/cluster/6381
```


### 3. 安装ruby包

这里可以只安装在一台服务器上,但是推荐都安装

防止服务器宕机后其他服务器需要再安装


#### 3.1 下载ruby包

这里还需要下载ruby相关的安装包

**ruby安装包**

```
https://www.ruby-lang.org/en/downloads/

https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz
```

**redis-gem包**
```
https://rubygems.org/gems/redis/versions

https://rubygems.org/gems/redis/versions/4.2.1
```



#### 3.2 编译安装ruby

```
mkdir -p /usr/share/ruby
cd /tmp
tar zxvf  ruby-2.7.1.tar.gz 
cd ruby-2.7.1/
./configure --prefix=/usr/share/ruby
make
make install 
cd ext/zlib/
/usr/share/ruby/bin/ruby ./extconf.rb
make
make install
```

验证是否安装成功

```
/usr/share/ruby/bin/ruby --version
```

#### 3.3 安装redis的gem包

```
/usr/share/ruby/bin/gem install -l /tmp/redis-4.2.1.gem

```


#### 3.4 修改redis的ruby脚本

redis安装后在src下面有redis-trib.rb脚本,需要修改首行的内容

将#!/usr/bin/env ruby 修改为 #!/usr/share/ruby/bin/ruby

```
cp /usr/local/redis/src/redis-trib.rb /usr/local/redis/src/redis-trib.rb.bak

vim /usr/local/redis/src/redis-trib.rb
```

若redis配置了密码还需要修改一个文件

```
 vi /usr/share/ruby/lib/ruby/gems/2.7.0/gems/redis-4.2.1/lib/redis/client.rb
```

将password设为"123456"


[image:944 size:orig]





### 4.集群配置文件

接下来我们分别在/home/redis/cluster目录下建立哨兵配置文件(共9个)


这里以节点1为例,其他节点参考

其实只是比单机的配置文件多了一些集群相关的配置


**节点1**

```
$ cat /home/redis/cluster/6379/redis_6379.conf


daemonize yes
bind 172.18.95.83 
port 6379
tcp-backlog 1024
timeout 300
tcp-keepalive 300
databases 16
requirepass 123456
masterauth 123456

cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-6379.conf



pidfile "/home/redis/cluster/6379/redis_6379.pid"

loglevel notice
logfile "/home/redis/cluster/6379/redis_6379.log"

dir "/home/redis/cluster/6379"

dbfilename "dump.rdb"
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
aof-load-truncated yes
no-appendfsync-on-rewrite no
aof-rewrite-incremental-fsync yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 32mb

maxclients 65503
maxmemory 1gb
maxmemory-policy allkeys-lru

# replication
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
repl-backlog-size 32mb

# slow log
slowlog-log-slower-than 10000
slowlog-max-len 1024

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 512mb 512mb 60
client-output-buffer-limit pubsub 64mb 16mb 60

protected-mode yes

# security
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""

```


上面参数我们需要根据实际情况修改一些参数
- bind 172.18.95.84 127.0.0.1 监听地址,第一个使用本机IP地址
- port 6379 监听端口
- maxmemory redis允许使用的最大内存,根据服务器配置和业务需求决定
- requirepass 123456 redis密码,可以注释掉表示不设置
- masterauth 123456 连接master时用的密码,如master未设置可注释掉
- 还需要根据实际修改配置文件和日志文件的路径和名称

### 5.启动redis

接下来我们启动所有9个redis节点


**启动redis**

```
su - redis
172.18.95.83 
/usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf
/usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf
/usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf
172.18.95.84 
/usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf
/usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf
/usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf
172.18.95.85
/usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf /usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf
/usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf
```

这时我们查看集群状态发现是fail的,而且没有其他节点的信息

[image:945 size:orig]

集群文件也只有一个节点的信息

```
[redis@SYTEST1 6379]$ more nodes-6379.conf 
9a74ab968c706a36d7a44427a45e4c151a8bfa63 :0@0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
```

同时集群也是不能写入的

```
172.18.95.83:6379> set hello world
(error) CLUSTERDOWN Hash slot not served
172.18.95.83:6379> 
```

### 6. 搭建集群

接下来我们来搭建集群

除了手动搭建,我们这里使用命令来自动化安装

到了5的版本,该功能已经集成到redis-cli命令中

但是redis 3和4的版本需要使用ruby脚本来完成自动化安装,

我们输入如下命令完成搭建

这里我们将6379的端口写在最前面

**安装有ruby的一个节点**

```

/usr/local/redis/src/redis-trib.rb create --replicas 2 172.18.95.83:6379 172.18.95.84:6379 172.18.95.85:6379 172.18.95.83:6380 172.18.95.84:6380 172.18.95.85:6380 172.18.95.83:6381 172.18.95.84:6381 172.18.95.85:6381
```

[image:946 size:orig]



这里填入yes

可以看到该命令已经将从节点分配在不同节点上了,并且6379端口为主节点

最后完成了搭建并打印结果

[image:947 size:orig]


对于集群我们只要保证主节点不在同一服务器并且主从节点不在同一个服务器就可以了,如果需要固定的主从关系,请使用后面的命令来改变关系


### 7.连接redis集群

我们使用如下命令来连接集群,可选择任一节点

```
[redis@SYTEST1 6379]$ redis-cli -h 172.18.95.83 -p 6379 -a 123456 -c
```

这里必须加入-c参数,否则如果操作的key的slot值不在该节点会导致命令执行失败

### 8.查询集群信息

**查询节点信息**
```
cluster nodes
```

[image:948 size:orig]


**查询slot信息**

该命令可以更直观的查看集群的架构

```
cluster slots
```
[image:949 size:orig]


**查询集群状态**

```
cluster info
```

[image:950 size:orig]


**手动failover**

有时集群宕机重启后可能会导致主备节点在同一台机器上,这时需要手动指定一个从节点成为主节点


```
从节点#172.18.95.83:6380> cluster failover
```

**重新指定主库**

我们同样可以手动指定从节点同步哪个主节点

后面跟的是主节点的node id

```
从节点># 172.18.95.85:6380> cluster replicate 2fb4d5cf998a562e1391c082eb34a1476c8f620f
```