Redis集群模式cluster部署实践学习
知识回顾:
通过对Redis中的String的命令做了充分的讲解以及实践学习
通过对Redis中String类型之Bit命令的详解以及Bit命令的实践进行了学习
通过对Redis中的Hash类型以及Hash中常用命令的实践学习
通过对Redis之List类型的详解&List类型中常用命令的实践的学习
通过对Redis之Set类型的详解&Set类型中常用命令的实践的学习
通过对Redis之ZSet类型的详解&ZSet类型中常用命令的实践的学习
通过对Redis中消息的发布和订阅以及命令的实践学习
通过对Redis中事务Multi命令及监控键值Watch命令的实践学习
通过对Redis持久化原理之快照版本RDB的学习
通过对Redis持久化原理之AOF(Append Only File)的学习
通过对Redis主从复制原理以及搭建一主俩从集群实践的学习
通过对Redis一主(master)二从(slave)复制及哨兵模式实践学习
接下来的学习任务:
接下来我们要学习的内容是:Redis集群模式cluster部署实践学习。
Redis中String类型内容请看这里呦:
【Redis之String类型的详解&String类型中常用命令的实践】
Redis中String类型是Bit命令内容请看这里呦:
【Redis中String类型之Bit命令的详解&Bit命令的实践】
Redis之Hash类型的详解&Hash类型中常用命令的实践请看这里呦:
【Redis之Hash类型的详解&Hash类型中常用命令的实践】
Redis之List类型的详解&List类型中常用命令的实践请看这里呦:
【Redis之List类型的详解&List类型中常用命令的实践】
Redis之Set类型的详解&Set类型中常用命令的实践请看这里呦:
【Redis之Set类型的详解&Set类型中常用命令的实践】
Redis之Zset类型的详解&Zset类型中常用命令的实践请看这里呦:
【Redis之ZSet类型的详解&ZSet类型中常用命令的实践】
Redis中消息的发布和订阅以及命令的实践请看这里呦:
【Redis中消息的发布和订阅】
Redis中事务Multi命令及监控键值Watch命令的实践请看这里呦:
【Redis中事务Multi命令及监控键值Watch命令】
Redis持久化原理之快照版本RDB的学习请看这里呦:
【Redis持久化原理之快照版本RDB】
Redis持久化原理之AOF(Append Only File)的学习请看这里呦:
【Redis持久化原理之AOF(Append Only File)】
Redis主从复制原理以及搭建一主俩从集群实践的学习请看这里呦:
【Redis主从复制原理以及搭建一主master俩从slave集群实践】
Redis一主(master)二从(slave)复制及哨兵模式实践学习请看这有呦:
【Redis一主(master)二从(slave)复制及哨兵模式实践学习】
搭建Redis主节点集群
1、在linux主机上创建相应的目录用于挂载
mkdir -p /mydata/redis_cluster/node1/data #集群一
mkdir -p /mydata/redis_cluster/node2/data #集群二
mkdir -p /mydata/redis_cluster/node3/data #集群三
2、创建集群
创建集群一
docker create --name redis-node1 -v /mydata/redis_cluster/node1/data/:/data -p 6382:6379 redis --cluster-enabled yes --cluster-config-file redis-node1.conf
启动集群一:
docker start redis-node1
创建集群二
docker create --name redis-node2 -v /mydata/redis_cluster/node2/data/:/data -p 6383:6379 redis --cluster-enabled yes --cluster-config-file redis-node2.conf
启动集群二:
docker start redis-node2
创建集群三
docker create --name redis-node3 -v /mydata/redis_cluster/node3/data/:/data -p 6384:6379 redis --cluster-enabled yes --cluster-config-file redis-node3.conf
启动集群三:
docker start redis-node3
3、查看集群信息
docker ps
4.注意三个集群的IP和端口信息
1、IP信息
三个Redis集群在Docker容器中被重新分配了IP信息
1)先看redis-node1容器被分配的IP地址
docker inspect redis-node1
2)再看redis-node2容器被分配的IP地址
docker inspect redis-node2
3)再看redis-node3容器被分配的IP地址
docker inspect redis-node3
2、 端口信息
在做端口映射时,我们已经指明了端口映射的具体情况,通过查看上面的命令我们也可以看到具体的端口情况
redis-node1对外的端口是6382,但是在自己docker分配IP下的端口还是6379
redis-node2对外的端口是6383,但是在自己docker分配IP下的端口还是6379
redis-node3对外的端口是6384,但是在自己docker分配IP下的端口还是6379
4、集群搭建
执行组建集群命令(请根据自己的ip信息进行拼接)
[root@VM-4-9-centos ~]# docker exec -it redis-node1 redis-cli --cluster create 172.17.0.7:6379 172.17.0.8:6379 172.17.0.10:6379 --cluster-replicas 0
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: b0541541646c447640925ec94c5decd4a831e34b 172.17.0.7:6379
slots:[0-5460] (5461 slots) master
M: eb1772430c567c2f7ea1820e333122d235d4d5fc 172.17.0.8:6379
slots:[5461-10922] (5462 slots) master
M: 0e204c5bd09ad71bab137aea3c2723f3de5acd0d 172.17.0.10:6379
slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 172.17.0.7:6379)
M: b0541541646c447640925ec94c5decd4a831e34b 172.17.0.7:6379
slots:[0-5460] (5461 slots) master
M: 0e204c5bd09ad71bab137aea3c2723f3de5acd0d 172.17.0.10:6379
slots:[10923-16383] (5461 slots) master
M: eb1772430c567c2f7ea1820e333122d235d4d5fc 172.17.0.8:6379
slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@VM-4-9-centos ~]#
5、测试集群
启动redis,要以redis-cli -c命令启动,-c代表启动集群的意思。
在集群一中set username psx
[root@VM-4-9-centos ~]# docker exec -it redis-node1 redis-cli -c
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set username psx
-> Redirected to slot [14315] located at 172.17.0.10:6379
OK
172.17.0.10:6379>
在集群二中get username
[root@VM-4-9-centos ~]# docker exec -it redis-node2 redis-cli -c
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> get username
-> Redirected to slot [14315] located at 172.17.0.10:6379
"psx"
172.17.0.10:6379>
在集群三中get username
[root@VM-4-9-centos ~]# docker exec -it redis-node3 redis-cli -c
127.0.0.1:6379> keys *
1) "username"
127.0.0.1:6379> get username
"psx"
127.0.0.1:6379>
通过上面我们已经部署好了Redis集群,但是存在一些问题,我们来分析一下
这种集群有个问题,就是这些ip是在一个docker下的,所以只能在一台服务器才可以成功,所以我们需要使用Redis部署在不同ip地址下的方式来进行集群的搭建。这个问题我们后续补充解决。
解决方案:
解决方案是让Docker使用 host模式 的网络连接类型,Docker在使用host模式下创建的容器是没有自己独立的网络命名空间的,是跟物理机共享一个网络空间,进而可以共享物理机的所有端口与IP,这样就可以让公共网络直接访问容器了,尽管这种方式有安全隐患,但目前来说还没找到其他可行性模式。
通过上面我们搭建了Redis的主节点集群,但是无法体现集群中的主从关系,所以,接下来我们来搭建一下Redis的主从集群,安排!
搭建Redis主从节点集群(3主3从)
1.创建 6 个 Redis 容器
redis-node1:6382
redis-node2:6383
redis-node3:6384
redis-node4:6385
redis-node5:6386
redis-node6:6387
2.创建对应的要挂在的目录结构
mkdir -p /mydata/redis_cluster/node1/data
mkdir -p /mydata/redis_cluster/node2/data
mkdir -p /mydata/redis_cluster/node3/data
mkdir -p /mydata/redis_cluster/node4/data
mkdir -p /mydata/redis_cluster/node5/data
mkdir -p /mydata/redis_cluster/node6/data
3.创建容器的具体执行命令
# 启动节点1
docker create --name redis-node1 --net host -v /data/redis_cluster/node1/data:/data redis --cluster-enabled yes --cluster-config-file redis-node1.conf --port 6382
# 启动节点2
docker create --name redis-node2 --net host -v /data/redis_cluster/node2/data:/data redis --cluster-enabled yes --cluster-config-file redis-node2.conf --port 6383
# 启动节点3
docker create --name redis-node3 --net host -v /data/redis_cluster/node3/data:/data redis --cluster-enabled yes --cluster-config-file redis-node3.conf --port 6384
# 启动节点4
docker create --name redis-node4 --net host -v /data/redis_cluster/node4/data:/data redis --cluster-enabled yes --cluster-config-file redis-node4.conf --port 6385
# 启动节点5
docker create --name redis-node5 --net host -v /data/redis_cluster/node5/data:/data redis --cluster-enabled yes --cluster-config-file redis-node5.conf --port 6386
# 启动节点6
docker create --name redis-node6 --net host -v /data/redis_cluster/node6/data:/data redis --cluster-enabled yes --cluster-config-file redis-node6.conf --port 6387
4.查看启动中的集群
部分参数解释:
- –cluster-enabled:是否启动集群,选值:yes 、no
- –cluster-config-file 配置文件.conf :指定节点信息,自动生成
- –cluster-node-timeout 毫秒值: 配置节点连接超时时间
- –appendonly:是否开启持久化,选值:yes、no
5.组建 Redis 集群
进入任意一个 Redis 实例:
# 这里以 redis-node1 实例为例
docker exec -it redis-node1 /bin/bash
执行组件集群的命令:
# 这里以 redis-node1 实例为例
# 组建集群,x.x.x.x为当前物理机的ip地址
redis-cli --cluster create x.x.x.x:6382 x.x.x.x:6383 x.x.x.x:6384 x.x.x.x:6385 x.x.x.x:6386 x.x.x.x:6387 --cluster-replicas 1
成功启动,三主三从。
6.集群命令讲解
redis-cli --cluster create x.x.x.x:6382~6387 --cluster-replicas 1
最重要的就是这个参数 --cluster-replicas 1,参数后面的数字表示的是主从比例,比如这里的 1 表示的是主从比例是 1:1,什么概念呢?
也就是 1 个主节点对应几个从节点,现有 6 个实例,所以主从分配就是 3 个 master 主节点,3 个 slave 从节点。
如果 --cluster-replicas 2 呢?
那么主从比例就是 1:2,也就是 1 个主节点对于应 2 个从节点。
即:3(master) + 6(slave) = 9个 Redis 实例。
如果不足 9个 Redis 实例,但是参数指定为 2 会怎么样?
提示非常清楚,Redis集群至少需要3个主节点。那么从节点就需要有6个,所以最后说:至少需要9个节点。
但是我想4个主节点,2个从节点,这总怎么实现呢?
四个节点按照之前的流程启动,参数设置为0--cluster-replicas 0,剩下的两个从节点需要我们手动添加。
添加节点的命令:
redis-cli --cluster add-node x.x.x.x:6383 x.x.x.x:6379 --cluster-slave --cluster-master-id 启动后的容器id
好了,到这里【Redis集群模式主节点集群(3实例)以及主从模式集群(6实例)部署实践学习】就学习完毕了,中间有一个小的知识点【docker下redis三个主节点是共享一个docker的ip地址的,只能在一台服务器才可以成功】后面我会专门写一篇文档解决它,敬请期待!!!