Redis集群
1 第一种方式(主从复制)
1.1 概述
redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
1.2 搭建步骤
1). 创建第一个redis的实例作为主数据库,端口号为默认的6379,并将其更改成后台启动
2). 创建第二个redis的实例作为从数据库,端口号为6380,并且更改其配置文件,指定其主节点的ip地址以及端口号
slaveof 192.168.80.128 6379
3). 启动两个redis的实例
给主节点使用set命令存储数据
在从节点使用get上获取数据
使用set命令在从节点上存储数据
因为从节点只负责进行读操作,因此不能存储数据! 经过我们的测试,我们发现主从复制这种集群我们已经搭建成功了!
2 第二种方式(分片集群)
2.1 概述
Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀;
原理图如下:
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点.
2.2 搭建步骤
2.2.1 使用ruby脚本搭建集群。需要ruby的运行环境。安装ruby
1). yum install ruby
2). yum install rubygems
3). 安装ruby脚本运行使用的包。gem install redis-3.0.0.gem
2.2.2 创建6个redis的实例,更改每一个节点的端口号以及cluster-enabled为yes(表示支持集群)
cluster-enabled yes
端口号分别为: 7001 , 7002 , 7003 , 7004 , 7005 , 7006
2.2.3启动6个redis的实例
2.2.4 使用./redis-trib.rb脚本设置其集群节点的关联关系
./redis-trib.rb create –replicas 1 192.168.80.128:7001 192.168.80.128:7002 192.168.80.128:7003 192.168.80.128:7004 192.168.80.128:7005 192.168.80.128:7006
2.2.5 使用redis-cli链接集群
2.3 添加主节点
1). 创建一个节点
2). 启动该节点
3). 使用redis-trib.rb把7007节点纳入到集群中
./redis-trib.rb add-node 192.168.80.128:7007 192.168.80.128:7001
4). 链接集群节点查看集群节点信息:
通过查询节点信息,我们发现7007节点的确已经被添加到集群中了,但是7007节点没有槽位信息,因此我们需要为其分配槽位信息!
5). 给7007分配槽位
./redis-trib.rb reshard 192.168.80.128:7001
链接集群节点查看槽位分配信息:
如果可以看到上述信息,说明主节点槽位分配成功!
2.4 添加从节点
1). 创建一个节点
2). 启动改节点
3). 使用redis-trib.rb脚本把该节点添加到集群中:格式===?./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口
./redis-trib.rb add-node --slave --master-id 5d514ad261a661a9f25723795a096e7784cfa395 192.168.80.128:7008 192.168.80.128:7001
4). 链接集群查看节点信息:
如果可以看到上述信息说明添加成功!
2.5 删除从节点
1). 直接使用redis-trib.rb脚本删除指定的从节点
./redis-trib.rb del-node 192.168.80.128:7001 383bfde78ea820554fc2bee115bc9a31e265baeb
2). 链接集群,查看删除信息
通过查看节点的信息,我们发现7008节点的确已经被删除了!
2.6 删除主节点
使用redis-trib.rb脚本删除
./redis-trib.rb del-node 127.0.0.1:7005 5d514ad261a661a9f25723795a096e7784cfa395
在删除主节点的时候,报错了!因为主节点上存在槽位,因此不能直接进行删除!我们就需要将其操作给分配出去,然后在进行删除!具体的操作分配可以参考笔记上面的槽位分配命令!