redis cluster是redis3.0提供的分布式解决方案,有效的解决了redis分布式方面的需求,同时它也是学习分布式存储的绝佳案例。
-
学习redis cluster是大家学习分布式数据库的一个很好的案例
-
我们为什么需要redis cluster集群这样的功能?
并发量:redis单机默认支持10万/s ,如果对并发要求更高,百万/s呢?
数据量:redis单机内存是16-256G,如果业务需要500G呢?
- 解决方法:
配置强悍的机器:超大内存,超牛CPU - 正确的解决方法:
分布式:简单的认为加机器 - 集群,规模化需求
并发量需求,QPS
数据量需求,大数据
- 数据分布概论
- 分布式数据库,数据分区
- 顺序分区和哈希分区
- 数据顺序分布和哈希分布的对比
注意:哈希分布不支持批量操作 - 哈希分布主要有三种
(1)节点取余分区
(2)一致性哈希分区(是对节点取余分区问题的一种优化)
(3)虚拟槽分区(redis cluster使用的分区方式)
- 节点取余分区
- 节点取余会有一个问题
当添加一个节点的时候,会有80%左右的数据进行分区迁移
翻倍扩容分区,这样会好一点,将有50%左右的数据进行分区迁移 - 节点取余的特点
客户端分片:哈希+取余
节点伸缩:数据节点关系变化,导致数据迁移
迁移数量和添加节点数量有关,建议翻倍扩容分区
- 一致性哈希分区
- 一致性哈希解决了节点取余带来数据迁移过大的问题,在Memcache中使用比较广泛
- 一致性哈希
客户端分片:哈希+顺时针(优化节点取余)
节点伸缩:只影响临近节点,但是还是有数据迁移
翻倍伸缩:保证最小迁移数据和负载均衡
- 虚拟槽分区
- redis cluster采用了虚拟槽分区的方式
- 预设虚拟槽,每个槽映射一个数据子集,一般比节点数大
- 良好的哈希函数,例如CRC16
- 服务端管理节点、槽、数据,例如redsi cluster
- redis cluster的基本架构
-
智能客户端知道每一个节点负责的槽的范围
-
分布式之间每个节点是可以互相通信的,而且每一个节点知道其它节点负责的槽的范围
-
每个节点都负责数据的读写,因为每个节点都负责整个数据集的一部分,这也是分布式的一个特性
-
redis cluster架构
节点
meet:节点之间可以互相通信
指派槽
复制:保证高可用,当一个主节点挂了,会启动该主节点的从节点,同时redis cluster没有使用sentinel -
redis cluster特性
复制
高可用
分片
- redis cluster原生命令安装
原生命令安装可以充分理解redis cluster的基本架构
-
配置开启节点
redis-server redis-7000.conf -
meet
cluster meet ip port
cluster节点主要配置 -
指派槽
cluster addslots {0…5461} -
主从
cluster replicate node-id
- 原生安装redis cluster 01-准备节点
编写6个配置文件,三个主节点,三个从节点
port 7000
daemonize yes
dir "/opt/soft/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
# 注意上面的所有port端口和下面的总线端口都要开开,否则集群启动失败
# 云服务器上部署需指定公网ip
cluster-announce-ip xxx.xxx.xxx.xxx
# Redis总线端口,用于与其它节点通信
cluster-announce-bus-port port + 10000
开启集群6个节点服务redis-server redis-7000.conf
查看集群节点的配置redis-cli -p 7000 cluster nodes
查看集群节点的信息redis-cli -p 7000 cluster info
- 原生安装redis cluster 02-meet操作(节点握手)
redis-cli -p 7000 cluster meet 公网ip 7001
redis-cli -p 7000 cluster meet 公网ip 7002
redis-cli -p 7000 cluster meet 公网ip 7003
...04
...05
- 原生安装redis cluster 03-分配槽
- 编写为三个主节点添加槽的脚本
start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
- 执行脚本命令
sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002
- 原生安装redis cluster 04-分配主从
redis-cli -p 7003 cluster replicate 99cfeb7aaxxxxc5b5c3a1965b
这个id就是7000端口的Id,通过命令redis-cli -p 7000 cluster nodes
查看
redis-cli -p 7003 cluster replicate 7000-c5b5c3a1965b
redis-cli -p 7004 cluster replicate 7001-axxxxc5b5c3a1965b
redis-cli -p 7005 cluster replicate 7002-b7aaxxxxc5b5c3a1965b
- 注意,客户端链接集群redis实例时这样写
redis-cli -c -p 7003
- 以槽位单位查看槽内对应的节点信息
redis-cli -p 7000 cluster slots
至此,原生安装redis cluster已经大功告成。
- ruby环境准备
- 下载、编译、安装ruby
- 安装rubygem redis
- 安装redis-trib.rb
- 安装步骤
wget https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz
tar xvf ruby-3.2.0.tar.gz
cd ruby-3.2.0
./configure -prefix=/usr/local/ruby
make
make install
./configure && make && make install
wget https://rubygems.org/downloads/redis-4.6.0.gem
sudo gem install -l redis-4.6.0.gem
sudo gem list -- check redis gem
查看ruby版本ruby --version
- redis-trib构建集群
- 将redis-trib.rb文件拷贝
cp /opt/soft/redis/src/redis-trib.rb /usr/local/bin
- 创建6个配置文件8000-8005
port 8000
daemonize yes
dir "/opt/soft/redis/data"
logfile "8000.log"
dbfilename "dump-8000.rdb"
cluster-enabled yes
cluster-config-file nodes-8000.conf
cluster-require-full-coverage no
protected-mode no
# 云服务器上部署需指定公网ip
cluster-announce-ip xxx.xxx.xxx.xxx
# Redis总线端口,用于与其它节点通信
cluster-announce-bus-port 18000
- 切换目录
cd /opt/soft/redis/src/
- 创建集群(比上面原生安装省略了meet、分配槽、创建主从关系)
redis-cli --cluster create xxx:8000 xxxx:8001 ip:8002 4xxxx71:8003 xxxx:8004 xxxx:8005 --cluster-replicas 1
当然新版本redis6.0已经将上面的命令移除了,也不需要安装上面的ruby等等,redis-cli直接提供了创建集群的命令
redis-cli --cluster create ip:8000 ip:8001 ip:8002 ip:8003 ip:8004 ip:8005 --cluster-replicas 1
简直是太方便了
- 原生命令与redis-trib.rb对比
- 原生命令安装
理解redis cluster架构
生产环境不使用 - 官方工具安装
高效、准确
生产环境可以使用 - 其它
可视化部署-cachecloud
cachecloud官网
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/245012.html