本文以技术栈Redis为例,列举并解释了一些面向Docker进行应用程序开发和系统搭建中所需要注意的问题和技巧,以及Caicloud平台在Docker管理和帮助企业应用向Docker转化中的作用。由于应用程序千差万别,应用场景层出不穷,本文仅起到抛砖引玉的作用。
我们总结基于Docker的Redis组件的使用注意事项如下:
Redis的外部存储挂载
Persistence被开启:无论是RDB还是AOF模式,都会需要在硬盘上进行存储。以RDB为例,会自动存在本地硬盘一个叫dump.rdb的文件。如果没有挂载外部存储,这些数据在docker销毁后会消失。
主从设置下Replication对硬盘的需求:在Redis 2.8以前,Master与Slave的同步需要用存储(硬盘)作为中间媒介(自2.8此同步可不经过硬盘,但还属于试验内容)。在Docker环境下需要挂载Volume以保证这个步骤能正常运行。
Redis不能跑在daemonize的模式
Docker的容器需要其中的主进程一直在前端运行,使用daemonize的模式会使得container在运行后立即退出。幸运的是在Redis的配置文件中daemonize模式默认被关闭。如需运行daemon模式,应该在docker层面通过-d命令来进行。
Redis的日志文件目录应置为空
Docker的容器所产生的日志会被系统自动接收和管理;同时Caicloud的集群管理平台更会监测和聚合系统中所有容器的日志。因此在配置文件中将logfile设为空会享受Docker和Caicloud的自动日志收集和管理。
Redis Snapshot的注意事项
在主从结构下Snapshot应开启:如果在Redis的Master节点上配置了Persistenceoff (数据不会自动存储到硬盘上),那么我们同时还应该关掉Master节点的自动重启功能。由于Caicloud的自动修复功能会重启实效的容器(包括RedisMaster),我们应开启Snapshot功能。
对Persistence的需求:Redis会把Snapshot产生的rdb文件写在指定的目录中。默认情况下这个对应在Docker内部的一个目录,会随着Docker的销毁而销毁。如果有Persistence的需求,应该在生成Dockerfile和运行Redis容器时同时挂载外部的存储。
Redis的端口映射
Docker的容器在运行时默认会将容器内的应用端口映射成一个随机的主机端口,但这样会打破一些Redis服务。比如sentinel需要根据默认端口规则 (26379) 来进行自动发现。因此在Docker下运行Redis一定要使用 –p port:port的格式来明确使用默认的Redis端口规则。
Redis主从结构中的Master节点的发现
在主从结构中,从节点(slave)需要在配置文件中使用Master节点的IP,来实现与Master节点的互连。传统架构中这个IP可以预先通过静态绑定。在Caicloud体系中,系统不需要静态绑定具体的IP地址,而是可以通过DNS动态地发现,并通过运行Docker时的CMD命令来使用特定的脚本将Master IP动态添加到配置中。
多个Redis集群共存的情况
Caicloud下不会出现两个Redis Cluster混为一起(https://www.oschina.net/news/67037/container-redis-accident)的情况,因为Caicloud的独特网络特性(扁平化,每个机器有自己的网段)。如例子中提到的两个Redis 集群混在一起需要如下条件:
在某一个物理机上运行来自两个Redis 集群的server 实例(from cluster A and cluster B);
在两个Redis 集群中存在两个server 实例(from cluster A and cluster B)碰巧有同样的IP(在纯Docker环境下有可能,因为每个主机上的Docker会随机分配网段和IP)
在Caicloud环境下,每个Redis server都会被分配一个不同的IP,每两个Redis server 的IP必定不相同(每个机器有自己的网段,所以不同机器上的Docker在给container分配地址的时候不会撞车)。
(如果需要转载,请联系我们哦,尊重知识产权人人有责)