作者:邹祁峰
邮箱:[email protected]
博客:http://blog.csdn.net/qifengzou
日期:2016.06.02
转载请注明来自”祁峰”的CSDN博客
Codis 是一个分布式Redis解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (有一些命令不支持, 如:keys、flushall, etc.), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务,当然,前段时间redis官方的3.0出了稳定版,3.0支持集群功能,codis的实现原理和3.0的集群功能差不多。[注:本文档适合搭建CODIS集群不熟练的人员]
当前本人用有如下10台机器,其相关信息及用途规划如下:
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.11 | WebServer-11 | codis-server |
02 | 192.168.1.12 | WebServer-12 | codis-server |
03 | 192.168.1.13 | WebServer-13 | codis-server |
04 | 192.168.1.14 | WebServer-14 | codis-server |
05 | 192.168.1.15 | WebServer-15 | codis-server |
06 | 192.168.1.21 | WebServer-21 | codis-proxy |
07 | 192.168.1.22 | WebServer-22 | codis-proxy |
08 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
09 | 192.168.1.32 | WebServer-32 | zookeeper |
10 | 192.168.1.33 | WebServer-33 | zookeeper |
各程序得主要功能描述如下:
序号 | 程序名 | 功能描述 |
---|---|---|
01 | zookeeper | 用于存放数据路由表 |
02 | codis-config | 用于展示集群的监控信息 |
03 | codis-ha | 用于实现codis-server的主从切换 |
04 | codis-proxy | 用于转发redis命令至codis-server服务 |
05 | codis-server | 其是在redis的基础上进行修改的,用于存储真正的数据 |
作用:用于存放数据路由表。
描述:zookeeper简称zk。在生产环境中,zk部署越多,其可靠性越高。由于zk集群是以宕机个数过半才会让整个集群宕机,因此,奇数个zk更佳。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
02 | 192.168.1.32 | WebServer-32 | zookeeper |
03 | 192.168.1.33 | WebServer-33 | zookeeper |
步骤:
1、下载源码
下载源代码,并解压至/usr/local/zookeeper目录。
下载路径:http://zookeeper.apache.org/releases.html#download。
注意事项:请勿yum -y install zookeeper。可能出现各种莫名其妙得问题,以致zk始终无法正常启动。
2、安装java包
#yum -y install java # 安装java包
3、配置程序
第一步:添加域名
编辑/etc/hosts文件,并添加以下配置。[注:在192.168.1.31~33上都完全一样]
#vim /etc/hosts #添加域名
192.168.1.31 zookeeper-node1
192.168.1.32 zookeeper-node2
192.168.1.33 zookeeper-node3
第二步:修改zk配置
编辑配置文件,并添加以下配置:[注:在192.168.1.31~33上都完全一样]
#cd /usr/local/zookeeper #安装目录
#vim ./conf/zoo.cfg #编辑配置maxClientCnxns=50 #最大连接数设置. 注:可不配置.
tickTime=2000 #一个周期(tick)的时长(单位:毫秒). 注:可用默认值
initLimit=10 #初始化同步阶段最多耗费tick个数. 注:可用默认值
syncLimit=5 #等待应答的最大间隔tick个数. 注:可用默认值
dataDir=/data/zookeeper/ #数据存储目录. 注:勿放在/tmp目录
clientPort=2181 #帧听端口. 注:可用默认值
server.1=zookeeper-node1:2888:3888
server.2=zookeeper-node2:2888:3888
server.3=zookeeper-node3:2888:3888
说明:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
第三步:其他处理
创建第二步中的dataDir目录,并设置当前zk的结点ID。[注:在192.168.1.31~33上ID值各不相同]
#mkdir -p /data/zookeeper #创建zk数据目录(datadir)
#echo “1” > /data/zookeeper/myid #生成ID,这里需要注意, myid对应的zoo.cfg的server.ID.比如zookeeper-node2对应的myid应该是2.
/usr/lib/zookeeper/bin/Server.sh start #服务启动
4、启动程序
需要在192.168.1.31~33上依次执行以下命令。
#cd /usr/local/zookeeper/ #安装目录
#./bin/Server.sh start #服务启动
作用:用于展示集群的监控信息。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
步骤:
1、安装golang环境
先从官网(https://golang.org/dl/)下载golang安装包,并将其解压,再拷贝至/usr/local/go/中,最后配置如下环境变量。
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安装路径
export GOPATH=$HOME/godir # 工作路径
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径
2、下载codis源码
在codis-config部署机器上执行如下命令:
#go get github.com/CodisLabs/codis/
执行如上命令后,可在$GOPATH/src/github.com/CodisLabs目录中看到codis源码。
3、编译程序
进入codis源码目录,并执行make指令对codis进行编译。
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#make #执行编译 – 可能会有几分钟的阻塞.
编译之后,便可在源码的bin目录中看到已经生成的codis-config程序。
4、修改配置
项目名称是chatroom。 先将codis源码中的默认配置文件config.ini该为config-chatroom.ini,再修改其内容。
#vim config-chatroom.ini #修改配置
zk=192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181 #zk集群
product=chatroom #项目名称
dashboard_addr=192.168.1.31:18087 #监控访问
为了防止出现dashboard监控页面中OPS始终为0的现象,需要将各proxy的IP和主机名写到hosts文件中。
#vim /etc/hosts # 添加域名
192.168.1.21 WebSocket-21
192.168.1.22 WebSocket22
5、启动程序
在codis源码目录中启动codis-config监控程序。
#./bin/codis-config -c /etc/codis/config_chatroom.ini dashboard & #启动程序
#./bin/codis-config -c /etc/codis/config_chatroom.ini slot init #初始化SLOT
完成以上五个步骤后,便完成了对codis-config的安装。此时在浏览器中输入:http://192.168.1.31:18087便可监控codis集群的状态。由于此时还未加入codis-server和codis-proxy等程序,所有监控信息都处于缺失状态。
作用:其是在redis的基础上进行修改的,用于存储真正的数据。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.11 | WebServer-11 | codis-server |
02 | 192.168.1.12 | WebServer-12 | codis-server |
03 | 192.168.1.13 | WebServer-13 | codis-server |
04 | 192.168.1.14 | WebServer-14 | codis-server |
05 | 192.168.1.15 | WebServer-15 | codis-server |
步骤:
1、安装golang环境
先从官网(https://golang.org/dl/)下载golang安装包,并将其解压,再拷贝至/usr/local/go/中,最后配置如下环境变量。[注: 在192.168.1.11~15上完全一样]
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安装路径
export GOPATH=$HOME/godir # 工作路径
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径
2、下载codis源码
在codis-config部署机器上执行如下命令: [注: 在192.168.1.11~15上完全一样]
#go get github.com/CodisLabs/codis/
执行如上命令后,可在$GOPATH/src/github.com/CodisLabs目录中看到codis源码。
3、编译程序
进入codis源码目录,并执行make指令对codis进行编译。[注: 在192.168.1.11~15上完全一样]
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#make #执行编译 – 可能会有几分钟的阻塞.
编译之后,便可在源码的bin目录中看到已经生成的codis-server程序。
4、修改配置
由于codis-server是在redis的源码上直接修改的,且其完全继承了redis的配置,因此,可以直接是用redis的配置文件。[注:主从均无需配置slaveof选项]
为了提高codis-server的可靠性,在此本人采用交叉互备方案。因此,每台机器上需准备2个codis-server配置文件:codis-server-6379.conf codis-server-6380.conf.
互备方案如下:
序号 | Master | Slave |
---|---|---|
01 | 192.168.1.11:6379 | 192.168.1.12:6380 |
02 | 192.168.1.12:6379 | 192.168.1.13:6380 |
03 | 192.168.1.13:6379 | 192.168.1.14:6380 |
04 | 192.168.1.14:6379 | 192.168.1.15:6380 |
05 | 192.168.1.15:6379 | 192.168.1.11:6380 |
5、启动程序
在192.168.1.11~15机器上各启动2个codis-server,依次执行如下命令。
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#./bin/codis-server -c ./conf/codis-server-6379.conf & #启动Master程序
#./bin/codis-server -c ./conf/codis-server-6380.conf & #启动Slave程序
6、划分分组
登录codis-config部署服务器192.168.1.31, 并执行如下命令:
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#分组11
./bin/codis-config -c ./config_chatroom.ini server add 11 192.168.1.11:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 11 192.168.1.12:6380 slave
#分组12
/bin/codis-config -c ./config_chatroom.ini server add 12 192.168.1.12:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 12 192.168.1.13:6380 slave
#分组13
/bin/codis-config -c ./config_chatroom.ini server add 13 192.168.1.13:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 13 192.168.1.14:6380 slave
#分组14
/bin/codis-config -c ./config_chatroom.ini server add 14 192.168.1.14:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 14 192.168.1.15:6380 slave
#分组15
/bin/codis-config -c ./config_chatroom.ini server add 15 192.168.1.15:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 15 192.168.1.11:6380 slave
7、划分SLOT
Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成1024个slots (0-1023)。对于每个key来说,通过以下公式确定所属的 slot id : slotid = crc32(key) % 1024。每一个 slot 都会有一个特定的server group id来表示这个slot的数据由哪个server group来提供。
为了均衡各分组的压力,因此需要将slot分配的更加均衡。本次有5台codis-server服务分组,因此每个分组分配1024/5=205个slot。
登录codis-config部署服务器192.168.1.31, 并执行如下命令:
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#./bin/codis-config -c ./config_chatroom.ini slot range-set 0 204 11 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 205 409 12 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 410 614 13 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 615 819 14 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 820 1023 15 online
完成以上七个步骤后,便完成了对codis-server的部署。此时在浏览器中输入:http://192.168.1.31:18087便可在“Server Groups”栏看到codis-server的分组和状态详情。
作用:用于转发redis命令至codis-server服务。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.21 | WebServer-21 | codis-proxy |
02 | 192.168.1.22 | WebServer-22 | codis-proxy |
步骤:
1、安装golang环境
先从官网(https://golang.org/dl/)下载golang安装包,并将其解压,再拷贝至/usr/local/go/中,最后配置如下环境变量。[注: 在192.168.1.21~22上完全一样]
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安装路径
export GOPATH=$HOME/godir # 工作路径
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径
2、下载codis源码
在codis-config部署机器上执行如下命令: [注: 在192.168.1.21~22上完全一样]
#go get github.com/CodisLabs/codis/
执行如上命令后,可在$GOPATH/src/github.com/CodisLabs目录中看到codis源码。
3、编译程序
进入codis源码目录,并执行make指令对codis进行编译。[注: 在192.168.1.21~22上完全一样]
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#make #执行编译 – 可能会有几分钟的阻塞.
编译之后,便可在源码的bin目录中看到已经生成的codis-proxy程序。
4、修改配置
项目名称是chatroom。 先将codis源码中的默认配置文件config.ini该为config-chatroom.ini,再修改其内容。[注: 在192.168.1.21~22上proxy_id 各不相同]
#vim config-chatroom.ini #修改配置
zk=192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181 #zk集群
product=chatroom #项目名称
dashboard_addr=192.168.1.31:18087 #监控访问
session_max_timeout=0 #会话超时时间(默认值:1800)
proxy_id=proxy_192.168.1.21 #代理ID。各PROXY的ID必须唯一。
注意:在192.168.1.22上proxy_id为proxy_192.168.1.22。
5、启动程序
在192.168.1.21~22机器上各启动1个codis-proxy,依次执行如下命令。[注:一般情况下设置cpu个数为总cpu个数的1/2]
#cd $GOPATH/src/github.com/CodisLabs/codis #源码目录
#./bin/codis-proxy -c ./config_chatroom.ini -L ./log/codis-proxy.log —log-level=error –cpu=12 —addr=0.0.0.0:19000 —http-addr=0.0.0.0:11000 &
完成以上搭建步骤后,此时在浏览器中输入:http://192.168.1.31:18087便可在“Proxy Status”栏看到codis-proxy的状态详情。
作用:用于实现codis-server的主从切换。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
安装:
1、下载源码
首先登录192.168.1.31服务器,并执行go get下载codis-ha源码。
#go get github.com/ngaut/codis-ha
执行以上命令后,将在$GOPATH/src/github.com/ngaut/目录中看到codis-ha源码。
2、编译程序
#cd $GOPATH/src/github.com/ngaut/codis-ha
#go build #编译codis-ha
执行以上命令后,可在源码目录看到codis-ha程序。
3、运行程序
#codis-ha –codis-config=192.168.1.31:18087 –productName=chatroom
此时如果kill一个codis-server分组中得master程序,你会发现之前的slave会提升为master程序。
4、部署监控
由于人为误操作或其他原因,可能导致codis-ha退出运行,致使codis集群出现异常时无法实现主从切换。为了防止此问题得程序,需要部署supervisord用于管理codis-ha,增强codis-ha的可靠性。
在部署和使用过程中,本人遇到了如下问题:
问题描述:启动zookeeper时,遇到问题:”Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain”
解决方案:不要是用yum安装zookeeper, 而应该从http://ftp.wayne.edu/apache/zookeeper/下载zookeeper源码进行安装。
问题描述:在dashboard监控界面,出现OPS始终为0,但是其他监控信息正常。
解决方案:将所有部署proxy的机器的ip和hostname写入部署dashboard的/etc/hosts文件中便可解决。
即:在此次部署中,登录192.168.1.31,并在hosts文件中添加如下配置:
#vim /etc/hosts/
192.168.1.21 WebServer-21
192.168.1.22 WebServer-22
问题描述:用客户端goredis库连接codis-proxy建立连接池,在使用过程中,偶尔会发现选择一个redis连接对象后,进行redis操作时,报EOF的问题。
解决方案:这很有可能是由于codis-proxy中的session_max_timeout的值不为0导致的。当客户端长时间未发送redis操作请求时,一但超过此值,codis-proxy则会关闭该链接。如果将session_max_timeout设置为0,只要该连接保活正常,即使长时间不进行redis操作,codis-proxy也不进行关闭操作。
问题描述:给集群配置密码后,当某组的master出现故障时,codis-ha无法将其他slave提升为master。即:无法进行自动进行主从切换。
解决方案:禁止配置密码