美文网首页
docker 搭建 redis 伪分布式集群

docker 搭建 redis 伪分布式集群

作者: 南国的小狼 | 来源:发表于2021-01-14 00:45 被阅读0次

    建议阅读方式

    可前往语雀阅读,体验更好: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 伪分布式集群

          本文链接:https://www.haomeiwen.com/subject/ifjmaktx.html