1 Redis Cluster集群介绍1.1 Redis集群的优势1.2 Redis集群的工作原理1.4 Redis集群的主从复制模型2 Redis cluster部署2.1 项目环境2.2 Redis安装(6节点分别执行,以节点1为例)2.3 创建Redis实例2.3.1 创建节点1实例2.3.2 创建节点2实例2.3.3 创建节点3实例2.3.4 创建节点4实例2.3.5 创建节点5实例2.3.6 创建节点6实例2.4 开启Redis集群模式2.5 重启Redis实例2.6 创建集群2.7 查看集群信息或状态2.8 查看集群节点2.9 删除节点2.10 添加新的节点2.11 重新分片2.12 免交互重新分片脚本2.13 自动重新分片2.14 报错解决2.14.1 创建实例报错2.14.2 在创建或者添加节点到集群时报错2.14.3 登陆或者创建集群报错2.14.4 Redis服务停止报错3 Redis Cluster集群相关操作3.1 关闭集群的某个节点3.2 集群的关闭3.3 Redis集群的重新启动3.3.1 保留原来的数据3.3.2 丢弃原来的数据3.4 Redis cluster命令手动管理Redis集群4 Redis Cluster集群性能调优4.1 关闭RDB防止fork进程的内存溢出问题4.2 防止某个节点挂掉,整个cluster挂掉的问题4.3 设置最大内存4.4 日志4.5 防止因为磁盘同步,卡掉住进程的情况出现4.6 内核修改,如果没开防火墙可以不设置这个4.7 这个用来防止内存申请不到发生卡死的情况,很重要4.8 thp redis warning要求关掉4.9 最大连接数要改一下,redis的warning会要求修改4.10 设置内存超出策略
Redis主从,解决了Redis单点问题,但是没有实现Redis状态监控及故障自动切换,于是后来又引入了sentinel(哨兵)解决此问题。但是依然没能解决数据的一个并发读写的问题,那么Redis集群就是来解决此问题的,它是一个提供在多个Redis节点间共享数据的程序集。
Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可以继续处理业务。
自动分割数据到不同的节点上;
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
要让集群正常运作至少需要三个主节点,为了实现主节点的高可用, 强烈建议使用六个节点:其中三个为主节点, 而其余三个则是各个主节点的从节点。
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念。
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
节点 A 包含 0 到 5460号哈希槽.
节点 B 包含5461到10922号哈希槽.
节点 C 包含10923到16383号哈希槽.
这种结构很容易添加或者删除节点,比如如果我想新添加个节点D,我需要从节点 A, B, C中分配部分哈希槽到节点D上。如果我想移除节点A,需要将节点A中的哈希槽移到节点B和节点C上,然后将没有任何哈希槽的节点A从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加、删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品。
在上面具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5461到10922这个范围的哈希槽而不可用。
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为哈希槽找不到而不可用了,不过当B和B1都失败后,集群是不可用的。
# 下载解压
[root@node01 src]# cd /usr/src
[root@node01 src]# wget http://download.Redis.io/edis-stable.tar.gz
[root@node01 src]# tar xf redis-stable.tar.gz
[root@node01 src]# cd redis-stable
# 编译安装Redis
[root@node01 redis-stable]# make PREFIX=/usr/local/redis install
# 到这一步,Redis已经安装好了
# 设置Redis参数:
[root@node01 redis-stable]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[root@node01 redis-stable]# echo "net.core.somaxconn = 512" >> /etc/sysctl.conf
[root@node01 redis-stable]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@node01 redis-stable]# sysctl -p
# 设置radis环境变量:
[root@node01 ~]# cat > /etc/profile.d/redis.sh << EOF
PATH=/usr/local/redis/bin:$PATH
export PATH
EOF
[root@node01 ~]#
[root@node01 ~]# source /etc/profile
[root@node01 ~]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node01 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7000
Please select the redis config file name [/etc/redis/7000.conf] /usr/local/redis/7000.conf
Please select the redis log file name [/var/log/redis_7000.log] /usr/local/redis/7000.log
Please select the data directory for this instance [/var/lib/redis/7000] /usr/local/redis/7000
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7000
Config file : /usr/local/redis/7000.conf
Log file : /usr/local/redis/7000.log
Data dir : /usr/local/redis/7000
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7000.conf => /etc/init.d/redis_7000
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node01 redis-stable]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node01 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7001
Please select the redis config file name [/etc/redis/7001.conf] /usr/local/redis/7001.conf
Please select the redis log file name [/var/log/redis_7001.log] /usr/local/redis/7001.log
Please select the data directory for this instance [/var/lib/redis/7001] /usr/local/redis/7001
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7001
Config file : /usr/local/redis/7001.conf
Log file : /usr/local/redis/7001.log
Data dir : /usr/local/redis/7001
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7001.conf => /etc/init.d/redis_7001
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node01 redis-stable]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node02 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7002
Please select the redis config file name [/etc/redis/7002.conf] /usr/local/redis/7002.conf
Please select the redis log file name [/var/log/redis_7002.log] /usr/local/redis/7002.log
Please select the data directory for this instance [/var/lib/redis/7002] ^C
[root@node02 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7002
Please select the redis config file name [/etc/redis/7002.conf] /usr/local/redis/7002.conf
Please select the redis log file name [/var/log/redis_7002.log] /usr/local/redis/7002.log
Please select the data directory for this instance [/var/lib/redis/7002] /usr/local/redis/7002
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7002
Config file : /usr/local/redis/7002.conf
Log file : /usr/local/redis/7002.log
Data dir : /usr/local/redis/7002
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7002.conf => /etc/init.d/redis_7002
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node02 redis-stable]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node02 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7003
Please select the redis config file name [/etc/redis/7003.conf] /usr/local/redis/7003.conf
Please select the redis log file name [/var/log/redis_7003.log] /usr/local/redis/7003.log
Please select the data directory for this instance [/var/lib/redis/7003] /usr/local/redis/7003
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7003
Config file : /usr/local/redis/7003.conf
Log file : /usr/local/redis/7003.log
Data dir : /usr/local/redis/7003
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7003.conf => /etc/init.d/redis_7003
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node02 redis-stable]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node03 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7004
Please select the redis config file name [/etc/redis/7004.conf] /usr/local/redis/7004.conf
Please select the redis log file name [/var/log/redis_7004.log] /usr/local/redis/7004.log
Please select the data directory for this instance [/var/lib/redis/7004] /usr/local/redis/7004
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7004
Config file : /usr/local/redis/7004.conf
Log file : /usr/local/redis/7004.log
Data dir : /usr/local/redis/7004
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7004.conf => /etc/init.d/redis_7004
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node03 redis-stable]#
用初始化脚本,快速创建实例配置文件,日志目录:
[root@node03 redis-stable]# /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running Redis server
Please select the redis port for this instance: [6379] 7005
Please select the redis config file name [/etc/redis/7005.conf] /usr/local/redis/7005.conf
Please select the redis log file name [/var/log/redis_7005.log] /usr/local/redis/7005.log
Please select the data directory for this instance [/var/lib/redis/7005] /usr/local/redis/7005
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 7005
Config file : /usr/local/redis/7005.conf
Log file : /usr/local/redis/7005.log
Data dir : /usr/local/redis/7005
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7005.conf => /etc/init.d/redis_7005
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node03 redis-stable]#
在每个Redis实例的配置文件中,开启如下参数(以节点1为例):
[root@node01 ~]# vi /usr/local/redis/7000.conf
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no # 关闭保护模式
requirepass **** # master开启密码保护
masterauth **** # replica同master交互密码
[root@node01 ~]# /etc/init.d/redis_7000 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node01 ~]#
[root@node01 ~]# /etc/init.d/redis_7001 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node01 ~]#
[root@node02 ~]# /etc/init.d/redis_7002 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node02 ~]#
[root@node02 ~]# /etc/init.d/redis_7003 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node02 ~]#
[root@node03 ~]# /etc/init.d/redis_7004 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node03 ~]#
[root@node03 ~]# /etc/init.d/redis_7005 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@node03 ~]#
现在已经有了六个正在运行中的 Redis 实例, 接下来就可以直接使用这些实例来创建集群, 并为每个节点编写配置文件。
如果使用的是Redis 5以上的版本,可以直接使用redis-cli命令创建新集群,检查或重新硬化现有集群等等。
对于Redis版本3或4,使用Redis-trib.rb创建集群,它是一个Ruby程序。可以在Redis源代码的src目录下找到它。
# 创建集群:
[root@node01 ~]# /usr/local/redis/bin/redis-cli --cluster create 192.168.1.181:7000 192.168.1.181:7001 \
192.168.1.182:7002 192.168.1.182:7003 192.168.1.183:7004 192.168.1.183:7005 \
--cluster-replicas 1
--cluster-replicas 1 表示为集群中的每个主节点创建一个从节点。
其中指定了6个Redis的ip:port,3个master3个slave。
以上命令回车后,当我们输入yes,redis-cli就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:
005 --cluster-replicas 1
>>> 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.1.183:7004 to 192.168.1.181:7000
Adding replica 192.168.1.183:7005 to 192.168.1.181:7001
Adding replica 192.168.1.182:7003 to 192.168.1.182:7002
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots:[0-5460] (5461 slots) master
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-10922] (5462 slots) master
M: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots:[10923-16383] (5461 slots) master
S: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
replicates d5ecca53d38c4746be746b4be8a7904e81da6529
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
replicates 8fffaca408475225eda34260a2793cdff0f7a5f2
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
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.1.181:7000)
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots: (0 slots) slave
replicates d5ecca53d38c4746be746b4be8a7904e81da6529
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 8fffaca408475225eda34260a2793cdff0f7a5f2
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
[root@node01 ~]# redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:120
cluster_stats_messages_pong_sent:163
cluster_stats_messages_sent:283
cluster_stats_messages_ping_received:158
cluster_stats_messages_pong_received:120
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:283
[root@node01 ~]#
[root@node01 ~]# redis-cli -p 7000 cluster nodes
5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001@17001 master - 0 1593086224000 2 connected 5461-10922
4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003@17003 slave d5ecca53d38c4746be746b4be8a7904e81da6529 0 1593086224398 4 connected
7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004@17004 slave 8fffaca408475225eda34260a2793cdff0f7a5f2 0 1593086225911 5 connected
aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005@17005 slave 5277b27644e037f0d92e39a44dc6f40d7f422a3f 0 1593086224000 6 connected
d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002@17002 master - 0 1593086225000 3 connected 10923-16383
8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000@17000 myself,master - 0 1593086225000 1 connected 0-5460
[root@node01 ~]#
删除节点一定要注意,删除节点之前一定要先将数据移到其它节点,不能直接删除,不过也不用担心,即使有数据,不小心执行了删除节点指令,也会报有数据存在,不可以删除的错误。
# 查看状态:
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7000
192.168.1.181:7000 (8fffaca4...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 8fffaca408475225eda34260a2793cdff0f7a5f2
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
# 通过重新分片,将散列槽移到其它节点:
[root@node01 ~]# redis-cli --cluster reshard 192.168.1.181:7000
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 8fffaca408475225eda34260a2793cdff0f7a5f2
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 5461
# 用来接受散列槽的节点,可以任意指定:
What is the receiving node ID? 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
# 7000节点的id(意思是把该节点的散列槽分配给其它节点):
Source node #1: 8fffaca408475225eda34260a2793cdff0f7a5f2
Source node #2: done
# 查看状态:发现192.168.1.181:7000上的散列槽已经没有了。
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7000
192.168.1.181:7000 (8fffaca4...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 10923 slots | 2 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots: (0 slots) master
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
# node01(192.168.1.181)已经没有了散列槽:
192.168.1.181:7000 (8fffaca4...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 10923 slots | 2 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
# 确定没问题了,执行下面命令,可以实现删除节点:
[root@node01 ~]# redis-cli --cluster del-node 192.168.1.181:7000 8fffaca408475225eda34260a2793cdff0f7a5f2
>>> Removing node 8fffaca408475225eda34260a2793cdff0f7a5f2 from cluster 192.168.1.181:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@node01 ~]#
# 检查状态:发现192.168.1.181:7000节点已经没有了。
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7001
192.168.1.181:7001 (5277b276...) -> 0 keys | 10923 slots | 2 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 2 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7001)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
添加节点前,一定要初始化好此节点:
# 添加节点
[root@node01 ~]# redis-cli --cluster add-node 192.168.1.181:7000 192.168.1.181:7001
>>> Adding node 192.168.1.181:7000 to cluster 192.168.1.181:7001
>>> Performing Cluster Check (using node 192.168.1.181:7001)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
[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.1.181:7000 to make it join the cluster.
[OK] New node added correctly.
[root@node01 ~]#
# 看到以下信息,表示节点添加成功:
...
[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.1.181:7000 to make it join the cluster.
[OK] New node added correctly.
[root@node01 ~]#
虽然节点添加成功,但是还没有分配散列槽,需要重新分片,就是将其它节点上的部分散列槽移动到该节点上。
# 可以看到虽然7000新节点添加成功,但是没有分配散列槽:
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7000
192.168.1.181:7000 (b7a5add9...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 10923 slots | 2 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: b7a5add92ee8103a2032688c3a7728bc8db02b23 192.168.1.181:7000
slots: (0 slots) master
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
# 重新分配,只需指定一个节点,redis-cli将自动找到其它节点:
[root@node01 ~]# redis-cli --cluster reshard 192.168.1.181:7000
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: b7a5add92ee8103a2032688c3a7728bc8db02b23 192.168.1.181:7000
slots: (0 slots) master
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
首先指定分配多少散列槽
# 重新分配多少个散列槽,这里尝试重新设置5461个散列槽:
How many slots do you want to move (from 1 to 16384)? 5461
指定接收哈希槽的节点ID
# 指定接受的Redis节点ID,注意不是指定ip地址:
How many slots do you want to move (from 1 to 16384)? 5461
What is the receiving node ID? b7a5add92ee8103a2032688c3a7728bc8db02b23
指定从哪些节点获取散列槽
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Source node #2: done
# all:表示自动在所有节点进行分配。
# done:表示指定节点结束,一般用在移除节点时,指定完Source node #1: 节点ID,再输入done,表示输入结束。
是否确定分配
Moving slot 5457 from 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Moving slot 5458 from 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Moving slot 5459 from 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Moving slot 5460 from 5277b27644e037f0d92e39a44dc6f40d7f422a3f
Do you want to proceed with the proposed reshard plan (yes/no)? yes
在最终确认之后,redis-cli开始执行重新分配
# 下面这个片段可以看到Redis正在从7001上移动散列槽到7000上:
...
Moving slot 1584 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1585 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1586 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1587 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1588 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1589 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1590 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1591 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1592 from 192.168.1.181:7001 to 192.168.1.181:7000:
Moving slot 1593 from 192.168.1.181:7001 to 192.168.1.181:7000:
重新分片正在进行中时,程序不受影响地运行。检查集群的运行状态:
# 可以看到散列槽已经分配了
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7000
192.168.1.181:7000 (b7a5add9...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: b7a5add92ee8103a2032688c3a7728bc8db02b23 192.168.1.181:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates b7a5add92ee8103a2032688c3a7728bc8db02b23
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
可以自动执行重新分片,而无需以交互方式手动输入参数。这可以使用如下命令行:
# 免交互重新分片脚本语法
redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
# 将node01(192.168.1.181:7001)的1000个哈希槽分配给node02(192.168.1.182:7003)
[root@node01 ~]# redis-cli --cluster reshard 192.168.1.181:7000 --cluster-from 5277b27644e037f0d92e39a44dc6f40d7f422a3f --cluster-to 4669f9ed7daa587c31de2dc2a0243be07049b8a6 --cluster-slots 1000 --cluster-yes
# 自动重新分片:
[root@node01 ~]# redis-cli --cluster rebalance 192.168.1.181:7000
>>> Performing Cluster Check (using node 192.168.1.181:7000)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 999 slots from 192.168.1.182:7003 to 192.168.1.181:7001
#######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
Moving 1 slots from 192.168.1.182:7003 to 192.168.1.181:7000
#
[root@node01 ~]#
# 检查集群状态:发现分片已自动平衡
[root@node01 ~]# redis-cli --cluster check 192.168.1.181:7000
192.168.1.181:7000 (b7a5add9...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.181:7001 (5277b276...) -> 1 keys | 5461 slots | 1 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: b7a5add92ee8103a2032688c3a7728bc8db02b23 192.168.1.181:7000
slots:[0-5460],[6460] (5462 slots) master
1 additional replica(s)
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[5461-6459],[6461-10922] (5461 slots) master
1 additional replica(s)
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates b7a5add92ee8103a2032688c3a7728bc8db02b23
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
This systems seems to use systemd. Please take a look at the provided example service unit files in this directory, and adapt and install t hem. Sorry!
[root@node01 ~] vim ./install_server.sh
注释下面的代码即可
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
[ERR] Node 192.168.1.181:7000 is not empty. Either the node already knows other nodes
(check with CLUSTER NODES) or contains some key in database 0.
# 在创建或者添加节点到集群时,报错:
[ERR] Node 192.168.1.181:7000 is not empty. Either the node already knows other nodes
(check with CLUSTER NODES) or contains some key in database 0.
# 将需要新增的节点下aof、rdb等本地备份文件及Redis.conf里面cluster-config-file所在的文件删除;
[root@node01 ~]# cd /usr/local/redis/7000
[root@node01 7000]# ls
appendonly.aof dump.rdb nodes-7000.conf
[root@node01 7000]# rm -rf *
# 登录新节点对数据库进行清除:
[root@node01 7000]# redis-cli -h 192.168.1.181 -p 7000
192.168.1.181:7000> flushdb
OK
192.168.1.181:7000>
# 重启新节点:
[root@node01 ~]# /etc/init.d/redis_7000 restart
# 如果重新创建或者添加节点到时,依然报错,可以修复下集群:
[root@node01 ~]# redis-cli --cluster fix 192.168.1.181:7000
192.168.1.181:7000 (8fffaca4...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.181:7001 (5277b276...) -> 0 keys | 10923 slots | 2 slaves.
192.168.1.182:7003 (4669f9ed...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.181:7000)
M: 8fffaca408475225eda34260a2793cdff0f7a5f2 192.168.1.181:7000
slots: (0 slots) master
S: 7b088ee93f02b3cc0b9018ffee0eaf7035328503 192.168.1.183:7004
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
S: d5ecca53d38c4746be746b4be8a7904e81da6529 192.168.1.182:7002
slots: (0 slots) slave
replicates 4669f9ed7daa587c31de2dc2a0243be07049b8a6
S: aef97908c5b67a64f195f840e023e9187e19197a 192.168.1.183:7005
slots: (0 slots) slave
replicates 5277b27644e037f0d92e39a44dc6f40d7f422a3f
M: 5277b27644e037f0d92e39a44dc6f40d7f422a3f 192.168.1.181:7001
slots:[0-10922] (10923 slots) master
2 additional replica(s)
M: 4669f9ed7daa587c31de2dc2a0243be07049b8a6 192.168.1.182:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node01 ~]#
# 查询或者创建键值报错:
[root@node01 ~]# redis-cli -h 192.168.1.181 -p 7000
192.168.1.181:7000> get name
(error) MOVED 5798 192.168.1.181:7001
192.168.1.181:7000>
# 解决办法:启动时使用-c参数来启动集群模式,命令如下:
[root@node01 ~]# redis-cli -c -h 192.168.1.181 -p 7000
192.168.1.181:7000> get name
-> Redirected to slot [5798] located at 192.168.1.181:7001
"superman"
192.168.1.181:7001>
[ERR] Node 172.29.57.198:7000 NOAUTH Authentication required.
解决办法:
用redis-cli 密码登陆(redis-cli -a password)。
(error) NOAUTH Authentication required.
Redis服务器设置密码后,使用/etc/init.d/redis_7000 stop 会出现以下信息:
/etc/init.d/redis_7000
Stopping ...
OK
(error) NOAUTH Authentication required.
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
出现这样的错误信息,redis 这时是没有停止服务的。
可以使用ps -ef | grep redis 查进程号 然后kill 掉,如果在deamon下还需要去删除pid文件,有点繁琐。
解决办法:
用redis-cli 密码登陆(redis-cli -a password)。
再用ps -ef | grep redis 可以看到redis进程已经正常退出。
修改redis服务脚本,加入如下所示的红色授权信息即可:
vi /etc/init.d/redis
$CLIEXEC -a "password" -p $REDISPORT shutdown
比如关闭端口号为7000的实例
# redis-cli -a <password> -c -h 127.0.0.1 -p 7000 shutdown
[root@node01 ~]# redis-cli -a 123456 -c -h 10.123.188.134 -p 7000 shutdown
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
[root@node01 ~]#
[root@node01 ~]# redis-cli -a 123456 -h 10.123.188.134 -p 7001
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.181:7001> cluster nodes
2a1c901e41d20de14eeb62a3c3f70133584786ce 192.168.1.181:7000@17000 slave,fail d22374ac2f4fdc28db316b95a034176629a246bc 1615809932963 1615809930458 7 disconnected
d22374ac2f4fdc28db316b95a034176629a246bc 192.168.1.182:7003@17001 master - 0 1615810216120 7 connected 0-5460
c6df7738b24644317c629f669f63c7ca0d412fe1 192.168.1.183:7005@17001 slave 8237509c0dd48bea6a57859813aec8bb99e650d4 0 1615810217122 3 connected
97b6fc54a516f6ff20a3e6244d66dd2ea8dc139b 192.168.1.183:7004@17000 master - 0 1615810215118 5 connected 10923-16383
ccb235ca30cc8466459fdf5854aacf8653f7e760 192.168.1.181:7001@17001 myself,slave 97b6fc54a516f6ff20a3e6244d66dd2ea8dc139b 0 1615809928000 5 connected
8237509c0dd48bea6a57859813aec8bb99e650d4 192.168.1.182:7002@17000 master - 0 1615810216621 3 connected 5461-10922
192.168.1.181:7001>
关闭之后,可以将实例重新启动,启动完成之后,自动加入到集群当中;
192.168.1.181:7001> quit
[root@node01 ~]# systemctl restart Redis_7000
[root@node01 ~]# redis-cli -a 1qaz.@WSX.3edc -h 10.123.188.134 -p 7001
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.181:7001> cluster nodes
2a1c901e41d20de14eeb62a3c3f70133584786ce 192.168.1.181:7000@17000 slave d22374ac2f4fdc28db316b95a034176629a246bc 0 1615810611980 7 connected
d22374ac2f4fdc28db316b95a034176629a246bc 192.168.1.182:7003@17001 master - 0 1615810611579 7 connected 0-5460
c6df7738b24644317c629f669f63c7ca0d412fe1 192.168.1.183:7005@17001 slave 8237509c0dd48bea6a57859813aec8bb99e650d4 0 1615810610978 3 connected
97b6fc54a516f6ff20a3e6244d66dd2ea8dc139b 192.168.1.183:7004@17000 master - 0 1615810612080 5 connected 10923-16383
ccb235ca30cc8466459fdf5854aacf8653f7e760 192.168.1.181:7001@17001 myself,slave 97b6fc54a516f6ff20a3e6244d66dd2ea8dc139b 0 1615810610000 5 connected
8237509c0dd48bea6a57859813aec8bb99e650d4 192.168.1.182:7002@17000 master - 0 1615810611000 3 connected 5461-10922
192.168.1.181:7001>
逐个关闭Redis实例即可。
[root@node01 ~]# systemctl stop redis_7000
[root@node01 ~]# systemctl stop redis_7001
[root@node02 ~]# systemctl stop redis_7002
[root@node02 ~]# systemctl stop redis_7003
[root@node03 ~]# systemctl stop redis_7004
[root@node03 ~]# systemctl stop redis_7005
逐个关闭Redis实例,再逐个的启动即可。
关闭实例,清空实例中数据存放目录的所有内容,然后逐个启动实例,在任意一个实例上执行集群的创建命令即可,本质上就是创建一个新的集群。
关闭实例
[root@node01 ~]# systemctl stop redis_7000
[root@node01 ~]# systemctl stop redis_7001
[root@node02 ~]# systemctl stop redis_7002
[root@node02 ~]# systemctl stop redis_7003
[root@node03 ~]# systemctl stop redis_7004
[root@node03 ~]# systemctl stop redis_7005
清空数据存储目录内容
[root@node01 ~]# rm -rf /usr/local/redis/7000/*
[root@node01 ~]# rm -rf /usr/local/redis/7001/*
[root@node02 ~]# rm -rf /usr/local/redis/7002/*
[root@node02 ~]# rm -rf /usr/local/redis/7003/*
[root@node03 ~]# rm -rf /usr/local/redis/7004/*
[root@node03 ~]# rm -rf /usr/local/redis/7005/*
启动实例
[root@node01 ~]# systemctl start redis_7000
[root@node01 ~]# systemctl start redis_7001
[root@node02 ~]# systemctl start redis_7002
[root@node02 ~]# systemctl start redis_7003
[root@node03 ~]# systemctl start redis_7004
[root@node03 ~]# systemctl start redis_7005
执行集群创建命令
[root@node01 ~]# /usr/local/redis/bin/redis-cli --cluster create 192.168.1.181:7000 192.168.1.181:7001 \
192.168.1.182:7002 192.168.1.182:7003 192.168.1.183:7004 192.168.1.183:7005 \
--cluster-replicas 1
1、打印集群的信息
CLUSTER INFO
2、列出集群当前已知的所有节点(node),以及这些节点的相关信息
CLUSTER NODES
3、将ip和port所指定的节点添加到集群中
CLUSTER MEET <ip> <port>
4、从集群中移除node_id指定的节点
CLUSTER FORGET <node_id>
5、将当前节点设置为node_id指定的节点的从节点
CLUSTER REPLICATE <node_id>
6、将节点的配置文件保存到硬盘里面
CLUSTER SAVECONFIG
7、将一个或多个槽(slot)指派(assign)给当前节点
CLUSTER ADDSLOTS <slot> [slot ...]
8、移除一个或多个槽对当前节点的指派
CLUSTER DELSLOTS <slot> [slot ...]
9、移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点
CLUSTER FLUSHSLOTS
10、将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派
CLUSTER SETSLOT <slot> NODE <node_id>
11、将本节点的槽slot迁移到node_id指定的节点中
CLUSTER SETSLOT <slot> MIGRATING <node_id>
12、从node_id指定的节点中导入槽 slot 到本节点
CLUSTER SETSLOT <slot> IMPORTING <node_id>
13、取消对槽slot的导入(import)或者迁移(migrate)
CLUSTER SETSLOT <slot> STABLE
14、计算键key应该被放置在哪个槽上
CLUSTER KEYSLOT <key>
15、返回槽slot目前包含的键值对数量
CLUSTER COUNTKEYSINSLOT <slot>
16、返回count个slot槽中的键
CLUSTER GETKEYSINSLOT <slot> <count>
save ""
appendonly=yes
cluster-require-full-coverage no
maxmemory
11453246122
logfile "./redis.log"
no-appendfsync-on-rewrite yes
net.nf_conntrack_max = 1648576
vm.overcommit_memory = 1
有三种方式修改内核参数,但要有root权限:
编辑/etc/sysctl.conf ,改vm.overcommit_memory = 1,然后sysctl -p 使配置文件生效
sysctl vm.overcommit_memory = 1
echo 1 > /proc/sys/vm/overcommit_memory
建议使用方法1。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
同时写入rc.local,保证下次重启生效
net.core.somaxconn = 1024
编辑/etc/sysctl.conf ,增加 net.core.somaxconn= 1024,然后sysctl -p 使配置文件生效
默认没有设置
allkeys-lru
BGREWRITEAOF 这个命令可以重写aof,因为aof长时间增量更新,导致越来越大,但是内存可能没这么大,所以可以用这个命令重写进行复制备份,恢复等
内存吃紧的时候可以尝试手动去掉内存碎片
config set activedefrag yes
memory purge
欢迎关注我的微信公众号【超哥的IT私房菜】获取更多技术干货!
有什么吐槽或反馈意见,直接告诉我!
我会解决您说的问题,进一步更好的服务您哦!
温馨提示:如出现二维码失效也可直接添加微信号:ysc13803862469。
原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。