redis-cluster 把所有的物理节点(redis master)映射到(0-16383)slot 上, cluster负责维护节点node,每个节点都会有一定范围的slot。比如node1 0-5000,node2 5001-10000,node3 100000-16383 。
node <---> slot <---> value
CRC16算法: 因为每次都会先把key 做 crc,所以客户端可以连接任意集群中master节点,起到内存总量和请求数提高
1,对集群模式下的所有key进行crc16计算,计算的结果始终在0-16383之间
2,对客户端的key进行crc16计算时,同一个key多次经过crc16计算结果始终一致
3,对客户端的不同key进行crc16计算,计算的结果会出现 不同的key 结果可能一致。 比如key name 和 cc 经过crc后可能结果相同。
shellcd /usr/local/src/ wget http://download.redis.io/releases/redis-6.2.6.tar.gz tar zxvf redis-6.2.6.tar.gz yum install -y gcc automake make cd redis-6.2.6 && make && make install cp ./src/redis-server /usr/bin/ cp ./src/redis-cli /usr/bin/ 若 cp ./src/redis-cli /usr/bin/ 出现如下错误: cp: not writing through dangling symlink ‘/usr/bin/redis-cli’ 这个错误表示目标 /usr/bin/redis-cli 已经存在并且是一个悬空的符号链接(即指向一个不存在的文件)。这可能是由于之前的安装或配置过程中创建了一个错误的符号链接。 要解决这个问题,您可以先删除旧的符号链接,然后重新执行复制命令。请执行以下命令: sudo rm /usr/bin/redis-cli sudo cp ./src/redis-cli /usr/bin/ 这将删除悬空的符号链接并将 redis-cli 复制到 /usr/bin/ 目录下现在,您应该能够在任何位置使用 redis-cli 命令了。
shellcp ./utils/redis_init_script /etc/init.d/redisd service redisd start
shell
mkdir /data/redis-cluster/{7000,7001,7002,7003,7004,7005}/log -pv
cp /usr/local/src/redis-6.2.6/redis.conf /data/redis-cluster/7000/redis.conf
vim redis.conf
bind 0.0.0.0
protected-mode yes
# 端口
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 300
# 后台运行
daemonize yes
supervised no
pidfile /var/run/redis_7000.pid
loglevel notice
logfile "/data/redis-cluster/7000/log/redis-7000.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
# cluster模式必须开启 aof持久化
appendonly yes
# aof日志文件
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes7000.conf
# 集群超时时间 可以改为 5000ms
cluster-node-timeout 15000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
# 集群认证
masterauth AuDdQdpuEZpXgNthP6CjYjPb
requirepass AuDdQdpuEZpXgNthP6CjYjPb
修改其他端口配置文件
cd /data//redis-cluster
cp 7000/redis.conf 7001/
cp 7000/redis.conf 7002/
cp 7000/redis.conf 7003/
cp 7000/redis.conf 7004/
cp 7000/redis.conf 7005/
sed -i 's/7000/7001/g' 7001/redis.conf
sed -i 's/7000/7002/g' 7002/redis.conf
sed -i 's/7000/7003/g' 7003/redis.conf
sed -i 's/7000/7004/g' 7004/redis.conf
sed -i 's/7000/7005/g' 7005/redis.conf
shell#此参数可用的值为0,1,2
#0表示当用户空间请求更多的内存时,内核尝试估算出可用的内存
#1表示内核允许超量使用内存直到内存用完为止
#2表示整个内存地址空间不能超过swap+(vm.overcommit_ratio)%的RAM值
echo "vm.overcommit_memory=1">>/etc/sysctl.conf
sysctl -p
shell# cat start-redis-cluster.sh
#!/bin/bash
cd /data/redis-cluster
cd 7000 && /usr/bin/redis-server /data/redis-cluster/7000/redis.conf
cd ../7001 && /usr/bin/redis-server /data/redis-cluster/7001/redis.conf
cd ../7002 && /usr/bin/redis-server /data/redis-cluster/7002/redis.conf
cd ../7003 && /usr/bin/redis-server /data/redis-cluster/7003/redis.conf
cd ../7004 && /usr/bin/redis-server /data/redis-cluster/7004/redis.conf
cd ../7005 && /usr/bin/redis-server /data/redis-cluster/7005/redis.conf
#!/bin/bash
base_dir="/data/redis-cluster"
for port in {7000..7005}; do
redis_conf="${base_dir}/${port}/redis.conf"
/usr/bin/redis-server "$redis_conf" &
done
# 等待所有 Redis 实例启动
wait
shellbash start-redis-cluster.sh ps -ef|grep redis
shell#创建集群主从节点 (一步完成)
redis-cli --cluster create 10.20.71.215:7000 10.20.73.204:7001 10.20.71.67:7002 10.20.71.215:7003 10.20.73.204:7004 10.20.71.67:7005 --cluster-replicas 1 -a AuDdQdpuEZpXgNthP6CjYjPb
# 单台服务器测试:
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 -a AuDdQdpuEZpXgNthP6CjYjPb
#说明:--cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。通过该方式创建的带有从节点的机器不能够自己手动指定主节点,所以如果需要指定的话,需要自己手动指定,注意:Redis Cluster最低要求是3个主节点,如果需要集群需要认证,则在最后加入 -a xx 即可。
# redis-cli:Redis命令行接口工具,用于与Redis服务器进行通信和管理。
# --cluster:表示您要执行的操作与Redis集群相关。
# create:表示您要创建一个新的Redis集群。
# 10.20.71.215:7000 10.20.73.204:7001 10.20.71.67:7002 10.20.71.215:7003 10.20.73.204:7004 10.20.71.67:7005:这些是集群中要包含的Redis实例的IP地址和端口号。在这个示例中,有6个实例分布在3个不同的IP地址上。
# --cluster-replicas 1:这个选项表示您希望为集群中的每个主节点分配一个从节点(即1个副本)。这有助于提高集群的容错能力。
# -a AuDdQdpuEZpXgNthP6CjYjPb:这个选项指定了用于与Redis实例进行身份验证的密码。在这个示例中,密码是“AuDdQdpuEZpXgNthP6CjYjPb”。
# 执行此命令后,redis-cli将尝试连接到提供的地址和端口上的Redis实例,并将它们配置为一个集群。集群中的每个主节点将具有一个从节点,以确保数据的高可用性
#也可以手动指定主从节点
#创建集群主节点
redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381
#添加集群主节点
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379
#说明:为一个指定集群添加节点,需要先连到该集群的任意一个节点IP(192.168.163.132:6379),再把新节点加入。该2个参数的顺序有要求:新加入的节点放前
#添加集群从节点
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d5192270
#说明:把6382节点加入到6379节点的集群中,并且当做node_id为 117457eab5071954faab5e81c3170600d5192270 的从节点。如果不指定 --cluster-master-id 会随机分配到任意一个主节点。
#删除节点
redis-cli --cluster del-node 192.168.163.132:6384 f6a6957421b80409106cb36be3c7ba41f3b603ff
#说明:指定IP、端口和node_id 来删除一个节点,从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
#注意:当被删除掉的节点重新起来之后不能自动加入集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。如果想要再次加入集群,则需要先在该节点执行cluster reset,再用add-node进行添加,进行增量同步复制。
#检查集群
redis-cli --cluster check 192.168.163.132:6384 --cluster-search-multiple-owners
#说明:任意连接一个集群节点,进行集群状态检查
#集群信息查看
redis-cli --cluster info 192.168.163.132:6384
#说明:检查key、slots、从节点个数的分配情况
#修复集群
redis-cli --cluster fix 192.168.163.132:6384 --cluster-search-multiple-owners
#说明:修复集群和槽的重复分配问题
#设置集群的超时时间
redis-cli --cluster set-timeout 192.168.163.132:6382 10000
#说明:连接到集群的任意一节点来设置集群的超时时间参数cluster-node-timeout
#集群中执行相关命令
redis-cli --cluster call 192.168.163.132:6381 config set requirepass cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config set masterauth cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config rewrite
#说明:连接到集群的任意一节点来对整个集群的所有节点进行设置。
shellredis-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 #指定集群的任意一节点进行迁移slot,重新分slots --cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。 --cluster-yes #指定迁移时的确认输入 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10 --cluster-replace #是否直接replace到目标节点 rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量 --cluster-weight <node1=w1...nodeN=wN> #指定集群节点的权重 --cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-simulate #模拟rebalance操作,不会真正执行迁移操作 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,默认值为10 --cluster-threshold <arg> #迁移的slot阈值超过threshold,执行rebalance操作 --cluster-replace #是否直接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 #设置cluster-node-timeout import host:port #将外部redis数据导入集群 --cluster-from <arg> #将指定实例的数据导入到集群 --cluster-copy #migrate时指定copy --cluster-replace #migrate时指定replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
shell# -c 才是连接集群
root@mgo-db01cn-t001:/usr/local/src/redis-6.2.6# redis-cli -c -p 7000
127.0.0.1:7000> auth AuDdQdpuEZpXgNthP6CjYjPb
OK
127.0.0.1:7000> cluster nodes
shell#将节点的配置文件保存到硬盘里面.试一下:
127.0.0.1:7009> cluster saveconfig
OK
#ok说明成功了,它会覆盖配置文件夹里的nodes.conf文件.这样做是为了某种情况下nodes文件丢失,这样就会生成一个最新的节点配置文件。
#1.如果想重新创建集群,需要登录到每个节点,执行flushdb,然后执行cluster reset,重启节点;
本文作者:Golovin
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!