Docker 实现的 redis 主从

计划用 Docker 实现 Redis 的主从,简单主从而已。主的名称叫 redis-master

一步步来。

先新建个Dockerfile ,从alpine 开始,比较简单。

FROM alpine:latest
MAINTAINER qufo [email protected].com

# 换源
RUN echo ‘http://mirrors.ustc.edu.cn/alpine/edge/main‘ > /etc/apk/repositories
RUN echo ‘@community http://mirrors.ustc.edu.cn/alpine/edge/community‘ >> /etc/apk/repositories
RUN echo ‘@testing http://mirrors.ustc.edu.cn/alpine/edge/testing‘ >> /etc/apk/repositories

RUN apk update

# 修正时区
ENV TIMEZONE Asia/Shanghai
RUN apk add tzdata
RUN ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
RUN echo $TIMEZONE > /etc/timezone

# 修改一些系统设置
RUN echo ‘vm.overcommit_memory = 1‘ >> /etc/sysctl.conf
RUN echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local

# 开始安装 redis
RUN apk add redis
COPY start_redis.sh /usr/local/
RUN chmod +x /usr/local/start_redis.sh
RUN chown redis:redis /usr/local/start_redis.sh

EXPOSE 6379

ENTRYPOINT ["sh","/usr/local/start_redis.sh"]
CMD ["master"]

可以看到,我们还需要一个启动脚本。start_redis.sh

redis_role=$1
sed -i ‘s/protected-mode yes/protected-mode no/g‘ /etc/redis.conf
sed -i ‘s/daemonize yes/daemonize no/g‘           /etc/redis.conf
sed -i ‘s/bind 127.0.0.1/bind 0.0.0.0/g‘          /etc/redis.conf

echo "Start Redis by "
if [ $redis_role = "master" ]; then
    echo "master"
    redis-server /etc/redis.conf
elif [ $redis_role = "slave" ]; then
    echo "slave"
    sed -i ‘s/# slaveof <masterip> <masterport>/slaveof redis-master 6379/g‘ /etc/redis.conf
    redis-server /etc/redis.conf
else
    echo "unknow role!"
fi

这里修改了一些系统配置,然后根据传进来的 role 区别启动主或从模式。其中的主名称是写死了的 redis-master

好了,现在构建,在Dockerfile 和 start_redis.sh 所在的目录下,执行

docker rmi qufo/redis
docker build -t="qufo/redis" .

我们就得到了一个名为 qufo/redis 的 image , 因为采用的是 alpine 的包,所以速度很快,在我的机器上大概7秒就完成了。

通过

docker images

看下镜象的信息,只有9M多些。

好了,现在来启动他们,启运完后检查一下是不是都在。

[email protected]:~$ docker run -d --name=redis-master -p=6379:6379 qufo/redis master
ad7c5a6e16a8d87f04240c7bcb20ef765eab832737f32457e956966a2f282179
[email protected]:~$ docker run -d --name=node1 --link=redis-master:redis-master  -p=7001:6379 qufo/redis slave
8cef160881f59b017cd915775fa3f76d9456b510b300147779fd8ff4ba9f9a2c
[email protected]:~$ docker run -d --name=node2 --link=redis-master:redis-master  -p=7002:6379 qufo/redis slave
767011663ef8b93b5326bd4f9940762922ee4a685278806d42b8ce690164de48
[email protected]:~$ docker run -d --name=node3 --link=redis-master:redis-master  -p=7003:6379 qufo/redis slave
6c4bb442d5adb6773301bac29e6a7a5b1f636d47c67dc21c9ec0ec28cf988602
[email protected]:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
6c4bb442d5ad        qufo/redis          "sh /usr/local/start_"   38 seconds ago       Up 37 seconds       0.0.0.0:7003->6379/tcp   node3
767011663ef8        qufo/redis          "sh /usr/local/start_"   48 seconds ago       Up 47 seconds       0.0.0.0:7002->6379/tcp   node2
8cef160881f5        qufo/redis          "sh /usr/local/start_"   57 seconds ago       Up 56 seconds       0.0.0.0:7001->6379/tcp   node1
ad7c5a6e16a8        qufo/redis          "sh /usr/local/start_"   About a minute ago   Up About a minute   0.0.0.0:6379->6379/tcp   redis-master

可以看到有一主(redis-master)多从 node1,node2,node3。

现在来试一下,在主里 set ,从里 get

# 利用映射出来的端品直接连 redis-master
[email protected]:~/$ redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:3
slave0:ip=172.17.0.3,port=6379,state=online,offset=239,lag=0
slave1:ip=172.17.0.4,port=6379,state=online,offset=239,lag=1
slave2:ip=172.17.0.5,port=6379,state=online,offset=239,lag=1
master_repl_offset:239
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:238
127.0.0.1:6379> set username qufo
OK
127.0.0.1:6379> get username
"qufo"
127.0.0.1:6379> exit
# 可见 为 master 模式,在里面设置和 username
# 通过 7001 连接 node1
[email protected]:~/$ redis-cli -p 7001
127.0.0.1:7001> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:327
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:7001> get username
"qufo"
127.0.0.1:7001> set username nothing
(error) READONLY You can‘t write against a read only slave.
127.0.0.1:7001> exit
[email protected]:~/$
# 可见为 slave 模式,可以 get username ,但不能 set username 因为slave 是只读的。

好吧,主从配置完成。

时间: 2024-11-01 22:18:35

Docker 实现的 redis 主从的相关文章

docker 配置redis主从配置 集群 正式部署

转至 平凡的学生族发表于后端技术 在这篇文章中: 前言 环境 目录 0.确立计划 1. 运行master容器 2. 编写redis.conf 3. 解决WARNING THP 4. 解决WARNING somaxconn 5. 最终的docker run 最后 参考 前言 在正式部署前,你可以先阅读前置准备,对部署过程中用到的docker.redis操作和配置有一个理解,以防在自己电脑上复现时出错. 我们将在一台windows10机器上运行多个docker容器,配置Redis主从集群. 环境 宿

nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发生单点故障,并且单服务器需要处理所有的请求会导致压力较大. 单台Redis服务器内存容量有限,不易扩展. 第一个问题可以通过Redis主从模式实现单节点的高可用(HA). 从节点(slave)是主节点(master)副本,当主节点(master)宕机后,Redis 哨兵(Sentinel)会自动将从

redis主从集群搭建及容灾部署(哨兵sentinel)

Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主从结构搭建 l  Redis容灾部署(哨兵sentinel) l  Redis常见问题 Redis安装 发行版:CentOS-6.6 64bit 内核:2.6.32-504.el6.x86_64 CPU:intel-i7 3.6G 内存:2G 下载redis,选择合适的版本 [[email protected] software]# wget http:/

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused 在docker中搭建的redis主从集群时,从服务器上的redis日志报错: 32677:S 08 Feb 16:14:38.947 * Connecting to MASTER 172.168.10.70:6379 32677:S 08 Feb 16:14:38.948 * MASTER <-> SLAVE sync started 32677:S 08

redis主从+集群

接上篇-redis基础 说明:docker版本:18.03.0-ce   redis版本: redis-4.0.9 4.redis主从配置 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库. 2.通过redis的复制功能可以很好的实现数据库的读

docker下配置mysql 主从

本机docker下配置mysql主从 首先安装docker mysql容器 $ docker pull mysql:5.6 拉取两个相同版本mysql 分别启动mysql 并设置root用户密码为admin: //主mysql docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql-master -v /Volumes/docker/mysql/my-m.cnf:/etc/mysql/my.cnf -p 3307:3306 mysql:5.

Redis——主从和哨兵机制

一.主从和哨兵机制: 1)主从:配置多态主从服务器,解决高可用问题:一台主服务器对应多台从服务器,从服务器自动拷贝主服务器的数据: 2)哨兵:配置哨兵模式,用于解决主服务器挂掉,需要再次手动配置从服务器作为主服务的操作: 哨兵会自动选择一台数据偏移量最大的从服务器,作为新得主服务器: 二.主从服务器配置: 1)创建两文件夹:分别存放两个服务器得数据卷和配置文件: 2)在配置文件中配置主服务器得密码: masterauth 123456 3)使用docker启动两个容器:分别映射两个端口: doc

Redis主从结构主节点执行写入后wait命令对性能的影响

这里的Redis主从结构可以是简单的主从,sentinel,redis cluster中的主从等. wait命令的作用:此命令将阻塞当前客户端,直到当前Session连接(主节点上)所有的写命令都被传送到指定数据量的slave节点.如果到达超时(以毫秒为单位),则即使尚未完全传送到达指定数量的salve节点,该命令也会返回(成功传送到的节点的个数).该命令将始终返回确认在WAIT命令之前发送的写命令的副本数量,无论是在达到指定数量的副本的情况下,还是在达到超时的情况下.具体说就是:比如对于1主2

redis主从同步原理

redis主从: 作用: 实现数据的实时备份,可用来实现redis的读写分离及redis高可用 主从同步原理: 一主一从环境: 环境:2台redis,一台master一台slave 1,master等待命令进入 2,slave连接master,发送一个sync命令 3,master开始执行BESAVE,并使用缓冲区记录BESAVE之后所执行的所以写命令 4,slave端如果现在有请求进来,可以根据配置项来决定是继续用当前数据做处理客户端的请求还是给客户端返回报错 5,master BESAVE执