一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster


redis cluster是redis3.0提供的分布式解决方案,有效的解决了redis分布式方面的需求,同时它也是学习分布式存储的绝佳案例。

  1. 学习redis cluster是大家学习分布式数据库的一个很好的案例

  2. 我们为什么需要redis cluster集群这样的功能?
    并发量:redis单机默认支持10万/s ,如果对并发要求更高,百万/s呢?
    数据量:redis单机内存是16-256G,如果业务需要500G呢?

  • 解决方法:
    配置强悍的机器:超大内存,超牛CPU
  • 正确的解决方法:
    分布式:简单的认为加机器
  • 集群,规模化需求
    并发量需求,QPS
    数据量需求,大数据
  1. 数据分布概论
  • 分布式数据库,数据分区
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
  • 顺序分区和哈希分区
  • 数据顺序分布和哈希分布的对比
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
    注意:哈希分布不支持批量操作
  • 哈希分布主要有三种
    (1)节点取余分区
    (2)一致性哈希分区(是对节点取余分区问题的一种优化)
    (3)虚拟槽分区(redis cluster使用的分区方式)
  1. 节点取余分区
  • 节点取余会有一个问题
    当添加一个节点的时候,会有80%左右的数据进行分区迁移
    翻倍扩容分区,这样会好一点,将有50%左右的数据进行分区迁移
  • 节点取余的特点
    客户端分片:哈希+取余
    节点伸缩:数据节点关系变化,导致数据迁移
    迁移数量和添加节点数量有关,建议翻倍扩容分区
  1. 一致性哈希分区
  • 一致性哈希解决了节点取余带来数据迁移过大的问题,在Memcache中使用比较广泛
  • 一致性哈希
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
    客户端分片:哈希+顺时针(优化节点取余)
    节点伸缩:只影响临近节点,但是还是有数据迁移
    翻倍伸缩:保证最小迁移数据和负载均衡
  1. 虚拟槽分区
  • redis cluster采用了虚拟槽分区的方式
  • 预设虚拟槽,每个槽映射一个数据子集,一般比节点数大
  • 良好的哈希函数,例如CRC16
  • 服务端管理节点、槽、数据,例如redsi cluster
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
  1. redis cluster的基本架构
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
  • 智能客户端知道每一个节点负责的槽的范围

  • 分布式之间每个节点是可以互相通信的,而且每一个节点知道其它节点负责的槽的范围

  • 每个节点都负责数据的读写,因为每个节点都负责整个数据集的一部分,这也是分布式的一个特性

  • redis cluster架构
    节点
    meet:节点之间可以互相通信
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
    指派槽
    复制:保证高可用,当一个主节点挂了,会启动该主节点的从节点,同时redis cluster没有使用sentinel

  • redis cluster特性
    复制
    高可用
    分片

  1. redis cluster原生命令安装
    原生命令安装可以充分理解redis cluster的基本架构
  • 配置开启节点
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster
    redis-server redis-7000.conf

  • meet
    cluster meet ip port
    cluster节点主要配置
    一站式学习Redis, 从入门到高可用分布式实践-09-初识redis cluster

  • 指派槽
    cluster addslots {0…5461}

  • 主从
    cluster replicate node-id

  1. 原生安装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

  1. 原生安装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
  1. 原生安装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
  1. 原生安装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已经大功告成。

  1. ruby环境准备
  • 下载、编译、安装ruby
  • 安装rubygem redis
  • 安装redis-trib.rb
  1. 安装步骤
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

  1. 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
    简直是太方便了
  1. 原生命令与redis-trib.rb对比
  • 原生命令安装
    理解redis cluster架构
    生产环境不使用
  • 官方工具安装
    高效、准确
    生产环境可以使用
  • 其它
    可视化部署-cachecloud
    cachecloud官网

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/245012.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论