https://github.com/autopilotpattern/redis
Architecture
正在运行的群集包括以下组件:
- Redis :我们使用的是Redis 3.2。
- Redis Sentinel :管理故障转移。
-
ContainerPilot :包含在我们的Redis容器中,以编排引导行为,并使用存储在启动,
health
和backup
处理程序中的Consul中的密钥和检查来协调复制。 - Consul :是我们的服务目录,可与ContainerPilot配合使用,并协助服务发现,复制和故障切换
- Manta :Joyent对象存储,用于安全和耐用地存储我们的Redis备份。
-
manage.sh
:一个小的bash脚本,ContainerPilot会调用来重新引导Redis。
当新的Redis节点启动时
Bootstrapping
onStart
任务作为应用程序启动的一部分运行,而不是来自ContainerPilot的preStart
处理程序,因为Consul代理必须正在运行,并且ContainerPilot直到preStart
才启动协进程。
onStart
执行以下操作:
- 这个容器是否配置为replica? 如是:
- 等待master在服务注册表中变得健康。
- 如果没有健康的master,尝试重新配置为master并重新启动。
- 这个容器是否配置为master? 如是:
- 验证此节点仍应以master身份启动。
- 如果此节点不应为master节点,请重新配置为replica并重新启动。
- 如果没有master,则根据服务注册表中的master或此节点,写入redis和sentinel配置。
- 如果存在,请恢复上次备份。
Maintenance via health
handler
health
执行以下操作:
- Ping redis,验证响应。
- 验证服务配置(master or replica)是否匹配redis的角色(master or slave)。 Sentinel可能已执行故障切换并更改了此节点的角色。 如果更改角色,则需要更新服务注册表,以便将来正确配置任何未来启动的容器。 如果服务配置和角色不匹配,请重新配置以匹配当前角色。
healthSentinel
pings sentinel.
Backups via backup
task
ContainerPilot通过重复的任务调用backup
处理程序。 备份处理程序将:
- 检查redis服务上的备份运行TTL健康检查。
- 如果TTL已过期:
- 通过检查
- 创建一个备份。
- 将备份上传到Manta。
Running the cluster
一旦你的_env
文件设置了配置详细信息 , 只需运行docker-compose up -d
并且在一段时间内,您将拥有运行的Redis主机 , 就可以轻松启动新的集群。 master和replica都被描述为单个docker-compose
服务。 在启动期间, ContainerPilot会询问consul是否已创建现有的master。 如果没有,则节点将初始化为新的master,并且所有将来的节点将通过Sentinel与主节点自配置复制。
运行docker-compose scale redis=3
添加replica 。 replica将自动配置为从master复制,并在准备完成后将自己作为replica注册到consul。 在节点出现故障的情况下,应至少有3个节点拥有法定人数。
Configuration
通过_env
文件传递这些变量。 包含的examples/triton/setup.sh
可用于测试Docker和Triton环境,并对_env
文件中的Manta SSH密钥进行编码。
MANTA_URL
:完整的Manta终结点网址。 (例如https://us-east.manta.joyent.com
)
-
MANTA_USER
:Manta帐户名称。 -
MANTA_SUBUSER
:Manta subuser帐户名称(如果有)。 -
MANTA_ROLE
:Manta角色名称,如果有的话。 -
MANTA_KEY_ID
:Manta帐户/子用户的MD5格式的ssh密钥ID(例如1a:b8:30:2e:57:ce:59:1d:16:f6:19:97:f2:60:2b:3d
) ; 包含的setup.sh
将自动编码 -
MANTA_PRIVATE_KEY
:Manta帐户/ subuser的私人ssh密钥; 包含的setup.sh
将自动编码 -
MANTA_BUCKET
:Manta上存储备份的路径。 (例如/myaccount/stor/manage
); 桶必须已经存在,并可由MANTA_USER
/MANTA_PRIVATE_KEY
这些变量是可选的,但您最有可能希望它们:
-
LOG_LEVEL
:将设置manage.sh
脚本的日志记录级别。 设置为DEBUG
以进行更多日志记录。 -
CONSUL
是要加入的consul实体的主机名。 默认为consul
Where to store data
该模式可自动执行数据管理,并使容器对Docker守护程序和调度程序有效地进行无状态化。 这旨在通过最小化管理数据库所需的外部协调来最大限度地提高方便性和可靠性。 不推荐使用外部卷( --volumes-from
, -v
等)。
在Triton上,不需要使用数据卷,因为通常在Linux中使用覆盖文件系统的性能下降不会发生在ZFS中。
Using an existing database
如果您使用已经包含数据库(具体来说是appendonly.aof文件)的数据目录启动Redis容器实例,则不会以任何方式更改预先存在的数据库。