codis集群部署

来源:互联网 发布:seo基础理论 编辑:程序博客网 时间:2024/06/07 03:25

官方中文文档:https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md

简介

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

codis3.2集群架构

这里写图片描述

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

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

Codis Proxy:客户端连接的Redis代理服务, 实现了Redis协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的Redis没有区别(就像Twemproxy)。

  • 对于同一个业务集群而言,可以同时部署多个codis-proxy实例;

  • 不同codis-proxy之间由codis-dashboard保证状态同步。

Codis Dashboard:集群管理工具,支持codis-proxy、codis-serve的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy的状态的一致性。

  • 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;

  • 所有对集群的修改都必须通过 codis-dashboard 完成。

Codis Admin:集群管理的命令行工具。

  • 可用于控制codis-proxy、codis-dashboard状态以及访问外部存储。

Codis FE:集群管理界面。

  • 多个集群实例共享可以共享同一个前端展示页面;

  • 通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。

Codis HA:为集群提供高可用。

  • 依赖codis-dashboard实例,自动抓取集群各个组件的状态;

  • 会根据当前集群状态自动生成主从切换策略,并在需要时通过codis-dashboard完成主从切换。

Storage:为集群状态提供外部存储。

  • 提供Namespace概念,不同集群的会按照不同product name进行组织;

  • 目前仅提供了Zookeeper和Etcd两种实现,但是提供了抽象的interface可自行扩展。

即:
服务端:codis-fe——codis-dashboard——codis-proxy——codis-group——codis-server
客户端:client——nginx-tcp——codis-proxy
cdis-fe可以管理多个codis-dashboard
每个codis-dashboard代表一个产品线,每个codis-dashboard可以管理多个codis-proxy
每个codis-proxy可以管理多个codis-server group
每个codis-server group至少由两个codis-server组成,最少1主1备

安装与编译

安装JDK

sh jdk-6u45-linux-x64.binmv jdk1.6.0_45/ /usr/local/mv /usr/local/jdk1.6.0_45/ /usr/local/jdk

安装zookeeper

wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gztar zxf zookeeper-3.4.6.tar.gz -C /usr/local/mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper

编译zookeeper配置文件/usr/local/zookeeper/conf/zoo.cfg

maxClientCnxns=60tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/dbdataLogDir=/data/zookeeper/logclientPort=2181# cluster configureserver.1=172.25.21.4:2888:3888server.2=172.25.21.6:2888:3888server.3=172.25.21.7:2888:3888

其中2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。

下面需要生成ID,这里需要注意,myid对应的zoo.cfg的server.ID,比如第二台zookeeper主机对应的myid应该是2,以此类推

mkdir /data/zookeeper/{db,log} -p
[root@server4 ~]# echo 1 > /data/zookeeper/db/myid
[root@server6 ~]# echo 2 > /data/zookeeper/db/myid
[root@server7 ~]# echo 3 > /data/zookeeper/db/myid

更改配置环境变量

vim /etc/profile    #最后面添加export PATH=$PATH:/usr/local/zookeeper/bin/
source /etc/profile    #刷新环境变量
zkServer.sh start    #每个主机都启动服务
[root@server4 redis-6379]# zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode: follower[root@server6 ~]# zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode: leader[root@server7 ~]# zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode: follower

安装 Go 运行环境

下载并解压

wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gztar -zxf go1.4.1.linux-amd64.tar.gz -C /usr/local/
vim /etc/profile.d/go.sh    #修改环境变量#!/bin/bashexport GOROOT=/usr/local/goexport GOPATH=/usr/local/codis/export PATH=$PATH:$GOROOT/bin
chmod +x /etc/profile.d/go.shsource /etc/profile.d/go.sh
go versiongo version go1.8 linux/amd64
source /etc/profile    #刷新环境变量

下载并编译安装codis 3.2

cdmkdir /usr/local/codis/src/github.com/CodisLabscd /usr/local/codis/src/github.com/CodisLabs/wget https://github.com/CodisLabs/codis/archive/codis-release3.2.zipunzip codis-release3.2.zipmv codis-release3.2  codiscd codismake  

直接通过 make 进行编译时,如果出现下面的报错

In file included from adlist.c:34:zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directoryzmalloc.h:55:2: error: #error "Newer version of jemalloc required"make[1]: *** [adlist.o] Error 1make[1]: Leaving directory `/root/redis-4.0.1/src'make: *** [all] Error 2

输入下面的命令

make MALLOC=libc

这里写图片描述
在bin文件夹内生成codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server六个可执行文件。另外, bin/assets文件夹是codis-dashboard http服务需要的前端资源, 需要和codis-dashboard放置在同一文件夹下。

vim /etc/profile.d/go.sh    #修改环境变量#!/bin/bashexport GOROOT=/usr/local/goexport GOPATH=/usr/local/codis/export PATH=$PATH:$GOROOT/binexport PATH=$GOROOT/bin:$GOPATH/bin:$PATHexport PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/#export PATH=$PATH:/data/codis/redis/bin
source /etc/profile.d/go.sh

为Codis创建标准目录

mkdir -p /data/codis/shmkdir -p /data/codis/confmkdir -p /data/codis/logmkdir -p /data/codis/runmkdir -p /data/codis/redis/binmkdir -p /data/codis/redis/redis-6379mkdir -p /data/codis/redis/redis-6380

添加环境变量

vim /etc/profile.d/go.sh#!/bin/bashexport GOROOT=/usr/local/goexport GOPATH=/usr/local/codis/export PATH=$PATH:$GOROOT/binexport PATH=$GOROOT/bin:$GOPATH/bin:$PATHexport PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/export PATH=$PATH:/data/codis/redis/bin
source /etc/profile.d/go.sh

配置启动Codis各组件—-启动Redis

codis服务器

vim /data/codis/redis/redis-6379/redis.confdaemonize yespidfile /data/codis/run/redis-6379.pidport 6379tcp-backlog 65535bind 0.0.0.0timeout 0tcp-keepalive 0loglevel noticelogfile "/data/codis/log/redis-6379.log"databases 16lua-time-limit 5000maxclients 10000###慢日志参数###slowlog-log-slower-than 10000slowlog-max-len 128###内存参数###maxmemory 3Gmaxmemory-policy noeviction###RDB持久化参数####save 3600 1#stop-writes-on-bgsave-error yes#rdbcompression yes#rdbchecksum yes#dbfilename dump.rdb###AOF持久化参数####no-appendfsync-on-rewrite yes#appendonly yes#appendfilename "appendonly.aof"#appendfsync no#auto-aof-rewrite-min-size 512mb#auto-aof-rewrite-percentage 100#aof-load-truncated yes#aof-rewrite-incremental-fsync yes###客户端Buffer参数### client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60###其他参数###hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yeslatency-monitor-threshold 0###安全参数####requirepass  123456789
vim /data/codis/redis/redis-6380/redis.conf###基本参数###daemonize yespidfile /data/codis/run/redis-6380.pidport 6380tcp-backlog 65535bind 0.0.0.0timeout 0tcp-keepalive 0loglevel noticelogfile "/data/codis/log/redis-6380.log"databases 16lua-time-limit 5000maxclients 10000###慢日志参数###slowlog-log-slower-than 10000slowlog-max-len 128###内存参数###maxmemory 3Gmaxmemory-policy noeviction###RDB持久化参数####save 3600 1#stop-writes-on-bgsave-error yes#rdbcompression yes#rdbchecksum yes#dbfilename dump.rdb###AOF持久化参数###no-appendfsync-on-rewrite yesappendonly yesappendfilename "appendonly.aof"appendfsync noauto-aof-rewrite-min-size 512mbauto-aof-rewrite-percentage 100aof-load-truncated yesaof-rewrite-incremental-fsync yes###客户端Buffer参数### client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60###其他参数###hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yeslatency-monitor-threshold 0###安全参数####requirepass  123456789

使用codis-server启动redis

codis-server /data/codis/redis/redis-6379/redis.confcodis-server /data/codis/redis/redis-6380/redis.conf

配置启动Codis各组件—启动dashboard(集群中某一个节点)

生成默认的配置文件:

codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml

修改配置文件

# Set Coordinator, only accept "zookeeper" & "etcd"coordinator_name = "zookeeper"coordinator_addr = "172.25.21.4:2181,172.25.21.6:2181,172.25.21.7:2181"# Set Codis Product {Name/Auth}.product_name = "codis-demo"product_auth = ""# Set bind address for admin(rpc), tcp only.admin_addr = "0.0.0.0:18080"#配置文件参数说明:coordinator_name:外部存储类型,接受zookeeper/etcd,这里我们使用的zookeeper集群。coordinator_addr:外部存储地址。product_name:集群名称,满足正则\w[\w\.\-]*。product_auth:集群密码,默认为空。admin_addr:RESTful API端口。

启动dashboard

nohup codis-dashboard --ncpu=2 --config=/data/codis/conf/dashboard.toml --log=/data/codis/log/dashboard.log --log-level=WARN &

参数解释:
–ncpu=N:最大使用CPU个数。
-c CONF, –config=CONF:指定启动配置文件。
-l FILE, –log=FILE:设置log输出文件。
–log-level=LEVEL:设置log输出等级:INFO,WARN,DEBUG,ERROR,默认INFO,推荐WARN。

PS:dashboard只需要在一个节点启动即可,启动时会向zookeeper注册信息(topom),如果有其他节点也启动dashboard时,向zookeeper注册信息发现里面有信息时,就会无法启动的。

配置启动Codis各组件—-启动codis-proxy(集群中所有节点)

生成默认的配置文件:

codis-proxy --default-config | tee /data/codis/conf/proxy.toml
vim /data/codis/conf/proxy.tomlproduct_name = "codis-demo"product_auth = ""admin_addr = "0.0.0.0:11080"proto_type = "tcp4"proxy_addr = "0.0.0.0:19000"jodis_addr = "10.0.60.152:2181,10.0.60.153:2181,10.0.60.154:2181"jodis_timeout = 10backend_ping_period = 5session_max_timeout = 1800session_max_bufsize = 131072session_max_pipeline = 1024session_keepalive_period = 60#配置文件参数介绍:product_name:产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集。product_auth:集群密码,默认为空。Codis 3.x支持AUTH,但是要求所有组件使用的AUTH必须完全相同。admin_addr:RESTful API端口。proto_type:Redis端口类型,接受tcp/tcp4/tcp6/unix/unixpacket。proxy_addr:Redis端口地址或者路径。jodis_addr:Jodis注册zookeeper地址。jodis_timeout:Jodis注册session timeout时间,单位second。backend_ping_period:与codis-server探活周期,单位second,0表示禁止。session_max_timeout:与client连接最大读超时,单位second,0表示禁止。session_max_bufsize:与client连接读写缓冲区大小,单位byte。session_max_pipeline:与client连接最大的pipeline大小。session_keepalive_period:与client的tcp keepalive周期,仅tcp有效,0表示禁止。

启动codis-proxy

nohup codis-proxy --ncpu=2 --config=/data/codis/conf/proxy.toml --log=/data/codis/log/proxy.log --log-level=WARN &

codis-proxy启动后,处于waiting状态,监听proxy_addr地址,但是不会accept连接,添加到集群并完成集群状态的同步,才能改变状态为online。
通过codis-fe添加。

配置启动Codis组件—启动codis-fe

生成默认的配置文件:

codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee /data/codis/conf/codis.json
vim /data/codis/conf/codis.json[    {        "name": "codis-demo",        "dashboard": "172.25.21.4:18080"    }]

启动codis-fe,注意启动codis-fe的时候,必须要使用codis-fe的全路径进行启动

nohup /usr/local/codis/src/github.com/CodisLabs/codis/admin/codis-fe --ncpu=2 --log=/data/codis/log/fe.log --log-level=WARN --dashboard-list=/data/codis/conf/codis.json \--listen=0.0.0.0:8080 &

web监控端口是801端口,我们可以在浏览器打开http://172.25.21.4:8080看看图形化界面。

在Group的New Group下输入1并点击New Group添加组
在Add Server 下添加 172.25.21.4:6379 to 1,并点击Add Server添加redis到1这个组中,可以继续添加其他的redis到组中,然后点击图标‘扳手‘,即刷新,会自动分配添加的redis的角色,一般情况下每个组中只有一个master,并且第一个添加的redis为master,其他均为slave。
我添加的如下图所示:
这里写图片描述

这样codis集群就搭建完成。