Redis主从复制,哨兵模式,读写分离,集群

主从复制

Redis主从复制,哨兵模式,读写分离,集群_第1张图片

什么是主从复制

是指将一台Redis服务器的数据,复制到其他的Redis服务器。

前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

搭建主从复制

主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情,一个节点默认就是主节点

# 我们可以用VM虚拟机,后者docker来进行模拟
- master
  port 6379
  bind 0.0.0.0

- slave1
  port 6380
  bind 0.0.0.0
  slaveof masterip masterport

- slave2
  port 6381
  bind 0.0.0.0
  slaveof masterip masterport

主从复制的作用

  • 确保数据的安全

在主从复制的基础上,又有了读写分离,哨兵模式。

读写分离

  • 主节点主负责写操作
  • 从节点负责读操作,无法进行写操作
  • 尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量

哨兵机制

主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。

这种方式并不推荐,实际生产中,我们优先考虑哨兵模式。

这种模式下,master宕机,哨兵会自动选举master并将其他的slave指向新的master。

简单的说哨兵机制就是带有自动故障转移功能的主从架构

无法解决: 1.单节点并发压力问题 2.单节点内存和磁盘物理上限

Redis主从复制,哨兵模式,读写分离,集群_第2张图片

Redis主从复制,哨兵模式,读写分离,集群_第3张图片

如何搭建哨兵机制

# 1.在主节点上创建哨兵配置
- 在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;

# 2.配置哨兵,在sentinel.conf文件中填入内容:
- sentinel monitor name【给这个主从架构,哨兵系统,自己起一个名字】 ip port 1
- 【说明:这个后面的数字1,是指当有一个及以上的sentinel服务检测到master宕机,才会去执行主从切换(故障切换)的功能,这样可以降低因出错而切换主节点master的概率。】

# 3.启动哨兵模式进行测试
- redis-sentinel  /root/sentinel/sentinel.conf
  • 注意:
    • 注意:如果连接过程中出现如下错误:RedisConnectionException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2)
    • 解决方案:在哨兵的配置文件中加入bind 0.0.0.0 开启远程连接权限

Redis主从复制,哨兵模式,读写分离,集群_第4张图片

Redis集群

集群:将同一种软件服务的多个节点放在一起,共同对系统提供服务的过程称之为集群。

分布式:有多个不同的服务集群,共同对系统提供服务,这个服务称之为分布式系统。

之前的主从复制架构,所有的请求都还是只发给一个主节点的,存在单节点并发压力问题 ,单节点内存和磁盘物理上限问题。

集群就是为了解决这些问题。

集群

Redis在3.0后开始支持Cluster(模式)模式,

目前redis的集群支持节点的自动发现,支持slave-master选举和容错,支持在线分片(sharding shard )等特性。

集群架构图

Redis主从复制,哨兵模式,读写分离,集群_第5张图片

集群细节

- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效. 
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis主从复制,哨兵模式,读写分离,集群_第6张图片

集群搭建

判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,

那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数

搭建集群至少需要三个主节点,三个从节点,至少需要6个节点

# 1.准备环境安装ruby以及redis集群依赖
- yum install -y ruby rubygems
- gem install redis-xxx.gem

Redis主从复制,哨兵模式,读写分离,集群_第7张图片

# 2.在一台机器创建7个目录
# 3.每个目录复制一份配置文件
[root@localhost ~]# cp redis-4.0.10/redis.conf 7000/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7001/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7002/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7003/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7004/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7005/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7006/

Redis主从复制,哨兵模式,读写分离,集群_第8张图片

# 4.修改不同目录配置文件
- port 	6379 .....                		 //修改端口
- bind  0.0.0.0                   		 //开启远程连接
- cluster-enabled  yes 	        			 //开启集群模式
- cluster-config-file  nodes-port.conf //集群节点配置文件
- cluster-node-timeout  5000      	   //集群节点超时时间
- appendonly  yes   		               //开启AOF持久化

# 5.指定不同目录配置文件启动七个节点
- [root@localhost bin]# ./redis-server  /root/7000/redis.conf
- [root@localhost bin]# ./redis-server  /root/7001/redis.conf
- [root@localhost bin]# ./redis-server  /root/7002/redis.conf
- [root@localhost bin]# ./redis-server  /root/7003/redis.conf
- [root@localhost bin]# ./redis-server  /root/7004/redis.conf
- [root@localhost bin]# ./redis-server  /root/7005/redis.conf
- [root@localhost bin]# ./redis-server  /root/7006/redis.conf

# 6.查看进程
- [root@localhost bin]# ps aux|grep redis

Redis主从复制,哨兵模式,读写分离,集群_第9张图片

1.创建集群

# 1.复制集群操作脚本到bin目录中
- [root@localhost bin]# cp /root/redis-4.0.10/src/redis-trib.rb .

# 2.创建集群
- ./redis-trib.rb create --replicas 1 192.168.202.205:7000 192.168.202.205:7001 192.168.202.205:7002 192.168.202.205:7003 192.168.202.205:7004 192.168.202.205:7005

# 3.集群创建成功出现如下提示

2.查看集群状态

# 1.查看集群状态 check [原始集群中任意节点] [无]
- ./redis-trib.rb check 192.168.202.205:7000

# 2.集群节点状态说明
- 主节点 
	主节点存在hash slots,且主节点的hash slots 没有交叉
	主节点不能删除
	一个主节点可以有多个从节点
	主节点宕机时多个副本之间自动选举主节点

- 从节点
	从节点没有hash slots
	从节点可以删除
	从节点不负责数据的写,只负责数据的同步

3.添加主节点

# 1.添加主节点 add-node [新加入节点] [原始集群中任意节点]
- ./redis-trib.rb  add-node 192.168.1.158:7006  192.168.1.158:7005
- 注意:
	1.该节点必须以集群模式启动
	2.默认情况下该节点就是以master节点形式添加

4.添加从节点

# 1.添加从节点 add-node --slave [新加入节点] [集群中任意节点]
- ./redis-trib.rb  add-node --slave 192.168.1.158:7006 192.168.1.158:7000
- 注意:
	当添加副本节点时没有指定主节点,redis会随机给副本节点较少的主节点添加当前副本节点
	
# 2.为确定的master节点添加主节点 add-node --slave --master-id master节点id [新加入节点] [集群任意节点]
- ./redis-trib.rb  add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006  127.0.0.1:7000

5.删除副本节点

# 1.删除节点 del-node [集群中任意节点] [删除节点id]
- ./redis-trib.rb  del-node 127.0.0.1:7002 0ca3f102ecf0c888fc7a7ce43a13e9be9f6d3dd1
- 注意:
 1.被删除的节点必须是从节点或没有被分配hash slots的节点

6.集群在线分片

# 1.在线分片 reshard [集群中任意节点] [无]
- ./redis-trib.rb  reshard  192.168.1.158:7000

你可能感兴趣的:(Redis,spring,java,后端)