使用docker pull命令拉取镜像。
docker pull redis:7.0
在当前目录下创建redisSave目录用来持久化redis的数据。
mkdir redisSave
复制一份 redis 核心配置文件 redis.conf 到宿主机目录/root/redisSave 中。注:/opt/redis下面的redis.conf是之间学习redis基础时就有的。
现在要修改redis.conf文件。包括:
修改完成后保存退出。
docker run --name redis7 \
-v /root/redisSave/redis.conf:/etc/redis/redis.conf \
-v /root/redisSave/data:/data \
-dp 6379:6379 redis:7.0 \
redis-server /etc/redis/redis.conf
结果如下:
这里指定了两个数据卷,其中一个是文件,一个是目录:
-v /root/redisSave/redis.conf:/etc/redis/redis.conf
-v /root/redisSave/data:/data
对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为挂载点目录/etc/redis 中的 redis.conf。
通过 docker exec 命令进入 Redis 容器后,就可通过 redis-cli 客户端连接上这个 Redis,然后执行 Redis 命令了。
现要搭建一个“一主两从”的 Redis 集群。这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 6381、6382、6383。其中,6381 的为 master,另外两个为 slave。
现仍在前面的/root/redisSave 目录中完成配置。复制 redis.conf 并重命名为 redis6381.conf,并在文件最后添加如下配置,以对外宣布当前 redis 的 IP 与端口。注意,该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号。
# 在redis6381.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6381
同理,再复制并修改 redis6382.conf。
# 在redis6382.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6382
同理,再复制并修改 redis6383.conf。
# 在redis6383.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6383
现在宿主机的/root/redisSave目录的内容如下:
启动master:
docker run --name redis-master \
-v /root/redisSave/redis6381.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6381:/data \
-dp 6381:6379 redis:7.0 \
redis-server /etc/redis/redis.conf
结果如下所示:
接下来就是启动两个slave,需要注意:在启动 slave 的命令中需要指出其 slaveof 于谁。
docker run --name redis-slave1 \
-v /root/redisSave/redis6382.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6382:/data \
-dp 6382:6379 redis:7.0 \
redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 6381
结果如下所示:
接下来还剩最后一个slave。
docker run --name redis-slave2 \
-v /root/redisSave/redis6383.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6383:/data \
-dp 6383:6379 redis:7.0 \
redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 6381
结果如下:
查看这三个容器节点的 info replication,可以看到它们间的主从关系已经建立。
可以看到master和slave之间的关系没有问题。现在插入数据进行测试。
发现数据测试也没问题,master节点可读可写,slave节点只能读。
主从集群存在的问题是,其容灾方式只能采用冷处理
方案,无法在生产中使用。所以,这里要搭建一个“一主两从三哨兵”的高可用集群,以达到热处理
的容灾方案。
对于“一主两从”集群,仍使用前面的即可。下面直接搭建三个 Sentinel 节点的集群。这三个容器的端口号都保持默认(26379),但对外暴露出的端口号分别为 26381、26382、26383。
复制 sentinel.conf 文件并重命名为 sentinel26381.conf。仅修改两处:
指定其要监视的 master 及
指定当前 sentinel 对外宣布的 IP 与端口号。其中 IP 为 docker 宿主机的 IP,端口号为其对外暴露的端口号。
# 下面配置的数字 2 有两层含义。
# 第一层:当master节点宕机后,还剩两个节点,这两个节点要有过半数量的节点认为master宕机,才会被判定为master客观宕机。
# 第二层:在master宕机后,在三个sentinel节点中,有一个会成为leader,成为leader的条件就是要有过半数量的sentinel认为某个sentinel能当上leader。
sentinel monitor redis-master 192.168.11.10 6381 2
sentinel announce-ip 192.168.11.10
sentinel announce-port 26381
同理,再复制并修改 sentinel26382.conf。内容如下:
sentinel monitor redis-master 192.168.11.10 6381 2
sentinel announce-ip 192.168.11.10
sentinel announce-port 26382
同理,再复制并修改 sentinel26383.conf。内容如下:
sentinel monitor redis-master 192.168.11.10 6381 2
sentinel announce-ip 192.168.11.10
sentinel announce-port 26383
现在宿主机的/root/redisSave目录的内容如下:
启动三个 sentinel 容器。命令如下:
# sentinel1的启动
docker run --name sentinel1 \
-v /root/redisSave/sentinel26381.conf:/etc/redis/sentinel.conf \
-dp 26381:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf
# sentinel2的启动
docker run --name sentinel2 \
-v /root/redisSave/sentinel26382.conf:/etc/redis/sentinel.conf \
-dp 26382:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf
# sentinel3的启动
docker run --name sentinel3 \
-v /root/redisSave/sentinel26383.conf:/etc/redis/sentinel.conf \
-dp 26383:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf
需要注意的是,这里的master节点的名字是redis-master
,所以sentinel文件中所有的master名字要和其保持一致。运行完成后查看运行的容器如下:
并且还可以通过sentinel查看集群的关系等信息。
为了验证高可用性,现将充当 master 的容器 redis-master 停掉。
此时,再查看另外两个 redis 容器的状态数据,发现 redis-slave1 成为了 redis-slave2 的 slave,即 redis-slave2 成为了新的 master。
此时再次将 redis-master 容器启动(docker start redis-master)。并查看 redis-master 的状态数据,发现其成为了 redis-slave2 的 slave。
Redis 集群的每个节点中的保存的数据都是相同的。而 Redis 分布式系统的节点中存放的数据可以是不同的。当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点。
下面要搭建一个三主三从的 Redis 分布式系统。
序号 | 角色 | 容器名称 | 网络模式 | 暴露地址 |
---|---|---|---|---|
1 | master | redis1 | host | 192.168.192.101:6381 |
2 | master | redis2 | host | 192.168.192.101:6382 |
3 | master | redis3 | host | 192.168.192.101:6383 |
4 | slave | redis4 | host | 192.168.192.101:6384 |
5 | slave | redis5 | host | 192.168.192.101:6385 |
6 | slave | redis6 | host | 192.168.192.101:6386 |
在/root 中 mkdir 一个名称为 cluster 的目录,并将前面的配置文件/root/redisSave/redis.conf复制到这里。也就是 cluster 目录下要有一个redis.conf文件。接下来需要复制六份 redis.conf 文件。复制 redis.conf 为 redis1.conf,并在其中将下面两个配置前的注释符号去掉
。这两项配置,一个是用于开启 cluster 功能,即分布式系统功能;一个是指定其需要的配置文件名称。
cluster-enabled yes
cluster-config-file nodes-6379.conf
然后再以 redis1.conf 为模板复制出 5 份,分别为 redis2.conf、redis3.conf、redis4.conf、redis5.conf、redis6.conf。这 6 份配置文件内容完全相同
。完成后cluster目录内容如下:
启动 6 个 Redis 容器。命令如下:
# 启动redis1
docker run --name redis1 --network host \
-v /root/cluster/redis1.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6381:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6381
# 启动redis2
docker run --name redis2 --network host \
-v /root/cluster/redis2.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6382:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6382
# 启动redis3
docker run --name redis3 --network host \
-v /root/cluster/redis3.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6383:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6383
# 启动redis4
docker run --name redis4 --network host \
-v /root/cluster/redis4.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6384:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6384
# 启动redis5
docker run --name redis5 --network host \
-v /root/cluster/redis5.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6385:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6385
# 启动redis6
docker run --name redis6 --network host \
-v /root/cluster/redis6.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6386:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6386
启动完成后使用 docker ps --format “table {{.ID}}\t{{.Names}}\t{{.Status}}” 命令查看状态等信息。如下所示:
6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6个节点创建为一个分布式系统。–cluster-replicas 1 指定每个 master 会带有一个 slave 副本。命令如下:
docker exec -it redis1 redis-cli --cluster create --cluster-replicas 1 192.168.11.10:6381 192.168.11.10:6382 192.168.11.10:6383 192.168.11.10:6384 192.168.11.10:6385 192.168.11.10:6386
输入命令再回车后即可看到一个计划日志,输入yes,就能把集群搭建完成。
通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。