是什么 :

  也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

能干嘛:

  读写分离,容灾恢复

怎么玩:

  1.配从(库)不配主(库)

  2.从库配置:slaveof 主库IP 主库端口

    每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件

    Info replication

  3.修改配置文件细节操作

    拷贝多个redis.conf文件

    开启daemonize yes

    Pid文件名字

    指定端口

    Log文件名字

    Dump.rdb名字  

  4.常用3招:

    一主二仆

    薪火相传

    反客为主

在同一台机器的不同端口演示,类似于多台机器

拷贝多份配置文件

  1. [root@node1 myredis]# cp redis.conf redis6379.conf
  2. [root@node1 myredis]# cp redis.conf redis6380.conf
  3. [root@node1 myredis]# cp redis.conf redis6381.conf
  4. [root@node1 myredis]#

分别修改对应的配置文件

  1. [root@node1 myredis]# vim redis6379.conf
  2. [root@node1 myredis]# vim redis6380.conf
  3. [root@node1 myredis]# vim redis6381.conf
  4. [root@node1 myredis]#

info replication

  1. 127.0.0.1:6379> info replication
  2. # Replication
  3. role:master
  4. connected_slaves:0
  5. master_repl_offset:0
  6. repl_backlog_active:0
  7. repl_backlog_size:1048576
  8. repl_backlog_first_byte_offset:0
  9. repl_backlog_histlen:0
  10. 127.0.0.1:6379>
  1. 127.0.0.1:6380> info replication
  2. # Replication
  3. role:master
  4. connected_slaves:0
  5. master_repl_offset:0
  6. repl_backlog_active:0
  7. repl_backlog_size:1048576
  8. repl_backlog_first_byte_offset:0
  9. repl_backlog_histlen:0
  10. 127.0.0.1:6380>
  1. 127.0.0.1:6381> info replication
  2. # Replication
  3. role:master
  4. connected_slaves:0
  5. master_repl_offset:0
  6. repl_backlog_active:0
  7. repl_backlog_size:1048576
  8. repl_backlog_first_byte_offset:0
  9. repl_backlog_histlen:0
  10. 127.0.0.1:6381>

一仆二主:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k4
"v4"
127.0.0.1:6380>

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> get k1
"v1"
127.0.0.1:6381>

再次输入info replication

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=291,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=291,lag=0
master_repl_offset:291
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:290
127.0.0.1:6379>

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:333
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380>

读写分离:

slave节点不能写入

  1. 127.0.0.1:6380> set k6 v6
  2. (error) READONLY You can't write against a read only slave.
  3. 127.0.0.1:6380>

主机挂掉时:

127.0.0.1:6379> SHUTDOWN
not connected> exit
You have new mail in /var/spool/mail/root
[root@node1 ~]#

slave节点状态:

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:753
master_link_down_since_seconds:17
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380>

主机修复后:

[root@node1 ~]# redis-server /myredis/redis6379.conf
[root@node1 ~]# redis-cli -p 6379
127.0.0.1:6379> set k7 v7
OK
127.0.0.1:6379>

 

slave节点:

127.0.0.1:6380> get k7
"v7"
127.0.0.1:6380>

在当前这种状体下,主机挂掉后从机不会改变状态,会原地待命

从机down掉之后会需要与主机从新连接,除非写进conf配置文件

127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> get k7
"v7"
127.0.0.1:6380>

薪火相传:

配置6381的主节点为6380

127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381>

则此时节点状态为

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1957,lag=1
master_repl_offset:1957
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1956
127.0.0.1:6379>

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2027
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70
127.0.0.1:6380>

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:10
master_sync_in_progress:0
slave_repl_offset:99
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381>

反客为主:  

  SLAVEOF no one:使当前数据库停止与其他数据库的同步,转成主数据库

127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=267,lag=0
master_repl_offset:267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:266
127.0.0.1:6380>

复制原理:

  Slave启动成功连接到master后会发送一个sync命令

  Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全同步

  全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

  增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步,但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

哨兵模式(sentinel):

  是什么:

    反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

  怎么玩:

    调整结构,6379带着80,81

    

  1. 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
  2. OK
  3. 127.0.0.1:6380> info repication
  4. 127.0.0.1:6380> info replication
  5. # Replication
  6. role:slave
  7. master_host:127.0.0.1
  8. master_port:6379
  9. master_link_status:up
  10. master_last_io_seconds_ago:7
  11. master_sync_in_progress:0
  12. slave_repl_offset:3833
  13. slave_priority:100
  14. slave_read_only:1
  15. connected_slaves:0
  16. master_repl_offset:225
  17. repl_backlog_active:1
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:2
  20. repl_backlog_histlen:224
  21. 127.0.0.1:6380>
  1. 127.0.0.1:6381> slaveof 127.0.0.1 6379
  2. OK
  3. 127.0.0.1:6381> info replication
  4. # Replication
  5. role:slave
  6. master_host:127.0.0.1
  7. master_port:6379
  8. master_link_status:up
  9. master_last_io_seconds_ago:5
  10. master_sync_in_progress:0
  11. slave_repl_offset:3861
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_repl_offset:0
  16. repl_backlog_active:0
  17. repl_backlog_size:1048576
  18. repl_backlog_first_byte_offset:0
  19. repl_backlog_histlen:0
  20. 127.0.0.1:6381>

    自定义的/myredis目录下新建sentinel.conf文件,名字觉不能错

      [root@node1 myredis]# touch sentinel.conf

      sentinel.conf 文件的内容:(末尾的1表示谁的票数多余1票,谁就是新的领导)

      sentinel monitor host6379 127.0.0.1 6379 1  

    启动哨兵:

      使用 redis-sentinel /myredis/sentinel.conf 启动

      

  1. [root@node1 myredis]# redis-sentinel /myredis/sentinel.conf
  2. 9871:X 30 Nov 09:22:52.073 * Increased maximum number of open files to 10032 (it was originally set to 1024).
  3. _._
  4. _.-``__ ''-._
  5. _.-`` `. `_. ''-._ Redis 3.0.4 (00000000/0) 64 bit
  6. .-`` .-```. ```\/ _.,_ ''-._
  7. ( ' , .-` | `, ) Running in sentinel mode
  8. |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
  9. | `-._ `._ / _.-' | PID: 9871
  10. `-._ `-._ `-./ _.-' _.-'
  11. |`-._`-._ `-.__.-' _.-'_.-'|
  12. | `-._`-._ _.-'_.-' | http://redis.io
  13. `-._ `-._`-.__.-'_.-' _.-'
  14. |`-._`-._ `-.__.-' _.-'_.-'|
  15. | `-._`-._ _.-'_.-' |
  16. `-._ `-._`-.__.-'_.-' _.-'
  17. `-._ `-.__.-' _.-'
  18. `-._ _.-'
  19. `-.__.-'
  20.  
  21. 9871:X 30 Nov 09:22:52.077 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  22. 9871:X 30 Nov 09:22:52.077 # Sentinel runid is 07858ebd94d326270f4a56e0501afefe82e444b1
  23. 9871:X 30 Nov 09:22:52.079 # +monitor master host6379 127.0.0.1 6379 quorum 1
  24. 9871:X 30 Nov 09:22:53.077 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
  25. 9871:X 30 Nov 09:22:53.091 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379

    原有的master挂了:

      哨兵的监视窗口增加新的内容:

  1. 9895:X 30 Nov 09:42:54.522 # +sdown master host6379 127.0.0.1 6379
  2. 9895:X 30 Nov 09:42:54.522 # +odown master host6379 127.0.0.1 6379 #quorum 1/1
  3. 9895:X 30 Nov 09:42:54.522 # +new-epoch 1
  4. 9895:X 30 Nov 09:42:54.522 # +try-failover master host6379 127.0.0.1 6379
  5. 9895:X 30 Nov 09:42:54.648 # +vote-for-leader ccc2dc958a8ae1e16294b81567126ec4031bf192 1
  6. 9895:X 30 Nov 09:42:54.648 # +elected-leader master host6379 127.0.0.1 6379
  7. 9895:X 30 Nov 09:42:54.648 # +failover-state-select-slave master host6379 127.0.0.1 6379
  8. 9895:X 30 Nov 09:42:54.725 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
  9. 9895:X 30 Nov 09:42:54.725 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
  10. 9895:X 30 Nov 09:42:54.778 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
  11. 9895:X 30 Nov 09:42:55.704 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
  12. 9895:X 30 Nov 09:42:55.704 # +failover-state-reconf-slaves master host6379 127.0.0.1 6379
  13. 9895:X 30 Nov 09:42:55.752 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
  14. 9895:X 30 Nov 09:42:56.778 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
  15. 9895:X 30 Nov 09:42:56.778 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
  16. 9895:X 30 Nov 09:42:56.877 # +failover-end master host6379 127.0.0.1 6379
  17. 9895:X 30 Nov 09:42:56.877 # +switch-master host6379 127.0.0.1 6379 127.0.0.1 6380
  18. 9895:X 30 Nov 09:42:56.878 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380
  19. 9895:X 30 Nov 09:42:56.878 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380

    6380变为了新的master

  1. 127.0.0.1:6380> info replication
  2. # Replication
  3. role:master
  4. connected_slaves:1
  5. slave0:ip=127.0.0.1,port=6381,state=online,offset=123955,lag=0
  6. master_repl_offset:123955
  7. repl_backlog_active:1
  8. repl_backlog_size:1048576
  9. repl_backlog_first_byte_offset:2
  10. repl_backlog_histlen:123954
  11. 127.0.0.1:6380>

    此时6381的状态

  1. 127.0.0.1:6381> info replication
  2. # Replication
  3. role:slave
  4. master_host:127.0.0.1
  5. master_port:6380
  6. master_link_status:up
  7. master_last_io_seconds_ago:1
  8. master_sync_in_progress:0
  9. slave_repl_offset:125992
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0
  18. 127.0.0.1:6381>

    问题:如果之前的master重启回来,会不会双master冲突

    启动挂掉的6379后

    哨兵监控打印:

  1. 9895:X 30 Nov 09:43:26.931 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380
  2. 9895:X 30 Nov 09:45:51.015 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380
  3. 9895:X 30 Nov 09:46:00.994 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380

    启动后,6379的状态:

    成为了当前master的salve节点

  1. 127.0.0.1:6379> info replication
  2. # Replication
  3. role:slave
  4. master_host:127.0.0.1
  5. master_port:6380
  6. master_link_status:up
  7. master_last_io_seconds_ago:1
  8. master_sync_in_progress:0
  9. slave_repl_offset:132805
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0
  18. 127.0.0.1:6379> keys *
  19. 1) "k7"
  20. 127.0.0.1:6379>

复制的缺点:

复制延时:由于所有的写操作都是闲在Master上操作,然后同步更新到salve上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

Redis的复制(Master/Slave)的更多相关文章

  1. Redis学习十:Redis的复制(Master/Slave)【重要】

    一.是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛 读写分离  容灾恢 ...

  2. redis高可用 - Master&Slave

    Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制.其中Master以写为主,Slave以读为主. Master&Slave的作用主 ...

  3. Redis 的主从复制(Master/Slave)

    目录 1. 是什么 2. 能干嘛 3. Redis主从复制讲解 (1). info replication:查看 目标redis 主从情况 (2) . 配从库不配主库 (3). 常用策略 (4). 复 ...

  4. Redis的自从复制(Master/Slave)

    一.是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛? 1.读写分离 2.容 ...

  5. Redis master/slave,sentinel,Cluster简单总结

    现在互联网项目中大量使用了redis,本文著主要分析下redis 单点,master/slave,sentinel模式.cluster的一些特点. 一.单节点模式 单节点实例还是比较简单的,平时做个测 ...

  6. Redis的master/slave复制

    摘自:Redis的master/slave复制 Redis的master/slave数据复制方式可以是一主一从或者是一主多从的方式,Redis在master是非阻塞模式,也就是说在slave执行数据同 ...

  7. Redis(八):Redis的复制(Master/Slave)

    Redis的复制(Master/Slave)目录导航: 是什么 能干嘛 怎么玩 复制原理 哨兵模式(sentinel) 复制的缺点 是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置 ...

  8. Redis的复制(Master/Slave)、主从复制、读写分离

    1.什么是Redis的复制 行话:也就是我们所说的主从复制,主数据更新后根据配置和策略自动同步到备用机的master/slave机制,Mater以写为主,slave以读为主. 2.能干什么 2.1.读 ...

  9. 8.Redis的复制(Master/Slave)

    Redis的复制(Master/Slave) a)是什么 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave ...

随机推荐

  1. django复习笔记3:实战

    1.初始化 2.配置后台,增加测试数据 3.测试urls/views/templates 4.增加静态资源 5.修改样式 6.模版继承 7.增加博文主页 8.增加表单 9.完善新增页面和编辑页面的表单 ...

  2. PAT 1017. A除以B (20)

    本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...

  3. PHP & Delphi 語法

    明 C(区分大小写) Delphi(不区分大小写) PHP(区分大小写) 整型变量的定义 1 2 3 4 5 6 7 char a = 'a';         /* 8位有符号*/ int a=10 ...

  4. .net core API 统一拦截错误

    public override void OnActionExecuted(ActionExecutedContext context) { if (context.Exception != null ...

  5. NOI2018准备Day4

    上午9点20至11点50就做出了一道题,一个很基础的二分挡住了,原因是浮点数精度问题的处理,现在还搞不懂,为什么用double存进去两位小数过不了,用double存进去两位小数再*100再/100就能 ...

  6. oracle:如何用sql生成日历

    BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...

  7. ROS(Robot Operating System)常用环境变量介绍

    本文简单介绍ROS系统中常用的环境变量用途及设置方式.ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等. ...

  8. 前端备忘录 — IE 的条件注释

    CSS hack 由于不同厂商的浏览器,比如 Internet Explorer,Safari,Mozilla Firefox, Chrome 等,或者是同一厂商的浏览器的不同版本,如 IE6 和 I ...

  9. Mininet的内部实现原理简介

    原文发表在我的博客主页,转载请注明出处. 前言 之前模拟仿真网络一直用的是Mininet,包括写了一些关于Mininet安装,和真实网络相连接,Mininet简历拓扑的博客,但是大多数都是局限于具体步 ...

  10. java并发:线程同步机制之ThreadLocal

    1.简述ThreadLocal ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程.ThreadLocal是一个线程级别的局部变量 ...