codis集群部署

codis简介  

Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工 作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务。

codis由四部分组成:

codis proxy(codis-proxy)                    codis dashboard(codis-config)

codis redis(codis-server)                    zookeeper/etcd

codis-proxy是客户端连接的redis代理服务,codis-proxy本身实现 了redis协议,表现得和一个原生的redis没什么区别(就像twemproxy),对于一个业务来说,可以部署多个codis- proxy,codis-proxy本身是无状态的。

codis-config是codis的管理工具,支持包括:添加/删除redis节点,添加/删除proxy节点,发起数据迁移等操作。codis-config本身还自带了一个http-server,会启动一个dashboard,用户可以直接在浏览器上观察codis集群的运行状态。

codis-server是codis项目维护的一个redis分支,基于redis2.8.21开发,加入了slot的支持和原子的数据迁移指令。codis上层的codis-proxy和codis-config只能和这个版本的redis交互才能正常运行。

codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个存活的codis-proxy。

codis支持按照namespace区分不同的产品,拥有不同的product name的产品,各项配置都不会冲突。

codis架构图如下:

Codis 3.x 由以下组件组成:

  • Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改

  • Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 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 Admin:集群管理的命令行工具。

    • 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
  • Codis FE:集群管理界面。

    • 多个集群实例共享可以共享同一个前端展示页面;
    • 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
  • Storage:为集群状态提供外部存储。

    • 提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
    • 目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。

实验准备

codis集群的搭建,需要zookeeper集群。除了zookeeper集群之外,我们还需要安装go语言环境,因为codis是基于go语言开发的。

实验环境(rhel7.3):

172.25.81.1     Codis-proxy                    server1
172.25.81.2     Codis-redis-master       server2
172.25.81.3     Codis-redis-slave          server3

1. 安装go环境(所有节点均须安装,在server1上做演示,其他节点相同)

[root@server1 ~]# tar zxf go1.12.linux-amd64.tar.gz -C /usr/local/

[root@server1 ~]# vim /etc/profile

export GOPATH=/usr/local/codis
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin

[root@server1 ~]# source /etc/profile

[root@server1 ~]# go version            ##显示go版本信息

2、设置编译环境

[kiosk@foundation81 Downloads]$ wget https://codeload.github.com/CodisLabs/codis/zip/release3.2  ##下载codis源码包

在$GOPATH 目录里建立 codis 编译目录,将下载后的codis解压到此目录

[root@server1 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs

[root@server1 ~]# ls
go1.12.linux-amd64.tar.gz  release3.2
jdk-7u79-linux-x64.tar.gz  zookeeper-3.4.6.tar.gz

[root@server1 ~]# unzip release3.2

[root@server1 ~]# mv codis-release3.2 $GOPATH/src/github.com/CodisLabs/codis

[root@server1 ~]# cd $GOPATH/src/github.com/CodisLabs/codis

3、编译 Codis 源码

在编译之前需要安装依赖包

[root@server1 codis]# yum install -y gcc git autoconf      ##安装编译需要的依赖包

 

[root@server1 codis]# make MALLOC=libc

编译结果:

3.配置集群

Codis 源 码 编 译 完 成 后 , 组 件 的 启 动 脚 本 在$GOPATH/src/github.com/CodisLabs/codis/admin目录下。配置文件在

GOPATH/src/github.com/CodisLabs/codis/config 目录下。日志在$GOPATH/src/github.com/CodisLabs/codis/log 目录下。

(1)进行集群配置

codis-proxy 配置

<1>安装JDK

[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz

[root@server1 ~]# mv jdk1.7.0_79/ /usr/local/

[root@server1 local]# ln -s jdk1.7.0_79 java

[root@server1 local]# vim /etc/profile

export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

[root@server1 local]# source /etc/profile

<2>安装zookeeper

[root@server1 ~]# tar zxf zookeeper-3.4.12.tar.gz -C /usr/local/

[root@server1 ~]# vim /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/
export PATH=$PATH:$ZOOKEEPER_HOME/bin

[root@server1 ~]#  source /etc/profile

<3>配置zookeeper,修改配置文件:

[root@server1 ~]# cp /usr/local/zookeeper-3.4.12/conf/zoo_sample.cfg   /usr/local/zookeeper-3.4.12/conf/zoo.cfg

[root@server1 ~]# vim /usr/local/zookeeper-3.4.12/conf/zoo.cfg

dataDir=/data/zookeeper/data

autopurge.snapRetainCount=500

autopurge.purgeInterval=24

[root@server1 ~]# mkdir -p /data/zookeeper/data

 

设置myid:

设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件配置的srver.X中的X为什么数字,则myid文件就输入这个数字,这里只有一台zk,所以配置文件里可以不配置server.X,但还是要配置myid的,echo一个数字1进去即可。如果有多台zk,则分别在zk服务器上echo对应的数字进对应的myid文件

[root@server1 ~]# echo "1" > /data/zookeeper/data/myid

启动zookeeper:

因为环境变量里已经添加了路径,直接执行命令即可,执行zkServer.sh start后,要等一会再执行zkServer status:

[root@server1 ~]# zkServer.sh start

[root@server1 ~]# zkServer.sh status

 

 

在哪个目录下启动,就在哪个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。

[root@server1 ~]# vim /usr/local/codis/config.ini

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

 

<3>启动各个组件

[root@server1 ~]# zkServer.sh start      ##启动zookeeper

[root@server1 ~]# cd $GOPATH/src/github.com/CodisLabs/codis

[root@server1 codis]# ./admin/codis-dashboard-admin.sh start   ##启动CodisDashboard组件

查 看日志文件看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-dashboard.log.2019-03-04

[root@server1 codis]# ./admin/codis-proxy-admin.sh start        ##启动CodisProxy组件

查看日志看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-proxy.log.2019-03-04

 

[root@server1 codis]# ./admin/codis-server-admin.sh start   ##启动 Codis Server 组件

查看日志看是否启动成功:/tmp/redis_6379.log

 

[root@server1 codis]# ./admin/codis-fe-admin.sh start

查看日志看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-fe.log.2019-03-04

 server2与server3配置:(以server3为例

<1>安装go环境

<2>安装并编译 Codis 源码

<3>修改redis配置文件

[root@server3 ~]# cd  /usr/local/codis/src/github.com/CodisLabs/codis/config

[root@server3 config]# vim redis.conf

 61 bind 0.0.0.0

 84 port 6379

 128 daemonize yes

[root@server3 ~]# cd  /usr/local/codis/src/github.com/CodisLabs/codis

[root@server3 codis]# ./admin/codis-server-admin.sh start

查看日志看是否启动成功:

 


测试:

通过web浏览器访问集群管理页面(fe地址:172.25.81.1:9090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUPNEW GROUP 行输入 1,再点击 NEW GROUP 即可 添加 Codis Server,Add Server 行输入我们刚刚启动的 codis-server 地址,添加到我们刚新建的 Group,然后再点击 Add Server 按钮加入相应的codis-server(server2,server3),如下图所示

通过fe初始化slot

新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过 fe 提供的 rebalance all slots 按钮来做,如下图所示,点击此按钮,我们即快速完成了一个集群的搭建。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值