1、Redis 单机版安装
1.1 拉取 Redis
首先从 docker hub 拉取 Redis 镜像,这里拉取 7.0 版。
docker pull redis:7.0
1.2 创建数据卷目录
首先要在宿主机/root 目录中创建一个目录 redis,将来用于存放外挂文件 redis.conf。
mkdir redis
使用rz命令上传一份redis.conf:
rz
1.3 修改 redis.conf
修改配置文件:
vim redis.conf
1.解除 IP 绑定
将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定。
2.关闭保护模式
关闭保护模式,否则只能本机访问自己。
3.指定持久化目录
这里要指定 RDB 或 AOF 的持久化目录为/data,这样无论是哪种持久化文件,均会保存
到该目录。后面会指定容器中的/data 目录为数据卷挂载点目录。
1.4 启动 Redis 容器
docker run --name myredis \ -v /root/redis/redis.conf:/etc/redis/redis.conf \ -v /root/redis/data:/data \ -dp 6379:6379 \ redis:7.0 \ redis-server /etc/redis/redis.conf
这里指定了两个数据卷,其中一个是文件,一个是目录:
- /root/redis/redis.conf:/etc/redis/redis.conf
- /root/redis/data:/data
对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为
挂载点目录/etc/redis 中的 redis.conf。
查看运行的docker的镜像:
docker ps -a
1.5 进入容器连接 Redis
通过 docker exec 命令进入 Redis 容器后,就可通过 redis-cli 客户端连接上这个 Redis,然后执行 Redis 命令了。
docker exec -it myredis /bin/bash
redis-cli
到此为止,单机版的redis搞定啦!!!!
2、Redis 一主两从集群搭建
现要搭建一个“一主两从”的 Redis 集群。这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 6381、6382、6383。其中,6381 的为 master,另外两个为 slave。
2.1 复制三份 redis.conf
现仍在前面的/root/redis 目录中完成配置。复制 redis.conf 并重命名为 redis1.conf,并在文件最后添加如下配置,以对外宣布当前 redis 的 IP 与端口。注意,该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号。
复制 redis.conf 并重命名为 redis1.conf
cp redis.conf redis1.conf
修改redis1.conf
vim redis1.conf
最后加上两句语句如下:
slave-announce-ip 192.168.162.105 slave-announce-port 6381
同理redis2.conf redis3.conf 如下:
slave-announce-ip 192.168.162.105 slave-announce-port 6382
slave-announce-ip 192.168.162.105 slave-announce-port 6383
2.2 启动 master
首先启动 master,即启动 myredis-1 容器。
docker run --name myredis-1 \ -v /root/redis/redis1.conf:/etc/redis/redis.conf \ -v /root/redis/data/6381:/data \ -dp 6381:6379 \ redis:7.0 \ redis-server /etc/redis/redis.conf
2.3 启动 两个redis slave
在启动 slave 的命令中需要指出其 slaveof 于谁。
启动myredis-2:
docker run --name myredis-2 \ -v /root/redis/redis2.conf:/etc/redis/redis.conf \ -v /root/redis/data/6382:/data \ -dp 6382:6379 \ redis:7.0 \ redis-server /etc/redis/redis.conf --slaveof 192.168.162.105 6381
启动myredis-3:
docker run --name myredis-3 \ -v /root/redis/redis3.conf:/etc/redis/redis.conf \ -v /root/redis/data/6383:/data \ -dp 6383:6379 \ redis:7.0 \ redis-server /etc/redis/redis.conf --slaveof 192.168.162.105 6381
2.4 三者关系查看
查看这三个容器节点的 info replication,可以看到它们间的主从关系已经建立。
docker exec -it myredis-1 redis-cli info replication
docker exec -it myredis-2 redis-cli info replication
docker exec -it myredis-3 redis-cli info replication
2.5 数据测试
在 master 节点 myredis-1 中写入数据。
docker exec -it myredis-1 /bin/bash redis-cli set name tigerhhzz11 set name tigerhhzz11
这里可以新开一个连接窗口进行测试
在 slave 节点 myredis-2 与 myredis-3 节点中可读出数据。
3、Redis 高可用集群搭建
主从集群存在的问题是,其容灾方式只能采用冷处理方案,无法在生产中使用。所以,这里要搭建一个“一主两从三哨兵”的高可用集群,以达到热处理的容灾方案。对于“一主两从”集群,仍使用前面的即可。下面直接搭建三个 Sentinel 节点的集群。这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 26381、26382、26383。
3.1 复制三份 sentinel.conf
复制 sentinel.conf 文件并重命名为 sentinel1.conf。仅修改两处:
- 指定其要监视的 master 及。
- 指定当前 sentinel 对外宣布的 IP 与端口号。其中 IP 为 docker 宿主机的 IP,端口号为其
对外暴露的端口号。
修改sentinel1.conf
vim sentinel1.conf
sentinel monitor mymaster 192.168.162.105 6381 2 sentinel announce-ip 192.168.162.105 sentinel announce-port 26381
同理,再复制并修改 sentinel2.conf。
```bash sentinel monitor mymaster 192.168.162.105 6381 2 sentinel announce-ip 192.168.162.105 sentinel announce-port 26382
同理,再复制并修改 sentinel3.conf。 ```bash ```bash sentinel monitor mymaster 192.168.162.105 6381 2 sentinel announce-ip 192.168.162.105 sentinel announce-port 26383
3.2 启动 sentinel
启动三个 sentinel 容器。
docker run --name mysentinel-1 \ -v /root/redis/sentinel1.conf:/etc/redis/sentinel.conf \ -dp 26381:26379 \ redis:7.0 \ redis-sentinel /etc/redis/sentinel.conf
docker run --name mysentinel-2 \ -v /root/redis/sentinel2.conf:/etc/redis/sentinel.conf \ -dp 26382:26379 \ redis:7.0 \ redis-sentinel /etc/redis/sentinel.conf
docker run --name mysentinel-3 \ -v /root/redis/sentinel3.conf:/etc/redis/sentinel.conf \ -dp 26383:26379 \ redis:7.0 \ redis-sentinel /etc/redis/sentinel.conf
3.3 关系查看
docker exec -it mysentinel-1 redis-cli -h 192.168.162.105 -p 26381 info sentinel
以上命令的查看结果说明 sentinel 对 master 的监视成功,说明高可用集群搭建成功。连接任何一个 sentinel 容器节点查看到的信息与上面的都是相同的。
3.4 故障转移测试
为了验证高可用性,现将充当 master 的容器 myredis-1 停掉。
docker stop myredis-1
此时,再查看另外两个 redis 容器的状态数据,发现 myredis-2 成为了 myredis-3 的 slave,
即 myredis-3 成为了新的 master。
docker exec -it myredis-2 redis-cli info replication
docker exec -it myredis-3 redis-cli info replication
此时再次 myredis-1 容器启动。
docker start myredis-1
再查看 myredis-1 的状态数据,发现其成为了 myredis-3 的 slave。
4、Redis 分布式系统搭建
Redis 集群的每个节点中的保存的数据都是相同的。而 Redis 分布式系统的节点中存放的数据可以是不同的。当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点。
下面要搭建一个三主三从的 Redis 分布式系统。
序号 | 角色 | 容器名称 | 网络模式 | 暴露地址 |
1 | master | myredis-cluster-1 | host | 192.168.162.105:6381 |
2 | master | myredis-cluster-2 | host | 192.168.162.105:6382 |
3 | master | myredis-cluster-3 | host | 192.168.162.105:6383 |
4 | slave | myredis-cluster-4 | host | 192.168.162.105:6384 |
5 | slave | myredis-cluster-5 | host | 192.168.162.105:6385 |
6 | slave | myredis-cluster-6 | host | 192.168.162.105:6386 |
4.1 准备目录与配置文件
在/root 中 mkdir 一个名称为 cluster 的目录,并将前面的配置文/root/redis/redis.conf
复制到这里。
[root@docker ~]# mkdir cluster [root@docker ~]# cd cluster [root@docker cluster]# cp /root/redis/redis.conf redis.conf [root@docker cluster]# ll
4.2 复制六份 redis.conf
复制 redis.conf 为 redis1.conf,并在其中将下面两个配置前的注释去掉。这两项配置,一个是用于开启 cluster 功能,即分布式系统功能;一个是指定其需要的配置文件名称。
cp redis.conf redis1.conf vim redis1.conf
然后再以 redis1.conf 为模板复制出 5 份,分别为 redis2.conf、redis3.conf、redis4.conf、redis5.conf、redis6.conf。这 6 份配置文件内容完全相同。
[root@docker cluster]# ll 总用量 108 -rw-r--r--. 1 root root 106667 11月 4 17:24 redis1.conf [root@docker cluster]# cp redis1.conf redis2.conf [root@docker cluster]# cp redis1.conf redis3.conf [root@docker cluster]# cp redis1.conf redis4.conf [root@docker cluster]# cp redis1.conf redis5.conf [root@docker cluster]# cp redis1.conf redis6.conf [root@docker cluster]# ll 总用量 756 -rw-r--r--. 1 root root 106667 11月 4 17:28 redis1.conf -rw-r--r--. 1 root root 106667 11月 4 17:28 redis2.conf -rw-r--r--. 1 root root 106667 11月 4 17:28 redis3.conf -rw-r--r--. 1 root root 106667 11月 4 17:28 redis4.conf -rw-r--r--. 1 root root 106667 11月 4 17:28 redis5.conf -rw-r--r--. 1 root root 106667 11月 4 17:28 redis6.conf -rw-r--r--. 1 root root 106667 11月 4 17:24 redis.conf [root@docker cluster]#
4.3 启动 redis
启动前先删除所有运行的容器:
docker rm -f $(docker ps -qa)
启动 6 个 Redis 容器。
docker run --name myredis-1 --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
docker run --name myredis-2 --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
docker run --name myredis-3 --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
docker run --name myredis-4 --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
docker run --name myredis-5 --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
docker run --name myredis-6 --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
4.4 创建系统
6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6个节点创建为一个分布式系统。–cluster replicas 1 指定每个 master 会带有一个slave 副本。
docker exec -it myredis-1 /bin/bash redis-cli --cluster create --cluster-replicas 1 192.168.162.105:6381 192.168.162.105:6382 192.168.162.105:6383 192.168.162.105:6384 192.168.162.105:6385 192.168.162.105:6386
回车后即可看到如下的计划日志:
键入 yes 后再回车,即可按照上面的计划完成系统创建。
4.5 查看节点信息
通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。
查看6383集群节点信息:
redis-cli -c -p 6383 cluster nodes
看到connected,就说明成功了搭建了三主三从的redis集群!!!(完毕)