Redis分布式解决方案-Coids
来源:互联网 发布:苹果手机平面设计软件 编辑:程序博客网 时间:2024/06/06 00:14
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 CodisProxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
Codis 由四部分组成:
- Codis Proxy (codis-proxy) 实现redis协议,由于本身是无状态的,因此可以部署很多个节点
- Codis Manager (codis-config) 是codis的管理工具,包括添加/删除redis节点添加删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置
- Codis Redis (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架构
首先需要安装go环境
wget http://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
解压
tar -zxvf go1.4.1.linux-amd64.tar.gz
下载zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解压
vi ~/.bash_profile
配置go环境变量还有zk home
vi ~/.bash_profile
PATH=$PATH:$HOME/binexport PATHJAVA_HOME=/java/jdk1.7.0_76PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOMEexport CLASSPATHZOOKEEPER_HOME=/java/zookeeper-3.4.6GOROOT=/java/goexport GOPATH=/java/codisPATH=$PATH:$GOROOT/bin:$GOPATH/bin:$ZOOKEEPER_HOME/binexport PATH
令环境变量生效
source ~/.bash_profile
创建codis目录
mkdir codis
下载codis代码
go get -u -d github.com/CodisLabs/codis
进入到coids里面执行make 编译代码
编译完成后会在bin目录下面产生3个可执行文件
修改config.ini文件
vi config.ini
进入zk目录启动zk
cd /java/zookeeper-3.4.6/bin./zkServer.sh start
通过jps命令查看zk是否启动
codis启动步骤
./codis-config -c ../config.ini dashboard
你也可以在后面加上 & 表示后台启动
可以查看zk里面的数据
然后初始化slots
./codis-config -c ../config.ini slot init
这些slot的信息都会保存在zk里面
首先可以启动一个codis-server
复制一份redis的配置文件过来 ,然后启动
./codis-server ./redis.6379.conf
然后添加一个group server
每一个Servicegroup作为一个Redis服务器组存在,只允许有一个master,可以有多个slave,group id 仅支持大于1的整数
添加成功
分配slot
启动codis-proxy
./codis-proxy -c ../config.ini -L ./proxy.log --cpu=1 --addr=192.168.247.103:19000 --http-addr=192.168.247.103:11000
• Addr为代理绑定的ip和端口
• --cpu为代理使用的cpu核数,与虚拟机的配置有关,一般跟核数相同
• http-addr用于测试的地址
• -L 指定代理的日志文件
刚启动的时候,默认是offline状态,处于此状态不能对外提供服务
把代理状态修改为online
访问11000端口
查看到proxy的id,然后修改codis proxy的状态
./codis-config -c ../config.ini proxy online proxy_1
也可以通过dashboard 查看
连接proxy
./redis-cli -p 19000 -h 192.168.247.103
通过java 客户端连接 codis
Pom.xml
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>io.codis.jodis</groupId><artifactId>jodis</artifactId><version>0.3.1</version></dependency><dependency><groupId>com.wandoulabs.jodis</groupId><artifactId>jodis</artifactId><version>0.2.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><type>jar</type><scope>test</scope></dependency>
Java代码:
JedisResourcePool jedisPool = RoundRobinJedisPool.create() .curatorClient("192.168.247.103:2181", 30000).zkProxyDir("/zk/codis/db_test/proxy").build();try (Jedis jedis = jedisPool.getResource()) { jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value);}
删除刚刚设置的key
运行程序查看结果
Codis高可用 codis-ha
Codis-ha 需要单独安装 codis-ha
go get github.com/ngaut/codis-ha
进入codis-ha目录
执行build命令
go build
启动codis-ha
nohup ./codis-ha --codis-config=192.168.247.103:18087 --productName=test
– codis-config:指定配置服务地址
– productName:产品名称
– nohup是把日志输出重定向到nohup文件
一共启动了2个codis
Kill掉其中一个codis
kill -9 16914
nohup.out 输出日志
刷新 dashboard 页面
原来的master 的状态被改变为 offine , slave 被提升为 master
然后重新启动 6379
日志信息
原来的6379变为了 slave
虽然可以高可用是可以自动切换,但是在实际应用场景还是要注意下应用场景
因为redis本身的主从复制是异步方式, 异步方式就没有办法保证数据的完整性,数据没有最终的保证.
如果并发高了,每秒的操作多了,执行的很快,在master宕掉的话,slave可能跟不上,导致slave可能会抛弃一些数据.数据就会出现不一致
一般的话,我们使用redis来存储数据,如果出现这种情况,也会在redis中获取不到的时候重新在存储数据到redis里面,所以一般是不用担心主从复制导致数据不一致所产生的问题
Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们
- Redis分布式解决方案-Coids
- 分布式Redis集群解决方案
- 分布式Redis集群解决方案
- redis的分布式解决方案--codis
- redis的分布式解决方案--codis
- Codis 一个分布式的 Redis 解决方案
- 实战录 | 基于redis的分布式HA调度器解决方案
- Codis——分布式Redis服务的解决方案
- Redis分布式
- Redis 分布式
- redis分布式
- Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
- Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
- 基于Spring Boot-Spring Session-Redis的分布式Session共享解决方案
- 分布式定时任务解决方案-spring boot整合JMS以及Redis实现
- Dubbo分布式,微服务架构解决方案,jvm虚拟机,Redis持久化
- redis 分布式,主从同步
- redis 分布式,主从同步
- linux net子系统-套接口层
- mysql小记
- 关于数据精度
- JBOSS实现RMI时注意的问题
- linux下EINTR的错误处理
- Redis分布式解决方案-Coids
- 《数据结构》10进制的数向任何进制的数进行转换
- php正则表达式
- 一些软件设计的原则
- Java_Filter
- 机器学习-支持向量机SVM学习笔记一
- VB.net导出花式Excel
- 关于信息安全专业学习的一些看法
- Android——线程管理之ExecutorService