codis集群部署实战

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://navyaijm.blog.51cto.com/4647068/1637688

一、概要

1、折腾codis集群已经快两个月了,感谢一直以来codis的作者刘奇和黄东旭的耐心支持,在这里给你们点个赞,现在我司已经有一个业务跑在了codis集群上,目前只是切了整个业务的10%的量,预计下周会全量切到codis上,这个时候大家肯定特别想知道codis稳定吗?有没有什么bug啊,你想知道的也是我想知道的,搞起吧,用了才知道,反正目前我们这没发现啥问题,一些小的问题已经及时联系作者改掉了,好吧,不扯淡了,写这篇文章的目的是帮助想了解codis的初学者快速部署(官方的部署文档对应运维知识弱一点的童鞋看来还是有点费力)还有就是给自己做一个备录以便后期集群的部署。

2、Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (有一些命令不支持), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务,当然,前段时间redis官方的3.0出了稳定版,3.0支持集群功能,codis的实现原理和3.0的集群功能差不多,我了解的现在美团、阿里已经用了3.0的集群功能了,我们这边的业务主要是php,3.0集群的sdk目前貌似还没有支持php语言的,大家谁的php应用上了3.0集群,请联系我,我去取经,有关redis常见的集群技术,请移步到 @萧田国 萧老师的infoq专栏Redis集群技术及Codis实践

二、架构

wKiom1U4wNbil8RQAAIeNjYHmcE992.jpg

三、角色分批

1
2
3
4
5
6
7
8
9
10
11
12
13
zookeeper集群:
10.10.0.47
10.10.0.48
10.10.1.76
codis-config、codis-ha:
10.10.32.10:18087
codis-proxy:
10.10.32.10:19000
10.10.32.49:19000
codis-server:
10.10.32.42:6379、10.10.32.43:6380(主、从)
10.10.32.43:6379、10.10.32.44:6380(主、从)
10.10.32.44:6379、10.10.32.42:6380(主、从)

四、部署

1、安装zookeeper

1
yum -y  install  zookeeper jdk   ##安装服务
1
2
3
4
vim  /etc/hosts   ##添加host
10.10.0.47 ZooKeeper-node1
10.10.0.48 ZooKeeper-node2
10.10.1.76 ZooKeeper-node3
1
2
3
4
5
6
7
8
9
10
vim  /etc/zookeeper/conf/zoo .cfg  ##撰写zk的配置文件
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
dataDir= /data/zookeeper/
clientPort=2181
server.1=ZooKeeper-node1:2888:3888
server.2=ZooKeeper-node2:2888:3888
server.3=ZooKeeper-node3:2888:3888
1
2
3
mkdir  /data/zookeeper/  ##创建zk的datadir目录
echo  "2"  > /data/zookeeper/myid   ##生成ID,这里需要注意, myid对应的zoo.cfg的server.ID,比如ZooKeeper-node2对应的myid应该是2
/usr/lib/zookeeper/bin/zkServer .sh start   ## 服务启动

2、go安装(codis是go语言写的,所以那些机器需要安装你懂得)

1
2
3
4
5
6
7
8
9
10
11
12
wget https: //storage .googleapis.com /golang/go1 .4.1.linux-amd64. tar .gz
tar  -zxvf go1.4.1.linux-amd64. tar .gz
mv  go  /usr/local/
cd  /usr/local/go/src/
bash  all. bash
cat  >> ~/.bashrc << _bashrc_export
export  GOROOT= /usr/local/go
export  PATH=\$PATH:\$GOROOT /bin
export  GOARCH=amd64
export  GOOS=linux
_bashrc_export
source  ~/.bashrc

3、下载并编译codis(codis-config、codis-proxy、codis-server所在的机器)

1
2
3
4
5
6
mkdir  /data/go
export  GOPATH= /data/go
/usr/local/go/bin/go  get github.com /wandoulabs/codis
cd   /data/go/src/github .com /wandoulabs/codis/
. /bootstrap .sh
make  gotest

五、服务启动及初始化集群

1、启动 dashboard(codis-config上操作)

1
2
3
4
5
6
7
cat  /etc/codis/config_10 .ini  ##撰写配置文件
zk=10.10.0.47:2181,10.10.0.48:2181,10.10.1.76:2181
product=zh_news
proxy_id=codis-proxy_10
net_timeout=5000
proto=tcp4
dashboard_addr=10.10.32.10:18087
1
cd  /data/go/src/github .com /wandoulabs/codis/  &&  . /bin/codis-config  -c  /etc/codis/config_10 .ini  dashboard &

2、初始化 slots (codis-config上操作)

1
cd  /data/go/src/github .com /wandoulabs/codis/  &&  . /bin/codis-config  -c  /etc/codis/config_10 .ini slot init

3、启动 Codis Redis , 和官方的Redis Server参数一样(codis-server上操作)

1
cd  /data/go/src/github .com /wandoulabs/codis/  && . /bin/codis-server  /etc/redis_6379 .conf &

4、添加 Redis Server Group , 每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数(codis-config上操作)

1
2
3
4
5
6
7
cd  /data/go/src/github .com /wandoulabs/codis/
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 1 10.10.32.42:6379 master
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 1 10.10.32.43:6380 slave
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 2 10.10.32.43:6379 master
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 2 10.10.32.44:6380 slave
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 3 10.10.32.44:6379 master
. /bin/codis-config  -c  /etc/codis/config_10 .ini server add 3 10.10.32.42:6380 slave

5、设置 server group 服务的 slot 范围 Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.(codis-config上操作)

1
2
3
4
cd  /data/go/src/github .com /wandoulabs/codis/
. /bin/codis-config  -c  /etc/codis/config_10 .ini slot range- set  0 300 1 online
. /bin/codis-config  -c  /etc/codis/config_10 .ini slot range- set  301 700 2 online
. /bin/codis-config  -c  /etc/codis/config_10 .ini slot range- set  701 1023 3 online

6、启动 codis-proxy  (codis-proxy上操作)

1
2
3
4
5
6
7
cat  /etc/codis/config_10 .ini  ##撰写配置文件
zk=10.10.0.47:2181,10.10.0.48:2181,10.10.1.76:2181
product=zh_news
proxy_id=codis-proxy_10   ##10.10.32.49上改成codis-proxy_49,多个proxy,proxy_id 需要唯一
net_timeout=5000
proto=tcp4
dashboard_addr=10.10.32.10:18087
1
2
cd  /data/go/src/github .com /wandoulabs/codis/  &&  . /bin/codis-proxy   -c  /etc/codis/config_10 .ini -L  /data/log/codis-proxy_10 .log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
cd  /data/go/src/github .com /wandoulabs/codis/  &&  . /bin/codis-proxy   -c  /etc/codis/config_49 .ini -L  /data/log/codis-proxy_49 .log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &

OK,整个集群已经搭建成功了,截图给你们show show

wKiom1U4woPj8_kiAAIq1SRxwxo029.jpg

六、codis-server的HA

codis-ha实现codis-server的主从切换,codis-server主库挂了会提升一个从库为主库,从库挂了会设置这个从库从集群下线

1、安装

1
2
3
4
5
6
7
export  GOPATH= /data/go
/usr/local/go/bin/go  get github.com /ngaut/codis-ha
cd   /data/go/src/github .com /ngaut/codis-ha
go build
cp  codis-ha  /data/go/src/github .com /wandoulabs/codis/bin/
使用方法:
codis-ha --codis-config=dashboard地址:18087 --productName=集群项目名称

2、使用supervisord管理codis-ha进程

1
yum -y  install  supervisord
1
2
3
4
5
6
7
8
9
10
11
/etc/supervisord .conf中添加如下内容:
[program:codis-ha]
autorestart = True
stopwaitsecs = 10
startsecs = 1
stopsignal = QUIT
command  /data/go/src/github .com /wandoulabs/codis/bin/codis-ha  --codis-config=10.10.32.17:18087 --productName=zh_news
user = root
startretries = 3
autostart = True
exitcodes = 0,2

3、启动supervisord服务

1
2
/etc/init .d /supervisord  start
chkconfig supervisord  on

此时,ps -ef |grep codis-ha 你回发现codis-ha进程已经启动,这个时候你去停掉一个codis-server的master,看看slave会不会提升为master呢


七、关于监控

关于整个codis集群的监控,我们这边用的是zabbix,监控的指标比较简单,所以这块大家有什么好的建议多给我提提哈

zookeeper:监控各个节点的端口联通性(以后想着把进程也监控上)

codis-proxy:监控了端口的联通性,这个监控远远不够呀

codis-server:监控了内存使用率、连接数、联通性

codis-ha:监控进程

dashboard:监控端口联通性


八、使用过程中遇到的问题

1、codis-proxy的日志切割,codis-proxy的默认日志级别是info,日志量很大,我们这边每天产生50多G日志,目前codis-proxy还不支持热重启,想修改启动参数还是比较麻烦的,日志切割推荐用logrotate

2、codis-proxy的监听地址默认没有具体ipv4,也就是codis-proxy启动之后没有0.0.0.0:19000这样的监听,这样会导致的问题就是前端lvs没有办法负载均衡codis-proxy,不能转发请求过,这个问题已联系作者处理了,在codis-proxy启动的配置文件中加上proto=tcp4这个参数就支持监听ipv4了

3、添加 Redis Server Group的时候,非codis-server(原生的redis)竟然也能加入到codis集群里面,在redis和codis-server共存在一个物理机上的清楚,很容易加错,希望能有个验证,非codis-server不能加入到codis集群

4、codis集群内部通讯是通过主机名的,如果主机名没有做域名解析那dashboard是通过主机名访问不到proxy的http-addr地址的,这会导致从web界面上看不到 OP/s的数据,至于还有没有其他问题,目前我这边还没有发现,建议内部通讯直接用内网IP

PS:我已建立一个管理codis的QQ群,对codis感兴趣的可以加入一起交流,群号: 183613045


本文出自 “屌丝运维男” 博客,请务必保留此出处http://navyaijm.blog.51cto.com/4647068/1637688

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
22天前
|
NoSQL Java Shell
Redis集群搭建
Redis集群搭建
27 1
|
5月前
|
存储 Kubernetes Cloud Native
k8s 集群部署尝试
k8s 集群部署尝试
85 13
|
7月前
|
缓存 NoSQL 算法
Redis6搭建高可用的多主多从集群
Redis6搭建高可用的多主多从集群
129 0
|
NoSQL Linux Redis
|
NoSQL Redis 算法
搭建Redis高可用Cluster集群环境
首先搭建单机版 Redis 环境
179 0
搭建Redis高可用Cluster集群环境
|
NoSQL Java Linux
如何搭建Redis集群?
如何搭建Redis集群?
158 0
|
NoSQL Redis 容器
搭建redis集群
docker-compose 搭建redis集群
143 0
搭建redis集群
|
存储 缓存 运维
Redis高可用集群搭建,配置,运维与应用!
现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如何稳定、高性能地提供服务的?
165 0
|
Kubernetes 负载均衡 网络协议
Kubenetes高可用集群搭建
Kubenetes高可用集群搭建
255 0
Kubenetes高可用集群搭建
|
NoSQL Go Redis
基于Codis的Redis集群部署
Codis是基于代理的高性能Redis集群方案,使用Go语言进行开发,现在在在豌豆荚及其它公司内已经广泛使用,当然也包括我们公司。 Codis与常见的Redis集群方案对比。
1149 0