Redis集群模式: 主从模式 、 哨兵模式 、 分片集群模式
1.Redis - 主从模式
Redis的主从模式,使用异步复制,从节点异步从主节点复制数据,主节点提供读写服务,从节点只提 供读服务(这个是默认配置,可以通过修改配置文件 replica-read-only 控制)。
主节点可以有多个从节点。
配置一个从节点只需要在redis.conf文件中指定:
replicaof master-ip master-port
1.主从复制配置
一主一从、一主多从、一主一从一从...
2.主从复制基本过程
. Slave启动时,向Master发送SYNC命令,以实现全量复制。
. Mater(主库)接到SYNC请求,会在后台保存快照(也就是进行RDB持久化), 并将快照期间接收到命 令缓存起来 。
. 快照完成后,Master(主库)会将快照文件和所有的缓存的命令发送给Slave(从库)。
. Slave(从库)接收后,会载入快照文件并执行缓存的命令,从而完成复制的初始化。
. 在数据库使用阶段,Master(主库)会自动把每次收到的写命令同步到从服务器。
3.主从模式配置
主节点配置
bind 127.0.0.1 # 注释掉
protected-mode no # 关闭保护模式(将yes改为no)
daemonize yes # 守护进程模式开启(将no改为yes)
logfile "/opt/redis/redis.log"
从节点配置
bind 127.0.0.1 # 注释掉
protected-mode no # 关闭保护模式(将yes改为no)
daemonize yes # 守护进程模式开启(将no改为yes)
logfile "/opt/redis/redis.log"
2.哨兵模式
配置 /opt/redis/sentinel.conf文件
daemonize yes # 改为yes
logfile /opt/redis/sentinel.log
sentinel monitor mymaster 192.168.85.128 6379 1
sentinel down-after-milliseconds mymaster 5000 # 改为5s,默认30s
启动哨兵: redis-sentinel /opt/redis/sentinel.conf
进入哨兵: redis-cli -h 192.168.1.128 -p 26379
查看哨兵信息: redis-cli -h 192.168.1.128 -p 26379 info Sentinel
3.分片集群
目前比较流行的Redis集群方案
系统 | 贡献者 | 语言 |
Twemproxy | c | |
Redis Cluster | Redis官方 | c |
Redis Cluster | 豌豆荚 | Go,c |
Redis集群是一个提供在多个Redis节点间共享数据的程序集。
Redis集群并 不支持处理多个key的命令(比如mset、mget、sdiff、sinter等) ,因为这需要在不同 的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继 续处理命令。
1.Redis 集群的优势
自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
2. Redis 集群的数据分片
Redis集群引入了哈希槽的概念。
Redis 集群有 16384个哈希槽 ,每个key通过 CRC16校验 后对16384取模来决定放置哪个槽。
集群的 每个节点负责一部分hash槽。
举个例子:
比如当前集群有3个主节点,那么:
节点A包含 0 到 5500号哈希槽。
节点 B 包含5501 到 11000 号哈希槽。
节点 C 包含11001 到 16383号哈希槽。
这种结构很容易添加或者删除节点:比如我们想新添加个节点D, 我们需要将节点 A、B、 C中的部 分槽移动到D上。如果我想移除节点A,需要将A中的槽移到B和C节点上。然后将没有任何槽的A节 点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加 删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
.3 Redis集群安装
现实条件不满足所以只能采取一台机器上安装6个节点的方式(3主3从)
安装方式:在一台机器上安装6个节点(3主3从)
安装节点数:必须有3个或3个以上的主节点,所以采用3主3从方式安装;
安装步骤
1. 在/opt目录下创建 cluster 目录
2. 在/opt/cluster下创建6个目录,分别是8001、8002...8006 3. 拷贝一个新的redis.conf文件到/opt/redis-cluster/8001目录下
4. 修改redis.conf
1. bind 本机的ip地址 # 绑定ip(69行)
2. protected-mode no # 关闭保护模式(88行)
3. port 800* # 端口号为8001 - 8006(92行)
4. daemoinze yes # 开启守护进程模式(136行)
5. pidfile "/var/run/redis_800*.pid" (158行)
6. logfile /opt/cluster/800*/redis.log (171行)
7. dir /opt/cluster/800* # 持久化文件的默认保存位置、集群配置文件(263行)
8. cluster-enabled yes # 启动集群模式(去掉注释 838行)
9. cluster-config-file nodes-800*.conf # 集群自动生成的文件,自动写到dir目录
5.按顺序启动每一个节点,查看是否启动
redis-server /opt/cluster/8001/redis.conf
redis-server /opt/cluster/8002/redis.conf
redis-server /opt/cluster/8003/redis.conf
redis-server /opt/cluster/8004/redis.conf
redis-server /opt/cluster/8005/redis.conf
redis-server /opt/cluster/8006/redis.conf
6.使用 redis-cli 命令创建集群
redis-cli --cluster create 192.168.1.128:6006 192.168.1.128:6001 192.168.1.128:6002 192.168.1.128:6003 192.168.1.128:6004 192.168.1.128:6005 -- cluster-replicas 1
7.登陆集群
redis-cli -c -h 192.168.1.128 -p 8001
-c : 以集群的方式连接redis -h : 连接的主机(host) -p : 端口号(port)
计算key的hash槽的槽号: cluster keyslot key的名称