技术经验分享:codis原理及部署_01

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 技术经验分享:codis原理及部署_01

一.codis介绍


Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到Codis Proxy和连接原生的RedisServer没有明显的区别,有部分命令不支持


Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的Redis服务.


Codis由四部分组成


Codis-proxy:实现redis协议,由于本身是无状态的,因此可以部署很多个节点


Codis-config :是codis的管理工具,包括添加/删除redis节点添加删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置


Codis-server :是codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移指令; codis-proxy和codis-config只能和这个版本的redis交互才能正常运行


Zookeeper,用于codis集群元//代码效果参考:http://www.jhylw.com.cn/454321127.html

数据的存储,维护codis集群节点

二.Codis优缺点


优点


对客户端透明,与codis交互方式和redis本身交互一样


支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面


支持高可用,无论是redis数据存储还是代理节点


自动进行数据的均衡分配


最大支持1024个redis实例,存储容量海量


高性能


缺点


采用自有的redis分支,不能与原版的redis保持同步


如果codis的proxy只有一个的情况下, redis的性能会下降20%左右


某些命令不支持,比如事务命令muti


国内开源产品,活跃度相对弱一些


三.部署codis,并写代码访问codis


3.1 zookeeper


1.三集群节点


172.16.10.142 zoo1


172.16.10.143 zoo2


172.16.10.144 zoo3


# 确保每个节点hostname -i返回的是正确IP地址


2.获取安装软件


wget


scp -rp zookeeper-3.4.12 172.16.10.143:/usr/local


scp -rp zookeeper-3.4.12 172.16.10.144:/usr/local


mv zookeeper-3.4.12 /usr/local/zookeeper-3.4.12/


3.设置环境变量


export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/


export PATH=$PATH:$ZOOKEEPER_HOME/bin


4.单机环境配置文件


cd /usr/local/zookeeper-3.4.12/conf


cp -rp zoo_sample.cfg zoo.cfg


vi zoo.cfg


tickTime=2000


initLimit=10


syncLimit=5


dataDir=/usr/local/zookeeper/data


dataLogDir=/usr/local/zookeeper/log


clientPort=2181


# tickTime : 服务器与客户端之间交互的基本时间单元(ms)


# dataDir : 保存zookeeper数据路径


# dataLogDir : 保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致


# clientPort : 客户端访问zookeeper时经过服务器端时的端口号


5.集群环境配置文件


cd /usr/local/zookeeper-3.4.12/conf


cp -rp zoo_sample.cfg zoo.cfg


vi zoo.cfg


tickTime=2000


# tickTime : 服务器与客户端之间交互的基本时间单元(ms)


initLimit=10


# initLimit : 此配置表示允许follower连接并同步到leader的初始化时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。


syncLimit=5


# syncLimit : Leader服务器与follower服务器之间信息同步允许的最大时间间隔,如果超过次间隔,默认follower服务器与leader服务器之间断开链接。


dataDir=/usr/local/zookeeper/data


# dataDir : 保存zookeeper数据路径


dataLogDir=/usr/local/zookeeper/log/tran_logs


# dataLogDir : 保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致,事务日志,会产生version2目录


clientPort=2181


# clientPort : 客户端访问zookeeper时经过服务器端时的端口号


maxClientCnxns=60


# maxClientCnxns : 限制连接到zookeeper服务器客户端的数量。


server.1=zoo1:2888:3888


server.2=zoo2:2888:3888


server.3=zoo3:2888:3888


# server.id=host:port:port : 表示了不同的zookeeper服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息。用户可以从“server.id=host:port:port” 中读取到相关信息。在服务器的data(dataDir参数所指定的目录)下创建一个文件名为myid的文件,这个文件的内容只有一行,指定的是自身的id值。比如,服务器“1”应该在myid文件中写入“1”。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。这一样配置中,zoo1代表第一台服务器的IP地址。第一个端口号(port)是从follower连接到leader机器的端口,第二个端口是用来进行leader选举时所用的端口。所以,在集群配置过程中有三个非常重要的端口:clientPort:2181、port:2888、port:3888。


5.写id到文件


ssh 172.16.10.142 "echo '1' > /usr/local/zookeeper-3.4.12/data/myid"


ssh 172.16.10.143 "echo '2' > /usr/local/zookeeper-3.4.12/data/myid"


ssh 172.16.10.144 "echo '3' > /usr/local/zookeeper-3.4.12/data/myid"


6.更改日志输出


/usr/local/zookeeper-3.4.12/conf/log4j.properties


#zookeeper.root.logger=INFO, CONSOLE


zookeeper.root.logger=INFO, ROLLINGFILE


#log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender


log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender


#log4j.appender.ROLLINGFILE.MaxFileSize=10MB


# 更改app应用的日志输出


vi zkEnv.sh


if 【 "x${ZOO_LOG_DIR}" = "x" 】


then


ZOO_LOG_DIR="/usr/local/zookeeper/log/app_logs/"


fi


if 【 "x${ZOO_LOG4J_PROP}" = "x" 】


then


ZOO_LOG4JPROP="INFO,ROLLINGFILE"


fi


3.2 go


1.下载


wget


tar -zxvf go1.9.2.linux-amd64.tar.gz -C /usr/local


2.配置环境变量


export GOROOT=/usr/local/go //后面的值指向go解压的目录


export GOPATH=/usr/local/go/gowork //go环境境的扩展包目录,所有go环境境共用,工作目录


PATH=$PATH:$GOROOT/bin:$GOPATH/bin


# go命令依赖一个重要的环境变量:$GOPATH


# GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;,Linux系统是冒号:


# 当有多个GOPATH时默认将go get获取的包存放在第一个目录下


# $GOPATH目录约定有三个子目录


# - src存放源代码(比如:.go .c .h .s等)


# - pkg编译时生成的中间文件(比如:.a)


# - bin编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)


3.查看版本


【root@slave01 go】# go version


go version go1.8.3 linux/amd64


3.3 CodsLabs


1.下载


go get github.com/wandoulabs/codis


# cd .; git clone /usr/local/go/gowork/src/github.com/wandoulabs/codis


Cloning into '/usr/local/go/gowork/src/github.com/wandoulabs/codis'...


fatal: unable to access '': Peer reports incompatible or unsupported protocol version.


yum update nss curl git


mkdir -p $GOPATH/src/github.com/CodisLabs


cd $ && git clone -b release3.2


1.linux二进制 2.或者直接下载zip包


2.安装


cd $GOPATH/src/github.com/CodisLabs/codis


$ make


3.提取有用程序


# 进入源码目录


mkdir /usr/local/codis


cp -rp bin admin config /usr/local/codis/


3.4 部署codis-dashboard


1.修改配置文件


vi /usr/local/codis/config/dashboard.toml


#coordinator_name = "filesystem"


#coordinator_addr = "/tmp/codis"


coordinator_name = "zookeeper"


coordinator_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"


2.启动dashboard


cd /usr/local/codis


./admin/codis-dashboard-admin.sh start


ss -tpnl |grep 18080


# 可以查看log确认状态 /usr/local/codis/log/codis-dashboard.log.


3.dashboard地址


admin_addr = "0.0.0.0:18080"


3.5 部署codis-fe管理后台


1.修改启动文件


vi /usr/local/codis/admin/codis-fe-admin.sh


#COORDINATOR_NAME="filesystem"


#COORDINATOR_ADDR="/tmp/codis"


COORDINATOR_NAME="zookeeper"


COORDINATOR_ADDR="172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"


2.启动fe


cd /usr/local/codis


./admin/codis-fe-admin.sh start


ss -tpnl|grep 9090


# 可以查看log确认状态 /usr/local/codis/log/codis-fe.log.


3.后台管理地址


CODIS_FE_ADDR="0.0.0.0:9090"


3.6 部署codis-server加入集群


部署4个节点的server 172.16.10.142/143/144/154


1.所有server机器启动codis-server


/usr/local/codis/admin/codis-server-admin.sh start


2.redis.conf修改了如下参数(仅用于测试)


protected-mode no


port 6369


pidfile /usr/local/codis/log/redis_6369.pid


logfile "/usr/local/codis/log/redis_6369.log"


dbfilename dump_6369.rdb


dir /usr/local/codis/log/


appendfilename "appendonly.aof"


3.fe管理后台添加2个group,每个group分配2个机器


4.点击分配槽位


3.7 部署codis-proxy代理服务


部署3个节点的server 172.16.10.142/143/144


1.修改配置文件proxy.toml,zookeeper地址


vi /usr/local/codis/config/proxy.toml


#jodis_name = ""


#jodis_addr = ""


jodis_name = "zookeeper"


jodis_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"


2.修改启动文件并启动,指向dashboard IP:PORT


vi /usr/local/codis/admin/codis-proxy-admin.sh


#CODIS_DASHBOARD_ADDR="127.0.0.1:18080"


CODIS_DASHBOARD_ADDR="172.16.10.154:18080"


/usr/local/codis/admin/codis-proxy-admin.sh //代码效果参考:http://www.jhylw.com.cn/064723339.html

start

ss -tpnl |grep 19000


3.proxy启动默认会自动注册到dashboard中,也可以在fe中手动添加


3.8 部署redis-sentinel实现集群HA


部署3个节点的server 172.16.10.142/143/144


1.修改配置文件


vi /usr/local/codis/config/sentinel.conf


port 26379


dir "/tmp"


protected-mode no


2启动sentinel


#sentinel部署官方脚本,是根据codis-server启动脚本进行修改


# 源文件目录:./ansible/roles/redis-sentinel/templates/redis-sentinel-admin.sh


/usr/local/codis/admin/codis-sentinel-admin.sh start


ss -tpnl |grep 26379


3.fe界面添加Sentinels

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
108 1
|
6月前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(一)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
88 0
|
3月前
|
SQL 关系型数据库 MySQL
(二十五)MySQL主从实践篇:超详细版读写分离、双主热备架构搭建教学
在上篇《主从原理篇》中,基本上把主从复制原理、主从架构模式、数据同步方式、复制技术优化.....等各类细枝末节讲清楚了,本章则准备真正对聊到的几种主从模式落地实践,但实践的内容通常比较枯燥乏味,因为就是调整各种配置、设置各种参数等步骤。
512 2
|
6月前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(二)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
45 0
|
设计模式 缓存 NoSQL
腾讯架构师是如何解释:Redis高性能通信的原理(精华版)
我们一直说Redis的性能很快,那为什么快?Redis为了达到性能最大化,做了哪些方面的优化呢? 在深度解析Redis的数据结构 这篇文章中,其实从数据结构上分析了Redis性能高的一方面原因。
|
运维 Unix 应用服务中间件
深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」
深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」
664 0
深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」
|
存储 分布式计算 网络协议
《zk:分布式过程协同技术详解》读书笔记
《zk:分布式过程协同技术详解》读书笔记
《zk:分布式过程协同技术详解》读书笔记
|
存储 缓存 NoSQL
架构师之路-redis集群解析
架构师之路-redis集群解析
架构师之路-redis集群解析
|
存储 消息中间件 SQL
架构师之路--视频业务介绍,离线服务架构和各种集群原理
  先聊聊业务。我们媒资这边目前的核心数据是乐视视频的乐视meta和专门存储电视剧,综艺节目,体育赛事这种长视频的作品库。乐视视频的数据都是多方审核的,需要很多运营。但是作品库部分却是弱运营的,运营都不超过10个人。结果做了两个app,日活都有四五百万的样子。我们其实都有各样的技术储备,很容易可以抓取人家数据,自己套上一个壳子在线解码。但是我们逼格很高,都不这么做的。乐视是个非常注重版权的公司。我名下都有近百个专利了。   撇开这个项目,先看这边一般web项目的常用JVM配置。
架构师之路--视频业务介绍,离线服务架构和各种集群原理
|
缓存 移动开发 NoSQL
技术实践第三期|HashTag在Redis集群环境下的使用
欢迎了解友盟+技术干货第三期内容:Redis集群环境如何按照前缀批量删除缓存。希望能对开发者们在实际应用中有所帮助。
技术实践第三期|HashTag在Redis集群环境下的使用
下一篇
无影云桌面