前言
学习了redis的主从,哨兵之后,学习redis高可用的最后一篇集群。学习集群不着急,先来看看怎么搭建集群。现在都讲究容器化部署,咱也来试试基于docker搭建redis集群。
ps:我只有一台虚拟机,所以。。。。。将就一下。
搭建集群
拉去镜像
基于docker搭建redis集群。
- docker环境要装好;
- 拉取redis的镜像(
docker pull redis
)
创建容器
创建了6
个reids
容器,所以主从分配就是3
个主节点,3
个从节点。注意 主节点
最少3
个,3
个才能保证集群的健壮性。
当一个主节点和下面子节点全部挂掉
,少于3
个主节点时,redis
集群将不可用。当再次启动至三个
可用主节点时,之前挂掉的主节点不一定就还是主节点
创建 6 个Redis 容器:
- redis-node1:6371
- redis-node2:6372
- redis-node3:6373
- redis-node4:6374
- redis-node5:6375
- redis-node6:6376
docker create --name redis-node1 --net=host -v /data/redis-data/node1:/data redis --cluster-enabled yes --cluster-config-file nodes-node-1.conf --cluster-node-timeout 10000 --appendonly yes --port 6371
docker create --name redis-node2 --net=host -v /data/redis-data/node2:/data redis --cluster-enabled yes --cluster-config-file nodes-node-2.conf --cluster-node-timeout 10000 --appendonly yes --port 6372
docker create --name redis-node3 --net=host -v /data/redis-data/node3:/data redis --cluster-enabled yes --cluster-config-file nodes-node-3.conf --cluster-node-timeout 10000 --appendonly yes --port 6373
docker create --name redis-node4 --net=host -v /data/redis-data/node4:/data redis --cluster-enabled yes --cluster-config-file nodes-node-4.conf --cluster-node-timeout 10000 --appendonly yes --port 6374
docker create --name redis-node5 --net=host -v /data/redis-data/node5:/data redis --cluster-enabled yes --cluster-config-file nodes-node-5.conf --cluster-node-timeout 10000 --appendonly yes --port 6375
docker create --name redis-node6 --net=host -v /data/redis-data/node6:/data redis --cluster-enabled yes --cluster-config-file nodes-node-6.conf --cluster-node-timeout 10000 --appendonly yes --port 6376
创建redis
容器参数解释:
--net=host
容器和宿主机共用网络 不需要再做端口映射-v
创建容器数据卷--cluster-enabled
:是否启动集群,选值:yes 、no
--cluster-config-file
配置文件.conf :指定节点信息,自动生成--cluster-node-timeout
毫秒值: 配置节点连接超时时间--appendonly
是否开启持久化,选值:yes、no
--port
端口
启动容器
docker start redis-node1 redis-node2 redis-node3 redis-node4 redis-node5 redis-node6
组建 Redis 集群
- 进入任一容器内部, 这里以 redis-node1 实例为例
docker exec -it redis-node1 /bin/bash
- 执行组件集群的命令,localhost替换成实际的主机ip,也可以不替换。
redis-cli --cluster create localhost:6371 localhost:6372 localhost:6373 localhost:6374 localhost:6375 localhost:6376 --cluster-replicas 1
--cluster-replicas 1
: 参数后面的数字表示的是主从比例,这里的1
,表示1
个主节点对应1
个从节点。上面创建了6
个reids
容器,所以主从分配就是3
个主节点,3
个从节点。
如果 --cluster-replicas 2
呢?那么主从比例就是 1:2
,也就是1
个主节点对于应 2
个从节点。
- 组建成功,进入redis查看一下集群节点信息:
//连接客户端
redis-cli -c -p 6371
-c 代表集群模式
-p 代表进入6371端口
//集群节点信息
cluster nodes
Redis Cluster
主从模式
redis cluster
为了保证数据的高可用性,加入了主从模式,一个主节点
对应一个或多个从节点
,主节点提供数据存取
,从节点则是从主节点拉取数据备份
,当这个主节点挂掉后
,就会有这个从节点
选取一个来充当主节点,从而保证集群不会挂掉。
至此redis集群搭建完毕。
测试集群数据
- 插入一个字符串
- 进入不同的redis容器,打开客户端,获取插入的值
可以获取到test
的值,并且说明了数据的信息来源。
添加节点
添加从节点:
当创建了3个主节点,3个从节点以后。redis集群不够用的情况下,主节点可以再次添加从节点,进行扩容。
- 创建并启动容器redis-node7
docker create --name redis-node7 --net=host -v /data/redis-data/node7:/data redis --cluster-enabled yes --cluster-config-file nodes-node-7.conf --cluster-node-timeout 10000 --appendonly yes --port 6377
docker start redis-node7
- 执行添加从节点 组建集群的命令
localhost
替换成实际主机ip
redis-cli --cluster add-node localhost:6377 localhost:6371 --cluster-slave --cluster-master-id e883411231bbc5e4e542b435f9950e6f6c580904
#注意语法,一个新节点IP:端口 空格 一个旧节点IP:端口,注意点是:
#1.不能多个新节点一次性添加
#2.新节点后是旧节点
#3.如果设置--cluster-slave,新节点挂在旧节点下的一个从节点
#4.如果设置 --cluster-master-id <arg> ,arg设置旧节点的id,具体可以使用cluster nodes查看各个节点的id
- 查看节点信息
添加主节点
- 创建并启动容器redis-node8
docker create --name redis-node8 --net=host -v /data/redis-data/node7:/data redis --cluster-enabled yes --cluster-config-file nodes-node-7.conf --cluster-node-timeout 10000 --appendonly yes --port 6378
docker start redis-node8
- 进入redis-node8
docker exec -it redis-node8 /bin/bash
- 添加节点
redis-cli --cluster add-node localhost:6378 localhost:6371
上面只是把6378
节点加入了集群中,但是并没有分配slot
,所以这个节点并没有真正的开始分担集群工作。
- 分配槽点
redis-cli --cluster reshard localhost:6378 --cluster-from e883411231bbc5e4e542b435f9950e6f6c580904,565d4a2be6859f7b700f7d01df52bb6e9f5ac180, 793efcf5eef483bbb87e2e1d299b4f05ff5c35de --cluster-to 0a8161a8c20389df8183ad00fc78cff07574a2b2 --cluster-slots 1024
#参数解释
#--cluster-from:表示slot目前所在的节点的主节点ID,多个ID用逗号分隔,参与分配的主节点
#--cluster-to:表示需要新分配节点的节点ID(6378的id)
#--cluster-slots:分配的slot数量
#根据提示键入yes 向集群添加主节点完成
#Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384
- 查看节点信息
服务搭建好了。
相关指令
-
redis-cli --cluster create [ip/port ,ip/port] --cluster-replicas n
- 组件集群的命令
- n: 参数后面的数字表示的是主从比例
-
redis-cli -c -p [port]
- 进入redis节点
- -c 代表集群模式
- -p 代表进入端口
-
cluster nodes
- 节点信息
-
redis-cli --cluster add-node [新节点ip:port] [旧主节点ip:port] --cluster-slave --cluster-master-id [id]
- 加入一个节点
- –cluster-slave,新节点挂在旧节点下的一个从节点(不加这个,加入一个主节点)
- cluster-master-id ,arg设置旧节点的id
-
redis-cli --cluster reshard [待分配的主节点ip:port] --cluster-from [参与分配的主节点id] --cluster-to [待分配的主节点id] --cluster-slots [分配个数]
- –cluster-from:表示slot目前所在的节点的主节点ID,多个ID用逗号分隔
- –cluster-to:表示需要新分配节点的节点ID
- –cluster-slots:分配的slot数量
-
redis-cli del-node [ip:port] [id]
- 移除节点
-
帮助指令
- redis-cli --cluster help
- 打开redis客户端,输入
cluster help