08-主从复制与集群

目录

一、定义

好处:

二、搭建一主多从

三、演示

四、主从复制的原理

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        该段插槽数据不能使用,其他仍然可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZuckD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值