赞
踩
Redis集群TCP端口
每个Redis群集节点都需要打开两个TCP连接。
用于服务客户端的常规Redis TCP端口,例如6379,
再加上在数据端口上加上10000所获得的端口,集群节点通信端口
redis分布式集群存储
使用多台redis节点组合在一起,形成一个集群,便于更好的存储。
redis的集群一般为三个主节点,三个从节点,从节点充当备份。
s集群的原理:(数据分片)
1.redis通过hash槽点来进行分配数据,总共有(0~16383)16384个槽点。
2.将这些槽点平均的分配到每台主节点上,只有有槽点的主节点才会进行工作。
3.主节点上有槽点,从节点上没有槽点。
4.当主节点宕机,那么槽点会进行迁移,迁移到从节点上,从节点变为主节点。
5.宕机得主节点修复后,恢复集群状态为从节点。
这样可以轻松添加和删除集群中的节点。
例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从集群中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。
因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加和删除节点或更改节点持有的哈希槽的百分比不需要任何停机时间。
redis Cluster主从模型
为了保证主节点出现故障或者无法与大多数节点通信时保持可用,产生了redis Cluster主从模型,其中每个哈希槽具有 1个主节点 + N个从节点
在具有节点A,B,C的示例集群中,如果节点B失败,则集群将无法继续,因为我们不再有办法为5501-11000范围内的哈希槽提供服务。
但是,在创建集群(或稍后)时,我们向每个主节点添加一个从属节点,以便最终集群由作为主节点的A,B,C和作为从属节点的A1,B1,C1组成,如果节点B发生故障,系统将能够继续。
节点B1复制B,并且B失败,群集将把节点B1提升为新的主节点,并将继续正常运行。
但是请注意,如果节点B和B1同时失败,则Redis Cluster无法继续运行。
redis集群缓存流程
client — redis集群 ---- mysql数据库
客户端请求缓存发送到redis集群,如果集群中存有数据则直接进行反馈。
如果redis集群种没有数据,则会到mysql数据库中进行查找,回应。
数据库回应的同时会将数据放在redis中进行缓存。
注意:每台主机的从节点不要与主节点放在同一台主机上,防止意外发生。交叉数据分片存放。
主机1:192.168.10.3
主机2:192.168.10.4
/usr/local/redis.conf
https://redis.io/topics/cluster-tutorial redis官方cluster文档
protected-mode yes
port 7000
appendonly yes #开启持久化
appendfilename "appendonly-7000.aof" #持久化日志文件
cluster-enabled yes #开启集群功能
cluster-config-file nodes-7000.conf #集群节点的配置文件
cluster-node-timeout 5000 #节点连接超时时间
#cluster-slave-validity-factor<factor>
#cluster-migration-barrier<count>
#cluster-require-full-coverage<yes/no>
#cluster-allow-reads-when-down<yes/no>
安装redis
[root@localhost ~]# tar -zxvf redis-5.0.5tar.gz -C /usr/src/
[root@localhost ~]# mv /usr/src/redis-5.0.5/ /usr/local/redis
[root@localhost ~]# cd /usr/local/redis
[root@localhost ~]# make && make install
主机1,创建多实例
#保留6379.redis的主目录,创建一个新的集群目录 [root@localhost ~]# mkdir /usr/local/cluster [root@localhost cluster]# mkdir {7000..7003} [root@localhost cluster]# cp /usr/local/redis/redis.conf 7000/redis.conf [root@localhost cluster]# cp /usr/local/redis/redis.conf 7001/redis.conf [root@localhost cluster]# cp /usr/local/redis/redis.conf 7002/redis.conf #修改配置文件内容,开启redis三个实例 [root@localhost cluster]# cat 7000/redis.conf | grep 7000 port 7000 pidfile /var/run/redis_7000.pid appendfilename "appendonly-7000.aof" cluster-config-file nodes-7000.conf [root@localhost cluster]# redis-server 7000/redis.conf [root@localhost cluster]# redis-server 7001/redis.conf [root@localhost cluster]# redis-server 7002/redis.conf #验证是否开启了redis三个实例 [root@localhost cluster]# netstat -anpt | grep redis | awk '{print$4,$7}' 192.168.10.3:7000 14846/redis-server 192.168.10.3:7001 14851/redis-server 192.168.10.3:7002 14856/redis-server 192.168.10.3:17000 14846/redis-server 192.168.10.3:17001 14851/redis-server 192.168.10.3:17002 14856/redis-server
主机2,创建多实例
#保留6379.redis的主目录,创建一个新的集群目录 [root@localhost ~]# mkdir /usr/local/cluster [root@localhost cluster]# mkdir {7000..7003} [root@localhost cluster]# cp /usr/local/redis/redis.conf 7000/redis.conf [root@localhost cluster]# cp /usr/local/redis/redis.conf 7001/redis.conf [root@localhost cluster]# cp /usr/local/redis/redis.conf 7002/redis.conf #修改配置文件内容,开启redis三个实例 [root@localhost cluster]# cat 7000/redis.conf | grep 7000 port 7000 pidfile /var/run/redis_7000.pid appendfilename "appendonly-7000.aof" cluster-config-file nodes-7000.conf [root@localhost cluster]# redis-server 7000/redis.conf [root@localhost cluster]# redis-server 7001/redis.conf [root@localhost cluster]# redis-server 7002/redis.conf #验证是否开启了redis三个实例 [root@localhost cluster]# netstat -anpt | grep redis | awk '{print$4,$7}' 192.168.10.4:7000 14885/redis-server 192.168.10.4:7001 14890/redis-server 192.168.10.4:7002 14895/redis-server 192.168.10.4:17000 14885/redis-server 192.168.10.4:17001 14890/redis-server 192.168.10.4:17002 14895/redis-server
[root@Localhost ~]# redis-cli --cluster create
192.168.10.3:7000
192.168.10.3:7001
192.168.10.3:7002 \
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 7ce7fc34556871ddfbe7aad3b9ad2f858fbfb66f 192.168.10.3:7000
slots:[0-5460] (5461 slots) master
M: 5b25aea28c7a2a9a3cf2d16fd08a22af6395931c 192.168.10.3:7001
slots:[5461-10922] (5462 slots) master
M: 26223cc3f91bf4bb83af8a13a500af46134df553 192.168.10.3:7002
slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
#确定创建集群。
[root@localhost cluster]# redis-cli --cluster check 192.168.10.3:7000
[root@localhost cluster]# redis-cli --cluster info 192.168.10.3:7000
[root@localhost cluster]# redis-cli -h 192.168.10.3 -p 7000 cluster nodes
[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7000 192.168.10.3:7000
[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7000 192.168.10.3:7000
格式:
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
[root@localhost cluster]# redis-cli --cluster add-node 192.168.10.4:7001 192.168.10.3:7001 \ --cluster-slave --cluster-master-id 5b25aea28c7a2a9a3cf2d16fd08a22af6395931c
#删除添加的空的“主节点”
格式: redis-cli --cluster del-node 127.0.0.1:7000
[root@localhost cluster]# redis-cli --cluster del-node 192.168.10.4:7000 89dff642bc5d71425dca46bf5958e252f1097afb
但其实并没有真正的删除干净,因为在从服务器上,node-7000的配置文件依旧存在
#彻底删除清空一个空的主节点,模拟其故障转移,让主节点崩溃
[root@localhost cluster]# redis-cli -h 192.168.10.4 -p 7000 debug segfault
Could not connect to Redis at 192.168.10.4:7002: Connection refused
此时才是真正将空的主节点删除干净。
格式:
redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
[root@localhost cluster]# redis-cli --cluster del-node 192.168.10.4:7002 1d2eb07e2a70b892a4f177c821d0808b9a4b925f
只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点
格式:
redis-cli --cluster reshard
[root@localhost cluster]# redis-cli --cluster reshard 192.168.10.3:7000
#你想移动多少个槽( 从1 到 16384)?
How many slots do you want to move (from 1 to 16384)? "4096"
#输入想要重新分片的目标节点
What is the receiving node ID? "4c23a004a399da0bd72178dcb18dda70b4405db1"
#指定从哪些节点来移动keys到目标节点,如果是all会从其他每个master节点取出一些哈希槽进行分配
Source node #1: "all"
#确实是否要重新进行分片
Do you want to proceed with the proposed reshard plan (yes/no)? "yes"
#查看重新分槽后的集群信息
[root@localhost cluster]# redis-cli --cluster check 192.168.10.3:7000
M: 4c23a004a399da0bd72178dcb18dda70b4405db1 192.168.10.4:7002
slots:[0-1706],[5461-7167],[10923-12628] (5120 slots) master
格式:
redis-cli --cluster import 集群内部实例:port --cluster-from 外部实例:port \
cluster-copy
[root@localhost ~]# redis-cli --cluster import 192.168.10.3:7000
–cluster-from 192.168.10.3:6379 --cluster-copy
cluster-from后面跟外部redis的ip和port
一般做测试故障转移使用
格式:redis-cli -p 7000 -h 127.0.0.1 debug segfault
redis-cli 命令 -p 指定redis放行端口 -h 指定redis放行主机 -c 以集群模式运行 --cluster:指定集群 --cluster create:创建集群 --cluster check <ip:port>:查看集群详细信息 --cluster info <ip:port>:查看集群详细信息(主节点信息) --cluster add-node:添加节点(默认为空的主节点) --cluster-slave:添加从节点 --cluster-master-id:添加从节点并指定主节点的UUID码 --cluster del-node:删除节点(只有从节点和空的主节点可以删除) --cluster reshard:重新分片 import:集群内部实例 --cluster-from:外部实例 --cluster-copy:进行键值对拷贝 ster:指定集群 --cluster create:创建集群 --cluster check <ip:port>:查看集群详细信息 --cluster info <ip:port>:查看集群详细信息(主节点信息) --cluster add-node:添加节点(默认为空的主节点) --cluster-slave:添加从节点 --cluster-master-id:添加从节点并指定主节点的UUID码 --cluster del-node:删除节点(只有从节点和空的主节点可以删除) --cluster reshard:重新分片 import:集群内部实例 --cluster-from:外部实例 --cluster-copy:进行键值对拷贝
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。