我们暂时先抛开go语言,咱们说下行业里近两年的哪些技术发展最火,毫无疑问是Docker和Kubernetes,没错,他们是go语言的顶级项目。
作者介绍:邹鹏,腾讯云数据库Redis产品负责人,多年数据库、网络安全研发经验。在网络、计算、存储、安全等领域有深入的研究和丰富的产品化经验。 在Redis、MySQL等数据库的高可用、高可靠和中间件方面有丰富的实践经验。
Codis能够分为clientJodis、代理中间件Codis Proxy、Zookeeper协调、监控界面、Redis定制版Codis Server等组件。这里第一部分主要关注最核心的Proxy部分的源代码。
【转载请注明出处】:https://cloud.tencent.com/developer/article/1636529
一、引言 Codis是一个分布式 Redis 解决方案,可以管理数量巨大的Redis节点。个推作为专业的第三方推送服务商,多年来专注于为开发者提供高效稳定的消息推送服务。每天通过个推平台下发的消息数量可达百亿级别。基于个推推送业务对数据量、并发量以及速度的要求非常高,实践发现,单个Redis节点性能容易出现瓶颈,综合考虑各方面因素后,我们选择了Codis来更好地管理和使用Redis。
此前的文章中,我们介绍了三种 redis 集群和搭建方法。 redis 集群详解及搭建过程
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
Codis主要解决的是redis的扩展和运维问题,因为redis官方以前没有集群方案,自从3.0才有,并且刚开始做的比较弱,特别是运维这块不是很友好,很多都是命令行操作的。我们可以认为Codis是一个可以支持容量可以无限扩大的Redis集群就行。
作为一家数据智能公司,个推不仅拥有海量的关系型数据,也积累了丰富的key-value等非关系型数据资源。个推采用Codis保存大规模的key-value数据,随着公司kv类型数据的不断增加,使用原生的Codis搭建的集群所花费的成本越来越高。
下面分享一下它的基础操作,详细可以参考 官方文档 Tip: 貌似没有自己的版本信息,不过当前的版本基于 Redis 2.8.21 开发的 [root@h101 bin]# ./codis-server --version Redis server v=2.8.21 sha=4a332efd:0 malloc=jemalloc-3.6.0 bits=64 build=569d3bc356356f21 [root@h101 bin]# ---- 概要 ---- 安装Codis 由于 Codis 是基于Go语言
Redis 本身就是最终一致性的。Master 挂了,Promote Slave 成为新的 Master 需要时间(测试15秒内)。其实 Sentinel 就是这个逻辑。Codis3.2 自己没有实现 HA,而是直接依赖 Sentinel 的。
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 背景 在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要有一台服务器可用服务就可用。 redis也是一样,为了解决单机故障引入了主从模式,但主从模式存在一个问题:master节点故障后服务,需要人为的手动将slave节点切换成为maser节点后服务才恢复。redis为解决这一问题又引入了哨兵模式
Google是一家顶尖的创新与大神集结的地方,员工的工作方式也很特别,叫做“20%Time”,即允许工程师拿出20%的时间来研究自己喜欢的项目。比如说语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物,而Go语言也是诞生于此。
在服务开发中,单机都会存在单点故障的问题,即服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要有一台服务器可用服务就可用。
在前面,我们提到了 Redis 集群方案 Redis Cluster,今天我们来聊聊 Redis 另外一种比较受欢迎的集群方案:Codis。
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
添加 Redis Server Group 准备配置文件 [root@h102 codis]# grep -v "^#" extern/redis-2.8.21/redis.conf | grep -v "^$" > /etc/codis/redis_s.conf [root@h102 codis]# grep -v "^#" extern/redis-2.8.21/redis.conf | grep -v "^$" > /etc/codis/redis2.conf [root@h102 codis
可以使用 make gotest 进行测试 (可选操作,非必须) [root@h102 codis]# make gotest GOPATH=`godep path`:$GOPATH go test ./pkg/... ./cmd/... ok github.com/wandoulabs/codis/pkg/models 16.501s ok github.com/wandoulabs/codis/pkg/proxy 9.242s ok github.com/wandoulabs/codis/p
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
近几年,随着互联网的飞速发展,作为程序员,我们需要处理的数据规模也在不断扩大。如果你使用Redis作为数据库时,面临大数据高并发的场景时,单个Redis实例就会显得力不从心。这时Redis的集群方案应运而生,他将众多Redis实例综合起来,共同应对大数据高并发的场景。
选择Go语言的原因可能会有很多,关于Go语言的特性、优势等,我们在之前的文档中也已经介绍了很多了。但是最主要的原因,应该是基于以下两方面的考虑:
直接使用 go get -u -d github.com/wandoulabs/codis 来获取codis源码
比如重读配置文件(将zk端口从2180改为2181),此时dashboard会报错
https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md
启动 codis-proxy [root@h102 codis]# bin/codis-proxy -c config.ini -L /tmp/proxy.log --cpu=2 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 _____ ____ ____/ / (_) _____ / ___/ / __ \ / __ / / / / ___/ / /__ / /_/ / / /_/ / / / (__ ) \___/ \
border="0" width="530" height="96" src="//music.163.com/outchain/player?type=2&id=369265&auto=1&heig
服务端:codis-fe------codis-dashboard------codis-proxy------codis-group------codis-server
Codis使用Go语言开发,它是一个代理中间件,和Redis一样也使用Redis协议对外提供服务,当客户端向Codis发送指令时,Codis负责将指令转发到后面的Redis实例来执行,并将结果返回给客户端
摘要:作为noSql中的kv数据库的王者,redis以其高性能,低时延,丰富的数据结构备受开发者青睐,但是由于redis在水平伸缩性上受限,如何做到能够水平扩容,同时对业务无侵入性是很多使用redis的开发人员都会面临的问题,而redis分布式解决方案的一个开源产品【codis】较好的弥补了这一弱势,本文主要讲解codis是如何做到对业务无感知,平滑迁移,迁移性能高,迁移异常处理,高可用以及常见的redis的避坑指南,虽然codis目前随着公司的nosql产品越来越成熟,生命周期也即将结束,不过鉴于还
准备方案 Golang环境搭建 环境搭建很简单,下载go1.4.2.linux-amd64.tar.gz安装包,直接解压并添加到环境变量就可以。 假设解压到/usr/local/go下,这个目录就是GOROOT,另外需要定义一个go开发目录,假设为/workspace/golang。 go开发目录未来会产生一些主要的子目录: 1. src 存放源码 2. pkg 编译后生成的文件 3. bin 编译后生产的可执行文件(比如godep命令在安装后就会放在这个目录下) 环境变量添加: export GOROOT
这实际上是一种静态分片技术。Redis实例的增减,都得手工调整分片程序。基于此分片机制的开源产品,现在仍不多见。这种方式下,可运维性较差。出现故障,定位和解决都得研发和运维配合着解决,故障时间变长。
ECS:测试实例3台32C128GB规格 REDIS:Redis 4.0—128G集群版16节点
这篇文章会重点讲述Codis Proxy的初始化,即启动的过程,其实也不完全是Codis Proxy的初始化,应该说是Codis面向用户请求链路的初始化,即经过这一系列的初始化,Codis Proxy才能对外提供服务。
Codis 是一个使用Go语言编写的Redis集群代理,是一种 Redis 的分布式集群解决方案,支持管道和动态弹性扩容
近一年来,学习和研究Go语言,断断续续的收集了一些比较优秀的开源项目,这些项目都非常不错,可以供我们学习和研究Go用,从中可以学到很多关于Go的使用、技巧以及相关工具和方法。我把他们整理发出来,大家有兴趣可以根据自己的爱好选择一些进行研究和阅读,提升自己的能力,更好的使用Go语言,开发出更优秀的项目。
检查状态 [root@h102 codis]# ps faux | grep codis | grep -v grep root 35057 1.5 2.5 448184 49352
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
数据持久化本质上是为了做数据备份,有了数据持久化,当Redis宕机时,我们可以把数据从磁盘上恢复回来,但在数据恢复之前,服务是不可用的,而且数据恢复的时间取决于实例的大小,数据量越大,恢复起来越慢。
因为线上多机房,然后有一个机房历史原因使用了Codis,这样就导致开发、QA、线上环境在缓存软件这块有点差异,为了因为这种差异化的东西,导致开发出来的软件对接缓存应用导致不同表现情况的话,线上统一用一个版本的Redis版本避免此问题。
数据持久化本质上是为了做数据备份,有了数据持久化,当Redis宕机时,我们可以把数据从磁盘上恢复回来,但在数据恢复之前,服务是不可用的,而且数据恢复的时间取决于实例的大小,数据量越大,恢复起来越慢。Redis的持久化过程可以参考《Redis持久化是如何做的?》。
随着公司项目的发展,单台redis的性能逐渐达到瓶颈,为了保证业务的正常运行,必须对单台redis进行扩展,组建redis的集群。在这次集群组建的过程中我们采用了豌豆荚开源的codis集群来承接业务需求,通过再开多个实例的方式来分担redis的业务压力。具体的codis集群搭建的过程就不在此赘述,本文主要记录线上redis数据迁移到codis中的过程。
前面我们分析了Codis Proxy的初始化:Codis Proxy初始化篇,今天分析其它部件的初始化,包括Redis Group及Slot的初始化。
如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求。Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的。在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库。
前文回顾 上一篇文章基于redis的分布式锁实现写了基于redis实现的分布式锁。分布式环境下,不会还使用单点的redis,做到高可用和容灾,起码也是redis主从。redis的单线程工作,一台物理机只运行一个redis实例太过浪费,redis单机显然是存在单点故障的隐患。内存资源往往受限,纵向不停扩展内存并不是很实际,因此横向可伸缩扩展,需要多台主机协同提供服务,即分布式下多个Redis实例协同运行。 在之前的文章Redis Cluster深入与实践介绍过Redis Cluster的相关内容,之前特地花
1. Redis常见集群技术 长期以来,Redis本身仅支持单实例,内存一般最多10~20GB。这无法支撑大型线上业务系统的需求。而且也造成资源的利用率过低——毕竟现在服务器内存动辄100~200GB。 为解决单机承载能力不足的问题,各大互联网企业纷纷出手,“自助式”地实现了集群机制。在这些非官方集群解决方案中,物理上把数据“分片”(sharding)存储在多个Redis实例,一般情况下,每一“片”是一个Redis实例。 包括官方近期推出的Redis Cluster,Redis集群有三种实现机制,分别介绍如
部署Codis集群 启动zookeeper服务 配置 zookeeper [root@h101 zookeeper-Standalone]# grep -v "^#" conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper dataLogDir=/tmp/zookeeper clientPort=2180 [root@h101 zookeeper-Standalone]# 启动 zookeeper [root@
📷 1 redis 初始 1.1 redis是什么 开源的 具有多种数据结构 高性能key-value服务器 高性能,功能丰富(pipeline,发布订阅,位图等等) 高可用分布式支持 codis Twemproxy 1.2 redis的特性介绍 1.2.1 速度快 官方测试数据是:10w OPS(每秒处理10万的读写) Redis的数据是存储于内存中 Redis是使用C语言编写的,代码也只有50000多行 Redis是单线程的线程模型å Redis速度快的最主要的原因是存储的介质: register fa
前面分析了Codis关于Slots迁移同步整体内容及同步迁移的一些分析:Codis源码分析之Slots迁移篇,再回顾同步迁移的逻辑:
领取专属 10元无门槛券
手把手带您无忧上云