架构图:

img

一.环境信息:

1)服务器配置
操作系统: centos 6.5
内核版本:2.6.32-431.el6.x86_64
CPU: i3-3240 4核
内存: 8G
2)相关软件包
codis版本:3.1
go版本:1.7.4
java版本: 1.8.0_101
zookeeper版本:3.4.6godep

二.安装:

1.epel源:
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.依赖包:
yum install -y gcc make gcc-c++ automake lrzsz openssl-devel zlib-* bzip2-* readline* zlib-* bzip2-* git nmap unzip wget lsof xz net-tools mer
curial vim
3.golang:
yum install golang -y
yum install java-1.8.0-openjdk* -y
4.zookeeper:
4.1 下载安装
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gztar -xvf zookeeper-3.4.6.tar.gz -C /usr/local/
cd /usr/local
ln -s zookeeper-3.4.6 zookeeper
4.2 生成配置文件
cd /usr/local/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
4.3 修改zookeeper配置文件
vim /usr/local/zookeeper/conf/zoo.cfg

maxClientCnxns=60tickTime=2000initLimit=10syncLimit=5dataDir=/usr/local/zookeeper/data
dataLogDir=/data/logs/zookeeper
clientPort=2181server.1=192.168.2.5:2888:3888server.2=xxx.xx.xxx.xx:2888:3888server.3=xxx.xx.xxx.xx:2888:38882888表示zookeeper程序监听端, 3888表示zookeeper选举通信端
(server可以加多个,xxx.xx.xxx.xx代表IP地址,这里用一个)
4.4 创建所需文件夹
mkdir -p /usr/local/zookeeper/datamkdir /var/log/zookeeper
4.5 生成myid
echo "1" >/usr/local/zookeeper/data/myid ##成ID,这里需要注意, myid对应的zoo.cfg的server.ID,假如第2台zookeeper主机对应的myid应该是2
4.6 启动zookeeper
cd /usr/local/zookeeper/bin
./zkServer.sh start
4.7 关闭zookeeper
cd /usr/local/zookeeper/bin
./zkServer.sh stop
4.8 查看zk状态
cd /usr/local/zookeeper/bin
./zkServer.sh status
4.9 查看相关信息
/usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
5.修改内核参数
vim /etc/sysctl.conf
vm.overcommit_memory = 1sysctl vm.overcommit_memory=1参数说明:取值为0,系统在为应用进程分配虚拟地址空间时,会判断当前申请的虚拟地址空间大小是否超过剩余内存大小,如果超过,则虚拟地址空间分配失败。因此,也就是如果进程本身占用的虚拟地址空间比较大或者剩余内存比较小时,fork、malloc等调用可能会失败。
 取值为1,系统在为应用进程分配虚拟地址空间时,完全不进行限制,这种情况下,避免了fork可能产生的失败,但由于malloc是先分配虚拟地址空间,而后通过异常陷入内核分配真正的物理内存,在内存不足的情况下,这相当于完全屏蔽了应用进程对系统内存状态的感知,即malloc总是能成功,一旦内存不足,会引起系统OOM杀进程,应用程序对于这种后果是无法预测的
 取值为2,则是根据系统内存状态确定了虚拟地址空间的上限,由于很多情况下,进程的虚拟地址空间占用远大小其实际占用的物理内存,这样一旦内存使用量上去以后,对于一些动态产生的进程(需要复制父进程地址空间)则很容易创建失败,如果业务过程没有过多的这种动态申请内存或者创建子进程,则影响不大,否则会产生比较大的影响
手工执行:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并加到/etc/rc.local中
参数说明:取消对透明巨页内存(transparent huge pages)的支持,因为这会造成 redis 使用过程产生延时和内存访问问题。
6.安装godep
wget https://github.com/kr/heroku-buildpack-go/raw/master/linux-amd64/bin/godepcp godep /usr/local/bin/
7.安装codis
7.1 下载codis
mkdir -p /usr/local/gopkg/src/github.com/CodisLabs/
cd /usr/local/gopkg/src/github.com/CodisLabs/
git clone https://github.com/CodisLabs/codis.git -b release3.1
7.2 编译codis
cd /usr/local/gopkg/src/github.com/CodisLabs/codis
make
7.3 查看bin
ll bin
总量 82728drwxr-xr-x 4 root root 111 12 18 21:54 assets
-rwxr-xr-x 1 root root 18261200 12 18 21:54 codis-admin
-rwxr-xr-x 1 root root 19101304 12 18 21:54 codis-dashboard
-rwxr-xr-x 1 root root 17655424 12 18 21:54 codis-fe
-rwxr-xr-x 1 root root 10032096 12 18 21:54 codis-ha
-rwxr-xr-x 1 root root 11202080 12 18 21:54 codis-proxy
-rwxr-xr-x 1 root root 4167892 12 18 21:54 codis-server
-rwxr-xr-x 1 root root 2073794 12 18 21:54 redis-benchmark
-rwxr-xr-x 1 root root 2197701 12 18 21:54 redis-cli
-rw-r--r-- 1 root root 148 12 18 21:54 version
注意:yum安装的go还是需要指定GOROOT和GOPATH(在/etc/profile里),我直接ln -s /usr/lib/golang /usr/local/go,make成功后,会在 bin 文件夹内生成 codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server 六个可执行文件。另外,bin/assets文件夹是 codis-dashboard http服务需要的前端资源,需要和codisdashboard 放置在同一文件夹下

vim /etc/profileexport GOROOT=/usr/local/goexport GOPATH=/usr/local/gopkgexport ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$GOPATH/bin
7.4 创建codis所需目录
mkdir -p /usr/local/codis
mkdir -p /data/logs/codis
mkdir -p /data/codis/redis_conf
mkdir -p /data/components/redis
7.5 拷贝codis的bin目录
cp -r /usr/local/gopkg/src/github.com/CodisLabs/codis/bin /usr/local/c
odis/

由于codis 本身只有codis-server ,没有Redis-cli,需要把redis 2.8.21 安装包里面的 redis-cli copy到/usr/local/codis/bin 下面:

cd /usr/local/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src
cp redis-cli /usr/local/codis/bin
7.6 配置和启动各组件

配置和启动 Codis的Redis 配置文件 : /usr/local/codis/redis_conf/redis6379.conf 设置密码: xxxxx 考虑性能,主库关闭aof和rdp,从库只开启aof:

cd /usr/local/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/
cp redis.conf /usr/local/codis/conf/redis6379.confcp redis.conf /usr/local/codis/conf/redis6380.conf

将redis6379.conf更改以下参数(主库):

daemonize yes
pidfile /usr/locai/codis/run/redis6379.pid
port 6379
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /data/logs/codis/redis6379.log
databases 16
save ""
#save 900 1 ----关闭aof#save 300 10
#save 60 10000stop-writes-on-bgsave-error nordbcompression yes
dbfilename dump6379.rdb
dir /data/codis/redis_data_6379
masterauth "xxxxx"slave-serve-stale-data yes
repl-disable-tcp-nodelay noslave-priority 100requirepass "xxxxx"maxmemory 10gb
maxmemory-policy allkeys-lru
appendonly noappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
lua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128hash-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 64client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 0 0 0client-output-buffer-limit pubsub 0 0 0hz 10aof-rewrite-incremental-fsync yesrepl-backlog-size 33554432

将redis6380.conf更改以下参数(从库):

daemonize yes
pidfile /usr/local/codis/run/redis6380.pid
port 6380
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /data/logs/codis/redis6380.log
databases 16
save ""
#save 900 1 ----关闭aof#save 300 10
#save 60 10000stop-writes-on-bgsave-error nordbcompression yes
dbfilename dump6379.rdb
dir /data/codis/redis_data_6380
masterauth "xxxxx"slave-serve-stale-data yes
repl-disable-tcp-nodelay noslave-priority 100requirepass "xxxxx"maxmemory 10gb
maxmemory-policy allkeys-lru
appendonly noappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
lua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128hash-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 64client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 0 0 0client-output-buffer-limit pubsub 0 0 0hz 10aof-rewrite-incremental-fsync yes
repl-backlog-size 33554432
7.7 启动redis
/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/redis6379.conf/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/redis6380.conf

三.配置codis

1.Codis Dashboard

Coddis3.0的dashboard与codis 2.0有所不同,作为集群管理工具,它支持codisproxy,codis-server的添加、删除以及数据迁移等操作。在集群状态发生改变时, codisdashboard 维护集群下所有 codis-proxy 的状态一致性。有以下两点注意事项:

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

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

1.1 配置Codis Dashboard

默认配置文件dashboard.toml可由codis-dashboard生成。

#/usr/local/codis/bin/codis-dashboard --default-config | tee dashboard.toml(就是dashboard.conf)

生成dashboard.toml文件,可自行配置。

# Set Coordinator, only accept"zookeeper"&"etcd"coordinator_name = "zookeeper"coordinator_addr = "192.168.2.5:2181,xxx.xx.xxx.xx:2181,xxx.xx.xxx.xx
:2181" #zookeeper是集群的话就写多个ip和端口,逗号隔开
# 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
coordinator_addr 外部存储地址
product_name 集群名称,满足正则 \w[\w\.\-]*
product_auth 集群密码,默认为空
admin_addr RESTful API 端口
1.2 启动codis dashboard
nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=das
hboard.toml(这里指定dashboard.conf也可以) --log=dashboard.log --log-level=WARN &

参数说明:

#bin/codis-dashboard -hUsage:
codis-dashboard [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEV
EL] [--host-admin=ADDR]
codis-dashboard --default-config
codis-dashboard --version--ncpu=N 最使 CPU 个数
-c CONF, --config=CONF 指定启动配置文件
-l FILE, --log=FILE 设置 log 输出件
--log-level=LEVEL 设置log输出等级: INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN
正常关闭dashboard命令: bin/codis-admin --dashboard=192.168.2.5:18
080 --shutdown
2.Codis Proxy

对于同一个业务集群而言,可以同时部署多个codis-proxy 实例; 不同 codis-proxy 之间由 codis-dashboard 保证状态同步

2.1 配置Proxy

默认配置文件proxy.toml由codis-proxy生成

/usr/local/codis/bin/codis-proxy --default-config | tee proxy.toml( prox
y.conf)

生成proxy.toml可自行配置

# 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:11080"# Set bind address for proxy, proto_type can be "tcp","tcp4", "tcp6", "
unix" or "unixpacket".
proto_type = "tcp4"proxy_addr = "0.0.0.0:19000"# Set jodis address & session timeout.
jodis_addr = ""jodis_timeout = 10# Proxy will ping-pong backend redis periodly to keep-alive
backend_ping_period = 5# If there is no request from client for a long time, the connectionwill be droped. Set 0 to disable.
session_max_timeout = 1800# Buffer size for each client connection.
session_max_bufsize = 131072# Number of buffered requests for each client connection.
# Make sure this is higher than the max number of requests for eachpipe
line request, or your client may be blocked.
session_max_pipeline = 1024# Set period between keep alives. Set 0 to disable.
session_keepalive_period = 60

参数说明:

product_name 集群名称,参考dashboard参数说明
product_auth 集群密码,默认为空
admin_addr RESTfulAPI 端
proto_type Redis 端类型,接受tcp/tcp4/tcp6/unix/unixpacket
proxy_addr Redis 端地址或者路径
jodis_addr Jodis注册zookeeper地址
jodis_timeout Jodis注册sessiontimeout时间,单位second
jodis_compatible Jodis注册 zookeeper 的路径
backend_ping_period 与codis-server 探活周期,单位second, 0表示禁
session_max_timeout 与client 连接最读超时,单位second, 0表示禁
session_max_bufsize 与client 连接读写缓冲区,单位bytesession_max_pipeline 与client 连接最的pipeline
session_keepalive_period 与client 的 tcp keepalive周期,仅tcp有效, 0表示禁
2.2 启动proxy
nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=proxy.toml \
--log=proxy.log --log-level=WARN &

codis-proxy启动后,处于 waiting 状态,监听proxy_addr 地址,但是不会accept连接。 添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两 种:

通过codis-fe添加:通过Add Proxy按钮,将admin_addr加入到集群中; 通过codis-admin命令行工具添加,方法如下:

/usr/local/codis/bin/codis-admin --dashboard=192.168.2.5:18080 --crea
te-proxy -x 192.168.2.5:11080

其中192.168.2.5:18080 以及192.168.2.5:11080 分别为dashboard和proxy的 admin_addr 地址。 添加过程中, dashboard会完成如下一系列动作: ① 获取 proxy 信息,对集群name以及auth进行验证,并将其信息写入到外部存储 中; ② 同步slots状态; ③ 标记proxy状态为online,此后proxy开始accept连接并开始提供服务。 正常关闭proxy操作

/usr/local/codis/bin/codis-admin --proxy=192.168.2.5:11080 --auth="xx
xxx"(有就加,没有就不加) --shutdown

/usr/local/codis/bin/codis-proxy -hUsage:
codis-proxy [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL]
[--host-admin=ADDR]

[--host-proxy=ADDR] [--ulimit=NLIMIT]
codis-proxy --default-config
codis-proxy --versionOptions:
--ncpu=N 最使 CPU 个数
-c CONF, --config=CONF 指定启动配置件
-l FILE, --log=FILE 设置 log 输出件
--log-level=LEVEL 设置 log 输出等级: INFO,WARN,DEBUG,ERROR;默认INFO,
推荐WARN
--ulimit=NLIMIT 检查ulimit -n的结果,确保运行时最大文件描述不少于NLIMIT
3.Codis FE
3.1 集群管理界面

多个集群实例可以共享同一个前端展示页面; 通过配置文件管理后端codis-dashboard列表,配置文件可自动更新

3.2 配置codis-fe

配置文件codis.json( fe.conf)可以手动编辑,也可以通过codis-admin从外部存储中拉 取。

/usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=192.168.2.5:2181 | tee codis.json

[
{"name": "codis-demo","dashboard": "127.0.0.1:18080"}
]
3.3 启动codis-fe
nohup /usr/local/codis/bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \
--dashboard-list=codis.json --listen=0.0.0.0:18090 &#(这指定端号为1809
0是为了防和codis-dashboard的端号18080冲突)

/usr/local/codis/bin/codis-fe -hUsage:
codis-fe [--ncpu=N][--log=FILE] [--log-level=LEVEL] --dashboard-list=LIST --listen=ADDR
codis-fe --versionOptions:
--ncpu=N 最使 CPU 个数
-d LIST,--dashboard-list=LIST 配置件,能够动刷新
-l FILE, --log=FILE 设置 log 输出件
--log-level=LEVEL 设置 log 输出等级: INFO,WARN,DEBUG,ERROR;默认INFO,推荐WA
RN
--listen=ADDR HTTP 服务端

打开浏览器,在地址栏里输入http://192.168.2.5:18090,通过管理界面操作Codis 至此,我们的codis集群就搭建完毕,