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。即:无法进行自动进行主从切换。
解决方案:禁止配置密码

           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值