编辑
2023-05-08
环境部署
00

目录

redis cluster
原理
安装
创建服务启停脚本
创建目录及配置文件
调整下内存分配使用方式并使其生效
制作启动脚本
启动服务
创建集群
查看集群信息
cluster saveconfig

redis cluster

原理

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后可能结果相同。

安装
shell
cd /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 命令了。
创建服务启停脚本
shell
cp ./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
启动服务
shell
bash 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 #说明:连接到集群的任意一节点来对整个集群的所有节点进行设置。
shell
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 #指定集群的任意一节点进行迁移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
cluster saveconfig
shell
#将节点的配置文件保存到硬盘里面.试一下: 127.0.0.1:7009> cluster saveconfig OK #ok说明成功了,它会覆盖配置文件夹里的nodes.conf文件.这样做是为了某种情况下nodes文件丢失,这样就会生成一个最新的节点配置文件。 #1.如果想重新创建集群,需要登录到每个节点,执行flushdb,然后执行cluster reset,重启节点;
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Golovin

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!