首页 > 技术文章 > redis主从同步(复制+哨兵) 学习笔记

my-ordinary 2020-04-22 18:35 原文

0 环境

  • 系统环境: centos7
  • 编辑器: xshell

1 准备

基本安装 -> 我选择直接编译安装
思维导图参考

2 配置

1 复制3个conf

在这里插入图片描述

需要三个端口6379 6380 6381 我用的阿里云 所以提前在安全组配好
准备3个conf文件 redis6379.conf redis6380.conf redis6381.conf

# 复制3个conf 类似 不在追叙
cp redis.conf redis6379.conf

2 修改redis6379.conf

# 文件的复制 为了省事 可以整个项目复制 cp -R redis redis-6379 类似
vim redis6379.conf
	port 6379
	pidfile /var/run/redis_6379.pid
	logfile "6379.log"
	dbfilename dump6379.rdb
	appendfilename "appendonly6379.aof"
# wq保存退出
# redis-server redis6379.conf
# 运行
redis-cli -a 123456	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 修改redis6380.conf

将redis6380.conf中6379全改为6380 下面的redis6381.conf也是一样 保存退出 如图
在这里插入图片描述

  • 访问redis-cli -p 6380 -a 123456
# 主节点设为6379 但是重启之后 又得重新设置 所以需要在conf中配置
SLAVEOF 127.0.0.1 6379
# 查看6379里的数据 是否同步 是 --> 有数据
keys *
# 可以通过它查看 具体信息
info replication
  • 在reids6380.conf中设置连接6379认证密码
    在这里插入图片描述
  • 在reids6380.conf设置主节点
    在这里插入图片描述
  • 6380节点(从节点)不可写入(reids6380.conf可以设置只读 no 即可写入)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4 修改redis6381.conf(接力棒)

和redis6380.conf修改一致
但是有一个问题出现了 都指向6379 增加了6379的负担 现在有个方式 接力的模式
6379 -> 6380 -> 6381 (6380同步6379 6381同步6380 有点血缘的传承(但不全一样 类似) 爷爷 --> 爸爸 --> 儿子)

127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> keys *
1) "a"
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:6468
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8aaef6f934ddeb720218b07507ab8277837aac9c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6468
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:6441
repl_backlog_histlen:28
127.0.0.1:6381> exit

或是在conf上修改和之前的类似

3 哨兵配置

配置一个主服务器(6379)和2个从服务(6380 6382) --> 一主二仆

1 配置sentinel

# 配置哨兵
vim sentinel.conf
#  mymaster --> 监控的主机名 可以随便取 
# 2代表多少个sentinel认为主机挂了 才会切换 
sentinel monitor mymaster 127.0.0.1 6379 2
# 在上面的命令之下 不然启动会卡住不动
sentinel auth-pass mymaster 123456
# 保存退出
wq

vim redisxxx.conf
# 注意 在三个节点(6379 6380 6382) 都添加如下命令 不然没密码 会。。。
masterauth "123456"

# 开启主从服务 
redis-server xxx.conf

# 查看一下节点 没毛病
ps -ef|grep redis

# 都ok了 启动哨兵 会看到slave slave 从节点 @ mymaster 127.0.0.1 6379(节点)
redis-server sentinel.conf

# 先开个窗口 cli 6379 输入命令SHUTDOW 关闭主服务器
redis-cli -a 123456

# 查看哨兵 稍等一会 切换过来了 主服务器挂了 内部选举 6380上位(老大) 之前的6379(小弟)
+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
+convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

2 查看结果

  • 主服务器挂了 等一会 从服务器切换为master
    在这里插入图片描述
  • redis-cli -a 123456 -p 6380 info replication
    在这里插入图片描述
  • 重新启动6379后 是从服务器了
    在这里插入图片描述
    在这里插入图片描述
  • 在sentinel.conf中查看 结果已经变了
    在这里插入图片描述

3 注意

当我们客户端不连接redis服务器是没有问题的 但是当我们调用它 没问题 但是主节点挂掉了 会报错 所以需要每个conf绑定具体的ip(配置节点也是) 监控master不能写127.0.0.1也要配置具体的ip

推荐阅读