redis5 cluster 部署

时间:2022-07-22
本文章向大家介绍redis5 cluster 部署,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

环境参考

  • centos7+
  • 三台机器
  • 每台机器均启动两个实例
  • redis版本均为redis-5.0.4

192.168.152.129 ----- 7000 192.168.152.129 ----- 7001 192.168.152.130 ----- 7004 192.168.152.130 ----- 7005 192.168.152.131 ----- 7002 192.168.152.132 ----- 7003

部署

  1. 下载源码包
  2. 在每台机器上分别解压,并编译
  3. 修改配置文件
  4. 启动

下载源码包

wget http://download.redis.io/releases/redis-5.0.4.tar.gz

解压

tar zxvf redis-5.0.4.tar.gz

安装

cd redis-5.0.4
make PREFIX=/usr/local/redis install

修改配置文件

以端口为7000的实例为例
mkdir /usr/local/redis/config/{7000,7001} -p
cp redis-5.0.4/redis.conf /usr/local/redis/config/70001

cat >> /usr/local/redis/config/7000/redis.conf << EOF 
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
EOF

sed -i 's/6379/7000/g' /usr/local/redis/config/7000/redis.conf
sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/config/7000/redis.conf
sed -i 's@logfile ""@logfile "/var/log/redis/redis-7000.log"@g' /usr/local/redis/config/7000/redis.conf

启动

在六个实例准备好之后,便重启每一个redis实例,这里我们最好使用systemd来管理redis服务

# cat redis@.service 
[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
PIDFile=/var/run/redis_%i.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/config/%i/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

systemctl daemon-reload

需要注意的是启动的时候需要注意:systemctl start redis@7003

# systemctl status redis@7003
● redis@7003.service - Redis-7003
   Loaded: loaded (/etc/systemd/system/redis@.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-04-05 10:45:27 CST; 7s ago
  Process: 20434 ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/config/%i/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 20435 (redis-server)
   CGroup: /system.slice/system-redis.slice/redis@7003.service
           └─20435 /usr/local/redis/bin/redis-server 192.168.152.131:7003 [cluster]

Apr 05 10:45:27 master systemd[1]: Starting Redis-7003...
Apr 05 10:45:27 master systemd[1]: PID 20048 read from file /var/run/redis_7003.pid does not exist or is a zombie.
Apr 05 10:45:27 master systemd[1]: Started Redis-7003.

创建集群

随意找一台机器执行此命令

/usr/local/redis/bin/redis-cli --cluster create 192.168.152.129:7000 192.168.152.129:7001 192.168.152.131:7002 192.168.152.131:7003 192.168.152.130:7004 192.168.152.130:7005 --cluster-replicas 1

执行后的输出如下:(输入yes)

最后输出:[OK] All 16384 slots covered

验证

随便连接一个节点
redis-cli -h 192.168.152.129 -p 7000 
> set name afei

切到其他节点查看
redis-cli -h 192.168.152.129 -p 7001
> get name

查看主节点

# ./redis-cli -h 192.168.152.131 -p 7002 cluster nodes | grep master
31e0e0d8420fd2c47f23c584fcfcc7666942b41a 192.168.152.129:7000@17000 master - 0 1554428553356 1 connected 0-5460
d4e934df845735259d5d47204452df3d9089ee0c 192.168.152.130:7004@17004 master - 0 1554428552549 5 connected 10923-16383
35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 192.168.152.131:7002@17002 myself,master - 0 1554428551000 3 connected 5461-10922

增加与删除节点

增加节点
# /usr/local/redis/bin/redis-cli --cluster add-node 192.168.152.131:7003 192.168.152.131:7002
>>> Adding node 192.168.152.131:7003 to cluster 192.168.152.131:7002
>>> Performing Cluster Check (using node 192.168.152.131:7002)
M: 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 192.168.152.131:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 31e0e0d8420fd2c47f23c584fcfcc7666942b41a 192.168.152.129:7000
   slots:[0-5460] (5461 slots) master
M: d4e934df845735259d5d47204452df3d9089ee0c 192.168.152.130:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e1686d5ce576e9446211fb9ae82999f4e98a8ad5 192.168.152.129:7001
   slots: (0 slots) slave
   replicates d4e934df845735259d5d47204452df3d9089ee0c
S: 4b78d60924bfa51d975d7129fe71a15c1690e8a4 192.168.152.130:7005
   slots: (0 slots) slave
   replicates 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.152.131:7003 to make it join the cluster.
[OK] New node added correctly.


删除节点
# /usr/local/redis/bin/redis-cli --cluster del-node 192.168.152.131:7003 6185115d72a1f978f78334077aecb33ec52ef313
>>> Removing node 6185115d72a1f978f78334077aecb33ec52ef313 from cluster 192.168.152.131:7003
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

如果增加指定的节点为slave的话在后面加–cluster-slave

问题记录

1、错误信息:slave,fail,noaddr disconnected

# /usr/local/redis/bin/redis-cli -h 192.168.152.131 -p 7002 cluster nodes 
f37660309eedf303be2e1764f8721425ad2344fa :0@0 slave,fail,noaddr 31e0e0d8420fd2c47f23c584fcfcc7666942b41a 1554431564423 1554431562000 4 disconnected
31e0e0d8420fd2c47f23c584fcfcc7666942b41a 192.168.152.129:7000@17000 master - 0 1554433711000 1 connected 0-5460
d4e934df845735259d5d47204452df3d9089ee0c 192.168.152.130:7004@17004 master - 0 1554433711000 5 connected 10923-16383
e1686d5ce576e9446211fb9ae82999f4e98a8ad5 192.168.152.129:7001@17001 slave d4e934df845735259d5d47204452df3d9089ee0c 0 1554433711531 5 connected
4b78d60924bfa51d975d7129fe71a15c1690e8a4 192.168.152.130:7005@17005 slave 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 0 1554433711733 6 connected
35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 192.168.152.131:7002@17002 myself,master - 0 1554433709000 3 connected 5461-10922

解决办法:

/usr/local/redis/bin/redis-cli -h 192.168.152.131 -p 7002 cluster forget f37660309eedf303be2e1764f8721425ad2344fa

重新增加即可。

2、错误信息:Wrong number of arguments for specified –cluster sub command

# /usr/local/redis/bin/redis-cli --cluster add-node 192.168.152.131:7003 --cluster-slave
[ERR] Wrong number of arguments for specified --cluster sub command

这个错是由于命令输错了,看下帮助信息才知道语法写错了,帮助信息如下:

# ./redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help

add-node后要跟两个地址,一个新的,一个已经存在的。修改后重新执行可以

# /usr/local/redis/bin/redis-cli --cluster add-node 192.168.152.131:7003 192.168.152.131:7002
>>> Adding node 192.168.152.131:7003 to cluster 192.168.152.131:7002
>>> Performing Cluster Check (using node 192.168.152.131:7002)
M: 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 192.168.152.131:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 31e0e0d8420fd2c47f23c584fcfcc7666942b41a 192.168.152.129:7000
   slots:[0-5460] (5461 slots) master
M: d4e934df845735259d5d47204452df3d9089ee0c 192.168.152.130:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e1686d5ce576e9446211fb9ae82999f4e98a8ad5 192.168.152.129:7001
   slots: (0 slots) slave
   replicates d4e934df845735259d5d47204452df3d9089ee0c
S: 4b78d60924bfa51d975d7129fe71a15c1690e8a4 192.168.152.130:7005
   slots: (0 slots) slave
   replicates 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.152.131:7003 to make it join the cluster.
[OK] New node added correctly.

3、问题信息: Node 192.168.152.131:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

# /usr/local/redis/bin/redis-cli --cluster add-node 192.168.152.131:7003 192.168.152.131:7002 --cluster-slave
>>> Adding node 192.168.152.131:7003 to cluster 192.168.152.131:7002
>>> Performing Cluster Check (using node 192.168.152.131:7002)
M: 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d 192.168.152.131:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 31e0e0d8420fd2c47f23c584fcfcc7666942b41a 192.168.152.129:7000
   slots:[0-5460] (5461 slots) master
M: d4e934df845735259d5d47204452df3d9089ee0c 192.168.152.130:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e1686d5ce576e9446211fb9ae82999f4e98a8ad5 192.168.152.129:7001
   slots: (0 slots) slave
   replicates d4e934df845735259d5d47204452df3d9089ee0c
S: 4b78d60924bfa51d975d7129fe71a15c1690e8a4 192.168.152.130:7005
   slots: (0 slots) slave
   replicates 35e3bc663c1d393c13ace6cb9d9b3d54ff18961d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.152.129:7000
[ERR] Node 192.168.152.131:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

网上参考的解决办法:

1 remove the aof/rdb backup file
2 remove the node_conf file
3 flushdb if necessary