一、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实例构成的集群
6379端口为客户端通讯端口
16379端口为集群总线端口
集群内部划分为16384(0-16383)个数据分槽,分布在三个主redis中。
从redis中没有分槽,不会参与集群投票,也不会帮忙加快读取数据,仅仅作为主机的备份。
三个主节点中平均分布着16384数据分槽的三分之一,每个节点中不会存有有重复数据,仅仅有自己的从机帮忙冗余。
问题:在什么情况下考虑使用Redis Cluster
答:Redis Cluster
是Redis
的分布式解决方案,在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