CODIS2.x集群 之 存储集群搭建全过程

Posted 祁峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODIS2.x集群 之 存储集群搭建全过程相关的知识,希望对你有一定的参考价值。

作者:邹祁峰
邮箱:Qifeng.zou.job@hotmail.com
博客: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集群不熟练的人员]

1 大体架构


2 功能规划


2.1 用途规划

当前本人用有如下10台机器,其相关信息及用途规划如下:

序号IP主机名部署程序
01192.168.1.11WebServer-11codis-server
02192.168.1.12WebServer-12codis-server
03192.168.1.13WebServer-13codis-server
04192.168.1.14WebServer-14codis-server
05192.168.1.15WebServer-15codis-server
06192.168.1.21WebServer-21codis-proxy
07192.168.1.22WebServer-22codis-proxy
08192.168.1.31WebServer-31zookeeper、codis-config、codis-ha
09192.168.1.32WebServer-32zookeeper
10192.168.1.33WebServer-33zookeeper

2.2 程序功能

各程序得主要功能描述如下:

序号程序名功能描述
01zookeeper用于存放数据路由表
02codis-config用于展示集群的监控信息
03codis-ha用于实现codis-server的主从切换
04codis-proxy用于转发redis命令至codis-server服务
05codis-server其是在redis的基础上进行修改的,用于存储真正的数据

2.3 部署结构图

按照2.1的用途规划,其部署效果如下图所示:

3 部署流程


3.1 zookeeper

作用:用于存放数据路由表。
描述:zookeeper简称zk。在生产环境中,zk部署越多,其可靠性越高。由于zk集群是以宕机个数过半才会让整个集群宕机,因此,奇数个zk更佳。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。

序号IP主机名部署程序
01192.168.1.31WebServer-31zookeeper、codis-config、codis-ha
02192.168.1.32WebServer-32zookeeper
03192.168.1.33WebServer-33zookeeper

步骤
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 #服务启动

3.2 codis-config

作用:用于展示集群的监控信息。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。

序号IP主机名部署程序
01192.168.1.31WebServer-31zookeeper、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等程序,所有监控信息都处于缺失状态。

3.3 codis-server

作用:其是在redis的基础上进行修改的,用于存储真正的数据。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。

序号IP主机名部署程序
01192.168.1.11WebServer-11codis-server
02192.168.1.12WebServer-12codis-server
03192.168.1.13WebServer-13codis-server
04192.168.1.14WebServer-14codis-server
05192.168.1.15WebServer-15codis-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.
互备方案如下:

序号MasterSlave
01192.168.1.11:6379192.168.1.12:6380
02192.168.1.12:6379192.168.1.13:6380
03192.168.1.13:6379192.168.1.14:6380
04192.168.1.14:6379192.168.1.15:6380
05192.168.1.15:6379192.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的分组和状态详情。

3.4 codis-proxy

作用:用于转发redis命令至codis-server服务。
部署:按照2.1中的用途规划,将在如下几台机器上部署该程序。

序号IP主机名部署程序
01192.168.1.21WebServer-21codis-proxy
02192.168.1.22WebServer-22codis-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的状态详情。

3.5 codis-ha

作用:用于实现codis-server的主从切换。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。

序号IP主机名部署程序
01192.168.1.31WebServer-31zookeeper、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的可靠性。

4 问题列表


在部署和使用过程中,本人遇到了如下问题:
问题描述:启动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。即:无法进行自动进行主从切换。
解决方案:禁止配置密码

以上是关于CODIS2.x集群 之 存储集群搭建全过程的主要内容,如果未能解决你的问题,请参考以下文章

CODIS3.x集群 之 存储集群搭建全过程

Nacos集群搭建过程详解

打印机故障转移集群之二:目标存储服务器的搭建与配置

集群搭建之架构逻辑图

分布式存储之Ceph集群介绍搭建

CODIS2.x原理 之 数据迁移流程