效果
- 一主一从
- 一主多从
- 主->从->从 链式结构
环境准备
1.软件
OS:CentOS 7.3
Redis:5.0.5(安装目录:/application/redis/)
2.虚拟机
HOSTNAME | IP | 端口 |
---|---|---|
web01(主库) | 192.168.55.9 | 6379 |
web02(从库) | 192.168.55.10 | 6379 |
Redis安装,参考 https://blog.csdn.net/zhou16333/article/details/84154879 。
配置
在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
在 Redis 中使用复制功能非常容易,
第一种:修改配置文件
只需要在从数据库的配置文件中加入slaveof 主数据库地址 主数据库端口
即可,主数据库无需进行任何配置。
[root@web02 ~]# vim /application/redis/redis.conf
slaveof 192.168.55.9 6379
启动从库
[root@web02 ~]# /application/redis/bin/redis-server /application/redis/redis.conf &
第二种:(在从库)命令行
从库运行时,在命令行中设置
......> SLAVEOF 192.168.55.9 6379
如果该数据库已经是其他主数据库的从数据库了,SLAVEOF命令会停止和原来数据库的同步转而和新数据库同步。此外对于从数据库来说,还可以使用 SLAVEOF NO ONE
命令来使当前数据库停止接收其他数据库的同步并转换成为主数据库。
使用INFO命令来分别在主库和从库中获取Replication节的相关信息:
|
|
---|---|
[root@web01 src]# /application/redis/bin/redis-cli 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.55.10,port=6379,state=online,offset=168,lag=1 master_replid:679029a635afe5a0f57290da96c37368f15cf44a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:168 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:168 | [root@web02 ~]# /application/redis/bin/redis-cli 127.0.0.1:6379> INFO replication #Replication role:slave master_host:192.168.55.9 master_port:6379 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:182 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:679029a635afe5a0f57290da96c37368f15cf44a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:182 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:182 |
测试
|
| |
---|---|---|
第一步 | 127.0.0.1:6379> set foo bar OK | |
第二步 | 127.0.0.1:6379> get foo “bar” | |
第三步 | 127.0.0.1:6379> set foo hi (error) READONLY You can’t write against a read only replica. |
可以通过设置从数据库的配置文件中的 slave-read-only
为 no
以使从数据库可写,但是因为对从数据库的任何更改都不会同步给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动,所以通常的场景下不应该设置从数据库可写,以免导致易被忽略的潜在应用逻辑错误。
单机多实例
在一台服务器上启动两个 Redis 实例,监听不同端口,其中一个作为主数据库,另一个作为从数据库。
首先我们不加任何参数来启动一个Redis实例作为主数据库:
$ /application/redis/bin/redis-server
该实例默认监听6379端口。然后加上slaveof参数启动另一个Redis实例作为从数据库,并让其监听6380端口:
$ /application/redis/bin/redis-server --port 6380 --slaveof 127.0.0.1 6379
此时在主数据库中的任何数据变化都会自动地同步到从数据库中。
我们打开 redis-cli实例A并连接到主数据库:
$ /application/redis/bin/redis-cli -p 6379
再打开redis-cli实例B并连接到从数据库:
$ /application/redis/bin/redis-cli -p 6380
无硬盘复制
主库开启该选项时,Redis在与从数据库进行复制初始化时将不会将快照内容存储到硬盘上,而是直接通过网络发送给从数据库,避免了硬盘的性能瓶颈。
vim /application/redis/redis.conf
repl-diskless-sync yes
参考文献
[1] 李子骅. Redis入门指南(第2版)[M]. 人民邮电出版社. 2015-05-01。