redis-cluster配置

一、redis使用中遇到的瓶颈

  我们日常在对于redis的使用中,经常会遇到一些问题

  1、高可用问题,如何保证redis的持续高可用性。

  2、容量问题,单实例redis内存无法无限扩充,达到32G后就进入了64位世界,性能下降。

  3、并发性能问题,redis号称单实例10万并发,但也是有尽头的。

二、redis-cluster的优势  

  1、官方推荐,毋庸置疑。

  2、去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。

  3、管理方便,后续可自行增加或摘除节点,移动分槽等等。

  4、简单,易上手。

三、redis-cluster名词介绍

  1、master  主节点、

  2、slave   从节点

  3、slot    槽,一共有16384数据分槽,分布在集群的所有主节点中。

四、redis-cluster简介

 

redis-cluster

 

 

图中描述的是六个redis实例构成的集群

6379端口为客户端通讯端口

16379端口为集群总线端口

集群内部划分为16384(0-16383)个数据分槽,分布在三个主redis中。

从redis中没有分槽,不会参与集群投票,也不会帮忙加快读取数据,仅仅作为主机的备份。

三个主节点中平均分布着16384数据分槽的三分之一,每个节点中不会存有有重复数据,仅仅有自己的从机帮忙冗余。

问题:在什么情况下考虑使用Redis Cluster

答:Redis ClusterRedis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。

五、Redis数据分区

Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

下图展现一个五个节点构成的集群,每个节点平均大约负责3276个槽,以及通过计算公式映射到对应节点的对应槽的过程。

 

 

Redis虚拟槽分区的特性:

解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据。
支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景。

六、搭建Redis Cluster

(一)准备6个redis数据库实例,准备6个配置文件redis-{7000....7005}配置文件

-rw-r--r-- 1 root root 151 Jan  2 19:26 redis-7000.conf
-rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7001.conf
-rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7002.conf
-rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7003.conf
-rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7004.conf
-rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7005.conf

redis-7000.conf配置如下

port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes   #开启集群模式
cluster-config-file nodes-7000.conf  #集群内部的配置文件
cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no

redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。

每个节点仅仅是端口运行的不同!

[root@yugo /opt/redis/config 17:12:30]#ls
redis-7000.conf  redis-7002.conf  redis-7004.conf
redis-7001.conf  redis-7003.conf  redis-7005.conf

#确保每个配置文件中的端口修改!!

(二)启动6个数据库实例

[root@localhost s15rediscluster]# redis-server redis-7000.conf 
[root@localhost s15rediscluster]# redis-server redis-7001.conf 
[root@localhost s15rediscluster]# redis-server redis-7002.conf 
[root@localhost s15rediscluster]# redis-server redis-7003.conf 
[root@localhost s15rediscluster]# redis-server redis-7004.conf 
[root@localhost s15rediscluster]# redis-server redis-7005.conf 

检查日志文件

cat 7000.log

检查redis服务的端口、进程

netstat -tunlp|grep redis


ps -ef|grep redis

此时集群还不可用,可以通过登录redis查看

redis-cli -p 7000
set hello world

(error)CLUSTERDOWN The cluster is down

(三)配置ruby语言环境,脚本一键启动redis-cluster 

1、下载ruby语言的源码包,编译安装

wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

2、解压缩

tar -xvf ruby-2.3.1.tar.gz

cd ruby-2.3.1

./configure --prefix=/opt/ruby/

make && make install

3、配置ruby的环境变量

echo $PATH
    
vim /etc/profile
#写入最底行
PATH=$PATH:/opt/ruby/bin/
#读取文件
source /etc/profile 

4、下载安装ruby操作redis的模块包

wget http://rubygems.org/downloads/redis-3.3.0.gem

gem install -l redis-3.3.0.gem

#查看gem有哪些包
gem list -- check redis gem

5、安装redis-trib.rb命令

cp /opt/redis/src/redis-trib.rb /usr/local/bin/

6、一键开启redis-cluster集群

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

#集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系

7、查看集群状态

redis-cli -p 7000 cluster info  

redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息

集群主节点状态
redis-cli -p 7000 cluster nodes | grep master
集群从节点状态
redis-cli -p 7000 cluster nodes | grep slave

安装完毕后,检查集群状态

[root@yugo /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10468
cluster_stats_messages_pong_sent:10558
cluster_stats_messages_sent:21026
cluster_stats_messages_ping_received:10553
cluster_stats_messages_pong_received:10468
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:21026

8、测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数

127.0.0.1:7000> set name chao     
-> Redirected to slot [5798] located at 127.0.0.1:7001       
OK
127.0.0.1:7001> exit
[root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"chao"

集群ok

 

posted @ 2019-01-04 11:05  中杯可乐不加冰  阅读(281)  评论(0编辑  收藏  举报