系统为 Redhat 7.4

数据库为 Redis 5.0.8

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软件

首先我们根据以前的内容安装3套redis

其中配置文件的目录参考上面的规划

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

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

3.新建目录

三台机器

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

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
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage no


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.png

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

[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. 搭建集群

接下来我们来搭建集群

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

redis 3和4的版本需要使用ruby脚本来完成自动化安装,到了5的版本,该功能已经集成到redis-cli命令中

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

​因为我们这里设置的6379端口是主节点所以我们将6379的端口写在最前面

其中一个节点

redis-cli -a "123456"  --cluster create  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 --cluster-replicas 2
Image_2.png

--cluster-replicas 2 表示一主两从

这里填入yes

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

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

Image_3.png

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

7.连接redis集群

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

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

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

8.查询集群信息

查询节点信息

cluster nodes
Image_4.png

查询slot信息

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

cluster slots
Image_5.png

查询集群状态

cluster info
Image_6.png

手动failover

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

从节点#172.18.95.83:6380> cluster failover

重新指定主库

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

后面跟的是主节点的node id

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