Linux下Docker 初体验 - redis主从同步

安装

安装环境要求:

目前,CentOS 仅发行版本中的内核支持 Docker。

  • Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
  • Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

使用yum安装步骤:

➜ uname -r    // 查看你当前的内核版本
3.10.0-123.9.3.el7.x86_64

➜ yum -y install docker    // 安装 Docker
...
Complete!

➜ service docker start    // 启动 Docker 后台服务
Redirecting to /bin/systemctl start  docker.service

➜ docker version  或  docker info  // 查看docker版本,验证是否安装成功

➜ sudo docker run hello-world // 验证docker是否安装成功并在容器中

redis主从复制

安装redis镜像

➜ docker search redis // docker中查看redis镜像
➜ docker pull redis:latest //  拉取最新版本redis
➜ docker images //  安装成功后,可以查看到 docker.io/redis

创建宿主机 redis 容器的数据和配置文件目录

# 这里我们在 /home/docker 下创建
➜ mkdir /home/docker/redis/{conf,data} -p
➜ cd /home/docker/redis

# 获取 redis 的默认配置模版
# 这里主要是想设置下 redis 的 log / password / appendonly
# redis 的 docker 运行参数提供了 --appendonly yes 但没 password
➜ wget https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf -O conf/redis.conf
# 绑定IP修改为IP列表或全部IP,否则会导致主从同步失败
➜ sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' conf/redis.conf

redis-master.conf配置

➜ cp conf/redis.conf conf/redis-master.conf
➜ sed -i 's/logfile ""/logfile "access.log"/' conf/redis-master.conf
➜ sed -i 's/# requirepass foobared/requirepass 123456/' conf/redis-master.conf
➜ sed -i 's/appendonly no/appendonly yes/' conf/redis-master.conf

创建redis-master容器

➜ docker run \
-p 6500:6379 \
-v $PWD/data:/data \
-v $PWD/conf/redis-master.conf:/etc/redis/redis.conf \
--privileged=true \
--name redis-master \
-d redis redis-server /etc/redis/redis.conf

/****************** 命令分解 ******************/
docker run \
-p 6500:6379 \ // 端口映射,`宿主机:容器`
-v $PWD/data:/data \ // 映射数据目录 rw 为读写,`宿主目录:容器目录`
-v $PWD/conf/redis-master.conf:/etc/redis/redis.conf \ // 映射配置文件
--privileged=true \ // 给与一些权限
--name redis-master \ // 给容器起个名字
-d redis redis-server /etc/redis/redis.conf // deamon 运行容器 并使用配置文件启动容器内的 redis-server

redis-slave.conf配置

/* 配置redis-slave.conf */
➜ cp conf/redis.conf conf/redis-slave.conf
➜ sed -i 's/logfile ""/logfile "access.log"/' conf/redis-slave.conf
➜ sed -i 's/# requirepass foobared/requirepass 123456/' conf/redis-slave.conf
➜ sed -i 's/appendonly no/appendonly yes/' conf/redis-slave.conf

/* 查看redis master 的内部 ip */
➜ docker inspect redis-master // 或redis-master的ContainerID
"NetworkSettings": {
            ...
            "Ports": {
                "6379/tcp": [ // 端口号
                    {
                        "HostIp": "0.0.0.0",  // 允许全部外部IP访问
                        "HostPort": "6500" // 宿主机对应的端口号
                    }
                ]
            },
            ...
            "Gateway": "172.17.0.1",
            "IPAddress": "172.17.0.3", // IP
            "IPv6Gateway": "",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",  // IP
                    ...
                }
            }
        }

/* 修改redis-slave.conf,增加下列配置 */
# 主地址
➜ vim conf/redis-slave.conf
➜ slaveof    // slaveof mymaster 6379
# 主认证
➜ masterauth  // masterauth 123456

创建redis-slave-1容器

➜ docker run \
-p 6501:6379 \
-v $PWD/data:/data \
-v $PWD/conf/redis-slave.conf:/etc/redis/redis.conf \
--privileged=true \
--name redis-slave-1 \
--link redis-master:mymaster \
-d redis redis-server /etc/redis/redis.conf

特别注意:

  • 创建从容器时,增加 --link redis-master:mymaster参数,其中redis-master是主容器真实名称,mymaster是主容器在从容器中的别名
  • slaveof mymaster 6379 主容器的IP使用别名表示,防止docker重启IP变化导致错误。

shell登陆容器内测试redis

/* redis master 添加一个值 */
➜ docker exec -it redis-master redis-cli -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name "test master..."
OK
127.0.0.1:6379> get name
"test master..."

/* redis slave 查询已添加值是否同步 */
➜ docker exec -it redis-slave-1 redis-cli -p 6379
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get name
"test master..."
  • 如果主从不同步,请检查 redis master 的 bind 和 protected-mode 的设置,看下有没有监听内网地址,否则 redis-slave 没办法通过 redis master 的地址做数据同步
  • --link 带来的容器启动顺序问题
  • 如果数据要保持强一致性,读数据只能通过主服务器完成。

关于redis主从补充

单个Redis实例1秒只能处理100个命令,当读请求的重要性明显高于写请求且读请求数量远远超出一台redis服务器读处理范围时,需要添加更多从服务器来处理读请求。从服务器也可以拥有自己的从服务器(主从链);然而,主主不能复制。
随着负载不断上升,主服务器可能无法快速更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。为了缓解这个问题,可以创建一个由Redis主从节点组成的中间层来分担主服务器的复制工作。


Redis主从复制树示例,树的中间层有3个帮助开展复制工作的服务器,底层有9个从服务器

参考

Docker基本概念讲解 - 掘金
Docker 官网
Docker安装部署redis
Docker 常用命令

你可能感兴趣的:(Linux下Docker 初体验 - redis主从同步)