1、集群的概念
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上,redis集群主要是缓解单台服务器同一时间大量请求带来的的压力,就算集群中有服务器宕机,也不影响整体对外提供服务。
2、搭建redis集群
1、准备6个redis节点,7000.conf,7001.conf,7002.conf,7003.conf,7004.conf,7005.conf;编辑7000.conf文件,将以下配置拷贝进去,其他配置可直接复制,后续进行修改。
port 7000
bind 127.0.0.1
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
2、使用命令,修改其他5个配置文件的内容
sed 's/7000/7001/g' 7000.conf > 7001.conf
sed 's/7000/7002/g' 7000.conf > 7002.conf
sed 's/7000/7003/g' 7000.conf > 7003.conf
sed 's/7000/7004/g' 7000.conf > 7004.conf
sed 's/7000/7005/g' 7000.conf > 7005.conf
3、分别启动六个实例
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
4、启动效果如下
root 7821 1 0 01:39 ? 00:00:00 redis-server 127.0.0.1:7000 [cluster]
root 7826 1 0 01:39 ? 00:00:00 redis-server 127.0.0.1:7001 [cluster]
root 7833 1 0 01:39 ? 00:00:00 redis-server 127.0.0.1:7002 [cluster]
root 7838 1 0 01:40 ? 00:00:00 redis-server 127.0.0.1:7003 [cluster]
root 7848 1 0 01:40 ? 00:00:00 redis-server 127.0.0.1:7004 [cluster]
root 7853 1 1 01:40 ? 00:00:00 redis-server 127.0.0.1:7005 [cluster]
5、安装配置ruby环境,用于一键搭建redis集群
5.1.下载源码
wget -c https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
5.2.解压缩ruby
tar -xvf ruby-2.3.1.tar.gz
5.3.编译安装ruby
./configure --prefix=/opt/ruby/
make && make install
5.4.准备ruby的环境变量
cp ./bin/ruby /usr/local/bin/
cp ./bin/gem /usr/local/bin
5.5.下载ruby的软件包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem #安装ruby操作redis的模块
5.6.查看ruby语言的包邮哪些
gem list -- check redis gem
5.7.配置环境变量,配置环境变量redis-trib.rb,用于创建redis-cluster
cp /opt/redis-4.0.10/src/redis-trib.rb /usr/local/bin/
5.8.通过redis-trib.rb命令,一键创建redis-cluster集群功能
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
6、查看redis集群状态信息
redis集群对内两两组成主从
redis-cli -p 7003 info replication #查看主从身份信息
redis-cli -p 7004 info replication #查看主从身份信息
redis-cli -p 7005 info replication #查看主从身份信息
redis-cli -p 7000 cluster info #查看节点集群状态
redis-cli -p 7000 -c #集群模式有ASK路由规则,加入-c参数后,会自动跳转到目标节点处理。
3、集群在哪个服务器上写数据:CRC16
redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了
4、与python交互
安装包如下
pip3 install redis-py-cluster
示列代码
from rediscluster import *
if __name__ == '__main__':
try:
# 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
startup_nodes = [
{'host': '192.168.8.104','port': '7000'},{'host': '192.168.8.104','port': '7003'},'port': '7001'},]
# 构建StrictRedisCluster对象
src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
result=src.set('name','花花')
print(result)
name = src.get('name')
print(name)
except Exception as e:
print(e)