Redis 集群搭建
基本使用
安装和下载redis:https://redis.io/download
redis-cli 交互式的使用:
redis-cli -h 127.0.0.1 -p 6379
redis-cli 命令行方式:
redis-cli -h 127.0.0.1 -p 6379 get hello
停止Redis服务:关闭前会自动将数据进行持久化。
redis-cli -h 127.0.0.1 -p 6379 shutdown
可以选择是否在关闭前进行持久化:
redis-cli shutdown nosave|save
单机配置
源码包下有默认的 redis.conf 文件,可使用 sed 命令进行简化。
sed '/^#/d' redis.conf | sed '/^$/d' > redis-6379.conf
默认配置文件:
bind 127.0.0.1 # 绑定的IP protected-mode yes port 6379 # 默认端口 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes # 要改成yes,表示后台启动 supervised no pidfile /var/run/redis_6379.pid # pid文件,端口不一样文件不一样 loglevel notice logfile "" #日志文件位置 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 appendonly no 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 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
主从复制
准备两个节点,第一个节点创建好数据目录后启动即可,第二个节点也就是从节点在配置文件中添加 slaveof ip port 这项后启动即可,这个ip和端口指的就是主节点的IP和端口。启动好后使用 redis-cli 客户端分别登陆各自的 redis 然后运行info replication 命令即可看到对应的 master 和 slave 的信息。
启动master:
redis-server redis-6379.conf
启动slave:
在单机配置中加入 slaveof 192.168.1.119 6379 这项。
echo 'slaveof 192.168.1.119 6379' > redis-6379.conf
主节点:
redis-cli -h 192.168.1.119 -p 6379 192.168.1.119:6379> info replication role:master ... 192.168.1.119:6379> set name hello OK
从节点:
redis-cli -h 192.168.1.119 -p 6379 192.168.1.119:6379> info replication role:slave ... 192.168.1.120:6379> get name "hello"
断开复制:在从节点上执行 slaveof no one 命令可断开与主节点的复制,断开之后从节点自动升为主节点。当前从节点的数据不会被删除。
192.168.1.120:6379> slaveof no one OK
可以在命令行中重新执行复制命令:这时又会变为从节点。
注意:会删除当前从节点的所有数据。
192.168.1.120:6379> slaveof 192.168.1.119 6379 OK 192.168.1.120:6379> info replication role:slave
集群配置
redis集群一般有6个节点,三个节点做主节点,然后各有一个从节点来做故障转移。
在单机版的配置文件中加入下面几项:
# 开启集群模式 cluster-enabled yes # 节点超时时间, 单位毫秒 cluster-node-timeout 15000 # 集群内部配置文件 cluster-config-file "nodes-6379.conf" #这个文件是redis自己维护的
集群配置中 cluster-config-file 这个配置项用来指定集群配置文件,这个文件是redis自己维护的,不要修改。每个节点对应一个这样的文件。
启动各个redis:
redis-server 6379/conf/redis-6379.conf redis-server 6380/conf/redis-6380.conf redis-server 6381/conf/redis-6381.conf redis-server 6382/conf/redis-6382.conf redis-server 6383/conf/redis-6383.conf redis-server 6384/conf/redis-6384.conf
节点握手:
在集群任意节点上执行 cluster meet 命令即可。
192.168.1.119:6379> cluster meet 192.168.1.119 6380 192.168.1.119:6379> cluster meet 192.168.1.119 6381 192.168.1.119:6379> cluster meet 192.168.1.119 6382 192.168.1.119:6379> cluster meet 192.168.1.120 6382 192.168.1.119:6379> cluster meet 192.168.1.120 6383 192.168.1.119:6379> cluster meet 192.168.1.120 6384
集群状态:
添加完成后在任意一个节点上执行 cluster nodes 即可看到集群状态:
> cluster nodes
查看集群当前状态:
> cluster info cluster_state:fail cluster_slots_assigned:0
此时 cluster_slots_assigned:0 还不可写,因为没有分配槽点。
分配槽点:
redis-cli -h 192.168.1.119 -p 6379 cluster addslots {0..5461} # 两个点 redis-cli -h 192.168.1.119 -p 6380 cluster addslots {5462..10922} redis-cli -h 192.168.1.119 -p 6381 cluster addslots {10923..16383}
查看集群状态:
此时的集群状态是ok的,说明已近可写了。
> cluster info cluster_state:ok cluster_slots_assigned:16384
查看节点状态:
这时可以从下面的信息中看到槽点的分配状况,输出的信息中每行的第一个字段为这个节点的NodeID。
192.168.1.119:6380> cluster nodes 5b231bee2de01fbbea32087ae0db22b46a3a44ac 192.168.1.120:6382@16382 master - 0 1543677508000 3 connected 7724c6470fe07cf4c905afce5098d78cd8e1290a 192.168.1.119:6381@16381 master - 0 1543677508932 5 connected 10923-16383 4a71503b6dd73e595864b4ff80251303f0456a14 192.168.1.119:6380@16380 myself,master - 0 1543677507000 2 connected 5462-10922 1343d82cc5144654553d9e92b3226463caf6acba 192.168.1.119:6379@16379 master - 0 1543677506928 1 connected 0-5461 e06fba968ddd6f161a86473fe3a01eaa1d5225e4 192.168.1.120:6384@16384 master - 0 1543677507931 0 connected 1c93ff599b16a385d87b1564fb4f1061c439c9b1 192.168.1.120:6383@16383 master - 0 1543677504000 4 connected
设置从节点:
此时还有三个节点是用来作为从节点的,使用 cluster replicate NodeID 即可将某个节点设置为从节点,这里的 NodeID 是要设置为那个节点的从节点。这个这个值可以使用 cluster nodes 查看到。
redis-cli -h 192.168.1.120 -p 6382 cluster replicate 1343d82cc5144654553d9e92b3226463caf6acba redis-cli -h 192.168.1.120 -p 6383 cluster replicate 4a71503b6dd73e595864b4ff80251303f0456a14 redis-cli -h 192.168.1.120 -p 6384 cluster replicate 7724c6470fe07cf4c905afce5098d78cd8e1290a
此时使用 cluster nodes 可以看到集群状态的详细信息。
redis集群读写:
在redis集群上读写时应使用 -c 选项,redis-cli -c ,可自动重定向,因为redis上读写要根据对应的槽点来进行,如果当前操作的数据不在当前的节点对应的槽点上则会返回重定向命令,-c 命令用来自动重定向并执行请求。
192.168.1.119:6380> get hello -> Redirected to slot [866] located at 192.168.1.119:6379 "world"
集群扩展
Redis集群使用一致性hash算法将数据分布在16384个槽点上,扩展集群要对原有的槽点和槽点上的数据进行迁移,先迁移数据再迁移槽点。在迁移槽点上的数据时是将槽点上的数据按照一个一个key进行迁移的。比如说要对槽点0从节点A迁移到节点B,先要将槽点0上存储的所有key一个一个迁移到B上的0号槽点,然后再将槽点0迁移到B上。
大致步骤为:
# 迁移槽点 cluster setslot 0 migrating 1343d82cc5144654553d9e92b3226463caf6acba cluster setslot 0 importing 5b231bee2de01fbbea32087ae0db22b46a3a44ac # 获取键名 cluster getkeysinslot 0 100 # 这个100是key的数量,可使用 CLUSTER COUNTKEYSINSLOT 0 来获取 # 逐个移动键 migrate 192.168.1.119 6380 hello 0 9999 replace # 迁移完成,如果这个槽点没有数据的话直接使用下面命令即可迁移成功。 cluster setslot 0 node 5b231bee2de01fbbea32087ae0db22b46a3a44ac
实际部署中使用的是 redis-trib.rb 工具来实现。