当前位置: 首页 > news >正文

基于Docker搭建Redis主从

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1,宿主机器上创建目录 (前两个目录主、从机器都需要)

mkdir -p /storage/docker/redis/datafile
mkdir -p /storage/docker/redis/log
mkdir /root/build_redis

 

2,编写Dockerfile

cd /root/build_redis
vi Dockerfile

如下内容:

FROM ubuntu:latest

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r redis && useradd -r -g redis redis

RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
wget \
&& rm -rf /var/lib/apt/lists/*

# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true

ENV REDIS_VERSION 3.2.8
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.8.tar.gz
ENV REDIS_DOWNLOAD_SHA1 6780d1abb66f33a97aad0edbe020403d0a15b67f

# for redis-sentinel see: http://redis.io/topics/sentinel
RUN set -ex \
\
&& buildDeps=' \
gcc \
libc6-dev \
make \
' \
&& apt-get update \
&& apt-get install -y $buildDeps --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
\
&& wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& rm redis.tar.gz \
\
# Disable Redis protected mode [1] as it is unnecessary in context
# of Docker. Ports are not automatically exposed when running inside
# Docker, but rather explicitely by specifying -p / -P.
# [1] https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da
&& grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h \
&& sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h \
&& grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h \
# for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"
# see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840
# (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)
\
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
\
&& rm -r /usr/src/redis \
\
&& apt-get purge -y --auto-remove $buildDeps

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

EXPOSE 6379
CMD [ "redis-server" ]

 

3,编写docker-entrypoint.sh:

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
chown -R redis .
exec gosu redis "$0" "$@"
fi

exec "$@"

 

4,创建redis镜像

将上述Dockerfile和docker-entrypoint.sh放到同样路径下,执行
docker build -t redis .

 

5,编辑redis master端的配置参数文件(说明:这里设置的默认密码是redis1234,按需修改。 从库的设置也一样。)

vi  /storage/docker/redis/redis_master.conf

daemonize no
pidfile /var/run/redis.6379.pid
port 6379
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
# unixsocket /data/datafile/redis.sock
# unixsocketperm 755
timeout 300
tcp-keepalive 60
loglevel notice
logfile /data/log/redis.log
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
databases 16
# save ""
# save 900 1
# save 300 10
# save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/datafile
# slaveof <masterip> <masterport>
# masterauth <master-password>
masterauth redis1234
slave-serve-stale-data yes
slave-read-only yes
# repl-ping-slave-period 10
repl-timeout 600
repl-disable-tcp-nodelay no
repl-backlog-size 64mb
# repl-backlog-ttl 3600
slave-priority 100
# min-slaves-to-write 3
# min-slaves-max-lag 10
requirepass redis1234
# rename-command CONFIG ""
maxclients 10000
maxmemory 4G
maxmemory-policy noeviction
# maxmemory-samples 3
appendonly no
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1024mb
lua-time-limit 5000
slowlog-log-slower-than 20000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 8192mb 4096mb 600
client-output-buffer-limit pubsub 32mb 8mb 60
aof-rewrite-incremental-fsync yes
# include /path/to/local.conf
# include /path/to/other.conf

 

 

6,启动redis主实例(说明:我们应用端连接的是宿主机器ip+6401端口,安全起见,不建议使用默认端口6379)

docker run --name m_redis -v /storage/docker/redis:/data -p 6401:6379 -d redis redis-server /data/redis_master.conf

 

7,在主库宿主机将redis镜像save,传输到从库宿主机器然后load进去

主库宿主机器:

docker save -o redis.image redis

scp redis.image core@192.168.17.62:/tmp/.

 

ssh登录从库宿主机器:

docker load -i /tmp/redis.image

 

8,编辑redis slave端的配置参数文件(说明:从库开启bgsave和aof,主库不开。)

vi  /storage/docker/redis/redis_slave.conf

daemonize no
pidfile /var/run/redis.6379.pid
port 6379
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
# unixsocket /data/datafile/redis.sock
# unixsocketperm 755
timeout 300
tcp-keepalive 60
loglevel notice
logfile /data/log/redis.log
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
databases 16
# save ""
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/datafile
slaveof MASTERIP 6379
masterauth redis1234
slave-serve-stale-data yes
slave-read-only yes
repl-ping-slave-period 10
repl-timeout 600
repl-disable-tcp-nodelay no
repl-backlog-size 64mb
repl-backlog-ttl 3600
slave-priority 100
# min-slaves-to-write 3
# min-slaves-max-lag 10
requirepass redis1234
# rename-command CONFIG ""
# maxclients 10000
maxmemory 4G
maxmemory-policy noeviction
# maxmemory-samples 3
appendonly yes
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 20000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 8192mb 4096mb 600
client-output-buffer-limit pubsub 32mb 8mb 60
aof-rewrite-incremental-fsync yes
# include /path/to/local.conf
# include /path/to/other.conf

 

 

9,启动从库容器

docker run --name s_redis -v /storage/docker/redis:/data -p 6401:6379 -d redis redis-server /data/redis_slave.conf

 

10,连接到从库容器内部执行主从复制

docker exec -it s_redis /bin/bash
redis-cli
auth redis1234
slaveof 192.168.17.61 6401

 

11,在主库新增一个key,观察是否正常同步到从库。

<end>

转载于:https://my.oschina.net/rocky0202/blog/876096

相关文章:

  • Centos6.5安装lvs+keepalived集群
  • FTP服务系列一FTP的基础知识以及服务器端的配置
  • vsftpd.conf 详解与实例配置
  • swift中UISearchBar的使用
  • MSP项目群管理介绍
  • cmake 添加头文件目录,链接动态、静态库(转载)
  • Phantomjs v.2.1 addCookie()始终返回错误
  • 在shell中编写函数
  • Gartner:自建大数据安全分析平台恐难逃失败厄运!
  • Linux A机器免密码SSH登录B机器
  • Python安装pandas
  • Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
  • 洛谷 1330 封锁阳光大学
  • windows server 安装phpVirtualBox web服务
  • Cmake 使用和交叉编译配置
  • [译]前端离线指南(上)
  • 【node学习】协程
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular Elements 及其运作原理
  • EventListener原理
  • gulp 教程
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • KMP算法及优化
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Node + FFmpeg 实现Canvas动画导出视频
  • Odoo domain写法及运用
  • php中curl和soap方式请求服务超时问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 从0实现一个tiny react(三)生命周期
  • 工作中总结前端开发流程--vue项目
  • 技术胖1-4季视频复习— (看视频笔记)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊sentinel的DegradeSlot
  • 入门到放弃node系列之Hello Word篇
  • 深入浅出Node.js
  • 实现简单的正则表达式引擎
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小李飞刀:SQL题目刷起来!
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • gunicorn工作原理
  • 昨天1024程序员节,我故意写了个死循环~
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core Web APi类库如何内嵌运行?
  • .NET gRPC 和RESTful简单对比
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 反编译_.net反编译的相关问题
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net转前端开发-启航篇,如何定制博客园主题