记录使用 docker 容器实现 redis 主从同步和哨兵模式

本贴最后更新于 1770 天前,其中的信息可能已经时移世异

事先准备:

主 master: 172.18.0.3

从 slaver1:172.18.0.4

从 slaver2:172.18.0.5

查看容器 IP 命令:docker inspect 容器 ID

配置启动 docker 的 redis 容器

一般情况下,docker 启动 redis 容器是没有 redis.conf 文件的,所以在这之前我们要先创建好 redis.conf 文件。

我们可以挑选宿主机的任意位置创建

# master [root@VM_0_10_centos ~]# mkdir -p /root/redis_1/{conf,data} [root@VM_0_10_centos ~]# cd /root/redis/conf/ [root@VM_0_10_centos conf]# vim redis.conf # slaver1 [root@VM_0_10_centos ~]# mkdir -p /root/redis_2/{conf,data} [root@VM_0_10_centos ~]# cd /root/redis/conf/ [root@VM_0_10_centos conf]# vim redis.conf # slaver2 [root@VM_0_10_centos ~]# mkdir -p /root/redis_3/{conf,data} [root@VM_0_10_centos ~]# cd /root/redis/conf/ [root@VM_0_10_centos conf]# vim redis.conf

接下来我们要到 redis 的官网找 redis.conf 的内容
redis 官网的 redis.conf 文件,我们可以找对应 redis 版本的 redis.conf 文件,点击打开之后把内容复制到服务器要创建的 redis.conf 里 :wq 保存退出即可。

创建完 redis.conf 文件之后就可以启动 redis 容器了

# master docker run -d --privileged=true -p 6379:6379 -p 26379:26379 -v /root/redis_1/conf/redis.conf:/etc/redis/redis.conf -v /root/redis_1/data:/data --name redis32_master 87856cc39862 redis-server /etc/redis/redis.conf --appendonly yes # slaver1 docker run -d --privileged=true -p 6378:6379 -p 26378:26379 -v /root/redis_2/conf/redis.conf:/etc/redis/redis.conf -v /root/redis_2/data:/data --name redis32_slaver1 87856cc39862 redis-server /etc/redis/redis.conf --appendonly yes # slaver2 docker run -d --privileged=true -p 6377:6379 -p 26377:26379 -v /root/redis_3/conf/redis.conf:/etc/redis/redis.conf -v /root/redis_3/data:/data --name redis32_slaver2 87856cc39862 redis-server /etc/redis/redis.conf --appendonly yes

参数说明:

--privileged=true:容器内的 root 拥有真正 root 权限,否则容器内 root 只是外部普通用户权限

-p 6379:6379 :映射容器 6379 端口到宿主机上

-p 26379:26379:同上,该端口后面实现哨兵模式要用到

-v /root/redis/conf/redis.conf:/etc/redis/redis.conf:映射配置文件

-v /root/redis/data:/data:映射数据目录

redis-server /etc/redis/redis.conf:指定配置文件启动 redis-server 进程

--name redis32:容器名

87856cc39862:image ID,可以用 docker images 查看,用于你要启动哪个容器

--appendonly yes:开启数据持久化

自此 redis 容器就启动了,要实现哨兵模式必须要三台机以上,所以你们可以在本地搭建三台容器,或者有多余的服务器每个服务器搭建一个容器都可以(比较推荐)

实现主从关系

配置 redis.conf 文件

masterredis.conf 文件(其余是默认设置不需要改动)

# 将127.0.0.1改为0.0.0.0,让其他服务器可访问 bind 0.0.0.0 daemonize yes

slaver1redis.conf 文件

# 将127.0.0.1改为0.0.0.0,让其他服务器可访问 bind 0.0.0.0 # 配置master服务器redis的IP地址和端口 slaveof 172.18.0.3 6379

slaver2redis.conf 文件

# 将127.0.0.1改为0.0.0.0,让其他服务器可访问 bind 0.0.0.0 # 配置master服务器redis的IP地址和端口 slaveof 172.18.0.3 6379

配置完之后,重启主从 redis 容器,随后可以测试一下

  1. 主服务器写入,从服务器可以读取到
  2. 从服务器不能写入
172.18.0.3:6379> set name lzl OK 172.18.0.4:6379> get name "lzl" 172.18.0.5:6379> get name "lzl" # 从服务器不能写入 172.18.0.4:6379> set name lzl (error) READONLY You can't write against a read only slave. 172.18.0.5:6379> set nam fdk (error) READONLY You can't write against a read only slave.

实现哨兵模式

sentinel 是哨兵,用于监视主从服务器的运行状况,如果主服务器挂掉,会在从服务器中选举一个作为主服务器。

配置文件如下,文件要创建在容器里,可以到任意目录下创建,这里我是到 docker 宿主机映射的 /etc/redis 目录下创建的文件

容器默认没有 vim 命令,所以我们要自行安装,安装命令如下:

# 这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。如果没有先执行这个命令是没办法安装vim的,包括下面的ps和netstat命令 apt-get update # 安装 vim命令 apt-get install vim

参数说明:

命令:sentinel monitor mymaster 172.18.0.3 6379 1

sentinel monitor:实现哨兵模式的固定句式

mymaster:mymaster 是主节点的别名,可用于配置项目

172.18.0.3 6379:当前 Sentinel 节点监控 172.18.0.3:6379 这个主节点

1:代表判断主节点失败至少需要 1 个 Sentinel 节点节点同意

mastersentinel.conf

[root@VM_0_10_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4a3df36f1c1 87856cc39862 "docker-entrypoint.s…" 18 hours ago Up 17 hours 0.0.0.0:6379->6379/tcp, 0.0.0.0:26379->26379/tcp redis32_master fa7c0e67a80b 87856cc39862 "docker-entrypoint.s…" 35 minutes ago Up 32 minutes 0.0.0.0:26378->26378/tcp, 0.0.0.0:6378->6379/tcp redis32_slaver1 a77a085139a1 87856cc39862 "docker-entrypoint.s…" 19 hours ago Up 57 minutes 0.0.0.0:6377->6379/tcp, 0.0.0.0:26377->26377/tcp redis32_slaver2 [root@VM_0_10_centos ~]# docker exec -it redis32 /bin/bash root@e4a3df36f1c1:/data# cd /etc/redis root@e4a3df36f1c1:/redis# vim sentinel.conf port 26379 # 初次配置时的状态,这个sentinel会自动更新 sentinel monitor mymaster 172.18.0.3 6379 1 daemonize yes # 生成一个日志文件到当前目录下 logfile "./sentinel_log.log"

slaver1sentinel.conf

#同上,参数上面即可,但是port参数不一样,对应docker容器启动命令上开放的端口,我这里master开放的是26379,slaver1是26378,slaver1是26377 [root@VM_0_10_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4a3df36f1c1 87856cc39862 "docker-entrypoint.s…" 18 hours ago Up 17 hours 0.0.0.0:6379->6379/tcp, 0.0.0.0:26379->26379/tcp redis32_master fa7c0e67a80b 87856cc39862 "docker-entrypoint.s…" 35 minutes ago Up 32 minutes 0.0.0.0:26378->26378/tcp, 0.0.0.0:6378->6379/tcp redis32_slaver1 a77a085139a1 87856cc39862 "docker-entrypoint.s…" 19 hours ago Up 57 minutes 0.0.0.0:6377->6379/tcp, 0.0.0.0:26377->26377/tcp redis32_slaver2 [root@VM_0_10_centos ~]# docker exec -it redis32 /bin/bash root@e4a3df36f1c1:/data# cd /etc/redis root@e4a3df36f1c1:/redis# vim sentinel.conf port 26378 # 初次配置时的状态,这个sentinel会自动更新 sentinel monitor mymaster 172.18.0.3 6379 1 daemonize yes logfile "./sentinel_log.log"

slaver2sentinel.conf

#同上,参数上面即可,但是port参数不一样,对应docker容器启动命令上开放的端口,我这里master开放的是26379,slaver1是26378,slaver1是26377 [root@VM_0_10_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4a3df36f1c1 87856cc39862 "docker-entrypoint.s…" 18 hours ago Up 17 hours 0.0.0.0:6379->6379/tcp, 0.0.0.0:26379->26379/tcp redis32_master fa7c0e67a80b 87856cc39862 "docker-entrypoint.s…" 35 minutes ago Up 32 minutes 0.0.0.0:26378->26378/tcp, 0.0.0.0:6378->6379/tcp redis32_slaver1 a77a085139a1 87856cc39862 "docker-entrypoint.s…" 19 hours ago Up 57 minutes 0.0.0.0:6377->6379/tcp, 0.0.0.0:26377->26377/tcp redis32_slaver2 [root@VM_0_10_centos ~]# docker exec -it redis32_slaver2 /bin/bash root@e4a3df36f1c1:/data# cd /etc/redis root@e4a3df36f1c1:/redis# vim sentinel.conf port 26377 # 初次配置时的状态,这个sentinel会自动更新 sentinel monitor mymaster 172.18.0.3 6379 1 daemonize yes logfile "./sentinel_log.log"

文件创建完成之后,启动 sentinel,主从 redis 容器都要进行操作,操作方式一样

root@e4a3df36f1c1:/redis# redis-server sentinel.conf --sentinel

启动完成,进入 reids Shell 操作界面用 info replication 命令查看服务状态
,也可以用 ps 命令,或者 netstat 命令查看是否启动成功

容器默认是没有 ps 和 netstat 命令的,所以我们要自己安装,安装命令如下:

# ps apt-get install procps # netstat apt-get install net-tools

master

root@e4a3df36f1c1:/redis# reids-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=122.51.148.103,port=6379,state=online,offset=197,lag=0 master_repl_offset:197 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:196

slave1

root@e4a3df36f1c1:/redis# reids-cli 127.0.0.1:6379> info replication # Replication role:slave master_host:49.234.200.117 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:253 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

slave2

root@e4a3df36f1c1:/redis# reids-cli 127.0.0.1:6379> info replication # Replication role:slave master_host:49.234.200.117 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:420761 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

最后想要测试哨兵模式是否成功,可以将 master 主机容器 stop,然后等待一会,在 slave1slave2info replication 命令查看 role 有没有由 slave 变成 master,如果其中一台变成 master 则说明成功。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 930 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...