一、数据分布
redis cluster采用哈希分区规则:离散度好、数据分布业务无关、无法顺序访问
1.节点取余分区:hask(key)%N,N为节点数量
优点:简单,常用于数据库分库分表
缺点:节点数量变化导致数据重新迁移
2.一致性哈希分区:每个节点分配一个token,构成一个哈希环,根据哈希值在环上找到第一个大于等于该哈希值的token节点
优点:节点的变动只影响相邻节点数据
缺点:节点变动导致数据无法移动,节点越小影响范围越大
3.虚拟槽分区
使用哈希函数把数据映射到固定范围的整数集合中,这些整数定义为槽,每个节点负责一定数量的槽
redis cluster采用该分区方法
虚拟槽分区:
redis槽范围0~16383
槽是集群内数据管理和迁移的基本单位
采用大范围槽的主要目的是为了方便数据拆分和集群扩展
由于高质量的哈希算法,每个槽所映射的数据通常比较均匀
二、cluster集群功能限制:
1.key批量操作支持有限。只支持具有相同slot的key进行批量操作
2.key事务操作支持有限
3.key做为分区的最小粒度,不能将大的键值对象进行分区
4.不支持多数据库空间,只能使用db0
5.复制结构只支持一层,从节点只能复制主节点
三、手动搭建集群:
修改配置文件
# 设置配置文件目录 sudo mkdir -p /etc/redis/redis-cluster/7000 cd /etc/redis/ # 创建一份配置文件,Cluster架构-3主3从 sudo cp redis.conf redis-cluster/7000/redis.conf # 修改配置文件 sudo vim redis-cluster/7000/redis.conf
配置文件修改如下部分
daemonize yes # redis后台运行 pidfile /var/run/redis_7000.pid #需要修改为 reids_{port}.pid 的形式 port 7000 #端口 cluster-enabled yes #开启集群 cluster-config-file 7000/nodes_7000.conf #集群的配置文件 nodes_{port}.conf的形式 cluster-node-timeout 5000 #超时时间 5s够了 appendonly yes #开启AOF日志
启动Redis
cd /etc/redis/redis-cluster/ sudo redis-server 7000/redis.conf sudo redis-server 7001/redis.conf sudo redis-server 7002/redis.conf sudo redis-server 7003/redis.conf sudo redis-server 7004/redis.conf sudo redis-server 7005/redis.conf
创建集群
sudo redis-cli --cluster create 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 --cluster-replicas 1 # 等一会 然后输入 yes
查看集群状态:cluster nodes
注意事项:
- 无论是在redis-server 5.x版本,还是老的ruby创建集群的方式, 在create cluster的环节是不能配置redis密码的
- 如果设置了密码,redis-cli --cluster create会报用户认证失败的错误
- 在搭建集群时去除所有redis节点的密码,也就是redis-cli --cluster create 的时候是没有密码参数配置的
- 当集群配置完成后,通过config set的方式动态的为每一个节点设置密码(不需要重启redis,且重启后仍然有效)
- $ redis-cli -h 127.0.0.1 -p 6379 -c
- 127.0.0.1:6379> config set requirepass 'password' // 设置密码
- 127.0.0.1:6379> config set masterauth 'password' // 设置连接密码
- 127.0.0.1:6379> config rewrite // 把config set 操作写入配置文件中
- 设置密码后连接集群 redis-cli -h 127.0.0.1 -p 6379 -c -a password