转载自: https://www.cnblogs.com/lizhaojun-ops/p/9447016.html

原文链接:http://gudaoyufu.com/?p=1230

redis主从复制

redis主从复制的特点:

  • 一个Master可以有多个slave主机,支持链式复制;
  • Master以非阻塞方式同步数据至slave主机;

配置redis主从复制相对比较简单:
在一台节点上配置文件中定义自己是谁的从节点,并且启用主节点密码认证即可。
下面使用3台主机配置一主两从的结构,redis使用一主多从的结构时还可以实现像mysql MHA那样的复制集群,当master节点宕机后,可以在两个slave节点中根据优先级选举新的master。因此这里使用3个节点,这部分内容会在后面单独说道。

复制的两种方式

新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization”,此时其同步方式有两种方式:

  • Disk-backend:主节点基于内存创建快照文件于磁盘中,而后将其发送给从节点;从节点收到快照进行恢复,快照恢复完后接着快照的那一刻随后内容进行复制,主节点每写一行,并直接将语句发送给从节点(跨网络复制适合)
  • Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;(占用网络带宽)

安装配置redis一主多从

  • 各节点安装redis
yum install redis -y
  • 配置master节点
bind 0.0.0.0     #绑定地址
requirepass gudaoyufu #启用密码认证
#默认master节点修改这两项就可以了,也可以进行其他设置
  • 配置各slave节点
bind 0.0.0.0
slaveof 192.168.214.148 6379 #定义master信息
masterauth gudaoyufu #认证

从节点上配置这三项页就可以,其他参数可以根据情况选择调整即可。

修改后记得重启服务,此时登录到master节点查看信息:

[root@master ~]# redis-cli -h 127.0.0.1 -a gudaoyufu
127.0.0.1:6379> CLIENT LIST
id=5 addr=192.168.214.149:39804 fd=5 name= age=326 idle=1 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
id=7 addr=127.0.0.1:35262 fd=6 name= age=4 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client #看到第一条记录最后cmd=replconf就说明该节点是从节点

或者使用指令INFO replication指令查看信息:

127.0.0.1:6379> INFO replication
# Replication
role:master #自己的角色
connected_slaves:1 #从节点数量
slave0:ip=192.168.214.149,port=6379,state=online,offset=995,lag=1 #从节点信息
master_repl_offset:995
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:994

接着将slave-2也配置好,与slave-1配置相同即可,配置好后重启服务,查看master节点信息

127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.214.149,port=6379,state=online,offset=1793,lag=1
slave1:ip=192.168.214.150,port=6379,state=online,offset=1793,lag=1
master_repl_offset:1793
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1792

可以看到信息发送变化,两个从节点已经上线,接下来可以进行简单的验证复制,在master节点设置一个key,看两个slave节点复制情况:

master节点创建一个key

127.0.0.1:6379> SET mykey 111
OK
127.0.0.1:6379> get mykey
"111"

两个slave节点查看:

[root@slave-1 ~]# redis-cli -h 127.0.0.1 -a gudaoyufu
127.0.0.1:6379> get mykey
"111"
#
[root@slave-2 ~]# redis-cli -h 127.0.0.1 -a gudaoyufu
127.0.0.1:6379> get mykey
"111"

slave节点定义也可以通过指令设置,设置后立即生效,并且会被保存至配置文件中,指令配置方式如下:

配置slave节点:

redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>

redis主从复制相关配置

下面是redis主从复制场景的一些可调参数,需要根据实际环境调整

  • slave-serve-stale-data yes : 是否可以把不新鲜的数据服务与客户端
  • slave-read-only yes : 从节点只读,启用slaveof定义后才生效
  • repl-diskless-sync no :是否同时向多个从节点同时发数据
  • repl-diskless-sync-delay 5 :发送的延迟时间
  • repl-ping-slave-period 10 探测从节点状态
  • repl-timeout 60 探测节点超时时间
  • repl-disable-tcp-nodelay no : 启用nodelay
  • repl-backlog-size 1mb
  • slave-priority 100 : 从节点优先级,复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
  • min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
  • min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;

redis sentinel 高可用复制集群

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,如果master宕机,Redis自身并不能实现自动进行主备切换,sentinel可以监控复制节点的状态,当主节点宕机后,它能根据选举方式选出后端的一个从节点作为新的master,sentinel还能监控多个master-slave集群,发现master宕机后能进行自动切换。

同时,sentinel本身也存在单点问题,通常sentinel也是一个集群,因此,redis的复制集群通常是下面的结构

sentinel集群工作原理

sentinel集群通过给定的配置文件发现master,启动时会监控master。通过向master发送info信息获得该服务器下面的所有从服务器。

sentinel集群通过流言协议与其他sentinel通信,以此来发现监视同一个主服务器的其他sentinel;集群之间会互相创建命令连接用于通信。

sentinel集群使用ping命令来检测实例的状态,如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复,sentinel会认为主节点宕机,但是并不会立即提升一个从节点为新的master,因为会存在误判的情况,此时为主观宕机
此时当sentinel集群中有一半以上的节点通告master为宕机状态时,此时为客观宕机,sentinel基于选举协议选举提升从节点为新的master,从节点之间根据优先级来决策谁会成为新的master,修复的节点重新上线后作为从节点工作。

配置sentinel 集群

下面使用上面的结构图,配置sentinel集群,来监控上面已经配置好的复制集群,实现高可用复制集群。
由于没有那么多机器,这里只使用6台主机做两个master-slave复制集群,把sentinel集群同时放在其中一组集群上与redis复制集群共存。sentinel集群同时监控两个复制集群。

安装redis安装时自带了sentinel功能,因此只要安装了redis即可,在创建一个复制集群,并在第二个复制集群上创建sentinel集群共存。

安装redis

[root@redis-master ~]# yum install redis -y
[root@redis-salve-1 ~]# yum install redis -y
[root@redis-salve-2 ~]# yum install redis -y

配置主从复制

bind 0.0.0.0
requirepass gudaoyufu.com

启动主节点redis:service redis start

启动两个从节点使用指令配置从节点为slave

[root@redis-salve-1 ~]# systemctl start redis
[root@redis-slave-2 ~]# systemctl start redis

salve节点配置:

[root@redis-salve-1 ~]# redis-cli
127.0.0.1:6379> slaveof 192.168.214.141 6379
OK
127.0.0.1:6379> config set masterauth gudaoyufu.com
OK # [root@redis-slave-2 ~]# redis-cli
127.0.0.1:6379> slaveof 192.168.214.141 6379
OK
127.0.0.1:6379> config set masterauth gudaoyufu.com
OK

主节点查看

[root@redis-master ~]# redis-cli -h 127.0.0.1 -a gudaoyufu.com
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.214.143,port=6379,state=online,offset=827,lag=1
slave1:ip=192.168.214.147,port=6379,state=online,offset=827,lag=1
master_repl_offset:841
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:840

调整两个复制集群slave的优先级
两个集群中选一个slave节点调低优先级

slave-priority 90
#重启
systemctl restart redis

配置sentinel监控集群

[root@redis-master ~]# vim /etc/redis-sentinel.conf

bind 0.0.0.0
port 26379 sentinel monitor mymaster-1 192.168.214.141 6379 2
sentinel monitor mymaster-2 192.168.214.148 6379 2 sentinel auth-pass mymaster-1 gudaoyufu.com
sentinel auth-pass mymaster-2 gudaoyufu sentinel down-after-milliseconds mymaster-1 30000
sentinel down-after-milliseconds mymaster-2 30000 sentinel parallel-syncs mymaster-1 1
sentinel parallel-syncs mymaster-2 1 sentinel failover-timeout mymaster-1 180000
sentinel failover-timeout mymaster-2 180000 logfile /var/log/redis/sentinel.log

将上面的配置文件配置好后各自复制一份到其他两个节点,注意:复制配置文件一定要在启动redis-sentinel服务之前,因为启动服务后配置文件中会生成id号,服务个节点的id相同会造成无法选举新的master节点

配置文件复制后启动各节点redis-sentinel服务。

service  redis-sentinel start
systemctl start redis-sentinel
(我使用的系统版本不一样,所以指令不同)

在redis-sentinel.conf文件中分别定义两个复制集群的master信息。

参数作用

  • sentinel monitor < master-name > < ip > < redis-port > < quorum >
  • sentinel auth-pass < master-name > < password >
    • < quorum >表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;
  • sentinel down-after-milliseconds < master-name > < milliseconds > :监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
  • sentinel parallel-syncs < master-name > < numslaves > : 指在failover过程中,能够被sentinel并行配置的从节点的数量;
  • sentinel failover-timeout < master-name > < milliseconds > :sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
  • sentinel notification-script < master-name > < script-path > :通知脚本,此脚本被自动传递多个参数;

测试故障转移

停掉mymaster-2的主节点 (192.168.214.148 ),查看mymaster-2的主节点有没有发生改变:

[root@redis-master ~]# redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "mymaster-1"
3) "ip"
4) "192.168.214.141"
5) "port"
6) "6379"
7) "runid"
8) "c068ea99d1f60e1eb5822d6eecbde47a45661509"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "151"
19) "last-ping-reply"
20) "151"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "770"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "793908"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
2) 1) "name"
2) "mymaster-2"
3) "ip"
4) "192.168.214.149"
5) "port"
6) "6379"
7) "runid"
8) "60ba5b8b5cc52fbb691179ec43b8582a161ed7e8"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "7"
19) "last-ping-reply"
20) "7"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "5101"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "35884"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

从上的一堆信息中可以看到已经改变了

2) "mymaster-2"
3) "ip"
4) "192.168.214.149" #新的master
#注意:slave节点的值越小,优先级越高

至此,两个redis的高可用复制集群已经完成了,还有一些参数根据环境调整即可

SENTINEL常用指令

redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves < MASTER_NAME >
SENTINEL failover < MASTER_NAME >
SENTINEL get-master-addr-by-name < MASTER_NAME >

转载:Redis主从复制与高可用方案的更多相关文章

  1. Redis主从复制与高可用方案

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis与其他key – value缓存产品有以下三个特点: 支持数据的持久化,可以将内存中 ...

  2. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

  3. Redis笔记5-redis高可用方案

    一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...

  4. (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...

  5. [转载] MySQL高可用方案选型参考

    原文: http://imysql.com/2015/09/14/solutions-of-mysql-ha.shtml?hmsr=toutiao.io&utm_medium=toutiao. ...

  6. 分布式数据存储 - MySQL主从复制高可用方案

    前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可 ...

  7. 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

    本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...

  8. 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...

  9. mysql高可用方案总结性说明

    MySQL的各种高可用方案,大多是基于以下几种基础来部署的(也可参考:Mysql优化系列(0)--总结性梳理   该文后面有提到)1)基于主从复制:2)基于Galera协议(PXC):3)基于NDB引 ...

随机推荐

  1. 编程与算法(一)、C语言实现二分法(方程近似解)

    一.二分法 假设有这样一个函数f(x) 函数与x轴有一个交点(也就是f(a)*f(b)<0,a<b),现在我们要求这个点的x值,也就是方程f(x)=0的一个实根 直接解显然不合适,那么接下 ...

  2. 你可以 CRUD,但你不是 CRUD 程序员!

    什么是务实 务实程序员他们总是在面临问题时,透过问题看到本质,从具体的场景出发,从大局着想,了解整个问题的来龙去脉,他们会对自己的行为负责,在项目面临问题时,他们不会撒手不管或者任由风险一步步扩大直至 ...

  3. OGG复制进程延迟高,优化方法一(使用索引)

    日常运维过程中,可能发现OGG同步进程延迟很高: 本篇介绍其中的一种方式. OGG复制进程,或者说同步进程及通过解析ogg trail文件,输出dml语句,在目标库执行dml操作,那么延迟高可能性其一 ...

  4. Deep learning-based personality recognition from text posts of online social networks 阅读笔记

    文章目录 一.摘要 二.模型过程 1.文本预处理 1.1 文本切分 1.2 文本统一 2. 基于统计的特征提取 2.1 提取特殊的语言统计特征 2.2 提取基于字典的语言特征 3. 基于深度学习的文本 ...

  5. Clion使用gtk3

    在已经安装了gtk3的情况下,使用Clion还是无法正常给gtk3. 此时,我们需要更改CMakeList. 以下代码中需要添加的行都以#开头,此仅为了标识需要添加的行,而无需在实际代码中添加# cm ...

  6. SSRF 跨站请求伪造学习笔记

    参考文章: 了解SSRF,这一篇就足够了 SSRF 学习之路 SSRF绕过方法总结 Weblogic SSRF漏洞 What-是什么 SSRF(Server-Side Request Forgery) ...

  7. python 去除Excel中的重复行数据

    导入pandas import pandas as pd 1.读取excel中的数据: frame = pd.DataFrame(pd.read_csv('excel的绝对路径.csv'', 'She ...

  8. cdh6.2.1搭建安装

    1.为CM安装mysql驱动 4台服务器 将mysql-connector-java-5.1.27-bin.jar拷贝到/usr/share/java路径下,并重命名 mv mysql-connect ...

  9. 7.hbase shell命令 cmd

    $HADOOP_USER_NAME #创建命名空间create_namespace 'bd1902' #展示所有命名空间 list_namespace #删除命名空间,The namespace mu ...

  10. python编程中的并发------多进程multiprocessing

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...