内容参考:
技术博客:http://blog.csdn.net/wang_sir_90/article/details/51839109
官方说明:https://github.com/CodisLabs/codis/blob/release3.1/doc/tutorial_zh.md
操作系统: CentOS 6.5 x86_64
亲测,可用
目录
Codis部署安装手册... 1
1. 安装codis. 1
2. 配置codis-dashboard. 5
3. 配置codis-proxy. 6
4. 配置codis-fe集群管理界面... 8
5. 图形界面创建组和solt节点... 9
附录: Codis HA(可选组件)... 12
FAQ:. 13
1. 安装codis
1.1 下载golang安装包
# wget -c -o /opt/packages/go1.6.tar.gz
http://golangtc.com/static/go/1.6/go1.6.linux-amd64.tar.gz
# cd /opt/packages
# tar -zvxf go1.6.tar.gz -c /usr/local
1.2 Zookeeper集群搭建
部署zookeeper(可部署1个,建议部署多台[奇数]提供集群服务,须安装JDK)
# tar zxvf zookeeper-3.4.8.tar.gz -c /home
# mv /home/zookeeper-3.4.8 /home/zookeeper
# cd /home/zookeeper/conf (建议使用3.4.6以上版本)
# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/2181
dataLogDir=/home/zookeeper/2181/logs
clientPort=2181
maxClientCnxns=0
server.1=zookeeper-1:2888:3888
server.2=zookeeper-2:2888:3888
server.3=zookeeper-3:2888:3888
配置host 注意下面ip是zk的实际IP地址
# vim /ect/hosts
172.3.4.246 zookeeper-1
172.3.4.245 zookeeper-2
172.3.4.242 zookeeper-3
# vim /home/zookeeper/2181/myid
在此文件内编辑自己对应的serverID. serverID见上述红色标记的数字
# sh /home/zookeeper/bin/zkServer.sh start
# ./zookeeper_setup.sh -d /home -z 2181
# service zookeeperd start (详见脚本)
# zkCli.sh -server ip:2181 能正确访问 则说明zk部署成功zk启动成功(依次将zk集群启动)
配置环境变量
cat >> /etc/profile << EOF
ZK_HOME=/app/hhy/devops/zookeeper
PATH=$PATH:$ZK_HOME/bin
export PATH
EOF
或
echo -e "ZK_HOME=/app/hhy/devops/zookeeper\nPATH=$PATH:$ZK_HOME/bin\nexport PATH" >> /etc/profile
1.3 设置环境变量
cat >> /etc/profile.d/go.sh << EOF
export GOROOT=/usr/local/go
export GOPATH=/opt/codis
export ZOOKEEPER_HOME=/home/zookeeper
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$ZOOKEEPER_HOME/bin
EOF
source /etc/profile
1.4 Codis源码安装
# mkdir -p /opt/codis/src/github.com/CodisLabs
# cd /opt/codis
# yum install git -y
# go get -u -d github.com/CodisLabs/codis(这个方法我没有采用,不知道为什么执行之后不出结果,我是直接在官网下载的包)
# wget -c https://github.com/CodisLabs/codis-3.1.0.zip
# unzip codis-3.1.0.zip -d /opt/codis/src/github.com/CodisLabs
# cd /opt/codis/src/github.com/CodisLabs
# mv codis-3.1.0 codis
#cd codis
#make
#make gotest(测试编译是否成功)
执行成功后进入bin目录,会新增几个文件,如下表示编译成功
软链接:
ln -sf /opt/codis/bin/codis-admin /usr/local/sbin/codis-admin
ln -sf /opt/codis/bin/codis-dashboard /usr/local/sbin/codis-dashboard
ln -sf /opt/codis/bin/codis-fe /usr/local/sbin/codis-fe
ln -sf /opt/codis/bin/codis-proxy /usr/local/sbin/codis-proxy
ln -sf /opt/codis/bin/codis-ha /usr/local/sbin/codis-ha
ln -sf /opt/codis/bin/codis-server /usr/local/sbin/codis-server
ln -sf /opt/codis/bin/codis-server-2.8.21 /usr/local/sbin/codis-server-2.8.21
ln -sf /opt/codis/bin/redis-benchmark /usr/local/sbin/redis-benchmark
ln -sf /opt/codis/bin/redis-cli /usr/local/sbin/redis-cli
1.5 修改配置文件
使用GOPATH做为安装目录:
# mkdir -p /opt/codis/{conf,run,logs,data}
# cd /opt/codis/src/github.com/CodisLabs/codis
# cp extern/redis-2.8.21/redis.conf /opt/codis/conf/redis7000.conf
# cat /opt/codis/conf/redis7000.conf |grep -vE '^#|^$'
考虑性能,主库关闭aof和rdp,从库只开启aof:
###################### 2.8.21版本配置 #########################
daemonize yes
pidfile /opt/codis/run/redis7000.pid
port 7000
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /opt/codis/logs/redis7000.log
databases 16
#### 关闭rdb ####
save ""
#### 开启rdb ####
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump7000.rdb
dir /opt/codis/data
masterauth "hhy@2016"
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "hhy@2016"
maxmemory 10gb
maxmemory-policy allkeys-lru
#### 关闭aof ####
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
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
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 0 0 0
hz 10
aof-rewrite-incremental-fsync yes
#################################################################
说明:执行之前注意将run, logs和data的文件生成目录建好,不然会启动失败
启动redis
codis-server /opt/codis/conf/redis7000.conf &
codis-server /opt/codis/conf/redis7001.conf &
停止redis
redis-cli -h 127.0.0.1 -p 7000 -a hhy@2016 shutdown
redis-cli -h 127.0.0.1 -p 7001 -a hhy@2016 shutdown
###############################################################
2. 配置codis-dashboard
生成默认配置
# codis-dashboard --default-config | tee /opt/codis/conf/dashboard.conf
vim /opt/codis/conf/dashboard.conf
coordinator_name # 外部存储类型, 接受 zookeeper/etcd
coordinator_addr # 外部存储地址, 格式IP:port,多个地址之间用逗号分割
product_name # 集群名称,满足正则 \w[\w\.\-]*
product_auth # 集群密码,默认为空
admin_addr # RESTful API 端口
后台启动
# cd /opt/codis/bin
# nohup codis-dashboard --ncpu=1 --config=/opt/codis/conf/dashboard.conf --log=/opt/codis/logs/dashboard.log --log-level=WARN &
执行完成后出现以下内容说明成功
#more dashboard.log日期
停止dashboard服务
# codis-admin --dashboard=0.0.0.0:18080 --shutdown
参数说明:
--ncpu=N # 最大使用 CPU 个数
-c CONF, --config=CONF # 指定启动配置文件
-l FILE, --log=FILE # 设置 log 输出文件
--log-level=LEVEL # 设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN
备注:
对于同一个业务集群而言,可以同时部署多个codis-proxy实例;
不同codis-proxy之间由codis-dashboard保证状态同步;
3. 配置codis-proxy
生成默认配置
# codis-proxy --default-config | tee /opt/codis/conf/proxy.conf
vim /opt/codis/conf/proxy.conf
配置文件解析:
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
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表示禁止
后台启动
# cd /opt/codis/bin
# nohup codis-proxy --ncpu=1 --config=/opt/codis/conf/proxy.conf --log=/opt/codis/logs/proxy.log --log-level=WARN &
执行完成后出现以下内容说明成功
#more proxy.log日期
停止 proxy 服务
# codis-admin --proxy=172.3.4.246:11080 --auth="hhy@2016" --shutdown
描述:
codis-proxy启动后,处于 waiting 状态,监听proxy_addr 地址,但是不会 accept 连接,添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两种:
a. 通过 codis-fe 添加:通过 Add Proxy 按钮,将 admin_addr 加入到集群中;
b. 通过 codis-admin 命令行工具添加,方法如下:
# codis-admin --dashboard=172.3.4.246:18080 --create-proxy -x 172.3.4.246:11080
其中 172.3.4.246:18080 以及 172.3.4.246:11080 分别为 dashboard 和 proxy 的 admin_addr 地址;
添加过程中, dashboard 会完成如下一系列动作:
① 获取 proxy 信息,对集群 name 以及 auth 进行验证,并将其信息写入到外部存储中;
② 同步 slots 状态;
③ 标记 proxy 状态为 online,此后 proxy 开始 accept 连接并开始提供服务;
查看 proxy 工具用法
# codis-proxy -h
Usage:
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 --version
Options:
--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
4. 配置codis-fe集群管理界面
生成配置文件
# codis-admin --dashboard-list --zookeeper=172.3.4.246 | tee /opt/codis/conf/codis.json
启动codis-fe
# cd /opt/codis/bin
# nohup codis-fe --ncpu=1 --log=/opt/codis/logs/fe.log --log-level=WARN --dashboard-list=/opt/codis/conf/codis.json --assets-dir=/opt/codis/bin/assets --listen=0.0.0.0:18090 &
看生成的日志出现如下情况说明没问题
至此codis的图形界面已经能够显示
5. 图形界面创建组和solt节点
1) 打开浏览器访问http://ip:18090, 通过管理界面操作codis
创建组
输入编号1,点击New Group,第一组创建完成。
2) 添加实例
在后面输入组的id号,然后后面框内输入redis实例所在机器的ip地址和redis实例的端口号,点击Add Server即可添加完成 实例 ,再添加第二个实例完成后G-1那一列会有向上的箭头,点击后可升为master,点击第二个redis实例中master那一列的 图标 即可将 此实例设置为slave, 此图标可以将对应的实例从该组中删除,如下两图:
3) 对slots进行分组
如下图所示,输入你所要分组的slots的起和止的范围,然后输入组ID,点击后面按钮即可。
4) 添加管理proxy
如下图所示,在框内输入proxy所对应的ip地址和端口号点击Add proxy即可
5) 通过命令行进行操作
创建组:
# codis-admin --dashboard=172.3.4.246:18080 --create-group --gid=1
# codis-admin --dashboard=172.3.4.246:18080 --create-group --gid=2
组添加服务器:
# codis-admin --dashboard=172.3.4.246:18080 --group-add --gid=1 \
--addr=172.3.4.246:7000
# codis-admin --dashboard=172.3.4.246:18080 --group-add --gid=1 \
--addr=172.3.4.246:7001
把从库跟主库同步:(同一组的两个实例都要执行)
# codis-admin --dashboard=172.3.4.246:18080 --sync-action --create \
--addr=172.3.4.246:7000
# codis-admin --dashboard=172.3.4.246:18080 --sync-action --create \
--addr=172.3.4.246:7001
若从库需要提升为master,操作如下:
# codis-admin --dashboard=172.3.4.246:18080 --promote-server --gid=1 \
--addr=172.3.4.246:7001(从库ip和端口)
初始化 slots,并设置 server group 服务的slot范围(只在一节点执行一次)sid是slot的编号。Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成1024个slots (0-1023), 对于每个key来说, 通过以下公式确定所属的Slot Id : SlotId = crc32(key) % 1024 每一个slot都会有一个且必须有一个特定的server group id来表示这个slot的数据由哪个server group来提供.
# codis-admin
--dashboard=172.3.4.246:18080 --slot-action --create-range --beg=0 --end=300 --gid=1
# codis-admin
--dashboard=172.3.4.246:18080 --slot-action --create-range --beg=301 --end=601 --gid=2
附录: Codis HA(可选组件)
工作原理
注意:Codis HA 工具仅仅是 Codis 集群 HA 的一部分,单独工作能力有限。
默认以 5s 为周期,codis-ha 会从 codis-dashboard 中拉取集群状态,并进行主从切换;
codis-ha 在以下状态下会退出:
i. 从 codis-dashboard 获取集群状态失败时;
ii. 向 codis-dashboard 发送主从切换指令失败时;
codis-ha 在以下状态下不会进行主从切换:
i. 存在 proxy 状态异常:
因为提升主从需要得到所有 proxy 的确认,因此必须确保操作时所有 proxy 都能正常响应操作指令;
ii. 网络原因造成的 master 异常:
若存在 slave 满足 slave.master_link_status == up,通常可以认为master 并没有真的退出,而是由于网络原因或者响应延迟造成的 master 状态获取失败,此时 codis-ha 不会对该 group 进行操作;
iii. 没有满足条件的 slave 时:
提升过程会选择满足 slave.master_link_status == down,并且 slave.master_link_down_since_seconds 最小的进行操作。这就要求被选择的 slave 至少在过去一段时间内与 master 是成功同步状态,这个时间间隔是 2d+5,其中 d 是 codis-ha 检查周期默认 5秒。
注意:因此,应用 codis-ha 时还需要结合对 codis-proxy 和 codis-server 的可用性监控,否则 codis-ha 无法保证可靠性。
需要注意:codis将其中一个slave升级为master时,该组内其他slave实例是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,因而会导致组内新的master和其他slave之间的数据不一致。因为redis的slaveof命令切换master时会丢弃slave上的全部数据,从新master完整同步,会消耗资源。因此,当出现主从切换时,需要管理员手动创建新的sync action来完成新master与slave之间的数据同步。Codis-ha不会自动刷新其他slave的状态。
启动codis-ha
# cd /opt/codis/bin
# nohup codis-ha --log=/opt/codis/logs/ha.log --log-level=WARN --dashboard=127.0.0.1:18080 &
参数说明
# codis-ha -h
Usage:
codis-ha [--log=FILE][--log-level=LEVEL][--interval=SECONDS] --dashboard=ADDR
codis-ha --version
Options:
--log=FILE 设置 log 输出文件
--log-level=LEVEL 设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN
FAQ:
异常关机后,无法启动dashboard,日志报下错:
2016/11/15 21:41:05 topom.Go:121: [ERROR] store: acquire lock of codis_gls_prd failed
[error]: zk: node already exists
解决方法:
# codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181
重启dashboard
启动codis-ha报错:
2017/01/10 09:40:52 main.go:110: [PANIC] rpc stats failed
[error]: [Remote Error] topom is not online
原因: dashboard的没有被解锁
解决方法:执行如上操作,并重启dashboard即可
删除server节点的分组报错:
原因:已经分配slot的group无法删除, 且server-master不能删除
解决:重新分配slot,或者想办法迁移slot后,再尝试删除
防止意外丢失数据
主从切换后,原主恢复后,先导出一份原从的数据,再进行主从同步数据
导出导入工具介绍:redis-port
1. DUMP rdb file from master redis
redis-port dump [--ncpu=N] --from=MASTER [--password=PASSWORD] [--output=OUTPUT]
2. SYNC data from master to slave
redis-port sync [--ncpu=N] --from=MASTER [--password=PASSWORD] --target=TARGET
参数介绍:
Options
-n N, --ncpu=N
set runtime.GOMAXPROCS to N
-i INPUT, --input=INPUT
use INPUT as input file, or if it is not given, redis-port reads from stdin (means '/dev/stdin')
-o OUTPUT, --output=OUTPUT
use OUTPUT as output file, or if it is not given, redis-port writes to stdout (means '/dev/stdout')
-m MASTER, --master=MASTER
specify the master redis
-t TARGET, --target=TARGET
specify the slave redis (or target redis)
-P PASSWORD, --password=PASSWORD
specify the redis auth password
-A AUTH, --auth=AUTH
specify the auth password for target
-e, --extra
dump or restore following redis backlog commands
--filterdb=DB
filter specifed db number, default value is '*'
一组codis-server全部异常会导致proxy代理无法连接后端
报错:ERR handle response, backend conn reset
解决:每个GROUP做成master-slave模式,确保至少有一个server可以提供服务。
Migrate Slots任务异常
报错:再执行Migrate任务,提示已经有任务在进行
尝试:
# codis-admin --proxy=172.3.4.246:11080 --reset-stats