[转帖]docker 搭建 redis 伪分布式集群

docker,搭建,redis,分布式,集群 · 浏览次数 : 0

小编点评

1. **生成 json 数据** ```json { "data": "root@14ab3c0d0f9a:/data#", "command": "redis-cli 127.0.0.1:6379" } ``` 2. **生成命令** ```json { "data": "root@7d830a49430a:/data#", "command": "redis-cli 127.0.0.1:6379" } ``` 3. **生成脚本** ```bash { "data": "root@14ab3c0d0f9a:/data#", "command": "redis-cli 127.0.0.1:6379", "output": "redis-slave1.out" } ``` 4. **生成镜像** ```json { "data": "root@14ab3c0d0f9a:/data#", "command": "redis-cli 127.0.0.1:6379", "output": "redis-slave1.out", "dockerImage": "redis:latest" } ``` 5. **删除 redis 容器** ```bash { "data": "root@7d830a49430a:/data#", "command": "redis-cli 127.0.0.1:6379", "output": "redis-slave2.out", "dockerImage": "redis:latest" } ``` 6. **删除 redis 资源目录** ```bash { "data": "root@14ab3c0d0f9a:/data#", "command": "redis-cli 127.0.0.1:6379", "output": "redis-master.out", "dockerImage": "redis:latest" } ``` 7. **删除 redis 镜像** ```json { "data": "root@14ab3c0d0f9a:/data#", "command": "docker rmi redis", "output": "redis-master.out" } ```

正文

https://www.jianshu.com/p/453a2d70a5de

 

建议阅读方式

可前往语雀阅读,体验更好:docker 搭建 redis 伪分布式集群

背景介绍

该实验主要来源于《Docker 容器与容器云 第2版》一书的 2.3 节:“搭建你的第一个 Docker 应用栈”中的一小步,搭建一个 redis 的一主双从的伪分布式集群

但书中的示例,在配置主、从 redis 实例的配置文件 redis.conf 时,漏掉了一个参数:bind 0.0.0.0,该参数在配置文件中的默认值为:bind 127.0.0.1,导致按书中步骤使用 docker 搭建 redis 的伪分布式集群时,主从之间无法同步数据

本文将按照,我优化过的实验步骤,介绍如何使用 docker 搭建 redis 伪分布式集群

环境说明

阿里云 centos 云主机一台:

 

docker 相关信息:

 

搭建架构

使用 docker 搭建一主双从的 redis 伪分布式集群,使用 redis 的 slaveof <master_ip> <master_port> 命令完成 redis 的主从复制,结构图如下:

 

如果是一个真正的分布式架构集群,还需要处理容器的跨主机通信问题,这里不做介绍

鉴于是在同一个宿主机完成 redis 伪分布式集群的搭建,只需要完成容器互联来实现容器间的通信即可,这里采用 docker run 命令的 --link 选项来建立容器间的互联关系

介绍下 --link 选项:

  • 通过 --link 选项能够进行容器间安全的相互通信
  • 使用格式为 name:alias
  • 可在一个 docker run 命令中重复使用该参数

通过 --link 选项,可以避免容器的 IP 和端口暴露到外网所导致的安全问题,还可以防止容器在重启后 IP 地址变化导致的访问失效

它的原理类似 DNS 服务器的域名和地址映射,当容器的 IP 地址发生变化时,Docker 将自动维护映射关系中的 IP 地址,在容器内的 /etc/hosts 文件中会体现上述映射关系

搭建步骤

1. 下载 redis 镜像,并下载镜像对应版本的 redis 压缩包

下载最新版 redis 镜像:

docker pull redis
 

找到 redis 镜像对应的 redis.tar.gz 压缩包:

docker history --no-trunc redis | grep -i tar.gz
 

将 redis-6.0.10.tar.gz 下载到指定目录 /usr/local/jsj 中:

mkdir -p /usr/local/jsj && cd /usr/local/jsj && curl -O http://download.redis.io/releases/redis-6.0.10.tar.gz
 

解压 redis-6.0.10.tar.gz,得到与 redis 镜像匹配的 redis.conf 配置文件:

tar xzf redis-6.0.10.tar.gz
 

2. 复制两份 redis.conf,作为 master, slave 的配置文件

复制 redis-master.conf:

cp redis-6.0.10/redis.conf ./redis-master.conf

redis-master.conf 修改如下参数:

daemonize yes
pidfile /var/run/redis.pid
bind 0.0.0.0

复制 redis-slave.conf(两台 redis):

cp redis-6.0.10/redis.conf ./redis-slave.conf

redis-slave.conf 修改如下参数:

daemonize yes
pidfile /var/run/redis.pid
bind 0.0.0.0
slaveof master 6379

3. 先后分别启动 1 台 redis-master, 2 台 redis-slave 容器

启动 redis-master 容器(单独开一个 terminal 操作):

# 启动 redis-master 容器,并进入该容器
docker run -it --name redis-master -v /usr/local/jsj/redis-master.conf:/usr/local/bin/redis.conf redis /bin/bash

# 在容器内,启动 redis-server 进程
/usr/local/bin/redis-server /usr/local/bin/redis.conf
 

启动 redis-slave1 容器(单独开一个 terminal 操作):

# 启动 redis-slave1 容器,并进入该容器
docker run -it --name redis-slave1 -v /usr/local/jsj/redis-slave.conf:/usr/local/bin/redis.conf --link redis-master:master redis /bin/bash

# 在容器内,启动 redis-server 进程
/usr/local/bin/redis-server /usr/local/bin/redis.conf
 

启动 redis-slave2 容器(单独开一个 terminal 操作):

# 启动 redis-slave1 容器,并进入该容器
docker run -it --name redis-slave2 -v /usr/local/jsj/redis-slave.conf:/usr/local/bin/redis.conf --link redis-master:master redis /bin/bash

# 在容器内,启动 redis-server 进程
/usr/local/bin/redis-server /usr/local/bin/redis.conf
 

4. 数据测试,验证主从复制

在 redis-master 容器中,连接上 redis-server,进行数据写入:

root@14ab3c0d0f9f:/data# redis-cli 
127.0.0.1:6379> set master jsj
OK
127.0.0.1:6379> get master
"jsj"
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.6,port=6379,state=online,offset=372,lag=1
slave1:ip=172.17.0.7,port=6379,state=online,offset=372,lag=1
master_replid:7eb1e8150916a477ff171bd0ab79bdff6bd002fe
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:372
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:372
127.0.0.1:6379> 
 

在两台 redis-slave 容器中,连接上 redis-server,进行数据查询(这里展示 redis-slave1):

root@7d830a49430a:/data# redis-cli 
127.0.0.1:6379> get master
"jsj"
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:372
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:7eb1e8150916a477ff171bd0ab79bdff6bd002fe
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:372
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:372
127.0.0.1:6379> 
 

从数据测试结果得知,一主双从的 redis 伪分布式集群已搭建完毕

环境复原

为了方便操作 json 数据,主机上已安装 jq rpm,jq 是一个操作 json 数据非常方便的命令行工具

1. 删除 redis-slave1 容器

# 删除 redis-slave1
a=$(docker inspect redis-slave1 | jq -r '.[].Mounts[1].Source') && echo ${a}
docker rm -f redis-slave1

# 删除 redis-slave1 的宿主机默认 bind 目录
cd ~ && rm -rfv ${a} && unset a
 

2. 删除 redis-slave2 容器

# 删除 redis-slave2
a=$(docker inspect redis-slave2 | jq -r '.[].Mounts[1].Source') && echo ${a}
docker rm -f redis-slave2

# 删除 redis-slave2 的宿主机默认 bind 目录
cd ~ && rm -rfv ${a} && unset a
 

3. 删除 redis-master 容器

# 删除 redis-master
a=$(docker inspect redis-master | jq -r '.[].Mounts[1].Source') && echo ${a}
docker rm -f redis-master

# 删除 redis-master 的宿主机默认 bind 目录
cd ~ && rm -rfv ${a} && unset a
 

4. 删除 redis 资源目录:/usr/local/jsj

rm -rfv /usr/local/jsj

5. 删除 redis 镜像

docker rmi redis

与[转帖]docker 搭建 redis 伪分布式集群相似的内容:

[转帖]docker 搭建 redis 伪分布式集群

https://www.jianshu.com/p/453a2d70a5de 建议阅读方式 可前往语雀阅读,体验更好:docker 搭建 redis 伪分布式集群 背景介绍 该实验主要来源于《Docker 容器与容器云 第2版》一书的 2.3 节:“搭建你的第一个 Docker 应用栈”中的一小步,

[转帖]一文搞懂不同方式Redis集群搭建

https://bbs.huaweicloud.com/blogs/380521 【摘要】 1 实验环境准备 1.1 构建Redis的Docker镜像[root@iZ2ze4m2ri7irkf6h6n8zoZ redis]# docker pull redis[root@iZ2ze4m2ri7irk

【转帖】通过docker配置DNS服务

https://blog.whsir.com/post-3185.html 在办公室开发人员经常会测试所写的页面,每次都要输入对应的IP地址或者更改hosts,为了让开发大爷省心,不如搭建一个dns服务,将所需要测试的网页直接解析成域名,让开发大爷自己选域名,想用啥就用啥,我这里通过docker配置

[转帖]Flannel 环境搭建与分析

https://switch-router.gitee.io/blog/flanenl/ 介绍 Flannel是CoreOS团队针对Kubernates设计的跨主机容器网络解决方案, 它可以使集群中不同节点上运行的docker容器都具有全集群唯一的虚拟IP地址。 举个例子,在一个由3台主机节点组成系

[转帖]Flannel 环境搭建与分析

https://switch-router.gitee.io/blog/flanenl/ 介绍 Flannel是CoreOS团队针对Kubernates设计的跨主机容器网络解决方案, 它可以使集群中不同节点上运行的docker容器都具有全集群唯一的虚拟IP地址。 举个例子,在一个由3台主机节点组成系

[转帖]docker容器跨主机网络overlay

https://www.cnblogs.com/machangwei-8/p/15757120.html 目录 拉取镜像,运行容器 浏览器上访问Consul 修改host1,host2的docker daemon配置文件 创建网络 验证 在overlay中运行容器 运行 查看一下这两个网卡 查看生成

[转帖]Docker容器跨主机通信overlay网络的解决方案

https://www.jb51.net/article/237838.htm 一、Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一

[转帖]docker多主机网络方案

http://t.zoukankan.com/bethal-p-6046816.html 本文探讨Docker多主机网络的性能。 在过去的博文里,我测试过 Docker的网络 。 MySQL服务器团队 提供了他们自己的结果,和我的观察是一致的。 本文里一系列的测试,想更多关注使用多主机的Docker

[转帖]docker进阶教程之dockerfile优化镜像大小

https://www.jb51.net/hack/ 同样功能的镜像,但是不同的Dockerfile build出来的镜像大小是不一样的,下面这篇文章主要给大家介绍了关于docker进阶教程之dockerfile优化镜像大小的相关资料,需要的朋友可以参考下 + 目录 一、无优化构建镜像 1 2 3

[转帖]Docker镜像最佳实践

https://www.zhihu.com/people/trumandu-95/posts 5条最佳建议 1.仅安装产线需要依赖与软件 镜像尽可能最小原则 仅复制jar/war 使用自定义JRE(Java Runtime Environment) 2.使用多阶段构建 FROM maven:3.6.