一、Codis原理
1、什么是Codis?
Codis 是一个 分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别(不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作,所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
Codis是一套用go语言
编写的,为了应对高并发环境
下的redis集群软件,原理是对一个redis key操作前,先把这个key通过crc32算法,分配到不同redis的某一个slot上,实现并发读写功能.而且能通过zookeeper调用redis-sentinel来实现故障切换功能.现在最新版本是3.2.1,依托于redis3.2.9开发出来。
2、Codis组成
组成 | 介绍 |
---|---|
Codis-proxy | 实现redis协议,由于本身是无状态的,因此可以部署很多个节点 |
Codis-config | 是codis的管理工具,包括添加/删除redis节点添加/删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置 |
Codis-server | 是codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移指令; codis-proxy和codis-config只能和这个版本的redis交互才能正常运行 |
Zookeeper | 用于codis集群元数据的存储,维护codis集群节点 |
3、Codis的架构
codis采用一层无状态的proxy层,将分布式逻辑写在proxy上,底层的存储引擎还是Redis,数据的分布状态存储于zookeeper(etcd)中
4、Codis的优缺点
(1)优点
对客户端透明,与codis交互方式和redis本身交互一样
支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面
支持高可用,无论是redis数据存储还是代理节点
自动进行数据的均衡分配
最大支持1024个redis实例,存储容量海量
高性能
(2)缺点
采用自有的redis分支,不能与原版的redis保持同步
如果codis的proxy只有一个的情况下, redis的性能会下降20%左右
某些命令不支持,比如事务命令muti
国内开源产品,活跃度相对弱一些
5、zookeeper
zookeeper依赖jdk语言包,描述:用于存放数据配置路由表。zookeeper简称zk。在生产环境中,zk部署越多,其可靠性越高。由于zk集群是以宕机个数过半才会让整个集群宕机,因此,奇数个zk更佳。
逻辑架构如下:
- 访问层:
访问方式可以是类似keepalived集群的vip方式,或者是通过java代码调用jodis控件再连接上zookeeper集群,然后查找到可用的proxy端,进而连接调用不同的codis-proxy地址来实现高可用的LVS和HA功能。
- 代理层:
中间层由codis-proxy和zookeeper处理数据走向和分配,通过crc32算法,把key平均分配在不同redis的某一个slot中。实现类似raid0的条带化,在旧版本的codis中,slot需要手工分配,在codis3.2之后,只要点一个按钮slot会自动分配,相当方便,但是也可以手动分配,需要另外调用codis-admin命令。
- 数据层:
最后codis-proxy把数据存进真实的redis-server主服务器上,由于codis的作者黄东旭相当注重数据一致性,不允许有数据延时造成的数据不一致,所以架构从一开始就没考虑主从读写分离。从服务器仅仅是作为故障切换的冗余架构,由codis-dashboard监控各服务的状态,然后通过改写zookeeper数据和调用redis-sentinel实现故障切换功能。
二、codis集群的搭建部署
主机 | 服务 |
---|---|
server1 | zk,codis-dashboard,codis-proxy,codis-fe,codis-server |
server2 | codis-server |
server3 | codis-server |
实验过程如下所示:
如果之前做过redis的服务,将redis服务停掉,因为会占用6379端口。
1、安装go,这里选用的版本为go1.9.1——因为codis3.2要求至少是1.7或1.8以上版本。
[root@server1 ~]# tar zxf go1.9.1.linux-amd64.tar.gz -C /usr/local/ #-C:指定解压目录
[root@server1 ~]# cd /usr/local
2、配置环境变量
[root@server1 ~]# vim /etc/profile #编辑环境变量的配置文件
78 export GOROOT=/usr/local/go
79 export GOPATH=/usr/local/codis
80 export PATH=$PATH:/usr/local/go/bin
[root@server1 ~]# source /etc/profile #重新加载环境变量,使得刚刚配置的环境变量生效
3、对codi进行源码编译,编译codis时依赖go,所以在安装codis先装好go。
[root@server1 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs #设置编译环境
[root@server1 ~]# yum install unzip -y #安装unzip软件,以支持unzip命令
[root@server1 ~]# unzip