当前位置: 首页 > Linux

超级详细!Codis介绍与实践

时间:2023-04-06 20:01:01 Linux

背景Redis在3.0推出了集群解决方案:redis-cluster。它可以让我们用官方的方式来搭建我们的redis集群,但是之前,我们的生产环境基本跑的是redis2.x版本的实例,如果需要集群管理,以唯品会为例,很多同事用twitter的Twemproxy.Twemproxy本身是一个静态的分布式解决方案。它在扩缩容的时候对我们的devops要求很高,很难做到平滑的扩容和缩容。并且没有集群管理的Dashboard,非常不方便。为了解决这些痛点,豌豆荚开源了他们的Codis。非常感谢作者们带来了这么好的工具。无论是使用还是学习CAP相关开发,codis都是很好的参考。Codis官方项目地址:https://github.com/CodisLabs/...codis架构上图是codis的一个整体架构,我们可以得到几个关键组件:codis-server、codis-proxy、codis-dashboard、codis-admin、codis-fe、cois-ha等CodisServer:基于redis-2.8.21分支开发。添加了额外的数据结构以支持与槽相关的操作和数据迁移指令。具体修改可以参考文档redis的修改。CodisProxy:客户端连接的Redis代理服务,实现了Redis协议。除了一些不支持的命令(listofunsupportedcommands),性能和原生Redis(就像Twemproxy一样)没有区别。对于同一个业务集群,可以同时部署多个codis-proxy实例;codis-dashboard确保不同codis-proxy之间的状态同步。CodisDashboard:集群管理工具,支持codis-proxy和codis-server的增删改查和数据迁移。当集群状态发生变化时,codis-dashboard保持集群中所有codis-proxy状态的一致性。同一个业务集群,同时只能有0个或1个codis-dashboard;所有对集群的修改都必须通过codis-dashboard完成。CodisAdmin:一个用于集群管理的命令行工具。可用于控制codis-proxy、codis-dashboard状态和访问外部存储。CodisFE:集群管理接口。多个集群实例可以共享同一个前端展示页面;通过配置文件管理后端codis-dashboard列表,配置文件可以自动更新。CodisHA:为集群提供高可用性。依赖codis-dashboard实例自动抓取集群各组件状态;根据当前集群状态自动生成主从切换策略,需要时通过codis-dashboard完成主从切换。存储:为集群状态提供外部存储。提供了Namespace的概念,会根据不同的产品名称组织不同的集群;目前只提供了Zookeeper和Etcd的两种实现,但是提供了一个抽象接口供自己扩展。理解以上组件的含义对于我们部署和维护codis是很有帮助的,所以在搭建环境之前,我们首先要仔细理解以上组件的含义。Codis及依赖环境配置Codis主要由golang开发,依赖zk或etcd进行配置管理(作为gopher,我主要使用etcd),所以最起码得先搭建go环境。1、go开发环境搭建建议参考官方指南:https://golang.org/doc/install安装完成后我们查看是否成功:$goversiongoversiongo1.7linux/amd642.go编译环境设置添加到PATH中,例如:exportGOROOT=/usr/local/goexportGOPATH=/home/apps/devgoexportGOBIN=/home/apps/devgo/binexportPATH=$PATH:$GOROOT/bin3.安装godep$goget-ugithub.com/tools/godep如果输入whichgodep报commandcommandnotfound错误,可以这样解决:$sudocp$GOPATH/bin/godep/usr/local/bin/4。安装codis$mkdir-p$GOPATH/src/github。com/CodisLabs$cd$_&&gitclonehttps://github.com/CodisLabs/codis.git-brelease3.0项目签出成功后,我们可以看到codis的完整目录;由于codis的外部包含一个redis基本工具。因此,我们需要在codis的主目录下执行make命令$cd$GOPATH/src/github.com/CodisLabs/codis$makemake-j-Cextern/redis-2.8.21/......gobuild-i-obin/codis-dashboard./cmd/dashboardgobuild-i-obin/codis-proxy./cmd/proxygobuild-i-obin/codis-admin./cmd/admingobuild-i-obin/codis-ha./cmd/hagobuild-i-obin/codis-fe./cmd/fe$lsbin/totalusage74528drwxrwxr-x3appsapps4096Oct209:52.drwxrwxr-x12apps应用程序409610月2日09:51..drwxrwxr-x4个应用程序409610月2日09:52assets-rwxrwxr-x1个应用程序1571027110月2日09:52codis-admin-rwxrwxr-x3618个应用程序3618应用程序09:52codis-dashboard-rwxrwxr-x1个应用程序应用程序1581004010月2日09:52codis-fe-rwxrwxr-x1个应用程序应用程序873028810月2日09:52codis-ha-rwxrwxr-x14个应用程序104个月209:52codis-proxy-rwxrwxr-x1appsapps4308197Oct209:52codis-server-rwxrwxr-x1appsapps2166709Oct209:52redis-benchmark-rwxrwxr-x1s12appsJan209:52redis-cli-rw-rw-r--1个应用程序应用程序146Oct209:52版本......$catbin/versionversion=2016-09-2913:58:59+0800@29199bb81e7b0b3cdb4bd7e005c96c9fd674a6eacompile=2016-10-0202go09:versiongo1.7linux/amd64接下来需要处理bin/下的命令工具sudocpcodis-*/usr/local/binsudocpredis-*/usr/local/bin5.安装etcd因为我是用etcd作为配置管理的,所以你需要安装配置etcd,但是喜欢zookeeper的可以忽略这一点,自己安装zk。$curl-Lhttps://github.com/coreos/etcd/releases/download/v2.3.7/etcd-v2.3.7-linux-amd64.tar.gz$tarxzvfetcd-v2.3.7-linux-amd64。tar.gz$cdetcd-v2.3.7-linux-amd64&&sudocpetcd/usr/local/bin/&&CPETCDCTL/USR/LOCAL/BIN/检查ETCD是否安装成功。$ETCD-VersionETCD版本:2.3.7GitSha:FD17C91GO版本:GO1.6.2GOOS/Arch:Linux/AMD64Codis提供的演示源代码。生成本地集群的用于本地测试的脚本scripts/demo.shetcd.pid=22387codis-server-16379.pid=22388codis-server-16380.pid=22389codis-server-16381.pid=22393codis-server-16382.pid=22394codis-server-16383.pid=22395codis-server-16384。pid=22396codis-server-16385.pid=22397codis-server-16386.pid=22398proxy-11080x19000.pid=22400proxy-11081x19001.pid=22402proxy-11082x19002.pid=22405proxy-110pid2x19002.pid=22405proxy-110pid2x19002.pid=22405proxy-110pid2piddash4=21041.piddash4=21041.piddash2=21043.22428migrateslot-[512,767]togroup-3migrateslot-[768,1023]togroup-4migrateslot-[0,255]togroup-1migrateslot-[256,511]togroup-2完成了............脚本会输出每个进程的PID,并将每个实例的日志输出到scripts/tmp目录;启动后,可以通过http://127.0.0.1:8080fe访问codis-。总结如上所述,我们可以快速运行一个演示版的codis,但这还不够。codis的开发运维还需要进一步学习。自定义参数和环境搭建在上一节中,我们运行了一个名为“codis-test”的codisdemo解决方案。本节我们尝试通过官方提供的相关命令组件来运行自己自定义的环境。还是和上一节一样,我继续选择etcd作为我的配置管理工具。注意:请按顺序逐步完成操作。1、启动etcd,我们使用etcd的默认端口2379nohupetcd--name=codis-demo&>/home/apps/codis/log/etcd/etcd.log&如果在启动过程中出现锁定异常,可以清理相关History:etcdctlrm--recursive/codis32.启动codis-server我们首先启动一个单节点服务器codis-server本身是一个redis实例,我们打开一个16379端口的服务器实例nohup./bin/codis-server--port16379&>/home/apps/codis/log/redis/redis-16379.log&[44886]02Oct16:50:11.381#你请求10000的maxclients需要至少10032个最大文件描述符。[44886]10月02日16:50:11.381#Redis无法将最大打开文件数设置为10032,因为操作系统错误:不允许操作。[44886]02Oct16:50:11.381#当前最大打开文件数为4096。maxclients4064以补偿低ulimit。如果您需要更高的maxclients,请增加“ulimit-n”。_.__.-``__''-.__.-```。`_。''-._8.21(29199bb8/0)64位.-``.-```。```/_.,_''-._(',.-`|`,)运行在standal一种模式|`-._`-...-`__...-.``-._|'`_.-'|端口:16379|`-._`._/_.-'|PID:44886`-._`-._`-./_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|http://redis.io`-._`-._`-.__.-'_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|`-._`-._`-.__.-'_.-'_.-'`-._`-.__.-'_.-'`-.__.-'`-.__.-'[44886]02Oct16:50:11.385#服务器启动,Redis版本2.8.21[44886]02Oct16:50:11.385#警告overcommit_memory设置为0!在内存不足的情况下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory=1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctlvm.overcommit_memory=1”以使其生效。[44886]10月2日16:50:11.385#警告您在内核中启用了透明大页面(THP)支持。这会造成延迟和内存使用问题es与Redis。要解决此问题,请以root身份运行命令“echonever>/sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local,以便在重启后保留设置。禁用THP后必须重新启动Redis。[44886]02Oct16:50:11.385#警告:无法强制执行511的TCP积压设置,因为/proc/sys/net/core/somaxconn设置为128的较低值。[44886]02Oct16:50:11.385*从磁盘加载的数据库:0.000秒[44886]02Oct16:50:11.385*服务器现在准备好接受端口16379上的连接三、启动dashboardnohup./bin/co-dis-dashboardconfig=/home/apps/codis/dashboard.toml--log=/home/apps/codis/log/dashboard/dashboard.log--log-level=WARN&我们在这里使用了自定义的dashboard.toml,它的内容如下:#####################################################Codis-Dashboard#########################设置Coordinator,只接受"zookeeper"&"etcd"coordinator_name="etcd"coordinator_addr="127.0.0.1:2379"#SetCodisProduct{Name/Auth}.product_name="codis-demo"product_auth=""#Setbindaddressforadmin(rpc),tcponly.admin_addr="0.0.0.0:18080"四、启动codis-proxynohup./bin/codis-proxy--config=/home/apps/codis/proxy.toml--log=/home/apps/codis/log/proxy/proxy.log--log-level=WARN&代理内容。toml如下:product_name="codis-demo"product_auth=""proto_type="tcp4"admin_addr="0.0.0.0:11080"proxy_addr="0.0.0.0:19000"五、启动fenohup./bin/codis-fe-d/home/apps/codis/codis.json--listen=0.0.0.0:8080&condis.json内容如下:[{"name":"codis-demo","dashboard":"127.0.0.1:18080"}]6.配置codis-admin上面我们已经启动了基本的组件,接下来我们需要通过codis-admin对我们的代理进行分组管理添加代理组./bin/codis-admin--dashboard=127.0.0.1:18080--create-group--gid1添加组./bin/codis-admin--dashboard=127.0.0.1:18080--group-添加--gid1-x127.0.0.1:16379创建代理./bin/codis-admin--dashboard=127.0.0.1:18080--create-proxy-x127.0.0.1:11080配置插槽./bin/codis-admin--dashboard=127.0.0.1:18080--slot-action--interval=100./bin/codis-admin--dashboard=127.0.0.1:18080--rebalance--confirm登录管理面板,如下图:作者:domac的菜园原文:http://lihaoquan.me/2016/10/2...