redis集群
# redis-cluster集群配置
https://www.cnblogs.com/pyyu/p/9844093.html (opens new window)
# 为什么要用redis-cluster
- 并发问题
redis官方生成可以达到 10万/每秒,每秒执行10万条命令
假如业务需要每秒100万的命令执行呢?
2
- 数据量太大
一台服务器内存正常是16~256G,假如你的业务需要500G内存,
新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。
各大企业集群方案:
twemproxy由Twitter开源
Codis由豌豆荚开发,基于GO和C开发
redis-cluster官方3.0版本后的集群方案
解决方案如下
1、配置一个超级牛逼的计算机,超大内存,超强cpu,但是问题是。。。。
2、正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事
2
3
4
5
6
7
8
9
10
11
12
13
# 客户端分片
redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。
redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上
# 数据分布方式
分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
常见的分区规则有哈希分区和顺序分区。Redis Cluster
采用哈希分区规则,因此接下来会讨论哈希分区规则。
节点取余分区
一致性哈希分区
虚拟槽分区(redis-cluster采用的方式)
1、顺序分区
2、哈希分区
例如按照节点取余的方式,分三个节点
1~100的数据对3取余,可以分为三类
余数为0
余数为1
余数为2
那么同样的分4个节点就是hash(key)%4
节点取余的优点是简单,客户端分片直接是哈希+取余
3、虚拟槽分区
Redis Cluster
采用虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
Redis Cluster槽的范围是0 ~ 16383。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽。
# 搭建redis cluster示例
搭建集群分为几部
准备节点(几匹马儿)
节点通信(几匹马儿分配主从)
分配槽位给节点(slot分配给马儿)
redis-cluster集群架构
多个服务端,负责读写,彼此通信,redis指定了16384个槽。
多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。
ruby的脚本自动就把分配槽位这事做了
2
3
4
5
1、准备几台redis服务器,并写配置脚本
redis
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
127.0.0.1:6382
2
3
4
5
redis_6379.conf
port 6379
daemonize yes
dir "/data/6379"
logfile "6379.log"
dbfilename "dump-6379.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-6379.conf #集群内部的配置文件
cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
# 配置的时候去掉注释
2
3
4
5
6
7
8
9
10
redis_6380.conf/redis_6381.conf,/redis_6382.conf,因为只用该端口号就行了,所有用了替换,如果有不同需求在去对应的去修改。
[root@VM-4-9-centos redis-4.0.10]# sed s/6379/6380/g redis_6379.conf > redis_6380.conf
[root@VM-4-9-centos redis-4.0.10]# sed s/6379/6381/g redis_6379.conf > redis_6381.conf
[root@VM-4-9-centos redis-4.0.10]# sed s/6379/6382/g redis_6379.conf > redis_6382.conf
# 确保每个配置文件中的端口修改!!
2
3
4
5
!redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。我们这里是示例只有4个2主2从
2、创建几个节点的实例
[root@VM-4-9-centos redis-4.0.10]# redis-server redis_6379.conf
[root@VM-4-9-centos redis-4.0.10]# redis-server redis_6380.conf
[root@VM-4-9-centos redis-4.0.10]# redis-server redis_6381.conf
[root@VM-4-9-centos redis-4.0.10]# redis-server redis_6382.conf
2
3
4
5
查看端口看是否启动成功
[root@VM-4-9-centos redis-4.0.10]# ps -ef|grep redis
root 30208 1 0 15:08 ? 00:00:00 redis-server *:6381 [cluster]
root 30378 1 0 15:08 ? 00:00:00 redis-server *:6382 [cluster]
root 30566 1 0 15:08 ? 00:00:00 redis-server *:6380 [cluster]
root 30970 1 0 15:08 ? 00:00:00 redis-server *:6379 [cluster]
root 31324 30283 0 15:08 pts/0 00:00:00 grep --color=auto redis
# 启动成功并有cluster标识
2
3
4
5
6
7
8
虽然启动成功,但是此时集群还不可用(因为还没有分配槽位),可以通过登录redis查看
redis-cli -p 6379
127.0.0.1:6379> set a a
(error) CLUSTERDOWN Hash slot not served
2
3
3、配置ruby环境,来分配槽位
下载、编译、安装Ruby
安装rubygem redis第三方
安装redis-trib.rb命令
第一步,安装ruby(这些命令可以放入一个sh脚本文件里)
#下载ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
#安装ruby
tar -xvf ruby-2.3.1.tar.gz
cd 解压名称
./configure --prefix=/opt/ruby/
make && make install
#准备一个ruby命令
#准备一个gem软件包管理命令
#拷贝ruby命令到path下/usr/local/ruby
cp /opt/ruby/bin/ruby /usr/local/
cp bin/gem /usr/local/bin
2
3
4
5
6
7
8
9
10
11
12
13
14
15
第二步,安装ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
# 查看gem有哪些包
gem list -- check redis gem
2
3
4
5
第三步,安装redis-trib.rb命令
[root@yugo /opt/redis/src 18:38:13]# cp /opt/redis/src/redis-trib.rb /usr/local/bin/
4、一键开启redis-cluster集群
#每个主节点,有一个从节点,代表--replicas 1
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 主动关系
2
3
4
由于服务器问题,后面的没有测试,后面可以看详细https://www.cnblogs.com/pyyu/p/9844093.html (opens new window)
dockerimgurl 拉取账号的密码
2
3