Redis集群
Redis可以分布式存储,集群 Redis最少需要三个节点,三个节点还需要备份 每个节点的地位都是平等的,每个都有连接 Redis 3.0以上做集群 通过hash slot(槽点)来分配,有16384个槽点(0-16384),平均分配到每个节点上,只有有槽点才能够存储数据,主节点处于工作的状态(槽点),从节点上面没有槽点,当主节点宕机,主节点会把槽点迁移从节点,然后从节点就变成主节点,继续集群的正常运行。
将数据进行crc16的算法,crc16(key)/16384=1545
数据是跟着槽点来走的。
搭建
代码语言:javascript复制[root@localhost ~]# tar -zxf redis-4.0.6.tar.gz -C /usr/src
[root@localhost ~]# mv /usr/src/redis-4.0.6/ /usr/local/redis
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# yum -y install gcc* make cmake
[root@localhost redis]# make && make install
代码语言:javascript复制[root@localhost redis]# vi redis.conf
创建集群文件
代码语言:javascript复制[root@localhost redis]# mkdir redis_cluster
[root@localhost redis]# cd redis_cluster/
[root@localhost redis_cluster]# mkdir {7000..7005}
[root@localhost redis_cluster]# ls
7000 7001 7002 7003 7004 7005
[root@localhost redis_cluster]# cp /usr/local/redis/redis.conf 7000/
[root@localhost redis_cluster]# vi 7000/redis.conf
配置文件内的#作为注释 不建议与配置同行 可以换行添加
代码语言:javascript复制[root@localhost redis_cluster]# cd 7000/
[root@localhost 7000]# cp redis.conf ../7001
[root@localhost 7000]# cp redis.conf ../7002
[root@localhost 7000]# cp redis.conf ../7003
[root@localhost 7000]# cp redis.conf ../7004
[root@localhost 7000]# cp redis.conf ../7005
[root@localhost 7000]# sed -i "s/7000/7001/g" ../7001/redis.conf
[root@localhost 7000]# sed -i "s/7000/7002/g" ../7002/redis.conf
[root@localhost 7000]# sed -i "s/7000/7003/g" ../7003/redis.conf
[root@localhost 7000]# sed -i "s/7000/7004/g" ../7004/redis.conf
[root@localhost 7000]# sed -i "s/7000/7005/g" ../7005/redis.conf
[root@localhost 7000]# cat ../7001/redis.conf | grep 7001
port 7001
appendfilename "appendonly-7001.aof" #aof持久化生成的文件
cluster-config-file nodes-7001.conf #集群节点的配置文件
[root@localhost 7000]# cat ../7002/redis.conf | grep 7002
port 7002
appendfilename "appendonly-7002.aof" #aof持久化生成的文件
cluster-config-file nodes-7002.conf #集群节点的配置文件
[root@localhost 7000]# cat ../7003/redis.conf | grep 7003
port 7003
appendfilename "appendonly-7003.aof" #aof持久化生成的文件
cluster-config-file nodes-7003.conf #集群节点的配置文件
[root@localhost 7000]# cat ../7004/redis.conf | grep 7004
port 7004
appendfilename "appendonly-7004.aof" #aof持久化生成的文件
cluster-config-file nodes-7004.conf #集群节点的配置文件
[root@localhost 7000]# cat ../7005/redis.conf | grep 7005
port 7005
appendfilename "appendonly-7005.aof" #aof持久化生成的文件
cluster-config-file nodes-7005.conf #集群节点的配置文件
启动
代码语言:javascript复制[root@localhost redis_cluster]# redis-server 7000/redis.conf
[root@localhost redis_cluster]# redis-server 7001/redis.conf
[root@localhost redis_cluster]# redis-server 7002/redis.conf
[root@localhost redis_cluster]# redis-server 7003/redis.conf
[root@localhost redis_cluster]# redis-server 7004/redis.conf
[root@localhost redis_cluster]# redis-server 7005/redis.conf
代码语言:javascript复制[root@localhost redis_cluster]# ln -s /usr/local/redis/src/redis-trib.rb /usr/bin/
[root@localhost redis_cluster]# yum -y install ruby
代码语言:javascript复制[root@localhost ~]# ls
anaconda-ks.cfg redis-3.3.0.gem redis-4.0.6.tar.gz
[root@localhost ~]# gem install redis-3.3.0.gem
Successfully installed redis-3.3.0
Parsing documentation for redis-3.3.0
Installing ri documentation for redis-3.3.0
1 gem installed
创建集群
代码语言:javascript复制[root@localhost ~]# redis-trib.rb create --replicas 1 192.168.1.80:7000 192.168.1.80:7001 192.168.1.80:7002 192.168.1.80:7003 192.168.1.80:7004 192.168.1.80:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.80:7000
192.168.1.80:7001
192.168.1.80:7002
Adding replica 192.168.1.80:7003 to 192.168.1.80:7000
Adding replica 192.168.1.80:7004 to 192.168.1.80:7001
Adding replica 192.168.1.80:7005 to 192.168.1.80:7002
M: 0346e92df4a532e42f4dbccadc754d260f474a9b 192.168.1.80:7000
slots:0-5460 (5461 slots) master
M: 376598db2e01e17eeb36278fd3d7933ceb7e0570 192.168.1.80:7001
slots:5461-10922 (5462 slots) master
M: e46f0a194a1393dd4f5f020683b093c54d3cbd56 192.168.1.80:7002
slots:10923-16383 (5461 slots) master
S: 711093acffe39f4f1495e1abf8209f9c0f6ef33e 192.168.1.80:7003
replicates 0346e92df4a532e42f4dbccadc754d260f474a9b
S: 79bf2c6bf3c95d886a451dc46c3095c1b199ac16 192.168.1.80:7004
replicates 376598db2e01e17eeb36278fd3d7933ceb7e0570
S: 4c958bc1b24c7594d22587f5440a604445ea32c5 192.168.1.80:7005
replicates e46f0a194a1393dd4f5f020683b093c54d3cbd56
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 192.168.1.80:7000)
M: 0346e92df4a532e42f4dbccadc754d260f474a9b 192.168.1.80:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: e46f0a194a1393dd4f5f020683b093c54d3cbd56 192.168.1.80:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 376598db2e01e17eeb36278fd3d7933ceb7e0570 192.168.1.80:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 711093acffe39f4f1495e1abf8209f9c0f6ef33e 192.168.1.80:7003
slots: (0 slots) slave
replicates 0346e92df4a532e42f4dbccadc754d260f474a9b
S: 79bf2c6bf3c95d886a451dc46c3095c1b199ac16 192.168.1.80:7004
slots: (0 slots) slave
replicates 376598db2e01e17eeb36278fd3d7933ceb7e0570
S: 4c958bc1b24c7594d22587f5440a604445ea32c5 192.168.1.80:7005
slots: (0 slots) slave
replicates e46f0a194a1393dd4f5f020683b093c54d3cbd56
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Redis-trib.rb 命令字 选项参数 Create 创建集群 选项 –replicas 给主节点指定从节点的个数 Redshard 槽点重分配 Check 检查集群 Info集群信息 Add-node 添加节点,默认为主节点 Add-node的选项 --slave 添加从节点 Del-node 删除节点,如果需要删除的主节点,需要将主节点的槽点提前释放,然后进行槽点从分配
检测集群
尝试存储
添加节点 1 添加从节点
代码语言:javascript复制[root@localhost ~]# cd /usr/local/redis/redis_cluster/
[root@localhost redis_cluster]# mkdir 7006
[root@localhost redis_cluster]# cp 7000/redis.conf 7006/
[root@localhost redis_cluster]# sed -i "s/7000/7006/g" 7006/redis.conf
[root@localhost redis_cluster]# redis-server 7006/redis.conf
代码语言:javascript复制[root@localhost redis_cluster]# redis-trib.rb add-node --slave --master-id 0346e92df4a532e42f4dbccadc754d260f474a9b 192.168.1.80:7006 192.168.1.80:7000
2 添加主节点
代码语言:javascript复制[root@localhost redis_cluster]# mkdir 7007
[root@localhost redis_cluster]# cp 7000/redis.conf 7007/
[root@localhost redis_cluster]# sed -i "s/7000/7007/g" 7007/redis.conf
[root@localhost redis_cluster]# redis-server 7007/redis.conf
[root@localhost redis_cluster]# redis-trib.rb add-node 192.168.1.80:7007 192.168.1.80:7000
槽点重分配
代码语言:javascript复制[root@localhost redis_cluster]# redis-trib.rb reshard 192.168.1.80:7000
3 删除节点
代码语言:javascript复制[root@localhost ~]# redis-trib.rb del-node 192.168.1.80:7000 4c958bc1b24c7594d22587f5440a604445ea32c5
>>> Removing node 4c958bc1b24c7594d22587f5440a604445ea32c5 from cluster 192.168.1.80:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
Redis,是开源的key-value缓存框架,由c语言编写,数据完全存储在内存空间中,支持数据持久性,支持数据持久性,支持master-slave模式的数据备份。
Mysql和redis的区别:mysql是持久数据化存储,存储在磁盘当中,会涉及到一些io。存储速度会较慢。Redis存储数据在内存当中,大幅度的提高了大数量的web访问速度。 Mysql redis就是一个内存 磁盘关系的映射,redis存储在内存中,mysql存储在磁盘中,这样的话,web每次访问redis如果没有数据就再去mysql读取数据,大大的提高了运行速度。
Php默认从redis索取缓存数据,只有redis过期或删除,php才会从数据库索求数据。
Redis的所有数据是保存在内存中,两种同步方式 半持久化模式:RDB(全量同步) RDB是redis默认同步方式 不定期的通过异步方式保存到磁盘上,快照最终结果。 在恢复最大数据集时的速度比AOF的恢复速度要快。 全持久化模式:(增量同步) 把每一次数据变化都写入到一个aof里面 没有rdb同步的快,但采用了高并发机制,对系统内存要求高。
只保证最终数据一致性,使用于微博粉丝,秒杀,抢红包等场景,
Redistribution