官方中文文档:https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md
对于Redis集群方案有好多种,基本常用的就是twemproxy,codis,redis cluster这三种解决方案。
本博文介绍codis。
1.codis集群简介
2.codis的优缺点
3.codis的架构介绍
<1>搭建codis集群所需的软件
(1)go
描述:codis依赖语言包
(2)codis
描述:codis集群套件,里面含有redis相关程序和集群专用程序。主要功能程序解析:
- codis-server:属于redis-server优化版,基于 redis-3.2.9 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。
- codis-proxy:客户端连接的 Redis 代理服务,实现了 Redis 协议。 除部分命令不支持以外(例如:keys *,flush ),表现的和原生的 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-fe:集群web管理界面。
- 多个集群实例共享可以共享同一个前端展示页面;
- 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
- redis-sentinel:可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。Sentinel的配置由 codis-dashboard和zookeeper一起控制,不需要手工填写。
(3)jdk
描述:zookeeper依赖语言包
(4)zookeeper
描述:用于存放数据配置路由表。zookeeper简称zk。在生产环境中,zk部署越多,其可靠性越高。由于zk集群是以宕机个数过半才会让整个集群宕机,因此,奇数个zk更佳。
<2>逻辑架构如下:
访问层:访问方式可以是类似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实现故障切换功能。
1.selinux和firewalld状态为disabled
2.各主机信息如下:
主机 | ip |
---|---|
server1(codis-server) | 172.25.83.1 |
server2(codis-server) | 172.25.83.2 |
server3(zk,codis-dashboard,codis-proxy,codis-fe,codis-server) | 172.25.83.3 |
配置server3:(因为server3之前只做过redis cluster集群的,所以要停掉redis-server服务)
前期准备:
停掉redis-server服务
1.安装go:(这里选用的版本为go1.9.1)——因为codis3.2要求至少是1.7或1.8以上版本的,那干脆下最新版吧。
<1>下载安装包:go1.9.1.linux-amd64.tar.gz(下载地址为:https://studygolang.com/dl/golang/go1.9.1.linux-amd64.tar.gz)
<2>下载后,解压就可以用了:
[root@server3 ~]# tar zxf go1.9.1.linux-amd64.tar.gz -C /usr/local/ #-C:指定解压目录
2.配置环境变量
[root@server3 ~]# vim /etc/profile #编辑环境变量的配置文件,在文件的最后编辑如下的内容
78 export GOROOT=/usr/local/go
79 export GOPATH=/usr/local/codis
80 export PATH=$PATH:/usr/local/go/bin
[root@server3 ~]# source /etc/profile #重新加载环境变量,使得刚刚配置的环境变量生效
3.对codi进行源码编译,编译codis时依赖go,所以在安装codis先装好go,上面已经装好:
<1>下载codis的源码包:codis-release3.2.zip
<2>设置编译环境
[root@server3 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs
[root@server3 ~]# yum install unzip -y #安装unzip软件,以支持unzip命令
[root@server3 ~]# unzip codis-release3.2.zip -d $GOPATH/src/github.com/CodisLabs
[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs
[root@server3 CodisLabs]# mv codis-release3.2/ codis #为了方便,将名字该为codis
<3>对codis进行源码编译
[root@server3 codis]# yum install gcc git autoconf -y #安装codis的依赖包
[root@server3 codis]# pwd
/usr/local/codis/src/github.com/CodisLabs/codis
[root@server3 codis]# make MALLOC=libc #进行编译安装
看到如下内容表示编译成功
codis源码编译完成之后,
- 组件的启动脚本在$GOPATH/src/github.com/CodisLabs/codis/admin目录下
- 配置文件在$GOPATH/src/github.com/CodisLabs/codis/config目录下
4.安装JDK:(这里选用的版本为jdk1.8),自己在官网下载一个安装即可,版本要求不严格,后面的zookeeper会用到JDK:
<1>下载安装包:jdk-8u201-linux-x64.rpm
<2>安装rpm包
[root@server3 ~]# yum install jdk-8u201-linux-x64.rpm -y
安装完成之后,查看java的版本
5.安装zookeeper:(这里选用的版本为zookeeper-3.4.13)
<1>下载安装包:zookeeper-3.4.13.tar.gz(下载地址为:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz)
<2>下载后,解压就可以用了
[root@server3 ~]# tar zxf zookeeper-3.4.13.tar.gz -C /usr/local/ #-C:指定解压目录
[root@server3 ~]# cd /usr/local/
[root@server3 local]# mv zookeeper-3.4.13/ zookeeper
6.编辑环境变量对应的配置文件
[root@server3 ~]# vim /etc/profile
78 export GOROOT=/usr/local/go
79 export GOPATH=/usr/local/codis
80 export ZOOKEEPER_HOME=/usr/local/zookeeper
81 export PATH=$PATH:/usr/local/go/bin:$ZOOKEEPER_HOME/bin
[root@server3 ~]# source /etc/profile #重新加载环境变量
7.对zookeeper进行配置,并启动zookeeper
<1>修改zookeeper的配置文件
[root@server3 ~]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
[root@server3 ~]# cd /usr/local/zookeeper/conf/
[root@server3 conf]# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
clientPort=2181
maxClientCnxns=60
autopurge.purgeInterval=24
autopurge.snapRetainCount=500
#server.1=codis-1:2888:3888
#server.2=codis-2:2888:3888
#server.3=codis-3:2888:3888
#补充:
(1)tickTime=2000
#一个周期(tick)的时长(单位:毫秒)
#ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。用来调节心跳和超时。
例如,session的最小超时时间是2*tickTime。
(2)initLimit=10
#初始化同步阶段最多耗费tick个数
#Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允
许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量
确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大
这个参数了。
(3)syncLimit=5
#等待应答的最大间隔tick个数
#在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状
态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不
要把这个参数设置得过大,否则可能会掩盖一些问题。
(4)clientPort=2181
#客户端连接server的端口,即对外服务端口,一般设置为 2181 吧。
(5)dataDir=/data/zookeeper/data
#该目录需要手动建立。
#存储快照文件napshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir,事务
日志的写性能直接影响zk性能。
(6)maxClientCnxns=60
#最大连接数设置(单ip限制). 注:默认60,设成0即无限制
#单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限
制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户
端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。指定客户端IP的限制策略
(7)autopurge.purgeInterval=24
#3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,
需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。
(8)autopurge.snapRetainCount=500
#3.4.0及之后版本,这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个
#zoo.cfg最后三行特别说明
说明:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C
表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂
了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的
端口。
#其中2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。
<2>设置myid:
设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字(该数字的取值范围是1-255),用来标识当前主机,conf/zoo.cfg文件配置的server.X中的X为什么数字,则myid文件就输入这个数字,我只有一台zk,所以配置文件里可以不配置server.X,但还是要配置myid 的,echo一个数字1进去即可。如果有多台zk,则分别在zk服务器上echo对应的数字进对应的myid文件。
[root@server3 conf]# mkdir /data/zookeeper/data -p
[root@server3 conf]# echo "1" > /data/zookeeper/data/myid
<3>启动zookeeper:因为环境变量里已经添加了路径,直接执行命令即可,执行zkServer.sh start后,然后可以执行"zkServer status"来查看zookeeper的状态。
[root@server3 ~]# zkServer.sh start #启动zookeeper
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@server3 ~]# zkServer.sh status #查看zookeeper的状态
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
在哪个目录下启动,就在那个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所 以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。
8.对codis进行配置,并启动codis的各个组件
值的注意的是:启动dashboard前,必须启动zookeeper服务,这是必须的,后面有很多操作,都可以在web页面完成,例如添加/删除组,添加/删除redis实例等。
<1>编辑/usr/local/codis/config.ini文件
zk=localhost:2181
product=test
proxy_id=proxy_1
net_timeout=5
dashboard_addr=localhost:18087
coordinator=zookeeper
参数解释:
zk=localhost:2181 //zookeeper的地址, 如果是zookeeper集群,可以这么写: zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181,如果是etcd,则写成http://hostname1:port,http://hostname2:port,http://hostname3:port
product=test //产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集
proxy_id=proxy_1 //proxy会读取, 用于标记proxy的名字, 针对多个proxy的情况, 可以使用不同的config.ini, 只需要更改 proxy_id 即可
net_timeout=5 //检测状态时间间隔
dashboard_addr=localhost:18087 //dashboard 服务的地址,CLI 的所有命令都依赖于 dashboard 的 RESTful API,所以必须启动
coordinator=zookeeper //如果用etcd,则将zookeeper替换为etcd
<2>启动codis的各个组件
(1)启动codis-dashboard组件
[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-dashboard-admin.sh start
(2)启动codis-proxy组件
[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-proxy-admin.sh start
(3)启动codis-fe组件
[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-fe-admin.sh start
Codis-fe的端口是9090
(4)启动codis-server组件
[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-server-admin.sh start
配置server1:
1.安装go(同server3)
2.配置环境变量(同server3)
3.对codis进行源码编译(同server3)
4.对codis进行配置,并启动codis-server这个组件
<1>对codis进行配置:
[root@server1 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/config/
[root@server1 config]# vim redis.conf
61 bind 0.0.0.0
<2>启动codis-server组件
[root@server1 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/admin
[root@server1 admin]# ./codis-server-admin.sh start
配置server2:
配置过程同server1
测试:
在浏览器访问http://172.25.83.3:9090,即可进入web管理界面
点击codis-demo
向下拉动界面
可以看到codis-proxy已经激活
点击New Group,使组创建成功
点击Add Server,使实例127.0.0.1:6379添加成功
同理,可以添加172.25.83.1:6379和172.25.83.2:6379。
最终的效果图为: