web前端培训RedisCluster

白癜风要怎么治疗好 http://m.39.net/pf/a_4364585.html

1、引入集群

问题:

容量不够,redis如何进行扩容?

并发写操作,redis如何分摊?

什么是集群:

Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

2.创建集群

2.1安装ruby环境:

本身redis集群的安装是很麻烦了,通过ruby工具,可以非常方便的将一系列命令打包为一个脚本!

(1)无网环境(CentOS6)

依次执行在安装光盘下的Package目录(/media/CentOS_6.8_Final/Packages)下的rpm包:

(2)无网环境(CentOS7)

进入Package目录(/run/media/root/CentOS7x86_64/Packages),拷贝如下安装包到独立目录rpmruby

进入此目录运行如下命令,按照依赖安装

rpm-Uvh*.rpm--nodeps--force

(3)联网环境

在联网状态下,执行yum安装,执行yum-yinstallruby;

之后安装rubygem,rubygem是ruby的包管理框架。yum-yinstallrubygems

2.2安装redisgem

redis-3.2.0.gem是一个通过ruby操作redis的插件!

拷贝redis-3.2.0.gem到/opt目录下,在opt目录下执行geminstall--localredis-3.2.0.gem;

2.3制作6个redis配置文件

端口号分别是:,,,,,

注意:每个配置文件中需要指定

daemonizeyes:服务在后台运行

port:端口号

pidfile:pid保存文件

logfile:日志文件(如果没有指定的话,就不需要)

dump.rdb:RDB备份文件的名称

appendonly关掉,或者是更改appendonly文件的名称。

cluster-enabledyes打开集群模式

cluster-config-filenodes-.conf设定节点配置文件名

cluster-node-timeout设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

样例:

include/usr/local/myredis/rediscluster/redis_base.conf

pidfile"/var/run/redis_.pid"

port

dbfilename"dump_.rdb"

cluster-enabledyes

cluster-config-filenodes-.conf

cluster-node-timeout

注意在创建集群的时候,初始化的时候,把所有节点的dump文件全部删掉。

2.4开启集群

①首先依次启动6个节点,启动后,会在当前文件夹生成nodes-xxxx.conf文件

②配置集群

在/opt/redis-3.2.5/src目录下,执行命令:./redis-trib.rbcreate--replicas..31.:..31.:..31.:

..31.:..31.:..31.:

注意,此处不要用.0.0.1,请用真实IP地址!

③之后登录到客户端,通过clusternodes命令查看集群信息

④6个节点,为什么是三主三从?

配置机器,至少需要6个节点,否则会报错:

命令create,代表创建一个集群。参数--replicas1表示我们希望为集群中的每个主节点创建一个从节点。一个集群至少要有

三个主节点

,分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

2.5slot

进入集群后,如果我们,直接写入数据,可能会看到报错信息:

这是因为,集群中多了slot(插槽)的设计。一个Redis集群包含个插槽(hashslot),数据库中的每个键都属于这个插槽的其中一个,集群使用公式CRC16(key)%来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key

CRC16校验和。

集群中的每个节点负责处理一部分插槽。举个例子,如果一个集群可以有主节点,其中:

节点A负责处理0号至号插槽。

节点B负责处理号至号插槽。

节点C负责处理号至号插槽。

2.6集群中写入数据

2.6.1客户端重定向

①在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器插槽,redis会报错,并告知应前往的redis实例地址和端口。

②redis-cli客户端提供了–c参数实现自动重定向。如redis-cli-c–p登入后,再录入、查询键值对可以自动重定向。

③每个slot可以存储一批键值对。

2.6.2如何多键操作

采用哈希算法后,会自动地分配slot,而不在一个slot下的键值,是不能使用mget,mset等多键操作。

如果有需求,需要将一批业务数据一起插入呢?

解决:可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

2.7集群中读取数据

CLUSTERKEYSLOTkey计算键key应该被放置在哪个槽上

CLUSTERCOUNTKEYSINSLOTslot返回槽slot目前包含的键值对数量

CLUSTERKEYSLOTkey:计算key应该放在哪个槽

CLUSTERGETKEYSINSLOTslotcount返回count个slot槽中的键。

2.8集群中故障恢复

问题1:如果主节点下线?从节点能否自动升为主节点?

答:主节点下线,从节点自动升为主节点。

问题2:主节点恢复后,主从关系会如何?

主节点恢复后,主节点变为从节点!

问题3:如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

答:服务是否继续,可以通过redis.conf中的cluster-require-full-coverage参数进行控制。

主从都宕掉,意味着有一片数据,会变成真空,没法再访问了!

如果无法访问的数据,是连续的业务数据,我们需要停止集群,避免缺少此部分数据,造成整个业务的异常。此时可以通过配置cluster-require-full-coverage为yes.

如果无法访问的数据,是相对独立的,对于其他业务的访问,并不影响,那么可以继续开启集群体提供服务。此时,可以配置cluster-require-full-coverage为no。

2.9集群的Jedis开发

Test

publicvoidtestCluster(){

SetHostAndPortjedisClusterNodes=newHashSetHostAndPort();

//JedisClusterwillattempttodiscoverclusternodesautomatically

jedisClusterNodes.add(newHostAndPort("..4.",));

JedisClusterjc=newJedisCluster(jedisClusterNodes);

jc.set("foo","bar");

Stringvalue=jc.get("foo");

}

2.10集群的优缺点

优点:

实现扩容

分摊压力

无中心配置相对简单

缺点:

多键操作是不被支持的

多键的Redis事务是不被支持的。lua脚本不被支持。

由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至rediscl。




转载请注明:http://www.aierlanlan.com/rzdk/3471.html