主从复制(Master/Slave)
1、是什么?
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制
Master以写为主,Slave以读为主
2、能干嘛?
读写分离 、容灾恢复(减轻读写压力)
3、常用的主从方式
1)、一主二仆
含义:就是一个Master两个Slave
info replication:查看主从信息
信息如下:
role:master
connected_slaves:0
master_replid:f6baff9abfda12ca58048cfce4b0e2c1f4683da1
master_replid2:e8fe596d47d9d1d923d56d884b28128b78d2c1e0
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
使用:
配从(库)不配主(库),默认大家都是主库master,在从库里面设置跟随的主库
(只要进行了主库配置,主库的所有东西都会被复制一份,而不是仅仅复制主库配置后的操作)
slaveof 主库ip 主库端口:配置从库
info replication:查看主从信息
注意点:
第一次slave1 和slave2切入点,是全量复制,之后是增量复制(不会复制一份之前已经复制 了)
主机可以写,但是从机不可以写,从机只能读
主机shutdow后,从机会处于待机状态,等主机回来后,主机新增记录从机可以顺利复制
从机shutdow后,每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
从机复制到的数据,会被本机持久化。就算shutdown断开连接依然会有数据。
重新连接或者变更master,会清除之前的数据,重新建立拷贝最新的数据
2)、薪火相传
含义:就是上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力。
注意事项和一主二仆差不多,但注意中间一个虽然有slave是相对master,但是依然是slave的身份
3)、反客为主
slaveof no one:使当前数据库停止与其他数据库的同步,转成主数据库
复制原理
Slave启动成功连接到master后会发送一个sync命令;
Master接到命令启动后的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步;
全量复制:而slave服务在数据库文件数据后,将其存盘并加载到内存中;
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步;
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
复制的缺点
延时,由于所有的写操作都是在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使得这个问题更加严重。
Java中
Jedis jedis_master = new Jedis("主机地址1",端口号1);
Jedis jedis_slave = new Jedis("主机地址1",端口号2);
jedis_salve.slaveof("主机地址1",端口号1); //认人为主
jedis_master.set("key","value"); //主机写完,从机即可读到
jedis_slave.get("key"); //从机就可读到