目录
一、定义
好处:
二、搭建一主多从
三、演示
四、主从复制的原理
1. 一主二仆
2.薪火相传
3.反客为主
五、哨兵模式
六、集群
七、搭建集群
八、集群操作与故障恢复
一、定义
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制, Master以写为主, Slave以读为主.

一主多从:一台主机挂掉,无法进行。需要集群
好处:
1.读写分离:主机做写操作,从机做读操作
2.容灾快速恢复:当一台机器挂掉,其他从机还能处理
二、搭建一主多从
1.创建/myredis文件夹
2.复制redis.conf配置文件到该文件中
3.配置一主两从,创建3个配置文件
redis6379.conf
redis6380.conf
redis6381.conf
4.在三个配置文件中写入内容
修改appendonly no
5.新建redis6379.conf 填写内容
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
6. 新建redis6380.conf 填写内容
include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
7. 新建redis6381.conf 填写内容
include /myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
启动三台服务器
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
查看进程是否启动
ps -ef | grep redis
查看三台主机运行情况
info replication
分别连上三个redis,不同的端口号
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
配从不配主(在从机的窗口输入以下命令)
slaveof <主机ip> <主机端口号>
slaveof 127.0.0.1 6379
再查看一遍
info replication
显示该机是一个slave 从服务器
三、演示
1.在主机中加数据
set k1 v1
2.在从机中能读到数据
keys *
若在从机进行写操作,会报错。
四、主从复制的原理
1. 一主二仆
1.其中一台从机挂掉
6379:
6380:
6381:shutdown
2.主机添加操作
6379:set k1 v1
6380:
6381:shutdown
3.6381从机再启动会什么效果?
6379:
6380:
6381:redis-server redis6381.conf
redis-cli -p 6381
info replication
4.发现从机6381变成主机了,再设置回从机
6379:
6380:
6381:slaveof 127.0.0.1 6379
5.6381能看到k1吗?
6379:
6380:
6381:key *
6.可以看到,但需要重新设置为从机
主机挂掉的情况:从机仍然是从机,主机仍然是主机
1.主机挂掉
6379:shutdown
6380:
6381:
2.从机仍然是从机
3.重启主机
6379:redis-server redis6379.conf
redis-cli -p 6379
6380:
6381:
通俗原理:
1、当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息(从机主动)
2、主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
3、每次主服务器进行写操作之后,和从服务器进行数据同步(主机主动)
主从复制原理:
- Slave启动成功连接到master后会发送一个sync命令。
- Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后, master 将传送整个数据文件到slave,以完成一次完全同步。
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制: Master继续将新的所有收集到的修改命令依次传给slave,完成同步,但是只要是重新连接master,-次完全同步(全量复制将被自动执行)
2.薪火相传
薪火相传:项目经理管几百人,向下划分小组长,只需通知小组长即可。
演示:
1.设置
6379:主机
6380:slave of 127.0.0.1 6379
6381:slave of 127.0.0.1 6380
2.6381的主机是6380
6379:主机
6380:
6381:info replication
中途变更转向:会清除之前的数据,重新建立拷贝最新的.
风险是一旦某个 slave宕机,后面的slave都没法备份。
主机挂了,从机还是从机,无法写数据了。
3.反客为主
1.6381从机上位,变成主机
6379:shutdown
6380:
6381:slaveof no one
但需要手动设置,后面的哨兵模式就是反客为主的自动版
五、哨兵模式
哨兵始终监听主机是否挂掉,通知从机上位
1.启动服务器 并 连接
6379:redis-server redis6379.conf
6380:redis-server redis6379.conf
6381: redis-server redis6379.conf
2.设置从服务器
6379:
6380:slaveof 127.0.0.1 6379
6381: slaveof 127.0.0.1 6379
3.配置哨兵模式
自定义的/myredis目录下新建sentinel.conf文件,名字不可错
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster 为监控对象起的服务器名字
1为至少有多少个哨兵同意迁移的数量,均同意才可
4.启动哨兵
/usr/local/bin
redis-sentinel /myredis/sentinel.conf
默认端口 26379
5.观察信息
主机挂掉,从6380.6381中选择一个当主机
6.主机挂掉
6379:shutdown
6380:
6381:
7.稍等,哨兵知晓,从机上位
selected-salve ... 6380
8.6380作为主机,但6379作为从服务器,只是仍然处以挂掉状态
6379:挂掉
6380:主机
6381:主机是6380
9.目前的状况
6379:主机是6380
6380:主机
6381:主机是6380
缺点:复制延时
由于所有的写操作都是先在Master.上操作,然后同步更新到Slave.上,所以从Master同步到Slave机器有一定的延迟 ,当系统很繁忙的时候,延迟问题会更加严重, Slave机器数量的增加也会使这个问题更加严重
选举新主机的条件:
1.选择优先级靠前的
2、选择偏移量最大的
3、选择runid最小的从服务
优先级的配置
vi redis.conf
值越小优先级越高
replica-priority 100
偏移量是指获得,原主机数据最全的。
每个redis实例启动后都会随机生成一个40位的runid
在java中配置主从复制
private static JedisSentinelPool jedisSentinelPool=null;
public static Jedis getJedisFromSentinel {
if(jedisSentinelPool==null) {
Set<String> sentinelSet=new HashSet<>() ;
sentinelSet.add(" 192. 168. 11. 103:26379");
JedisPoolConfig jedi sPpolConfig =new Jedi sPoolConfig(;
jedisPoolConfig. setMaxTotal(10); //最大可用连接数
jedisPoolConfig. setMaxIdle(5); //最大闲置连接数
jedisPoolConfig. setMinIdle(5); //最小闲置连接数
jedisPoolConfig. setBlockWhenExhausted(true); //连接耗尽是否等待
jedisPoolConfig. setMaxWaitMillis (2000); //等待时间
jedisPoolConfig. setTestOnBorrow(true); //取连接的时候进行一下测试 ping
pong
jedisSentinelPool=new JedisSentinelPool (”mymaster", sentinelSet, jedisPoolConfig) ;
return jedisSentinelPool. getResource() ;
六、集群
引入:
容量不够, redis如何进行扩容?
并发写操作,redis如何分摊?
另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口]等信息
之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置
代理主机,并不合理
无中心化集群
任何一台都可以当做服务的入口,他们互相可以传递服务
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N
Redis集群通过分区( partition)来提供一定程度的可用性(availbility) :即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
七、搭建集群
1.删除之前的rdb文件、aof文件
rm -rf dump63*
2.搭建6台redis服务器
6379:
6380:
6381:
6389:
6390:
6391:
89是79的从机,90是80的从机,91是81的从机
3.配置基本信息
daemonize yes
pid 文件名
指定端口
Log 文件名字
Appendonly no
4.redis cluster配置修改
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
5.配置其中一台,复制6份
cp redis6379.conf redis6380.conf
....
6.修改6份配置文件里面的端口,文件名都修改
7.启动6个Redis服务器
6379:redis-server redis6379.conf
6380: redis-server redis6380.conf
6381:redis-server redis6381.conf
6389:redis-server redis6382.conf
6390:redis-server redis6383.conf
6391:redis-server redis6384.conf
ps -ef | grep redis
8.6个服务器合成一个集群
确保redis实例都启动
cd /opt/redis-6.2.1/src
redis-cli --cluster create --cluster-replicas 1 192.168.44.168:6379 192.168.44.168:6380 192.168.44.168:6381 192.168.44.168:6389 192.168.44.168:6390 192.168.44.168:6391
写真实的IP地址,设置了密码的要在1后加 -a 密码,要开放端口才能用
9.接受分配方式
yes
10.分配完成
16384 ...
11.测试
集群方式连接
redis-cli -c -p 6379
12.查询结点信息
cluster nodes
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000 超时时间
八、集群操作与故障恢复
rediscluster如何分配这六个节点?
一个集群至少要有三个主节点。
选项--cluster-replicas 1表示我们希望为集群中的每个主节点创建一个从节点
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
什么是slots?
[OK] All 16384 slots covered.
一个Redis集群包含16384 个插槽( hash slot) ,数据库中的每个键都属于这16384个插槽的其中一个集群使用公式 CRC16(key) % 16384来计算键key属于哪个槽,中CRC16(key)语句用于计算键key的CRC16校验和。集群中的每个节点负责处理一部分插槽。
举个例子 ,如果一个集群可以有主节点 ,
其中:
节点A负责处理0号至5460号插槽
节点B负责处理5461号至10922号插槽
例如:
set k1 value1
k1计算k1所在的插槽,向插槽位置加入到不同的主机当中去。分担主机压力。
集群三个主机可以相互切换,根据计算的插槽位置不同,切换到不同主机。
插槽基本命令
1.如果同时加多个
mset name lucy age 26 address china
报错,无法计算插槽
2.如果要多个,要分组
mset name{user} lucy age{user} 20
user即组名,根据组名计算插槽
3.根据计算的值,切换
---
1.查询集群总的值
cluster keyslot k1
2.计算插槽中有多少key
cluster countkeysinslot 4847
只能在自己的插槽里看,否则显示0
3.显示插槽4847中的10个key
cluster getkeysinslot 4847 10
故障恢复
1.
6379:shutdown
src:redis-cli -c -p 6380
显示6379 fail,替代者6389升为主机
2.启动6379会变成89的从机
6379:redis-server redis6379.conf
3.目前状况
6379 是 89 的从机
这个叫做故障恢复
一个部分的主机、从机全挂掉了,根据配置决定redis服务是否继续
cluster-require-full-coverage yes 则整个集群都挂掉
cluster-require-full-coverage no 该段插槽数据不能使用,其他仍然可以