redis的主从复制/读写分离
1.什么是主从复制/读写分离?
将读和写操作进行划分,让读(查询/统计)、写(增/删/改)在不同的服务器上。
2.读写分离的使用场景
1)第一,减轻主数据库的压力,在高并发情况下,为了提高网站的“可用性”,进行读写分离。
2)第二,避免redis单点故障,用作数据备份。
备注:一般情况读操作要远远大于写操作,所以一般配置服务器的时候读服务器的数量大于写操作。
3.环境准备
6380(master)
6381(slave)
6382(slave)
并且修改各自的最小配置文件。
4.使用redis命令配置读写分离
6381>slaveof 127.0.0.1 6380
6381>info replication
运行上述命令查看主从复制信息如下:
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
1)然后到6380里面set一个值,验证6381中是否存在该值。
2)在6381中set一个值,看是否成功
127.0.0.1:6381> set age 18
(error) READONLY You can't write against a read only slave.
所以,在默认情况下,从服务器不能进行写操作,例如set,sadd,flushdb,flushall....凡是改变数据库状态的命令都是写操作。
5.修改从slave的conf文件配置读写分离
1)必须配置
slaveof 127.0.0.1 6380
masterauth admin123456
2)其他配置
slave-serve-stale-data yes 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误
slave-read-only yes 作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
repl-timeout 60 复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线
slave-priority 100 当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。
min-slaves-to-write 3 只有当3个或3个以上的从数据库连接到主库时,主数据库才是可写的,否则返回错误。
min-slave2-max-lag 10 允许从数据库失去连接的最长时间,该选项默认是关闭的,在分布式系统中,打开并合理配置该选项可以降低主从架构因为网络分区导致的数据不一致问题。
5.更换master
slaveof newhost newport命令或修改slave的配置文件
6.解除主从关系
slaveof no one命令或修改slave的配置文件
7.验证试验
刚才的实验
8.主从复制的架构
1)一主多从
6380(master)-6381(slave)
-6382(slave)
2)级联结构
6380(master)-6381(slave)-6382(slave)
9.异步复制
在master中set一个值,其执行结果会立即返回给客户,并不会等待主从复制完成以后再返回给客户。
所以说,这个过程是异步的。异步复制带来的问题?带来的最大问题就是不能保证数据100%复制成功,如果是同步的话则可以保证,在同步操作时如果复制失败可以返回一个
错误,用户再从新set。
10.总结
1)主从配置不需要修改master的conf文件。
2)使用slaveof 127.0.0.1 6380,slave no one等命令配置的主从关系,如果服务器重启后主从配置将会失效,继续按照conf文件中的配置规则工作。
3)主从复制能够保证主机和从机的数据是基本同步的(不是绝对的实时同步,因为主从复制是异步复制),这个跟主从架构的结构没有关系。
4)会使用slaveof/slaveof no one/info replication命令。
5)无论哪种主从架构,其中的数据在各个redis实例中最终都是一致的。
6)默认情况从机不能进行写操作,例如set,flushdb,flushall等,也可以通过修改slave-read-only no设置成可写。
7)为什么从库不建议写?因为从库中数据的改变不会被同步到master中,并且一旦master修改了数据,从库的数据就会因为自动同步被覆盖,所以一般情况下不建议将从库设置为可写。
redis的主从复制/读写分离
最新推荐文章于 2022-10-12 16:00:24 发布