|
| 1 | +redis包含三种集群策略 |
| 2 | + |
| 3 | +* 主从复制 |
| 4 | +* 哨兵 |
| 5 | +* 集群 |
| 6 | + |
| 7 | +## 主从复制 |
| 8 | +在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。其中主从复制有如下特点: |
| 9 | + |
| 10 | +主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库 |
| 11 | +从数据库一般都是只读的,并且接收主数据库同步过来的数据 |
| 12 | +一个master可以拥有多个slave,但是一个slave只能对应一个master |
| 13 | +主从复制工作机制 |
| 14 | +当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。 |
| 15 | + |
| 16 | +复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。 |
| 17 | + |
| 18 | +主从配置 |
| 19 | +redis默认是主数据,所以master无需配置,我们只需要修改slave的配置即可。 |
| 20 | + |
| 21 | +设置需要连接的master的ip端口: |
| 22 | + |
| 23 | +slaveof 192.168.0.107 6379 |
| 24 | + |
| 25 | +如果master设置了密码。需要配置: |
| 26 | + |
| 27 | +masterauth |
| 28 | + |
| 29 | +连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息: |
| 30 | + |
| 31 | +info replication |
| 32 | + |
| 33 | +## 哨兵 |
| 34 | +哨兵的作用是监控 redis系统的运行状况,他的功能如下: |
| 35 | + |
| 36 | +监控主从数据库是否正常运行 |
| 37 | +master出现故障时,自动将slave转化为master |
| 38 | +多哨兵配置的时候,哨兵之间也会自动监控 |
| 39 | +多个哨兵可以监控同一个redis |
| 40 | +哨兵工作机制 |
| 41 | +哨兵进程启动时会读取配置文件的内容,通过sentinel monitor master-name ip port quorum查找到master的ip端口。一个哨兵可以监控多个master数据库,只需要提供多个该配置项即可。 |
| 42 | + |
| 43 | +同事配置文件还定义了与监控相关的参数,比如master多长时间无响应即即判定位为下线。 |
| 44 | + |
| 45 | +哨兵启动后,会与要监控的master建立俩条连接: |
| 46 | + |
| 47 | +一条连接用来订阅master的_sentinel_:hello频道与获取其他监控该master的哨兵节点信息 |
| 48 | +另一条连接定期向master发送INFO等命令获取master本身的信息 |
| 49 | +与master建立连接后,哨兵会执行三个操作,这三个操作的发送频率都可以在配置文件中配置: |
| 50 | + |
| 51 | +定期向master和slave发送INFO命令 |
| 52 | +定期向master个slave的_sentinel_:hello频道发送自己的信息 |
| 53 | +定期向master、slave和其他哨兵发送PING命令 |
| 54 | +这三个操作的意义非常重大,发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。所以说哨兵只需要配置master数据库信息就可以自动发现其slave信息。获取到slave信息后,哨兵也会与slave建立俩条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等。 |
| 55 | + |
| 56 | +接下来哨兵向主从数据库的_sentinel_:hello频道发送信息与同样监控这些数据库的哨兵共享自己的信息,发送内容为哨兵的ip端口、运行id、配置版本、master名字、master的ip端口还有master的配置版本。这些信息有以下用处: |
| 57 | + |
| 58 | +其他哨兵可以通过该信息判断发送者是否是新发现的哨兵,如果是的话会创建一个到该哨兵的连接用于发送PIN命令。 |
| 59 | +其他哨兵通过该信息可以判断master的版本,如果该版本高于直接记录的版本,将会更新 |
| 60 | +当实现了自动发现slave和其他哨兵节点后,哨兵就可以通过定期发送PING命令定时监控这些数据库和节点有没有停止服务。发送频率可以配置,但是最长间隔时间为1s,可以通过sentinel down-after-milliseconds mymaster 600设置。 |
| 61 | + |
| 62 | +如果被ping的数据库或者节点超时未回复,哨兵任务其主观下线。如果下线的是master,哨兵会向其他哨兵点发送命令询问他们是否也认为该master主观下线,如果达到一定数目(即配置文件中的quorum)投票,哨兵会认为该master已经客观下线,并选举领头的哨兵节点对主从系统发起故障恢复。 |
| 63 | + |
| 64 | +如上文所说,哨兵认为master客观下线后,故障恢复的操作需要由选举的领头哨兵执行,选举采用Raft算法: |
| 65 | + |
| 66 | +发现master下线的哨兵节点(我们称他为A)向每个哨兵发送命令,要求对方选自己为领头哨兵 |
| 67 | +如果目标哨兵节点没有选过其他人,则会同意选举A为领头哨兵 |
| 68 | +如果有超过一半的哨兵同意选举A为领头,则A当选 |
| 69 | +如果有多个哨兵节点同时参选领头,此时有可能存在一轮投票无竞选者胜出,此时每个参选的节点等待一个随机时间后再次发起参选请求,进行下一轮投票精选,直至选举出领头哨兵 |
| 70 | +选出领头哨兵后,领头者开始对进行故障恢复,从出现故障的master的从数据库中挑选一个来当选新的master,选择规则如下: |
| 71 | + |
| 72 | +所有在线的slave中选择优先级最高的,优先级可以通过slave-priority配置 |
| 73 | +如果有多个最高优先级的slave,则选取复制偏移量最大(即复制越完整)的当选 |
| 74 | +如果以上条件都一样,选取id最小的slave |
| 75 | +挑选出需要继任的slaver后,领头哨兵向该数据库发送命令使其升格为master,然后再向其他slave发送命令接受新的master,最后更新数据。将已经停止的旧的master更新为新的master的从数据库,使其恢复服务后以slave的身份继续运行。 |
| 76 | + |
| 77 | +哨兵配置 |
| 78 | +哨兵配置的配置文件为sentinel.conf,设置主机名称,地址,端口,以及选举票数即恢复时最少需要几个哨兵节点同意。 |
| 79 | + |
| 80 | +sentinel monitor mymaster 192.168.0.107 6379 1 |
| 81 | + |
| 82 | +只要配置需要监控的master就可以了,哨兵会监控连接该master的slave。 |
| 83 | + |
| 84 | +启动哨兵节点: |
| 85 | + |
| 86 | +redis-server sentinel.conf --sentinel & |
| 87 | + |
| 88 | +出现如下内容表示启动成功 |
| 89 | + |
| 90 | +```text |
| 91 | +[root@buke110 redis]# bin/redis-server etc/sentinel.conf --sentinel & |
| 92 | +[1] 3072 |
| 93 | +[root@buke110 redis]# 3072:X 12 Apr 22:40:02.503 * Increased maximum number of open files to 10032 (it was originally set to 1024). |
| 94 | + _._ |
| 95 | + _.-``__ ''-._ |
| 96 | + _.-`` `. `_. ''-._ Redis 2.9.102 (00000000/0) 64 bit |
| 97 | + .-`` .-```. ```\/ _.,_ ''-._ |
| 98 | + ( ' , .-` | `, ) Running in sentinel mode |
| 99 | + |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 |
| 100 | + | `-._ `._ / _.-' | PID: 3072 |
| 101 | + `-._ `-._ `-./ _.-' _.-' |
| 102 | + |`-._`-._ `-.__.-' _.-'_.-'| |
| 103 | + | `-._`-._ _.-'_.-' | http://redis.io |
| 104 | + `-._ `-._`-.__.-'_.-' _.-' |
| 105 | + |`-._`-._ `-.__.-' _.-'_.-'| |
| 106 | + | `-._`-._ _.-'_.-' | |
| 107 | + `-._ `-._`-.__.-'_.-' _.-' |
| 108 | + `-._ `-.__.-' _.-' |
| 109 | + `-._ _.-' |
| 110 | + `-.__.-' |
| 111 | +
|
| 112 | +3072:X 12 Apr 22:40:02.554 # Sentinel runid is e510bd95d4deba3261de72272130322b2ba650e7 |
| 113 | +3072:X 12 Apr 22:40:02.554 # +monitor master mymaster 192.168.0.107 6379 quorum 1 |
| 114 | +3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.108:6379 192.168.0.108 6379 @ mymaster 192.168.0.107 6379 |
| 115 | +3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.109:6379 192.168.0.109 6379 @ mymaster 192.168.0.107 6379 |
| 116 | +
|
| 117 | +
|
| 118 | +``` |
| 119 | + |
| 120 | +可以在任何一台服务器上查看指定哨兵节点信息: |
| 121 | + |
| 122 | +bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel |
| 123 | + |
| 124 | +控制台输出哨兵信息: |
| 125 | + |
| 126 | +```text |
| 127 | +[root@buke107 redis]# bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel |
| 128 | +# Sentinel |
| 129 | +sentinel_masters:1 |
| 130 | +sentinel_tilt:0 |
| 131 | +sentinel_running_scripts:0 |
| 132 | +sentinel_scripts_queue_length:0 |
| 133 | +master0:name=mymaster,status=ok,address=192.168.0.107:6379,slaves=2,sentinels=1 |
| 134 | +``` |
| 135 | + |
| 136 | +## 集群 |
| 137 | +使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。 |
| 138 | + |
| 139 | +集群配置 |
| 140 | +安装依赖环境ruby,注意ruby版本必须高于2.2 |
| 141 | + |
| 142 | +```shell |
| 143 | +yum install ruby |
| 144 | +yum install rubygems |
| 145 | +gem install redis |
| 146 | +``` |
| 147 | + |
| 148 | +修改配置文件: |
| 149 | + |
| 150 | +```text |
| 151 | +bind 192.168.0.107 |
| 152 | +``` |
| 153 | + |
| 154 | +配置端口 |
| 155 | +```text |
| 156 | +port 6380 |
| 157 | +``` |
| 158 | + |
| 159 | +配置快照保存路径 |
| 160 | +```text |
| 161 | +dir /usr/local/redis-cluster/6380/ |
| 162 | +``` |
| 163 | + |
| 164 | +开启集群 |
| 165 | +```text |
| 166 | +cluster-enabled yes |
| 167 | +``` |
| 168 | + |
| 169 | +为节点设置不同的工作目录 |
| 170 | +```text |
| 171 | +cluster-config-file nodes-6380.conf |
| 172 | +``` |
| 173 | + |
| 174 | +集群失效时间 |
| 175 | +```text |
| 176 | +cluster-node-timeout 15000 |
| 177 | +``` |
| 178 | + |
| 179 | +开启集群中的节点: |
| 180 | +```text |
| 181 | +reids-service …/6380/redis.conf |
| 182 | +``` |
| 183 | + |
| 184 | +将节点加入集群中 |
| 185 | +```text |
| 186 | +redis-trib.rb create --replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385 |
| 187 | +``` |
| 188 | + |
| 189 | + |
| 190 | +中途需要输入yes确定创建集群: |
| 191 | +```text |
| 192 | +[root@buke107 src]# redis-trib.rb create --replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385 |
| 193 | +>>> Creating cluster |
| 194 | +Connecting to node 192.168.0.107:6380: OK |
| 195 | +Connecting to node 192.168.0.107:6381: OK |
| 196 | +Connecting to node 192.168.0.107:6382: OK |
| 197 | +Connecting to node 192.168.0.107:6383: OK |
| 198 | +Connecting to node 192.168.0.107:6384: OK |
| 199 | +Connecting to node 192.168.0.107:6385: OK |
| 200 | +>>> Performing hash slots allocation on 6 nodes... |
| 201 | +Using 3 masters: |
| 202 | +192.168.0.107:6380 |
| 203 | +192.168.0.107:6381 |
| 204 | +192.168.0.107:6382 |
| 205 | +Adding replica 192.168.0.107:6383 to 192.168.0.107:6380 |
| 206 | +Adding replica 192.168.0.107:6384 to 192.168.0.107:6381 |
| 207 | +Adding replica 192.168.0.107:6385 to 192.168.0.107:6382 |
| 208 | +M: 5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 |
| 209 | + slots:0-5460 (5461 slots) master |
| 210 | +M: 90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 |
| 211 | + slots:5461-10922 (5462 slots) master |
| 212 | +M: 868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 |
| 213 | + slots:10923-16383 (5461 slots) master |
| 214 | +S: b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 |
| 215 | + replicates 5cd3ed3a84ead41a765abd3781b98950d452c958 |
| 216 | +S: 68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 |
| 217 | + replicates 90b4b326d579f9b5e181e3df95578bceba29b204 |
| 218 | +S: d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 |
| 219 | + replicates 868456121fa4e6c8e7abe235a88b51d354a944b5 |
| 220 | +Can I set the above configuration? (type 'yes' to accept): yes |
| 221 | +>>> Nodes configuration updated |
| 222 | +>>> Assign a different config epoch to each node |
| 223 | +>>> Sending CLUSTER MEET messages to join the cluster |
| 224 | +Waiting for the cluster to join.... |
| 225 | +>>> Performing Cluster Check (using node 192.168.0.107:6380) |
| 226 | +M: 5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 |
| 227 | + slots:0-5460 (5461 slots) master |
| 228 | +M: 90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 |
| 229 | + slots:5461-10922 (5462 slots) master |
| 230 | +M: 868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 |
| 231 | + slots:10923-16383 (5461 slots) master |
| 232 | +M: b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 |
| 233 | + slots: (0 slots) master |
| 234 | + replicates 5cd3ed3a84ead41a765abd3781b98950d452c958 |
| 235 | +M: 68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 |
| 236 | + slots: (0 slots) master |
| 237 | + replicates 90b4b326d579f9b5e181e3df95578bceba29b204 |
| 238 | +M: d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 |
| 239 | + slots: (0 slots) master |
| 240 | + replicates 868456121fa4e6c8e7abe235a88b51d354a944b5 |
| 241 | +[OK] All nodes agree about slots configuration. |
| 242 | +>>> Check for open slots... |
| 243 | +>>> Check slots coverage... |
| 244 | +[OK] All 16384 slots covered. |
| 245 | +``` |
| 246 | + |
| 247 | +进入任何一个集群中的节点: |
| 248 | +```text |
| 249 | +redis-cli -c -h 192.168.0.107 -p 6381 |
| 250 | +``` |
| 251 | + |
| 252 | +查看集群中的节点: |
| 253 | +```text |
| 254 | +[root@buke107 src]# redis-cli -c -h 192.168.0.107 -p 6381 |
| 255 | +192.168.0.107:6381> cluster nodes |
| 256 | +868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 master - 0 1523609792598 3 connected 10923-16383 |
| 257 | +d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 slave 868456121fa4e6c8e7abe235a88b51d354a944b5 0 1523609795616 6 connected |
| 258 | +5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 master - 0 1523609794610 1 connected 0-5460 |
| 259 | +b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 slave 5cd3ed3a84ead41a765abd3781b98950d452c958 0 1523609797629 1 connected |
| 260 | +68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 slave 90b4b326d579f9b5e181e3df95578bceba29b204 0 1523609796622 5 connected |
| 261 | +90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 myself,master - 0 0 2 connected 5461-10922 |
| 262 | +
|
| 263 | +``` |
| 264 | + |
| 265 | +如上图所示,已经建立起三主三从的集群。 |
| 266 | + |
| 267 | +增加集群节点 |
| 268 | + |
| 269 | + |
| 270 | +转自原文: |
| 271 | +[https://blog.csdn.net/q649381130/article/details/79931791](https://blog.csdn.net/q649381130/article/details/79931791) |
0 commit comments