欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis搭建主从复制、哨兵集群

程序员文章站 2022-05-07 15:48:01
...

Redis搭建主从复制、哨兵集群

相关:

Redis导学与一系列常见问题

Redis-数据结构及持久化操作(CentOS)

主从复制搭建

主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据

无法解决master(主节点)出现故障的自动故障转移

主从复制架构图:

Redis搭建主从复制、哨兵集群

准备三台机器并修改对应的配置文件

由于我没有三台机器,故在单台机上开启三个redis服务来模拟主从复制

  1. 准备三份配置文件,修改对应的配置
- master
	port 6379	#指定端口号
	bind 0.0.0.0  #允许任意远程连接
	
- slave1
	port 6380
	bind 0.0.0.0
	slaveof masterip masterport # slaveof 192.xxx.xx.xxx 6379

- slave2
	port 6381
	bind 0.0.0.0
	slaveof masterip masterport	# slaveof 192.xxx.xx.xxx 6379

从节点的指定在配置文件中的位置如下:

Redis搭建主从复制、哨兵集群

2.启动三台机器进行测试

- cd /usr/redis/bin
- ./redis-server /root/master/redis.conf
- ./redis-server /root/slave1/redis.conf
- ./redis-server /root/slave2/redis.conf

如果搭建成功,你在master可以进行写操作,在从节点可以看到数据都会进行同步,但是从节点无法进行写操作!

启用哨兵机制

哨兵机制是在主从复制的基础上进行的

Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有自动故障转移功能的主从架构

哨兵架构原理图:

Redis搭建主从复制、哨兵集群

1.在主节点上创建哨兵配置

  • 在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;

2.配置哨兵,在sentinel.conf文件中填入内容:

sentinel monitor [被监控数据库名字(自定义)]  [ip] [port] [指明哪个数据库]
# sentinel monitor mymaster 192.xxx.xx.xxx 6379 1

3.启动哨兵模式进行测试

  • ./redis-sentinel /root/sentinel/sentinel.conf

启动哨兵后会显示该哨兵的端口号

如果哨兵机制成功运行,你将master服务宕机(CTRL + C)后,可以发现会有新的master被推举上任,在原master节点恢复后,会成为新master节点的从节点

通过springboot操作哨兵:

spring.redis.sentinel.master=mymaster
#master书写是使用哨兵监听的那个名称
spring.redis.sentinel.nodes=192.168.202.206:26379
#连接的不再是一个具体redis主机,书写的是多个哨兵节点
  • 注意:如果连接过程中出现如下错误: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搭建主从复制、哨兵集群

集群搭建

Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举和容错,支持在线分片(sharding shard )等特性

集群架构图与细节:

Redis搭建主从复制、哨兵集群

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  • 各自的节点可以主从复制节点与哨兵机制
  • 节点的fail是通过集群中超过半数的节点检测失效时才生效. 当一个节点宕机后,如果哨兵没能即使处理,会被踢出集群
  • 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  • redis-cluster把所有的物理节点映射到[0-16383]slot(槽)上

关于槽:集群负载均衡的一种策略

Redis搭建主从复制、哨兵集群

1.准备环境安装ruby以及redis集群依赖

yum install -y ruby rubygems #安装ruby环境与依赖
# ...
# 到互联网下载redis-xxx.gem到虚拟机 xxx表示你的redis版本
# ...
gem install redis-xxx.gem  #通过gem安装

2.在一台机器创建7个目录

由于集群最少需要6个节点(3主3从),我们另外加一个节点用来访问

Redis搭建主从复制、哨兵集群

7001 ~ 7006代表我们的集群

3.每个目录复制一份配置文件

[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7000/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7001/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7002/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7003/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7004/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7005/
[aaa@qq.com ~]# cp redis-4.0.10/redis.conf 7006/

4.修改各自目录配置文件

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

5.指定不同目录配置文件启动七个节点

- [aaa@qq.com bin]# ./redis-server  /root/7000/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7001/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7002/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7003/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7004/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7005/redis.conf
- [aaa@qq.com bin]# ./redis-server  /root/7006/redis.conf

6.查看进程

- [aaa@qq.com bin]# ps aux|grep redis

Redis搭建主从复制、哨兵集群

7.复制集群操作脚本到bin目录中

- [aaa@qq.com bin]# cp /root/redis-4.0.10/src/redis-trib.rb .

集群脚本在redis源码包中,在对应版本的源码包src/下找到这个rb源文件,复制到你redis的bin下即可

8.创建集群

./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

以上所有ip与端口改成你自己的

Redis搭建主从复制、哨兵集群

搭建成功后如下图所示

Redis搭建主从复制、哨兵集群

集群下相关操作

集群节点状态说明

  • 主节点
    主节点存在hash slots,且主节点的hash slots 没有交叉
    主节点不能删除
    一个主节点可以有多个从节点
    主节点宕机时多个副本之间自动选举主节点

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

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

# 添加主节点 add-node [新加入节点] [原始集群中任意节点]
./redis-trib.rb  add-node 192.168.1.158:7007  192.168.1.158:7006
- 注意:
	1.该节点必须以集群模式启动
	2.默认情况下该节点就是以master节点形式添加
	
	
# 添加从节点 add-node --slave [新加入节点] [集群中任意节点]
./redis-trib.rb  add-node --slave 192.168.1.158:7006 192.168.1.158:7000
- 注意:
当添加副本节点时没有指定主节点,redis会随机给副本节点较少的主节点添加当前副本节点