10 Redis 主从复制
文章目录
- 1 是什么
- 2 能干嘛
- 3 主从复制搭建
- 3.1 根目录下创建目录/myredis
- 3.2 修改/myredis中redis.conf
- 3.3 vim redis6379.conf
- 3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置
- 3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置
- 3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置
- 3.4 分别启动三个redis服务
- 3.4.1 查看进程是否正常启动
- 3.5 通过客户端连接加端口号查看redis信息
- 3.5.1 通过客户端连接加端口号查看redis6379信息 info replication
- 3.5.2 通过客户端连接加端口号查看redis6380信息 info replication
- 3.5.3 通过客户端连接加端口号查看redis6381信息 info replication
- 3.6 配置从库不配置主库
- 3.6.1 在6380客户端执行slaveof 127.0.0.1 6379
- 3.6.1 在6381客户端执行slaveof 127.0.0.1 6379
- 3.7 验证主从复制
- 3.7.1 在主库写入键值对,在从机查看可以复制成功
- 3.7.2 在从机查看可以取到键值,说明复制成功
- 3.7.3 如果在从库写入键值对是提示失败
- 3.8 一主二从
- 3.9 薪火相传
- 3.10 反客为主
- 3.11 主从复制原理
- 4 哨兵模式sentinel
- 4.1 首先配置一主二从的基本环境
- 4.2 配置哨兵
- 4.3 启动哨兵
- 4.4 模拟主服务器shutdown
- 4.5 此时再启动之前的主服务器6379变为从服务器slave了
- 4.6 复制延时
- 4.7 故障恢复
- 4.7.1 新主登基
- 4.7.2 群臣俯首
- 4.7.3 旧主俯首
1 是什么
主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为主
2 能干嘛
读写分离,性能扩展
容灾快速恢复
3 主从复制搭建
3.1 根目录下创建目录/myredis
将/etc/redis.conf 配置文件拷贝到/myredis中
[root@localhost chengwen]# mkdir /myredis
[root@localhost chengwen]# cd /myredis/
[root@localhost myredis]# cp /etc/redis.conf /myredis/redis.conf
[root@localhost myredis]# ls
redis.conf
3.2 修改/myredis中redis.conf
appendonly 修改为 no
appendonly no
3.3 vim redis6379.conf
3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置
[root@localhost myredis]# cp redis6379.conf redis6380.conf
[root@localhost myredis]# vim redis6380.conf
include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置
[root@localhost myredis]# cp redis6379.conf redis6381.conf
[root@localhost myredis]# vim redis6381.conf
include /myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
3.4 分别启动三个redis服务
[root@localhost myredis]# redis-server redis6379.conf
[root@localhost myredis]# redis-server redis6380.conf
[root@localhost myredis]# redis-server redis6381.conf
[root@localhost myredis]#
3.4.1 查看进程是否正常启动
[root@localhost myredis]# ps -ef|grep redis
root 152843 2158 0 04:30 ? 00:00:00 redis-server *:6380
root 152856 2158 0 04:31 ? 00:00:00 redis-server *:6381
root 152966 2158 0 04:33 ? 00:00:00 redis-server *:6379
root 152972 123376 0 04:33 pts/0 00:00:00 grep --color=auto redis
[root@localhost myredis]#
3.5 通过客户端连接加端口号查看redis信息
3.5.1 通过客户端连接加端口号查看redis6379信息 info replication
role:master 说明是角色是主机Master
[root@localhost myredis]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:1ecba680652395416fe8bd719da26c6564a957d5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
3.5.2 通过客户端连接加端口号查看redis6380信息 info replication
role:master 说明是角色是主机Master
[chengwen@localhost redis]$ redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:ad3b7ea9b5309fe5b1974333a68cd95a2c60e2df
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380>
3.5.3 通过客户端连接加端口号查看redis6381信息 info replication
role:master 说明是角色是主机Master
[chengwen@localhost ~]$ redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:08aebaa422e9096f8efb3ec263e8334f208ae017
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381>
3.6 配置从库不配置主库
slaveof
ip为主库的ip
port为主库的port
3.6.1 在6380客户端执行slaveof 127.0.0.1 6379
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
6380 角色变为role:slave
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:7
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6380>
6379主库信息显示了从库信息 slave0:ip=127.0.0.1,port=6380
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=154,lag=1
master_failover_state:no-failover
master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154
127.0.0.1:6379>
3.6.1 在6381客户端执行slaveof 127.0.0.1 6379
在6381客户端执行
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
6381 角色变为role:slave
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1120
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1120
second_repl_offset:-1
repl_backlog_active
6379主库信息显示了从库信息slave1:ip=127.0.0.1,port=6381
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=1232,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=1232,lag=1
master_failover_state:no-failover
master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1232
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1232
127.0.0.1:6379>
3.7 验证主从复制
3.7.1 在主库写入键值对,在从机查看可以复制成功
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
3.7.2 在从机查看可以取到键值,说明复制成功
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380>
3.7.3 如果在从库写入键值对是提示失败
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
3.8 一主二从
如果从slave服务器shutdown,重启启动后会变为独立的master;
通过slaveof 127.0.0.1 6379 配置为从服务器后,会从master复制全部数据
如果master服务器shutdown,重启后还是master
通过redis-server redis6379.conf 启动后还是主服务器
3.9 薪火相传
上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力,去中心化降低风险
用slaveof
中途变更转向,会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave无法备份
主机挂了,从机还是从机,无法写数据了
3.10 反客为主
当一个master宕机后,后面的slave可以立刻升为master,后面的slave不用做任何修改
用slaveof no one 将从机变为主机
3.11 主从复制原理
当从服务器slave连接上主服务器master后,会发送sync命令
master接到命令后启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制 slave服务器在接收到数据库文件后,将其存盘并加载到内存中
增量复制 master继续将新的所有收集到的修改命令依次传给slave,完成同步
只要是重新连接master,一次完全同步(全量复制)将被自动执行
4 哨兵模式sentinel
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
4.1 首先配置一主二从的基本环境
[root@localhost myredis]# redis-server redis6379.conf
[root@localhost myredis]# redis-server redis6380.conf
[root@localhost myredis]# redis-server redis6381.conf
[root@localhost myredis]# redis-cli -p 6379
[chengwen@localhost ~]$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
[chengwen@localhost redis]$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
4.2 配置哨兵
[root@localhost myredis]# vim /myredis/sentinel.conf
在sentinel.conf中添加如下配置
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster 为监控对象起的服务器名称,
1为至少有多少个哨兵同意迁移的数量
4.3 启动哨兵
[root@localhost ~]# redis-sentinel /myredis/sentinel.conf
启动信息,包含主机名称 端口,从机端口等
168706:X 05 May 2021 10:00:40.739 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
168706:X 05 May 2021 10:00:40.750 # Sentinel ID is 09cecc8460e8981db67146daa636f7ec6ccb2cdf
168706:X 05 May 2021 10:00:40.750 # +monitor master mymaster 127.0.0.1 6379 quorum 1
168706:X 05 May 2021 10:00:40.752 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:00:40.754 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
4.4 模拟主服务器shutdown
127.0.0.1:6379> shutdown nosave
not connected> exit
[root@localhost myredis]#
此时再看sentinel 信息
168706:X 05 May 2021 10:05:09.971 # +sdown master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:09.971 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
168706:X 05 May 2021 10:05:09.971 # +new-epoch 1
168706:X 05 May 2021 10:05:09.971 # +try-failover master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:09.974 # +vote-for-leader 09cecc8460e8981db67146daa636f7ec6ccb2cdf 1
168706:X 05 May 2021 10:05:09.974 # +elected-leader master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:09.974 # +failover-state-select-slave master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.050 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.050 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.109 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.696 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.696 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:10.775 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:11.782 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:11.782 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:11.874 # +failover-end master mymaster 127.0.0.1 6379
168706:X 05 May 2021 10:05:11.874 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381
168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
168706:X 05 May 2021 10:05:41.940 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
上述信息 selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
表明新的master 为6381,查看6381的info replication为
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=48619,lag=0
master_failover_state:no-failover
master_replid:8bedc64549b81b2c8b0fd6aaedfabda6339831c3
master_replid2:298dd1f7362edcaccde0774f694b9be161acf698
master_repl_offset:48619
second_repl_offset:16537
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:48619
127.0.0.1:6381>
4.5 此时再启动之前的主服务器6379变为从服务器slave了
[root@localhost myredis]# redis-server redis6379.conf
[root@localhost myredis]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:64126
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8bedc64549b81b2c8b0fd6aaedfabda6339831c3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:64126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:62879
repl_backlog_histlen:1248
127.0.0.1:6379>
4.6 复制延时
由于所有的写操作都是先在master上操作,然后同步的更新到slave,所以从master同步到slave机器有一定的延迟,当系统繁忙的时候,延迟问题更加严重,slave机器数量的增加也会使这个问题更加严重
4.7 故障恢复
4.7.1 新主登基
从宕机的主服务的所有从服务里面挑选一个从服务,将其转换成主服务
选择条件依次为:
选择优先级靠前的
选择偏移量最大的
选择runid最小的服务
4.7.2 群臣俯首
挑选出新的主服务器之后,sentinel向原主服务器的从服务发送slaveof新主服务的命令 复制新master
4.7.3 旧主俯首
当宕机的服务重新上线时,sentinel会向其发送slaveof命令,让其成为新的从机
优先级在redis.conf 中默认:slave-priority 100 ,值越小优先级越高replica-priority 100 (新版本配置优先级)
偏移量是指获得原主机数据最安全的
每个redis实例启动后都会随机生成一个40位的runid
文章目录
- 1 是什么
- 2 能干嘛
- 3 主从复制搭建
- 3.1 根目录下创建目录/myredis
- 3.2 修改/myredis中redis.conf
- 3.3 vim redis6379.conf
- 3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置
- 3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置
- 3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置
- 3.4 分别启动三个redis服务
- 3.4.1 查看进程是否正常启动
- 3.5 通过客户端连接加端口号查看redis信息
- 3.5.1 通过客户端连接加端口号查看redis6379信息 info replication
- 3.5.2 通过客户端连接加端口号查看redis6380信息 info replication
- 3.5.3 通过客户端连接加端口号查看redis6381信息 info replication
- 3.6 配置从库不配置主库
- 3.6.1 在6380客户端执行slaveof 127.0.0.1 6379
- 3.6.1 在6381客户端执行slaveof 127.0.0.1 6379
- 3.7 验证主从复制
- 3.7.1 在主库写入键值对,在从机查看可以复制成功
- 3.7.2 在从机查看可以取到键值,说明复制成功
- 3.7.3 如果在从库写入键值对是提示失败
- 3.8 一主二从
- 3.9 薪火相传
- 3.10 反客为主
- 3.11 主从复制原理
- 4 哨兵模式sentinel
- 4.1 首先配置一主二从的基本环境
- 4.2 配置哨兵
- 4.3 启动哨兵
- 4.4 模拟主服务器shutdown
- 4.5 此时再启动之前的主服务器6379变为从服务器slave了
- 4.6 复制延时
- 4.7 故障恢复
- 4.7.1 新主登基
- 4.7.2 群臣俯首
- 4.7.3 旧主俯首
10 Redis 主从复制相关推荐
- redis主从复制故障转移
Redis主从复制与故障切换 目录 目录1 一.概述1 二. 实验目的2 三.试验环境2 四. 说明2 五. 拓扑2 六. 实施步骤2 6.1.分别安装redis2.8.32 6.2.配置主从同步3 ...
- redis+主从复制+集群配置
redis+主从复制+集群配置 redis是一个key-value存储系统.和memcached类似,不过redis支持的value类型更多,主要有:string(字符串).list(链表).set( ...
- redis主从复制实验,使用ruby
redis相比memcached不仅多了数据持久化的部分,对多种数据结构的支持和主从复制的支持也更好了. 在这个实验中我增加了2个redis slave,即1个master(6379端口),2个sla ...
- cxgrid主从表 点+号展开_深入理解Redis主从复制
一.背景 前面的文章中,我们介绍过Redis的持久化机制,它可以实现Redis实例数据的crash-safe.但是这里有一个问题,就是Redis其实还存在着单点故障问题,比如说Redis的硬盘坏掉了, ...
- Redis主从复制的搭建与.哨兵.数据持久
目录 一.redis主从复制 1.主从复制的概述 2.一主一从结构的配置 二.哨兵服务 1. 哨兵服务的简单介绍 2.配置哨兵服务 三.数据持久化 1.RedisDataBase(RDB) 2.App ...
- 深入Redis 主从复制原理
复制原理 1.复制过程 复制的过程步骤如下: 1.从节点执行 slaveof 命令 2.从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制 3.从节点 ...
- [转载] 深入剖析 redis 主从复制
转载自http://www.cnblogs.com/daoluanxiaozi/p/3724299.html 主从概述 redis 支持 master-slave(主从)模式,redis server ...
- NoSQL(3) 之Redis主从复制、哨兵和集群介绍及详细搭建步骤
文章目录 一.主从复制 1.1 主从复制的概念 1.2 主从复制的作用 1.3 主从复制的流程 1.4 部署Redis 主从复制步骤 1)首先要搭建redis,在之前的博客写过, 具体可参考:NoSQ ...
- Redis—主从复制
原文作者:编程迷思 原文地址:深入学习Redis(3):主从复制 一.主从复制概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从 ...
最新文章
- gis怎么改鼠标滚轮缩放_ArcGIS鼠标滚轮方向之代码篇
- 我好像还没睡醒,在说胡话...
- Codeforces Global Round 1 晕阙记
- python类装饰器详解-Python装饰器基础概念与用法详解
- Asp.net常用的操作函数
- 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑
- Paxos算法(Basic Paxos 与 Multi-Paxos思想)
- 64位进程隐藏不蓝屏_浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法...
- hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错
- mongodb 导入 mysql_将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...
- html form urlencode,form-data和x-www-form-urlencode的区别
- opencv之retina滤波器---Retina_create
- 分组取出值最大的数据
- 加载字典文件,扫描网站潜在目录
- 嵌入式linux 内核移植篇
- [LTE] LTE基本架构
- autocad html 插件,cad插件有哪些
- Ubuntu下载速度慢的解决方法
- 读书笔记:少有人走的路
- Java中为什么有时候通过指定编码集无法解决乱码
热门文章
- 安卓怎么显示res文件夹中的html_使用Android WebView加载现有的.html文件
- 批量打印html文档,web页面的单页打印以及批量打印实现方法
- mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决
- pythondict(zip())_python基础:zip和dict详解
- sm总线控制器找不到驱动程序_技术 | 基于CAN总线的伺服电机通信控制
- html5简单动画效果代码,分享12个简洁漂亮的纯CSS3进度条特效动画代码
- mysql in 原理_深入理解MySql子查询IN的执行和优化
- php ajax城市联动,php+ajax 城市联动
- mysql show schema_快速入门 · xiaoboluo768/mysql-system-schema Wiki · GitHub
- table取tr对象 vue_javascript的DOM对象终极总结:你必看的js面向对象