Redis主从复制(基于docker)的配置和实现原理

2019-09-12 19:04:00 1400 Redis主从复制(基于docker)的配置和实现原理
  • 这篇文章难度很低,但是我为什么还是记录下来呢?因为网络上的技术文章写的相当xxxxxx,作为一个新手,可能要绕很大一个弯子

  • 按照惯例,先贴一份redis配置文件,此处附链接了,为了避免说不是原创 ,redis配置文件

  • 使用docker下载redis镜像 docker pull redis

  • 创建配置文件 1.在我的家目录创建redis目录/home/guofu/redis

2.进入redis目录,先从官网拷贝一份配置文件下来wget http://download.redis.io/redis-stable/redis.conf,然后复制2份

guofu@guofu-Inspiron-3558 redis $ ls
command  redis1.conf  redis2.conf  redis.conf

3.使用redis.conf作为主服务器配置文件,主要修改以下内容

#关闭保护模式
protected-mode no
#使用默认端口6379
port 6379
#允许后台运行
daemonize yes
#可改可不改,如果是在一台机器上面运行,必须修改
pidfile /var/run/redis_6379.pid
#日志文件,自定义
logfile "/var/log/redis/redis_6379.log"
  • 启动一个redis实例吧,先看一下启动命令我再解释
#创建实例
guofu@guofu-Inspiron-3558 redis $ docker run --rm -d -p 16379:6379 --name mredis  \
> -v /home/guofu/redis:/conf  \
> -v  /home/guofu/redis/log/redis:/var/log/redis  \
> -v /home/guofu/redis/data:/data \
> redis  
a1072b562eb6a3e0478d9fc4bccfd322f749a75d50462206fbdcd79abc4efb6b
guofu@guofu-Inspiron-3558 redis $ docker ps -a 
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                                                                                                    NAMES
a1072b562eb6        redis                    "docker-entrypoint.s…"   18 seconds ago      Up 15 seconds               0.0.0.0:16379->6379/tcp     
  • 命令解释 参数: --rm 在容器终止运行后自动删除容器文件 -d 后台运行 -p 6379:6379 端口映射(本机6379端口映射容器6379端口) --name myredis 容器别名 -v /etc/app/redis/conf:/conf 目录映射(本机redis配置文件目录) -v /etc/app/redis/data:/data 目录映射(本机redis数据目录) redis-server /conf/redis.conf --appendonly yes 在容器运行命令,并打开数据持久化
  • 看看这些挂载目录,宿主机都要存在哦,没有的话就创建
  • 进入容器启动redis服务,指定配置文件
guofu@guofu-Inspiron-3558 redis $ docker exec -it a1072b562eb6 bash 
root@a1072b562eb6:/data# /usr/local/bin/redis-server  /conf/redis.conf 

#连接一下客户端
root@a1072b562eb6:/data# /usr/local/bin/redis-cli                      
127.0.0.1:6379> info
#现在主从配置如下
# Replication
role:master
connected_slaves:0
master_replid:3167f202ef2507ed27172915040114d994d3069d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#执行一条命令
127.0.0.1:6379> set name jimi 
OK

  • 关闭客户端链接,查看一下本容器的ip
root@a1072b562eb6:/data# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
#下面这个就是ip啦,记住这个ip
172.17.0.2 a1072b562eb6
  • 主服务器创建完毕,退出,快捷键 ctrl+p+q;

  • 修改redis1.conf作为从服务器配置文件,主要修改以下内容

#关闭保护模式
protected-mode no
#使用端口6371
port 6371
#允许后台运行
daemonize yes
#可改可不改,如果是在一台机器上面运行,必须修改
pidfile /var/run/redis_6371.pid
#日志文件,自定义
logfile "/var/log/redis/redis_6371.log"
#开启从服务模式 ,对应主的ip和端口
replicaof 172.17.0.2 6379
  • 启动redis1.conf
guofu@guofu-Inspiron-3558 bin $  docker run --rm -d -p 16371:6371 --name sredis1  \
> -v /home/guofu/redis:/conf  \
> -v  /home/guofu/redis/log/redis:/var/log/redis  \
> -v /home/guofu/redis/data1:/data \
> redis  
b85b72c43c835946410ff56c82c821825031e276f2ed2f5d20bcb305ac92715a

#进入容器配置
guofu@guofu-Inspiron-3558 bin $ docker exec -it b85b72c43c835946410ff56c82c821 bash 
root@b85b72c43c83:/data# /usr/local/bin/redis-server /conf/redis1.conf 
root@b85b72c43c83:/data# /usr/local/bin/redis-cli -h 127.0.0.1 -p 6371 
127.0.0.1:6371> info
#主从信息如下
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
#获取主服务器刚才设置的name;
127.0.0.1:6371> get name
"jimi"
  • 相同方法启动redis2.conf,不细说,此处说一下如何查看容器内的进程
guofu@guofu-Inspiron-3558 redis $ docker top sredis2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
999                 11447               11415               0                   20:51               ?                   00:00:00            redis-server *:6379
root                11539               11415               0                   20:51               pts/0               00:00:00            bash
root                11580               11447               0                   20:52               ?                   00:00:00            /usr/local/bin/redis-server 127.0.0.1:6371
  • redis2.conf启动效果如下
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:1148
slave_priority:100

127.0.0.1:6372> get name
"jimi"

  • 至此,三台redis部署已经完毕

  • 主从复制的原理剖析,小虫发现已经有朋友总结的很好了,链接贴出 Redis主从复制原理剖析