|
| 1 | +# 主从复制 |
| 2 | + |
| 3 | +单机带来的问题:机器故障、容量限制、QPS瓶颈,主从复制提供了一种**一主多从**的模式提供了数据副本,解决了单机带来的机器故障问题,主从分离模式提高了 Redis 读的性能(读写分离)。也是高可用、分布式的基础。 |
| 4 | + |
| 5 | +## 什么是主从复制? |
| 6 | + |
| 7 | +所谓主从复制就是一个 Redis 主节点拥有多个从节点,由主节点的数据单向的复制到从节点,在一些读多写少的业务场景是非常受用的。 |
| 8 | + |
| 9 | +## 实现方式 |
| 10 | + |
| 11 | +提供了两种模式命令和配置,采用配置模式,优势是便于管理但是每次更改之后需要重启,采用命令模式优势是无需重启伴随的缺点是不便于管理。两者也是可以结合使用的。 |
| 12 | + |
| 13 | +### 命令实现 |
| 14 | +- slaveof ip port:开启一个主从复制,ip为主节点ip地址,port为主节点端口号,例如在6380机器上开启一个主从复制:```slaveof 127.0.0.1 6379``` |
| 15 | +- slaveof no one:取消主从复制,取消之前的数据不会清除。如果取消之后在切换到新的主节点,新的主节点同步数据到从节点之前会把该从节点的**先前数据进行全部清楚** |
| 16 | +- **注意**在新的版本中 slaveof 命令改为 replicaof |
| 17 | + |
| 18 | +### 配置实现 |
| 19 | + |
| 20 | +```shell |
| 21 | +slaveof ip port # 设置主节点的 ip |
| 22 | +slave-read-only yes # 设置为只读模式 |
| 23 | +``` |
| 24 | + |
| 25 | +## 一主多从实践 |
| 26 | + |
| 27 | +在一台虚拟机上建立一个主节点和多个从节点进行实践,注意,这里只是做为一个简单的测试都放在一台机器上,在实际的工作中是不会都放在一台机器上的,假设当前机器出现故障会导致所有节点都不可用。 |
| 28 | + |
| 29 | +### 环境准备 |
| 30 | + |
| 31 | +机器 | 模式 | 节点 | 安装目录 |
| 32 | +:----------------|:------|:-------|:--- |
| 33 | + 192.168.6.128 | Master | 6379 | /data/soft/redis-5.0.5 |
| 34 | + 192.168.6.128 | Slave1 | 6380 | /data/soft/redis-5.0.5 |
| 35 | + 192.168.6.128 | Slave2 | 6381 | /data/soft/redis-5.0.5 |
| 36 | + |
| 37 | + |
| 38 | +### Redis安装 |
| 39 | + |
| 40 | +这里采用的为 Redis 最新版本 v5.0.5,下载安装于 /data/soft/ 目录下,关于如何安装参考另一篇文章 [Redis 安装]()。 |
| 41 | + |
| 42 | +### 节点配置 |
| 43 | + |
| 44 | +**执行以下命令,先复制出 3 个节点的配置文件** |
| 45 | + |
| 46 | +```bash |
| 47 | +$ cp redis.conf redis-6379.conf |
| 48 | +$ cp redis.conf redis-6380.conf |
| 49 | +$ cp redis.conf redis-6381.conf |
| 50 | +``` |
| 51 | + |
| 52 | +**修改 redis-6379.conf 配置** |
| 53 | + |
| 54 | +```conf |
| 55 | + bind 192.168.6.128 |
| 56 | + port 6379 |
| 57 | + daemonize yes # 开启守护进程 |
| 58 | + pidfile /var/run/redis_6379.pid |
| 59 | + logfile "6379.log" |
| 60 | + # save 900 1 |
| 61 | + # save 300 10 |
| 62 | + # save 60 10000 |
| 63 | + dbfilename dump-6379.rdb |
| 64 | + dir /data/soft/redis-5.0.5/data/ |
| 65 | + replica-read-only yes # 默认从节点仅是只读模式 |
| 66 | +``` |
| 67 | + |
| 68 | +**修改 redis-6380.conf 配置** |
| 69 | + |
| 70 | +不同于上面主节点的配置是需要设置 replicaof 属性 |
| 71 | + |
| 72 | +```conf |
| 73 | + bind 192.168.6.128 |
| 74 | + port 6380 |
| 75 | + daemonize yes # 开启守护进程 |
| 76 | + pidfile /var/run/redis_6380.pid |
| 77 | + logfile "6380.log" |
| 78 | + # save 900 1 |
| 79 | + # save 300 10 |
| 80 | + # save 60 10000 |
| 81 | + dbfilename dump-6380.rdb |
| 82 | + dir /data/soft/redis-5.0.5/data/ |
| 83 | + replicaof 192.168.6.128 6379 # 之前版本为 slaveof 192.168.6.128 6379 |
| 84 | +``` |
| 85 | + |
| 86 | +**修改 redis-6381.conf 配置** |
| 87 | + |
| 88 | +在 edis-6381.conf 配置里并没有设置 replicaof 属性,在启动时会介绍如何通过命令启动 |
| 89 | + |
| 90 | +```conf |
| 91 | + bind 192.168.6.128 |
| 92 | + port 6381 |
| 93 | + daemonize yes # 开启守护进程 |
| 94 | + pidfile /var/run/redis_6381.pid |
| 95 | + logfile "6381.log" |
| 96 | + # save 900 1 |
| 97 | + # save 300 10 |
| 98 | + # save 60 10000 |
| 99 | + dbfilename dump-6381.rdb |
| 100 | + dir /data/soft/redis-5.0.5/data/ |
| 101 | + replicaof <masterip> <masterport> # 暂不修改为从节点 |
| 102 | +``` |
| 103 | + |
| 104 | +### 启动节点 |
| 105 | + |
| 106 | +**启动 Master** |
| 107 | + |
| 108 | +``` |
| 109 | +$ src/redis-server redis-6379.conf |
| 110 | +``` |
| 111 | + |
| 112 | +**启动 Slave1** |
| 113 | + |
| 114 | +``` |
| 115 | +$ src/redis-server redis-6380.conf |
| 116 | +``` |
| 117 | + |
| 118 | +**启动 Slave2** |
| 119 | + |
| 120 | +与上面不同的是,采用命令的方式开启一个从节点 |
| 121 | + |
| 122 | +```bash |
| 123 | +$ src/redis-server redis-6380.conf |
| 124 | +$ src/redis-cli -h 192.168.6.128 -p 6381 replicaof 192.168.6.128 6379 |
| 125 | +``` |
| 126 | + |
| 127 | +### 查看节点 |
| 128 | + |
| 129 | +```bash |
| 130 | +$ ps -ef | grep redis-server |
| 131 | +root 20122 1 0 01:50 ? 00:00:03 src/redis-server 192.168.6.128:6379 |
| 132 | +root 20130 1 0 01:50 ? 00:00:02 src/redis-server 192.168.6.128:6380 |
| 133 | +qufei 20172 1 0 02:02 ? 00:00:00 src/redis-server 192.168.6.128:6381 |
| 134 | +qufei 20414 19405 0 02:27 pts/1 00:00:00 grep --color=auto redis-server |
| 135 | +``` |
| 136 | + |
| 137 | +### 查看主从节点 |
| 138 | + |
| 139 | +链接上主节点客户端之后通过 ```info replication``` 命令查看,如下所示: |
| 140 | + |
| 141 | +* role: 角色(Master/Slave) |
| 142 | +* connected_slaves: 当前连接的从节点数量 |
| 143 | +* slave0、slave1: 展示了从节点的信息 |
| 144 | + |
| 145 | +``` |
| 146 | +$ redis-cli -h 192.168.6.128 -p 6379 info replication |
| 147 | +# Replication |
| 148 | +role:master |
| 149 | +connected_slaves:2 |
| 150 | +slave0:ip=192.168.6.128,port=6380,state=online,offset=3150,lag=1 |
| 151 | +slave1:ip=192.168.6.128,port=6381,state=online,offset=0,lag=2 |
| 152 | +master_replid:6b11e8d93b219d1c612b3cbd26731d8da1c4a881 |
| 153 | +master_replid2:0000000000000000000000000000000000000000 |
| 154 | +master_repl_offset:3150 |
| 155 | +second_repl_offset:-1 |
| 156 | +repl_backlog_active:1 |
| 157 | +repl_backlog_size:1048576 |
| 158 | +repl_backlog_first_byte_offset:1 |
| 159 | +repl_backlog_histlen:3150 |
| 160 | +``` |
0 commit comments