codis 使用
1:Jedis与Redisson对比
2.1. 概况对比
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单。
Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。可以认为是jedis的补充,不能替换jedis。
2.2.可伸缩性
Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
而Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
2.3. 编程模型
Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
Redisson使用非阻塞的I/O和基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。
2.4. 数据结构
Jedis仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。
Redisson不仅提供了一系列的分布式Java常用对象,不支持字符串存储,Redisson的实现类中只支持集合操作,不能对普通字符做操作。
不支持很多redis特性,比如排序,事务,管道,集群等
还提供了许多分布式服务,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch)。
并且是线程安全的,在分布式开发中,Redisson可提供更便捷的方法。
2:代码实例
jedis单机使用方式
public static void main(String[] args) {
// 开启Jedis连接池
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(50);
jpc.setMinIdle(10);
JedisPool jp = new JedisPool(jpc,"192.168.1.18",19000); // 开启Jedis客户端
Jedis jedis = jp.getResource(); jedis.set("k1","v1");
System.out.println(jedis.get("k1")); jedis.close();
}
jedis集群使用方式
public class JedisClusterTest { public static void main(String[] args) throws IOException { Set<HostAndPort> nodes = new HashSet<>();
HostAndPort hap = new HostAndPort("192.168.1.18",6379);
nodes.add(hap); JedisCluster jedisCluster =
new JedisCluster(
nodes, 1000,
1000, 1,
new GenericObjectPoolConfig()); jedisCluster.set("k1","v1");
jedisCluster.get("k1"); jedisCluster.close(); } }
Redisson使用方式
public class RedissonTest { public static void main(String[] args) { Config config = new Config();
config.setCodec(new org.redisson.client.codec.StringCodec());
config. useSingleServer().setAddress("192.168.1.18:19000"); RedissonClient redisson = Redisson.create(config);
RBucket<String> keyObject = redisson.getBucket("k2"); keyObject.set("v2"); System.out.println(keyObject.get()); redisson.shutdown();
}
}
3:codis能做什么
Codis介绍
- Codis开发是专门解决分布式方案才诞生的
- Codis是豌豆荚开发的分布式redis解决方案
- 线上动态配置实现无限扩容,插槽分配和漂移
- 单节点和集群操作对客户端透明
- 线上可以在一定程序上达到一个资源漂移的效果
codis的强大之处服务端透明化,不需要关心多少集群,只需要关心第三方的proxy。
Codis的组成部分
命令 | 命令作用 |
---|---|
Codis Dashboard | Codis集群管理工具 |
Codis Proxy | 集群代理,代理多个Codis |
Codis Server | 代替了窗台的redis-Server |
Codis Group | 组的概念,可以让集群出现更多的用法 |
Codis Admin | 集群管理的命令行工具 |
Codis FE | 图形界面处理 |
4:Codis集群的部署
1.环境的准备
yum install -y gcc glibc gcc-c++ make git
git clone https://github.com/CodisLabs/codis.git -b release3.2(去GIT上下载)
yum -y install glibc-2.17
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
2.需要的包
3.开始部署
安装go语言环境
1.常规操作
tar -xf go1.7.3.linux-amd64.tar.gz
cd go
2.添加环境变量
vim /etc/profile
export GOROOT=/root/codis/go
export GOPATH=/root/codis/go_path/codis
export PATH=PATH:JAVA_HOME/bin:$GOROOT/bin
source /etc/profile
安装zookeeper
tar -xf zookeeper-3.4.10.tar.gz
cd /root/codis/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cnf #配置文件有需要可以自己修改
/root/codis/zookeeper-3.4.10/bin/zkServer.sh start
安装codis
tar -xf codis3.2.2-go1.8.5-linux.tar.gz
codis-server
cd codis3.2.2-go1.8.5-linux
mkdir conf/redis/{redis_6381,reids_6382}
拷贝redis的配置文件到以上目录下
cp redis.cnf conf/redis/redis_6381/ #修改配置文件
vim redis.cnf
#bind 127.0.0.1 #绑定注释
protected-mode no #安全模块不开启
daemonize yes #开启后台启动
pidfile /var/run/redis_6381.pid #设置进程号,不能相同
port 6381 #设置端口号,不能一样
分别执行redis.cnf
开启两个服务
netstat -lnput |grep codis #查看是否6381和6382端口开启
ps -ef |grep codis-server #查看进程是否使用
配置集群的管理工具dashboard
./codis-dashboard --default-config |tee conf/dashboard.toml #开启dashboadb生成配置文件
修改配置文件
vim conf/dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "192.168.4.56:2181" #不建议写IP地址,最好使用主机名称
product_name = "codis-demo"
admin_addr = "192.168.4.56:18080"
启动dashboard
mkdri ./logs
nohup ./codis-dashboard --config=conf/dashboard.toml --log=logs/dashboard.log --log-level=WARN --ncpu 2 & #指定配置文件位置,指定日志路径,指定日志级别,指定可以提供资源数
#nohup指定后台启动
tail -f /log/日志文件
关于如何优雅的关闭dashboard
常规的情况下我们总是使用(Kill -9 进程号)强制结束,但是这样会导致整个node节点崩溃,
为了保障其他节点的正常运行我们需要的是优雅的关闭dashboard。
./codis-admin --dashboard="192.168.4.56:18080" --shutdown
开启proxy
./codis-proxy --default-config |tee conf/proxy.toml
product_name = "codis-demo" #必须和我们的dashboard相同
vim conf/proxy.toml
admin_addr = "192.168.4.56:11080"
proxy_addr = "192.168.4.56:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.4.56:2181"
启动但是没有启用
nohup ./codis-proxy --config=conf/proxy.toml --log=logs/proxy.log --log-level=WARN --ncpu 2 &
启用相互之间关联
./codis-admin --dashboard=192.168.4.56:18080 --create-proxy -x192.168.4.56:11080
cat logs/proxy.log #查看日志是否成功
启动codis-fe图形界面管理
生成配置文件
./codis-admin --dashboard-list --zookeeper=192.168.4.56:2181 |tee conf/codis.json
开启codis-fe
nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=conf/codis.json --listen=192.168.4.56:10011 &
cat log/codis-fe
访问网站
5:替换成代理的地址即可访问操作redis
本文主要的目标是帮助大家完成Codis的集群搭建,让大家对Codis有一个相对直观的认知,话不多说,咱们开始把。
环境准备
codis3.2.2-go1.8.5-linux.tar.gz
glibc-2.17.tar.gz
go1.10.linux-amd64.tar.gz
zookeeper-3.4.11.tar.gz
go环境配置安装
由于Codis是使用GO语言编写的,所以想使用Codis需要先安装GO语言环境,安装过程如下:
将go1.10.linux-amd64.tar.gz解压至预期安装目录下,笔者习惯将内容放置在/opt/install下,截图如下:
go的默认环境要求必须在/usr/local下,所以更改目录需要配置GOROOT环境变量
GOPATH的目录是用来标识GO的所有第三方软件放置位置,当然了,我们现在只有一个Codis
Zookeeper环境配置安装
Codis是一款强依赖于Zookeeper的软件,所以我们需要安装它。
- 首先我们将Zookeeper解压至预期目录,依照习惯,笔者将内容解压至/opt/install目录下
- 将Zookeeper的conf目录下zoo.sample.cfg修改为zoo.cfg文件
- 启动Zookeeper即可,启动命令在Zookeeper的bin目录下的zkServer.sh
Codis环境配置安装
将codis3.2.2-go1.8.5-linux.tar.gz解压至刚刚配置的GOPATH目录下,然后依次配置即可,以下都使用%codis_path%来表示codis的解压根目录哈
- Codis-server配置启动
首先我们要明确,codis-server其实就相当于redis-server,也就是codis-server可以启动很多个redis实例
- 创建配置文件存储目录[因为要创建两个Redis实例]
mkdir -p %codis_path%/conf/redis/redis_6379
mkdir -p %codis_path%/conf/redis/redis_6380- 拷贝redis的配置文件至相应目录下【ps:如果没有文件的话,可以去下载一个Redis,然后将配置文件拷贝出来,这里就不赘述了】
- 修改Redis配置文件【PS:两个配置文件修改的内容基本一致,所以合并一起说】
<p>- 启动codis-server
%codis_path%/codis-server %codis_path%/conf/redis/redis_6379/redis.conf
%codis_path%/codis-server %codis_path%/conf/redis/redis_6380/redis.conf<p>- Codis-dashboard配置启动
- 创建配置文件
%codis_path%/codis-dashboard --default-config | tee %codis_path%/config/codis/dashboard.toml<p>- 修改配置文件
- 启动dashboard命令:【注意替换自己的codis路径】
nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-dashboard \
--ncpu=4 \
--config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/dashboard.toml \
--log=/opt/install/codis3.2.2-go1.8.5-linux/logs/dashboard.log \
--log-level=WARN &<p>
-- 关闭dashboard命令:
/opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --shutdown<p>
<p>- Codis-Proxy配置启动
- 生成proxy配置文件【注意替换自己的codis路径】
/opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --default-config | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml<p>- 修改proxy配置文件
- 启动proxy
nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --ncpu=4 --config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml --log=/opt/install/codis3.2.2-go1.8.5-linux/logs/proxy.log --log-level=WARN &<p>- 关联proxy与dashboard
/opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --create-proxy -x192.168.4.130:11080<p>- Codis-FE配置启动
- 配置codis-fe
/opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard-list --zookeeper=192.168.4.130:2181 | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/codis.json<p>- 启动codis-fe
nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=config/codis/codis.json --listen=192.168.4.130:8080 & <p>- Codis配置演示
至此整个Codis集群环境就已经搭建完成了,大家可以尽情使用页面简单的操作和查看Redis集群状态了。
最后还是要大家说以下,如果希望使用Java客户端连接Codis集群,只要连接proxy即可,我们之前配置的proxy地址为:192.168.4.130:19000.
Codis分片原理
现在我们已经知道了Codis会将指定key的Redis命令转发给下层的Redis。那么Codis如何知道某个key在哪个Redis上呢。
Codis采用Pre-sharding的技术来实现数据分片,默认分为1024个slot(0-1023)。Codis在接收到命令时,先对key进行crc32运算,然后再对1024取余,得到的结果就是对应的slot。然后就可以将命令转发给slot对应的Redis实例进行处理了。
扩容操作
Codis的动态扩容/缩容能力是它的一大亮点之一。它可以对Redis客户端透明。在扩容时,Codis提供了SLOTSSCAN指令,这个指令可以扫描指定的slot上的所有key,然后对每个key进行迁移。在扩容过程中,如果有新的key需要转发到正在迁移的slot上,那么codis会判断这个key是否需要迁移,如果需要,则对指定的key进行强制迁移,迁移完成后,再将命令转发到新的Redis上。
看了上面的介绍是不是觉得扩容是一件很麻烦的事情,Codis已经为我们考虑到这点了,它提供了自动均衡的功能,只需要在界面上点一下"Auto Rebalance"按钮,就可以自动实现slot迁移(可以说非常贴心了)。缩容也比较简单,只需要将需要下线的实例的slot迁移到其他实例上,然后删除group就可以了。
- 添加group
刚刚我们启动了两个codis-server,因此,我们可以new两个group,然后分别将codis-server加入到两个group中
- 初始化slot
一开始所有的slot都是offline状态。
点击下方的Rebalance All Slots按钮,codis会自动把1024个slot分配给两个group(每个分512个)。
当然,也可以手动分配slot,比如,我们将group-1的10个slot分配给group-2,只需要点击Migrate Some按钮即可。
小结
codis 使用的更多相关文章
- Codis——分布式Redis服务的解决方案
Codis——分布式Redis服务的解决方案 之前介绍过的 Twemproxy 是一种Redis代理,但它不支持集群的动态伸缩,而codis则支持动态的增减Redis节点:另外,官方的redis 3. ...
- 基于Redis的开源分布式服务Codis
Redis在豌豆荚的使用历程--单实例==>多实例,业务代码中做sharding==>单个Twemproxy==>多个Twemproxy==>Codis,豌豆荚自己开发的分布式 ...
- codis集群安装
在网上找了很多codis的集群安装方法,看起来都是大同小异,本人结合了大多种方法完成了一套自己使用的codis的集群安装,可以供大家学习使用,如果有什么问题或者不懂的地方欢迎指正 1.集群规划: 三台 ...
- Codis集群
一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Re ...
- codis安装手册
本文属原创,转载请注明此信息:http://www.cnblogs.com/robinjava77/p/5465150.html (Robin) codis交流群 240361424 感谢群里各位群 ...
- 伪集群zookeeper模式下codis的部署安装
1,zookeeper伪集群部署 部署在192.168.0.210服务器上 下载 去官网将3.4.6版本的zookeeper下载下来到/app目录下解压 首先 ...
- Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
此文根据[QCON高可用架构群]分享内容,由群内[编辑组]志愿整理,转发请注明出处. 苏东旭,Ping CAP CTO,Codis作者 开源项目Codis的co-author黄东旭,之前在豌豆荚从事i ...
- 实战Centos系统部署Codis集群服务
导读 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可 ...
- codis配置
codis集群配置 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表) ...
- Redis 集群解决方案 Codis
(来源:开源中国社区 http://www.oschina.net/p/codis) Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生 ...
随机推荐
- 比较器CompareTo的使用
比较器CompareTo的使用 源码 package test; import java.text.SimpleDateFormat; import java.util.Date; public cl ...
- (转)区别TextBlock和Label
TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速 ...
- vim的基本快捷操作(一)
一.光标移动 ^ 到该行第一个非空格字符处. + 到下一行的第一个非空格字符处 - 到上一行的第一个非空格字符处 `. 到上次修改点 <c-o> 到上次所停留位置, <c-i> ...
- eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数
题目大意: 给定字符串 每次消除可消除连续的一段相同的字符的子串 求消除整个字符串的最少消除次数 #include <bits/stdc++.h> using namespace std; ...
- linux常用命令-2网络相关命令
1.ip [选项] 操作对象{link|addr|route...} ip addr show #显示网卡IP信息 2.修改IP配置 1) root权限 2) cd /etc/sy ...
- scala中的闭包
scala闭包 代码示例: package test.close_pack import scala.collection.mutable.ArrayBuffer /** * AUTHOR Guozy ...
- 【JZOJ6421】匹配
description analysis 对于普通树形\(DP\)可以设\(f[i][0/1],g[i][0/1]\)表示\([1,i]\)的线段树的最大值.方案数 \(0\)表示不选择根与某个儿子相 ...
- PHP ftp_rawlist() 函数
定义和用法 ftp_rawlist() 函数返回 FTP 服务器上指定目录中文件的详细列表. 语法 ftp_rawlist(ftp_connection,dir,recursive) 参数 描述 ft ...
- js自动下载
常用方法是利用a标签的属性download下载对应文件.图片等 <a href=".." download="...."></a> 但是 ...
- Android中的SrollView滚动详解
今天开发遇到一个需求就是ScrollView中嵌套一个ListView,同时需要实现滑动到底部自动加载更多,我们知道ListView滑动到底部简单实现onScrollListener()监听器即可,但 ...