一.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集群元数据的存储,维护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 http://apache.fayea.com/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 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_LOG4J_PROP="INFO,ROLLINGFILE" fi
3.2 go
- 1.下载
wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz 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 https://github.com/wandoulabs/codis /usr/local/go/gowork/src/github.com/wandoulabs/codis Cloning into '/usr/local/go/gowork/src/github.com/wandoulabs/codis'... fatal: unable to access 'https://github.com/wandoulabs/codis/': Peer reports incompatible or unsupported protocol version. yum update nss curl git mkdir -p $GOPATH/src/github.com/CodisLabs cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
1.linux二进制 https://github.com/CodisLabs/codis/releases 2.或者直接下载zip包github
- 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/154redis
- 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个机器
apache
-
4.点击分配槽位
服务器
3.7 部署codis-proxy代理服务
部署3个节点的server 172.16.10.142/143/144app
- 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 start ss -tpnl |grep 19000
- 3.proxy启动默认会自动注册到dashboard中,也能够在fe中手动添加
3.8 部署redis-sentinel实现集群HA
部署3个节点的server 172.16.10.142/143/144ssh
- 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