codis介绍
1 | codis是一个分布式redis集群解决方案,对于上层的应用来说, 连接到codis-proxy和连接原生的redis-server没有明显的区别。 |
codis体系结构
1 | Codis引入了Group的概念,每个Group包括1个Redis Master及至少1个Redis Slave,这是和Twemproxy的区别之一。这样做的好处是,如果当前Master有问题,则运维人员可通过Dashboard“自助式”切换到Slave,而不需要小心翼翼地修改程序配置文件。 |
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 可自行扩展。
重要概念
关于多产品线部署
1 | 很多朋友问我们如果有多个项目时,codis 如何部署比较好,我们 |
关于zookeeper
1 | 由于Codis 是一个强依赖的zk 的项目,而且在proxy 和zk 的连接发生抖动造 |
关于HA高可用
1 | 这里的HA 分成两部分: |
关于dashboard
1 | dashboard 在codis 中是一个很重要的角色,所有的集群信息变更操作都是通过dashboard 发起的(这个设计有点像docker),dashboard 对外暴露了一系列RESTfulAPI 接口,不管是web 管理工具,还是命令行工具都是通过访问这些httpapi 来进行操作的,所以请保证dashboard 和其他各个组件的网络连通性。 |
关于主从和bgsave
1 | bgsave:codis 本身并不负责维护Redis 的主从关系,在codis 里面的master和slave 只是概念上的:proxy 会将请求打到「master」上,master 挂了codis-ha 会将某一个「slave」提升成master。而真正的主从复制,需要在启动底层的Redis 时手动的配置。在生产环境中,我建议master 的机器不要开bgsave,也不要轻易的执行save 命令,数据的备份尽量放在slave 上操作。 |
关于跨机房/多活
1 | 想都别想codis 没有多副本的概念,而且codis 多用于缓存的业务场景,业务的压力是直接打到缓存上的,在这层做跨机房架构的话,性能和一致性是很难得到保证的 |
重要Q&A
Q1: codis没有多副本概念?
1 | Codis 是一个分布式Redis 解决方案,是通过presharding 把数据在概念上分成1024 个slot,然后通过proxy 将不同的key的请求转发到不同的机器上,数据的副本还是通过Redis本身保证。 |
Q2:Codis 的信息在一个zk 里面存储着,zk 在Codis 中还有别的作用吗?主从切换为何不
用sentinel?
1 | Codis 的特点是动态的扩容缩容,对业务透明;zk 除了存储路由信息,同时还作为一个事件同步的媒介服务,比如变更master 或者数据迁移这样的事情,需要所有的proxy 通过监听特定zk 事件来实现。可以说zk 被我们当做了一个可靠的rpc 的信道来使用。因为只有集群变更的admin 时候会往zk 上发事件,proxy 监听到以后,回复在zk 上,admin 收到各个proxy 的回复后才继续。本身集群变更的事情不会经常发生,所以数据量不大。Redis 的主从切换是通过codis-ha 在zk 上遍历各个server group 的master 判断存活情况,来决定是否发起提升新master 的命令。 |
Q3: 数据分片,是用的一致性hash 吗
1 | 不是,是通过presharding,hash 算法是crc32(key)%1024 |
Q4:Redis 跨机房有什么方案?
1 | 目前没有好的办法,我们的Codis 定位是同一个机房内部的缓存服务,跨机房复制对于 |
Q5:集群的主从怎么做(比如集群S 是集群M 的从)?
1 | Codis 只是一个proxy-based 的中间件,并不负责数据副本相关的工作。也就是数据只 |
Q6: codis的设计初衷与特点在何处?
1 | Codis更多的是为了替换twemproxy的一个项目。Redis 是cache,Codis 主要解决的是Redis单点和水平扩展的问题 |
Q7:可否介绍下codis 的autorebalance(自动再平衡) 实现?
1 | 算法比较简单。其实就是根据各个实例的内存比例,分配slot. |
Q8: 主要想了解对降低数据迁移对线上服务的影响?
1 | 其实现在codis 数据迁移的方式已经很温和了,是一个个key 的原子迁移,如果怕抖动甚至可以加上每个key 的延迟时间。这个好处就是对业务基本没感知,但是缺点就是慢。 |
codis集群部署实战
角色说明
1 | zookeeper集群: |
安装zookeeper-[41/42/43服务器配置]
快速移步查看:zookeeper集群部署
1 | 作用:用于存放数据路由表。 |
安装go环境-[除了zk服务器之外都安装]
安装依赖
1 | yum install -y git gcc make g++ gcc-c++ automake openssl-devel zlib-* |
安装go
1 | 下载地址: |
安装codis-[除了zk服务器之外都安装]
1 | https://codeload.github.com/CodisLabs/codis/tar.gz/3.2.0 |
集群配置前需要了解的问题
集群分片主要分三种:
1 | 客户端分片:这个需要自己开发,对客户端要求严格,集群很难扩容 |
codis3.2集群架构
1 | codis3.2集群架构 |
特别注意
1 | 同一个codis-server可以加入多个codis-dashboard的codis-group里,但是在不同的codis-dashboard里面主备的角色要一致,这代表逻辑隔离。 |
集群配置
重申下基本操作目录
1 | Codis软链目录:/usr/local/codis |
配置dashboard(在10.0.10.40上配置)
配置并启动codis-dashboard
修改dashboard配置文件
1 | cd /usr/local/codis |
1 | [root@localhost codis]# egrep -v "^#|^$" config/dashboard.toml #主要修改以下几项内容 |
修改启动脚本并启动服务
1 | 修改zookeeper地址池与product名称 |
1 | 启动codis-dashboard |
配置codis-proxy(在10.0.10.44和45服务器配置)
修改codis-proxy启动脚本
1 | cd /usr/local/codis |
修改proxy.toml配置
1 | [root@localhost codis]# cat config/proxy.toml|grep -Ev "^#|^$" |
启动codis-proxy
1 | [root@localhost codis]# ./admin/codis-proxy-admin.sh start |
检查日志和端口
1 | [root@localhost codis]# cat log/codis-proxy.log.2017-11-29 |
1 | [root@localhost codis]# ss -tulpn|grep codis-proxy |
配置codis-server-[需要在10.0.10.47/48/49上操作]
1 | codis-server规划: |
修改codis-server启动脚本
1 | cd /usr/local/codis/ |
1 | vim admin/codis-server-admin-6379.sh |
1 | vim admin/codis-server-admin-6380.sh |
修改服务配置
1 | 创建redis配置文件存放目录 |
1 | 拷贝默认redis配置文件 |
1 | 编辑配置文件(注:每个配置文件独立配置,因为3个redis从节点的slaveof配置不同) |
47服务器-redis配置文件
10.0.10.47(主)redis-6379.conf
1 | vim /etc/redis/6379/redis-6379.conf #配置主文件 |
10.0.10.48(从)redis-6380.conf
1 | vim /etc/redis/6379/redis-6380.conf #配置主文件 |
48服务器-redis配置文件
10.0.10.48的(主)redis-6379.conf
1 | vim /etc/redis/6379/redis-6379.conf #配置主文件 |
10.0.10.49(从)redis-6380.conf
1 | vim /etc/redis/6379/redis-6380.conf #配置主文件 |
49服务器-redis配置文件
10.0.10.49(主)redis-6379.conf
1 | vim /etc/redis/6379/redis-6379.conf #配置主文件 |
10.0.10.47(从)redis-6380.conf
1 | vim /etc/redis/6379/redis-6380.conf #配置主文件 |
分别启动47/48/49服务器的主从
1 | [root@localhost codis]# ./admin/codis-server-admin-6379.sh start |
分别检测47/48/49服务器的日志与端口
1 | [root@localhost codis]# ss -lntup |grep 63* |
在47服务器上连接redis 6379端口查看codis-server主从关系
1 | [root@localhost codis]# ./bin/redis-cli -h 10.0.10.47 -p 6379 |
启动codis-fe-[在10.0.10.40上操作]
1 | cd /usr/local/codis/ |
1 | #COORDINATOR_NAME="filesystem" |
启动codis-fe脚本
1 | ./admin/codis-fe-admin.sh start |
检查日志与端口
1 | [root@localhost codis]# ss -lntup |grep 9090 |
访问codis-fe Web面板
1 | http://10.0.10.40:9090/#codis-product1 |
codis-fe面板操作
通过codis-fe添加group
1 | 通过web浏览器访问集群管理页面(fe地址:http://192.168.188.125:9090/#codis-product1) 选择我们刚搭建的集群 codis-product1,在 Proxy 栏可看到我们已经启动的 Proxy, 但是Group 栏为空,因为我们启动的 codis-server 并未加入到集群. |
添加 NEW GROUP
1 | NEW GROUP 行输入 1,再点击 NEW GROUP 即可。如图: |
1 | 根据我们的拓扑规划,需要依次添加3个group , 6个codis-server 。默认每组里面第一个添加的为主,第二个添加的设置为从,同一个节点2个实例不能设置为同一group。 如图: |
消除界面中的从condis-server的背景颜色,如图:
通过codis-fe初始化solt
1 | 新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过fe提供的 rebalance all slots 按钮来做。 |
用codis-proxy代理-压力测试
1 | 上面我们已经配置好了2个codis-proxy,接下来使用它们其一对部署的集群进行压力测试 |
1 | 命令行执行结果: |
Dashboard测试效果如下:
代理HA
上层代理HA使用LVS+keepalived来实现, 使用zk集群中的41和42服务器来测试
安装ipvsadm管理工具并激活LVS
1 | #查看lvs模块 |
安装keepalived
1 | #安装keepalived |
1 | #配置keepalived |
41服务器keepalived配置文件
1 | global_defs { |
42服务器keepalived配置文件
1 | global_defs { |
分别启动
1 | >/etc/keepalived/keepalived.conf |
codis-proxy配置-【在2台lvs后端机codis-proxy上配置】
1 | 步骤1:在lo网卡绑定VIP地址(ip) |
检查LVS集群
1 | ipvsadm -ln |
最后把HA的IP和端口给研发即可
1 | 给研发正式启用前,务必进行多次压测 |
压力测试
1 | 压力测试命令: |
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2017/11/28/Codis3.2集群部署/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!