Codis是由Wandou Labs(豌豆荚团队)开发的开源工具,用于解决在大数据环境下使用Redis所面临的挑战。Codis将多个Redis实例组织起来,形成一个统一的数据访问层,从而提供了高可用和分布式的特性,使得Redis能够更好地处理大数据和高并发的场景。
Codis的功能是基于Redis构建的。Redis是一种内存数据库,用于存储键值对数据。然而,当数据量或并发请求数量增长时,单个Redis实例可能会遇到性能瓶颈。Codis通过在多个Redis实例之间进行数据分片,解决了这个问题。另外,Codis还提供了一些其他的高级功能,如数据迁移、故障恢复等。
codis server:基于redis进行了二次开发的组件,负责数据的读写 codis proxy:面向客户端,代理客户端访问codis
server zookeeper 集群:保存元数据,如数据路由表信息,codis proxy信息 codis dashboard,codis
fe:codis dashboard提供维护codis server,codis proxy等功能,codis
fe提供web界面,方便管理人员使用。
通俗的理解Codis可以被视为一个强大的Redis集群解决方案,它提供了更多的功能,并且允许开发者以相似的方式操作Redis实例。在大规模数据处理和高并发环境下,Codis相对于单个Redis实例,可以提供更好的性能和扩展性。
release binary文件安装
如果是重要的生产环境使用,尽量不要选择alpha、rc版本。 根据自己的部署平台,选择相应的文件下载即可。
参考这里
安装完成后可以运行下列命令进行检测:
$ go version
go version go1.7.3 linux/amd64
注意 $GOPATH
是本机所有第三方库 go 项目所在目录,Codis 仅是其中之一。
添加 $GOPATH/bin
到 $PATH
,例如:PATH=$PATH:$GOPATH/bin
。
$ go env GOPATH
/home/codis/gopath
Codis 源代码需要下载到 $GOPATH/src/github.com/CodisLabs/codis
:
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-3.2.8/
... ...
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-fe ./cmd/fe
$ ls bin/
total 69124
drwxr-xr-x 4 codis codis 4096 Jan 4 14:55 assets
-rwxr-xr-x 1 codis codis 17600752 Jan 4 14:55 codis-admin
-rwxr-xr-x 1 codis codis 18416320 Jan 4 14:55 codis-dashboard
-rwxr-xr-x 1 codis codis 9498040 Jan 4 14:55 codis-fe
-rwxr-xr-x 1 codis codis 11057280 Jan 4 14:55 codis-proxy
-rwxr-xr-x 1 codis codis 4234432 Jan 4 14:55 codis-server
-rw-r--r-- 1 codis codis 148 Jan 4 14:55 version
... ...
$ cat bin/version
version = 2016-01-03 14:53:22 +0800 @51f06ae3b58a256a58f857f590430977638846a3
compile = 2016-01-04 15:00:17 +0800 by go version go1.5.2 linux/amd64
详细参考 https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md
通过web浏览器访问集群管理页面(fe地址:127.0.0.1:9090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUP,NEW GROUP 行输入 1,再点击 NEW GROUP 即可 添加 Codis Server,Add Server 行输入我们刚刚启动的 codis-server 地址,添加到我们刚新建的 Group,然后再点击 Add Server 按钮即可,如下图所示
通过fe初始化slot
新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过 fe 提供的 rebalance all slots 按钮来做,如下图所示,点击此按钮,我们即快速完成了一个集群的搭建。
Codis 3.x 起,开始正式支持 Docker 部署。这就需要 codis-dashboard 以及 codis-proxy 能够外部的 listen 地址暴露出来并保存在外部存储中。
codis-proxy 增加了 --host-admin 以及 --host-proxy 参数;
codis-dashboard 增加了 --host-admin 参数;
以 codis-proxy 的 Docker 为例:
$ docker run --name "Codis-Proxy" -d -p 29000:19000 -p 21080:11080 codis-image \
codis-proxy -c proxy.toml --host-admin 100.0.1.100:29000 --host-proxy 100.0.1.100:21080
codis-proxy 在启动后,会使用 --host-admin 和 --host-proxy 参数所指定的实际地址替换 Docker 内监听的地址,向 codis-dashboard 注册。这样,例如使用 Jodis 的过程中,客户端就能够通过 100.0.1.100:29000 来访问 proxy 实例。
codis-dashboard 也是相同的道理,会使用 --host-admin 地址向外部存储注册,这样 codis-fe 也能通过该地址正确的对 codis-dashboard 进行操作。
具体样例可以参考 scripts/docker.sh。
Codis的架构主要包含以下四个部分:
Proxy:Proxy是Codis的核心组件,它负责请求的路由和负载均衡。用户的请求首先发送到Proxy,然后Proxy将请求转发到相应的Redis实例。
Group:Group是一组Redis实例,它们中的数据是一致的。每个Group含有一个Master节点和多个Slave节点,Master节点负责处理写请求,Slave节点用于处理读请求和故障恢复。
Dashboard:Dashboard是Codis的管理界面,它提供了一系列的管理和监控功能,如数据迁移、节点管理等。
ZooKeeper:Zookeeper是一个开源的分布式协调服务,Codis使用它来存储和同步集群的状态信息。
当一个请求发送到Codis时,以下是其大致的处理流程:
Proxy接收到用户的请求。
Proxy查询Zookeeper,获取到请求应该路由到哪个Group。
Proxy将请求转发到对应Group的Master节点。
Master节点处理请求,并将结果返回给Proxy。
Proxy将结果返回给用户。
Codis支持自动的数据分片,能够将数据在多个Redis实例之间进行均匀分布,这样就可以有效地解决单个Redis实例的性能瓶颈。Codis的分片是基于Redis的Key进行的,每个Key会被哈希到一个Slot中,每个Slot对应一个Redis实例。
在某些场景下,可能需要增加或减少Redis实例数量以应对变化的负载。在这种情况下,Codis提供了数据迁移的功能。可以在Dashboard中方便地管理数据迁移的过程,Codis会自动进行数据的迁移和重分布,而这个过程对应用是透明的。
Codis集群中的每个Redis实例都有一个或多个备份实例,当主实例发生故障时,备份实例可以立即接管请求,保证了服务的持续可用。Codis使用Zookeeper来检测和管理实例的状态,以实现快速的故障恢复。
Codis全面支持Redis的各种命令,包括键值操作、列表操作、集合操作等。可以像使用单个Redis实例一样使用Codis,这极大地降低了使用Codis的学习成本。
Codis支持Redis的分布式锁和发布订阅功能,可以使用这些功能来实现各种复杂的并发控制和事件通知需求。
Codis的高可用性是通过其内部的故障恢复机制实现的。在Codis中,每个Redis实例(Master节点)都会有一个或多个备份实例(Slave节点)。在正常情况下,所有的写请求都会发送到Master节点,而读请求则可以由任何节点来处理。
当Master节点发生故障时,Codis会自动从其备份节点中选举出一个新的Master节点接管服务。这个过程是自动进行的,对于用户来说,除了可能会有短暂的服务中断外,其他的都是透明的。
Codis使用Zookeeper来检测和管理节点的状态,当检测到节点发生故障时,Zookeeper会自动触发故障恢复流程。
当一个节点发生故障后,可以使用Codis提供的工具来恢复它。以下是一个例子:
# 停止故障节点
codis-admin --proxy=proxy_addr --offline
# 修复故障节点
codis-admin --proxy=proxy_addr --online
在这个例子中,proxy_addr
是故障节点的地址。首先需要将故障节点设置为离线状态,然后修复节点后,再将其设置为在线状态。
此外,还可以使用Codis的Dashboard来可视化地管理和监控Codis集群的状态,包括故障恢复等操作。
需要注意的是,Codis的高可用机制并不能保证数据的一致性。如果在Master节点故障期间有写请求,则这些请求可能会丢失。因此,需要根据的应用的需求,选择合适的数据持久化和备份策略。
对比项 | Codis | Redis Cluster |
---|---|---|
可靠性 | 可靠 | 可靠 |
扩容 | 支持 | 支持 |
数据迁移 | 同步迁移,异步迁移 | 同步迁移 |
客户端兼容性 | 兼容 | 不兼容,需要支持Cluster的客户端 |
组件数量 | 多 | 不需要额外组件,只需要Redis实例 |
成本 | 组件多,成本高 | 不需要额外组件,成本低 |
成熟度 | 高 | 低于Codis |
Codis的优势在于可靠性、支持扩容、数据迁移方式的灵活性以及客户端兼容性。而Redis Cluster的优势在于组件少、成本低。
在实际应用中,你可以根据以下几点来选择:
https://blog.csdn.net/wang0907/article/details/128341489