Redis集群

Redis可以分布式存储,集群
Redis最少需要三个节点,三个节点还需要备份
每个节点的地位都是平等的,每个都有连接
Redis 3.0以上做集群
通过hash slot(槽点)来分配,有16384个槽点(0-16384),平均分配到每个节点上,只有有槽点才能够存储数据,主节点处于工作的状态(槽点),从节点上面没有槽点,当主节点宕机,主节点会把槽点迁移从节点,然后从节点就变成主节点,继续集群的正常运行。

将数据进行crc16的算法,crc16(key)/16384=1545

数据是跟着槽点来走的。

搭建


[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
[root@localhost redis]# vi redis.conf

Redis是单点故障问题 redis的槽点个数_redis集群搭建


Redis是单点故障问题 redis的槽点个数_Redis是单点故障问题_02


创建集群文件

[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

配置文件内的#作为注释 不建议与配置同行 可以换行添加

Redis是单点故障问题 redis的槽点个数_redis集群搭建_03


Redis是单点故障问题 redis的槽点个数_redis_04

Redis是单点故障问题 redis的槽点个数_Redis是单点故障问题_05


Redis是单点故障问题 redis的槽点个数_redis集群搭建_06


Redis是单点故障问题 redis的槽点个数_3c_07

[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  #集群节点的配置文件

启动

[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

Redis是单点故障问题 redis的槽点个数_redis集群搭建_08

[root@localhost redis_cluster]# ln -s /usr/local/redis/src/redis-trib.rb /usr/bin/
[root@localhost redis_cluster]# yum -y install ruby
[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

创建集群

[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 删除节点,如果需要删除的主节点,需要将主节点的槽点提前释放,然后进行槽点从分配

检测集群

Redis是单点故障问题 redis的槽点个数_bc_09


尝试存储

Redis是单点故障问题 redis的槽点个数_3c_10


添加节点

1 添加从节点

[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

Redis是单点故障问题 redis的槽点个数_3c_11

[root@localhost redis_cluster]# redis-trib.rb add-node --slave --master-id 0346e92df4a532e42f4dbccadc754d260f474a9b 192.168.1.80:7006 192.168.1.80:7000

Redis是单点故障问题 redis的槽点个数_redis_12


2 添加主节点

[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

Redis是单点故障问题 redis的槽点个数_Redis是单点故障问题_13


槽点重分配

[root@localhost redis_cluster]# redis-trib.rb reshard 192.168.1.80:7000

Redis是单点故障问题 redis的槽点个数_Redis是单点故障问题_14


Redis是单点故障问题 redis的槽点个数_redis_15


Redis是单点故障问题 redis的槽点个数_3c_16

Redis是单点故障问题 redis的槽点个数_3c_17


3 删除节点

[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是单点故障问题 redis的槽点个数_bc_18

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