Redis Cluster集群搭建 集群搭建参考官网:
1 https://redis.io/topics/cluster-tutorial
redis集群需要至少三个master节点,我这里搭建三个master节点。并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台服务器部署(多台服务器部署,修改一下ip地址就可以了) 部署6个redis实例,三主三从,搭建集群的步骤如下:
我使用redis6.2.6版本
1 创建redis节点安装目录 1 mkdir /data/docker-redis-cluster
2 依次创建文件夹,并依次修改配置文件 1 2 3 4 创建文件夹 6381 -6386 mkdir /data/docker-redis-cluster/{6381 ..6386 }复制redis.conf配置文件到6381 下。 cp redis.conf /data/docker-redis-cluster/6381 /
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 修改配置文件 # 关闭保护模式 用于公网访问 protected-mode no port 6381 # 开启集群模式 cluster-enabled yes # 不改也可以 # cluster-config-file nodes-6381 .conf # cluster-node-timeout 5000 #日志文件 也可以不改默认 #pidfile /var/run/redis_6381.pid #此处绑定ip 可以是阿里云内网IP 和本地 ip 可以直接注释掉 # bind 127 .0 .0 .1 #用于连接主节点密码 masterauth 123 .Redis #设置redis密码 各个节点请保持密码一致 requirepass 123 .Redis
分别复制到其他5个文件夹中
1 2 3 4 5 6 7 cp redis.conf ../6382/ cp redis.conf ../6383/ cp redis.conf ../6384/ cp redis.conf ../6385/ cp redis.conf ../6386/ 配置文件的端口分别修改对应的。
3 启动6个docker容器和开通防火墙 目前 Redis Cluster 不支持经过 NAT 处理的环境以及重新映射 IP 地址或 TCP 端口的一般环境。
这里容易采坑。不要自作聪明通过端口映射的方式启动容器,后面会导致集群加入不了。官方不支持。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 开放防火墙 iptables -A INPUT -p tcp -m multiport --dports 6381 :6390 -j ACCEPT iptables -A INPUT -p tcp -m multiport --dports 16381 :16390 -j ACCEPT #分别启动6 个容器 1 .docker run --name redis1 --network host -v /data/docker-redis-cluster/6381 /data:/data -v /data/docker-redis-cluster/6381 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf 2 .docker run --name redis2 --network host -v /data/docker-redis-cluster/6382 /data:/data -v /data/docker-redis-cluster/6382 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf 3 .docker run --name redis3 --network host -v /data/docker-redis-cluster/6383 /data:/data -v /data/docker-redis-cluster/6383 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf 4 .docker run --name redis4 --network host -v /data/docker-redis-cluster/6384 /data:/data -v /data/docker-redis-cluster/6384 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf 5 .docker run --name redis5 --network host -v /data/docker-redis-cluster/6385 /data:/data -v /data/docker-redis-cluster/6385 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf 6 .docker run --name redis6 --network host -v /data/docker-redis-cluster/6386 /data:/data -v /data/docker-redis-cluster/6386 /redis.conf:/usr/local/etc/redis/redis.conf -d redis:6 .2 .6 redis-server /usr/local/etc/redis/redis.conf
也可以编写docker-compose.yml文件启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 version: '3' services: redis1: container_name: redis1 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6381/data:/data - /data/docker-redis-cluster/6381/redis.conf:/usr/local/etc/redis/redis.conf redis2: container_name: redis2 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6382/data:/data - /data/docker-redis-cluster/6382/redis.conf:/usr/local/etc/redis/redis.conf redis3: container_name: redis3 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6383/data:/data - /data/docker-redis-cluster/6383/redis.conf:/usr/local/etc/redis/redis.conf redis4: container_name: redis4 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6384/data:/data - /data/docker-redis-cluster/6384/redis.conf:/usr/local/etc/redis/redis.conf redis5: container_name: redis5 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6385/data:/data - /data/docker-redis-cluster/6385/redis.conf:/usr/local/etc/redis/redis.conf redis6: container_name: redis6 image: redis:6.2.6 command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" volumes: - /data/docker-redis-cluster/6386/data:/data - /data/docker-redis-cluster/6386/redis.conf:/usr/local/etc/redis/redis.conf
docker-compose启动
4 创建集群 1 2 3 4 5 6 7 8 9 10 创建集群命令 --cluster create --cluster-replicas 1 通过redis-cli 客户端命令来创建集群 redis-cli --cluster create -a '123.Redis' 122.152.250.233:6381 122.152.250.233:6382 122.152.250.233:6383 122.152.250.233:6384 122.152.250.233:6385 122.152.250.233:6386 --cluster-replicas 1 通过进入容器命令来创建 docker exec -it redis1 redis-cli --cluster create -a '123.Redis' 122.152.250.233:6381 122.152.250.233:6382 122.152.250.233:6383 122.152.250.233:6384 122.152.250.233:6385 122.152.250.233:6386 --cluster-replicas 1
5 Redis Cluster 集群验证 在某台机器上(或)连接集群6381端口的节点
1 2 3 4 5 普通redis方式: redis-cli -h 122.152.25.233 -c -p 6381 -a 123.Redis # 加参数 -c 可以连接到集群 Docker方式: docker exec -it redis1 redis-cli -h 122.152.25.233 -c -p 6381 -a 123.Redis
基础命令
1 2 3 4 info replication 通过这个命令来查看集群效果。 cluster nodes 整个集群的信息。 每个redis的节点都有一个ID值,此ID值将被此特定的redis实例永久使用,以便实例在集群上下文中具有唯一的名称,每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP或端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。我们简单的称这个标识符为节点id。
到此集群就搭建完毕了。
6 集群扩容 假设我们近期可能要流量大增,所以需要扩大一组redis,一主一从。注意哈希槽的重新分配。
假设实际工作中新增是两台机器
1 2 3 4 5 6 7 8 9 mkdir /data/docker-redis-cluster/6387 mkdir /data/docker-redis-cluster/6388 分别复制一份redis.conf文件到对应的目录。修改端口号。 7. docker run --name redis7 --network host -v /data/docker-redis-cluster/6387/data:/data -v /data/docker-redis-cluster/6387/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf 7. docker run --name redis8 --network host -v /data/docker-redis-cluster/6388/data:/data -v /data/docker-redis-cluster/6388/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf
新加入集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 将新增的6387 作为master节点加入集群。 redis-cli --cluster add-node ip:6387 ip:6381 #6387 要作为master新增节点,而6381 是原来集群节点里面的领路人,相当于6387 需要找到6381 来作为领路人来加入到集群这个组织。 docker exec -it redis1 redis-cli --cluster add-node -a '123 .Redis' 122 .152 .250 .233 :6387 122 .152 .250 .233 :6381 以下是提示信息: [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 122 .152 .250 .233 :6387 to make it join the cluster. 注意加入到集群之后,有个问题是它没有获取到槽位 #查看是否有槽位 docker exec -it redis1 redis-cli --cluster check 122 .152 .250 .233 :6381
重新分配槽位
1 2 3 4 5 6 7 8 9 10 11 命令: redis-cli --cluster reshard 122 .152 .250 .233 :6381 docker exec -it redis1 redis-cli --cluster reshard -a '123 .Redis' 122 .152 .250 .233 :6381 How many slots do you want to move (from 1 to 16384 ) 16384 除以4 = 4096 What is the receiving node ID? #接收点的id是什么? 637 f60c94ae1d0049383503bccec0f4b0e7f708e 输入新节点的IDSource node #1 : all #注意这里的all 最后输入yes
然后再次查看是否分配槽位
1 docker exec -it redis1 redis-cli --cluster check 122.152.250.233:6381 -a 123.Redis
但是要注意,我们新加入的这个节点分配了4096个槽位,但是它的槽位部署连续的:
1 slots:[0-1364],[5461-6826],[10923-12287] (4096 slots ) master 分成了三段。是之前上一次的三个主机master 都分割点过来凑起来了4096个槽位,并不是4个主机重新从0开始分配哈。
主节点下添加从节点
1 2 3 4 5 6 7 命令:redis-cli --cluster add-node ip:新slave端口 (空格) ip:新master端口--cluster-slave --cluster-master-id 新主机节点ID docker exec -it redis1 bash redis-cli -a 123 .Redis --cluster add-node 122 .152 .250 .233 :6388 122 .152 .250 .233 :6387 --cluster-slave --cluster-master-id 637 f60c94ae1d0049383503bccec0f4b0e7f708e 这个命令的意思就是新节点6388 ,要加入到6387 下作为从节点,--cluster-master-id 表示具体的你要加入到哪个maser节点下面,master节点有节点id.
加入了从机之后我们可以看到:
1 redis-cli --cluster check 122.152.250.233:6381 -a 123.Redis
7 集群缩容 现在的需求是我们流量高峰过了。为了节省资源所以我们就来把6387和6388这两台机器撤掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 先删除从机6388 命令:redis-cli --cluster del -node ip:从机端口 从机6388 节点ID redis-cli -a 123 .Redis --cluster del -node 122 .152 .25 .233 :6388 2577 b4e7140f8d83eb36a8c8d6ed6fd17de048d2 redis-cli -p 6388 -c -a Redis cluster nodes #查看节点ID 删除了后。重新分配槽位 redis-cli --cluster reshard -a '123 .Redis' 122 .152 .25 .233 :6381 root@look:/data # redis -cli --cluster reshard -a '123.Redis ' 122.152.25.233:6381Warning : Using a password with '-a ' or '-u ' option on the command line interface may not be safe . >>> Performing Cluster Check (using node 122.152.25.233:6381) M : 25a77b2ff812e77d11003a705db8b117a251cbca 122.152.25.233:6381 slots :[1365-5460] (4096 slots ) master 1 additional replica (s ) M : ff548df96b7c21c870c45c1a1c5c4e7d6809020c 122.152.25.233:6382 slots :[6827-10922] (4096 slots ) master 1 additional replica (s ) S : edef23f4c74af20b35768a5a4b5c7a9e9b8150a1 122.152.25.233:6384 slots : (0 slots ) slave replicates dc2da432af01aa6bcb2799a69b1bc1decc4fb408 S : 8c804b78e553e5ad75dde8a3809d3417881c5a09 122.152.25.233:6386 slots : (0 slots ) slave replicates ff548df96b7c21c870c45c1a1c5c4e7d6809020c M : dc2da432af01aa6bcb2799a69b1bc1decc4fb408 122.152.25.233:6383 slots :[12288-16383] (4096 slots ) master 1 additional replica (s ) S : 086621222eafbdcea8f86437ad0de4b80f7a4fc3 122.152.25.233:6385 slots : (0 slots ) slave replicates 25a77b2ff812e77d11003a705db8b117a251cbca M : 637f60c94ae1d0049383503bccec0f4b0e7f708e 122.152.25.233:6387 slots :[0-1364],[5461-6826],[10923-12287] (4096 slots ) master # 这里是4096 slots ,下面就选择4096。 [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)? #4096What is the receiving node ID ? 25a77b2ff812e77d11003a705db8b117a251cbca #6381的ID 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: 637f60c94ae1d0049383503bccec0f4b0e7f708e #这里是6387要删除的节点ID ,不是6388的。然后选择done 查看节点id redis -cli --cluster check 122.152.25.233:6381 -a 123.Redis # 然后再删除第七个节点 6387 命令:redis -cli --cluster del -node ip :端口 6387节点ID redis -cli -a 123.Redis --cluster del -node 122.152.25.233:6387 637f60c94ae1d0049383503bccec0f4b0e7f708e