最新消息:

Codis集群的搭建和使用

Linux ipcpu 1868浏览

Codis集群的搭建和使用.md

一、概述

Codis是豌豆荚开源的一款产品,一个分布式Redis解决方案,与官方cluster的纯P2P模式不同,Codis采用的是Proxy-based的方案。
当前的版本是Codis 3.x,使用go语言开发,Codis最大的优点是Proxy代理模式,无需客户端修改。

二、Codis的组件和架构

Codis 3.x 由以下组件组成:

Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。

Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
所有对集群的修改都必须通过 codis-dashboard 完成。
Codis Admin:集群管理的命令行工具。
可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
Codis FE:集群管理界面。
多个集群实例共享可以共享同一个前端展示页面;
通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
Storage:为集群状态提供外部存储。
提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。

其架构图如下,

三、Codis的安装和使用

Codis的二进制代码可以直接从github上下载,建议同时下载一份源码,因为源码内有辅助工具和配置文件。

快速启动

#启动dashboard
./admin/codis-dashboard-admin.sh start
#启动codis-proxy
./admin/codis-proxy-admin.sh start
#启动codis-server
./admin/codis-server-admin.sh start
#启动FE
./admin/codis-fe-admin.sh start

打开浏览器,输入FE服务器的地址,和端口号9090,如下,然后其他的大部分操作都可以在FE界面完成了。

比如,增加proxy节点,增加group,将server加入group,重新分配slot等等。

这里说一下Sentinel节点的增加。
Codis中的Sentinel仍然使用了官方的redis-sentinel程序,版本最好和codis一致,配置文件改动如下

protected-mode no
port 26379
dir "/tmp"
logfile "/var/log/redis/sentinel.log"

启动之后,在FE界面添加进去就可以了。

四、Codis的高可用

dashboard作为管理端,通过RESTFul接口去管理proxy,dashboard的数据存放在zookeeper或者etcd中,需要注意的是,dashboard启动以后会获取一个zookeeper锁,因此只能启动一个,这里会有个疑惑,dashboard会不是一个单点呢?确实是个单点,但是proxy仅在启动之初和有管理操作变更时才需要dashboard,平时不需要dashboard。实际测试总发现, 即使dashboard挂掉的情况,proxy也会根据sentinel中的信息,实现主从切换。因此dashboard这个服务写个定时脚本检查,发现挂掉后拉起即可。

FE作为前端程序,可以通过zookeeper寻找dashboard服务器列表。无需高可用保障,只涉及管理用途,平时没什么作用。可以写个脚本定时检查拉起即可,同dashboard。

proxy作为代理入口,是无状态的,其数据由dashboard来保证一致性(启动之初会拉取数据,有管理变更dadhboard会通知proxy)。proxy可以任意扩展,前端也可以加上负载均衡,或者proxy之间启用keepalived。

group一般是由一主一从,或者一主多从的server构成,group组内的高可用通过redis的Sentinel来实现自动切换。

参考资料

https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md
https://www.jianshu.com/p/7edd0bd2df28

转载请注明:IPCPU-网络之路 » Codis集群的搭建和使用