1.概述
- redis的主从复制实现多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的(可以通过配置文件配置,使其支持读写,但一般从库都是只读模式),并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
- 通过redis的主从复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。
- redis的主从复制可以实现容灾恢复,从库可以作为备份库。
配置原则:配从(库)不配主(库),主库的配置不用改变。
2.一般的主从配置
这里以windows环境下的redis进行操作(和linux下区别不大,一些文件的名字不同,绝大部分的配置项都是相同的)。
在redis的客户端中输入(或者配置文件中配置)slaveof 127.0.0.1 6379,表示以6379作为master,而自己就成了从库。
2.1 操作
- 选定一个主数据库:这里选择127.0.0.1 6379作为主库,其中6379是端口号。
- 复制两份redis.windows.conf文件,并改名为redis.windows6378.conf和redis.windows6377.conf。
- 修改redis.windows6378.conf和redis.windows6377.conf,配置port分别为6378和6379,配置dbfilename分别为dump6377.rdb和dump6378.rdb,分别配置dir。
- 在redis的安装目录下,使用cmd进入dos命令行,输入redis-server redis.windows.conf并回车开启端口为6379的redis服务,同样输入redis-server redis.windows6377.conf回车打开端口为6377的redis服务,6378端口redis操作同理。
- 目前这三个redis服务是相互独立的,可以使用info replication命令进行查看:
- 使用redis-cli -p 6379命令进入6379客户端,同样的方法进入6378和6377,6378和6379的客户端分别输入slaveof 127.0.0.1 6379,这样主从复制的模式就配置好了,6379是master(主库),6378和6377是slave(从库)
- 测试,在6379中写入数据,6378和6377都可以读的到,但6378和6377只能读主库的数据,自己不能写数据。
- 使用info replication查看master
- 查看slave
2.2 其他
上一个Slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力。
除了直接在客户端中的命令行中输入slaveof IP port进行主从配置以外,还可以直接修改对应的配置文件,比如修改redis.windows6378.conf,添加slaveof 127.0.0.1 6379。但是在windows环境下的哨兵模式(sentinel)下使用配置文件配置主从模式似乎有问题,linux上没有测。
如果master已经运行了一段时间,slave才连上来,此时slave会对master的所有数据进行同步。
如果master宕机,那么这个主从复制的体系就崩溃了,除非master重新启动。
3. 哨兵模式(sentinel)
前面的配置方式,如果6379(master)宕机了,那么这个“主从复制”的结构就被破坏了,没有了master,就不能写入数据了。而6377(slave)和6378(slave)永远都是从机。
哨兵模式:如果master宕机了,那么剩下的slave会进行选举,从slave中选举新的master。(如果之前的master又恢复了,也只能是作为slave)
3.1配置
创建sentinel.conf文件并写入如下内容:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 2000
各个配置的含义:
port:端口号
sentinel monitor mymaster 127.0.0.1 6379 1:去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要1个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel down-after-milliseconds mymaster 2000:指定了哨兵认为redis实例已经失效所需的毫秒数。
3.2操作
启动6379,6378,6377这三个redis服务实例,在dos中输入:redis-server.exe sentinel.conf --sentinel 命令启动哨兵。
分别以命令行的方式设置6378,6377作为6379的从机。
关闭6379服务,等几秒钟,使用info replication命令对6378,6377进行查看,发现其中的一个变成了master。查看sentinel.conf文件,发现sentinel monitor mymaster...中的配置也发生了变化,变成了新的master的ip和port.
参考博客:
https://blog.csdn.net/weixin_30815469/article/details/95148618
https://blog.csdn.net/csdnlyu/article/details/78738832
https://blog.csdn.net/u011204847/article/details/51307044
https://dpb-bobokaoya-sm.blog.csdn.net/article/details/87181647
感谢作者!