一、分片集集群架构
1、架构
分片集群需要的节点数量较多,一个最小的分片集群至少需要6个节点(3主,3从)。要保证集群的高可用,需要每个主节点都有至少一个从节点,也就是备份节点,所以redis集群至少需要6台服务器。如图:
2、分片集群功能
1)Redis 集群不支持单机版本的16个默认数据库,仅有0数据库,且select命令被禁用;
2)每个主节点下都可能有1个或多个从节点,这些从节点在网络分区或者发生故障时会尝试替代主节点,同时从节点也可用于支撑大规模的读操作;
3)主节点之间通过 ping 监测彼此健康状态;
4)客户端可以访问集群中任意节点(包括从节点),节点将会分析要操作的 key,找到对应哈希槽的节点,最终都会被转发到正确节点。一般情况下从节点会将客户端请求重定向到负责对应哈希槽的主节点。如果要实现大规模读,可以给从节点开启 READONLY;
5)key 空间被划分为16384个槽位(哈希槽),集群中的每个主节点占据一部分槽位数,跨slot的两个 key 可能不能做一些操作,比如:sdiff sunion;
6)key 映射到哈希操作的算法是 hash_slot = CRC16(16)mod 16384;
7)Cluster bus: 集群节点都通过TCP连接(TCP bus)和一个二进制协议(集群连接,cluster bus)建立通信(在原客户端访问端口之上加上1000),节点之间使用 gossip 协议来发布广播消息,通知配置变更;
8)通过分片集群,Redis 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,而且也具有故障迁移(主从切换)的功能,实现了较为完善的高可用方案。
二、安装redis
1)下载安装包
wget https://download.redis.io/releases/redis-6.2.4.tar.gz
2)解压
tar xf redis-6.2.4.tar.gz
3)创建软连接
mv redis-6.2.4 /usr/local/
cd /usr/local/
ln -s redis-6.2.4/ redis
4)初始化
make && make install
echo 'export PATH=/usr/local/redis/bin:$PATH' >>/etc/profile
source /etc/profile
5)创建数据目录
mkdir -p /data/300{1..6}/data
mkdir -p /data/300{1..6}/conf
mkdir -p /data/300{1..6}/log
6)创建配置文件
cat >/data/3001/conf/redis.cnf<<EOF
#端口
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /data/6379/conf/cluster.cnf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /data/6379/data
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip 本机公网IP
replica-announce-ip 10.10.180.107
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /data/6379/log/run.log
EOF
7)拷贝配置文件
cd /data/
echo 3001/conf 3002/conf 3003/conf 3004/conf 3005/conf 3006/conf | xargs -t -n 1 cp 3001/conf/redis.cnf
8)修改配置文件
printf '%s\n' 3001 3002 3003 3004 3005 3006 | xargs -I{} -t sed -i 's/6379/{}/g' {}/conf/redis.cnf
9)启动redis
redis-server /data/3001/conf/redis.cnf
redis-server /data/3002/conf/redis.cnf
redis-server /data/3003/conf/redis.cnf
redis-server /data/3004/conf/redis.cnf
redis-server /data/3005/conf/redis.cnf
redis-server /data/3006/conf/redis.cnf
10)创建redis 集群命令
redis-cli --cluster create 127.0.0.1:3001 127.0.0.1:3002 \
127.0.0.1:3003 127.0.0.1:3004 127.0.0.1:3005 127.0.0.1:3006 \
--cluster-replicas 1
redis-cli --cluster 或者 ./redis-trib.rb 代表集群操作命令;
create: 代表是创建集群;
–replicas 1或者–cluster-replicas 1 指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master ;
redis-cli --cluster help 命令进行集群命令的查看;
11)查看集群状态
redis-cli -p 7001 cluster nodes
2、添加节点
mkdir -p /data/300{7..8}/conf
mkdir -p /data/300{7..8}/log
mkdir -p /data/300{7..8}/data
cd /data/
echo 3007/conf 3008/conf | xargs -t -n 1 cp 3001/conf/redis.cnf
printf '%s\n' 3007 3008 | xargs -I{} -t sed -i 's/3001/{}/g' {}/conf/redis.cnf
redis-server /data/3007/conf/redis.cnf
redis-server /data/3008/conf/redis.cnf
添加节点
redis-cli --cluster add-node 127.0.0.1:3007 127.0.0.1:3001
分配槽位参考如下截图
redis-cli --cluster reshard 101.34.23.80:7001