官方中文文档: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服务。
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 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备
sh jdk-6u45-linux-x64.bin
mv jdk1.6.0_45/ /usr/local/
mv /usr/local/jdk1.6.0_45/ /usr/local/jdk
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.g
z
tar 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=60
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/db
dataLogDir=/data/zookeeper/log
clientPort=2181
# cluster configure
server.1=172.25.21.4:2888:3888
server.2=172.25.21.6:2888:3888
server.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 status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@server6 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@server7 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
下载并解压
wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
tar -zxf go1.4.1.linux-amd64.tar.gz -C /usr/local/
vim /etc/profile.d/go.sh #修改环境变量
#!/bin/bash
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
chmod +x /etc/profile.d/go.sh
source /etc/profile.d/go.sh
go version
go version go1.8 linux/amd64
source /etc/profile #刷新环境变量
cd
mkdir /usr/local/codis/src/github.com/CodisLabs
cd /usr/local/codis/src/github.com/CodisLabs/
wget https://github.com/CodisLabs/codis/archive/codis-release3.2.zip
unzip codis-release3.2.zip
mv codis-release3.2 codis
cd codis
make
直接通过 make 进行编译时,如果出现下面的报错
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[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/bash
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/
#export PATH=$PATH:/data/codis/redis/bin
source /etc/profile.d/go.sh
mkdir -p /data/codis/sh
mkdir -p /data/codis/conf
mkdir -p /data/codis/log
mkdir -p /data/codis/run
mkdir -p /data/codis/redis/bin
mkdir -p /data/codis/redis/redis-6379
mkdir -p /data/codis/redis/redis-6380
添加环境变量
vim /etc/profile.d/go.sh
#!/bin/bash
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export 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服务器
vim /data/codis/redis/redis-6379/redis.conf
daemonize yes
pidfile /data/codis/run/redis-6379.pid
port 6379
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/codis/log/redis-6379.log"
databases 16
lua-time-limit 5000
maxclients 10000
###慢日志参数###
slowlog-log-slower-than 10000
slowlog-max-len 128
###内存参数###
maxmemory 3G
maxmemory-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 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
###其他参数###
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
latency-monitor-threshold 0
###安全参数###
#requirepass 123456789
vim /data/codis/redis/redis-6380/redis.conf
###基本参数###
daemonize yes
pidfile /data/codis/run/redis-6380.pid
port 6380
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/codis/log/redis-6380.log"
databases 16
lua-time-limit 5000
maxclients 10000
###慢日志参数###
slowlog-log-slower-than 10000
slowlog-max-len 128
###内存参数###
maxmemory 3G
maxmemory-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 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
###其他参数###
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
latency-monitor-threshold 0
###安全参数###
#requirepass 123456789
使用codis-server启动redis
codis-server /data/codis/redis/redis-6379/redis.conf
codis-server /data/codis/redis/redis-6380/redis.conf
生成默认的配置文件:
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-proxy --default-config | tee /data/codis/conf/proxy.toml
vim /data/codis/conf/proxy.toml
product_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 = 10
backend_ping_period = 5
session_max_timeout = 1800
session_max_bufsize = 131072
session_max_pipeline = 1024
session_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-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集群就搭建完成。