说再多遍都不如自己动手操作一遍,接下来让我们一步一步搭建一个一主两从的`master-slave`集群:
1. 下载`Redis`软件包并复制两个`Redis`服务
~~~bash
cd /home/project
# 下载软件包
wget https://labfile.oss.aliyuncs.com/courses/3368/redis-5.0.5.tar.gz
# 解压
tar -zxf redis-5.0.5.tar.gz
rm /home/project/redis-5.0.5.tar.gz
# 安装
cd redis-5.0.5/src
make && make install PREFIX=/home/project/redis-5.0.5
~~~
到这里`Redis`已经安装完成了,接下来我们进入配置文件修改一下配置,执行命令`vim /home/project/redis-5.0.5/redis.conf`然后输入`/daemonize`,再按回车键搜索到下图所示位置,然后输入`a`进入文本编辑状态,将`no`修改为`yes`(下图中为修改后的示意图),表示启动`Redis`服务的时候在后台运行。
![](https://img.kancloud.cn/65/5a/655a42620b87fd36d50d3b43e2cad116_719x245.png)
接下来复制两个`Redis`服务:
~~~bash
cp -rf /home/project/redis-5.0.5 /home/project/redis-6370
cp -rf /home/project/redis-5.0.5 /home/project/redis-6371
~~~
2. 接下来分别进入`6370`和`6371`文件内,修改配置各自的配置文件:
~~~bash
vim /home/project/redis-6370/redis.conf
vim /home/project/redis-6371/redis.conf
~~~
3. 找到每个文件内的如下配置:
~~~
port 6379 #6379 分别修改为 6370 和 6371
pidfile /var/run/redis_6379.pid #6379 分别修改为 6370 和 6371
logfile "" #路径分别修改为:/home/project/redis-6370/redis.log 和 /home/project/redis-6371/redis.log
dir ./ #路径分别修改为:/home/project/redis-6370/ 和 /home/project/redis-6371/
~~~
4. 启动`6370`和`6371`端口的`Redis`服务以及最开始默认的`6379`端口`Redis`服务,总共`3`个`Redis`服务:
~~~bash
/home/project/redis-5.0.5/bin/redis-server /home/project/redis-5.0.5/redis.conf #启动 6379 端口Redis
/home/project/redis-6370/bin/redis-server /home/project/redis-6370/redis.conf #启动 6370 端口Redis
/home/project/redis-6371/bin/redis-server /home/project/redis-6371/redis.conf #启动 6371 端口Redis
~~~
5. 启动之后执行`ps -ef | grep redis`确认服务是否启动成功。
![](https://img.kancloud.cn/ad/cd/adcdf7ca4c36bb2b0b82e94b7f467432_907x138.png)
6. 执行命令,让`6379`端口的`Redis`服务成为主节点并查看状态:
~~~bash
# 连接上 6379 端口的 Redis 服务
/home/project/redis-5.0.5/bin/redis-cli
# 成为一个主节点,也可以执行 slaveof no one
replicaof no one
~~~
![](https://img.kancloud.cn/66/05/660503c9e9199b3bb941dab155a84cb1_644x85.png)
查看当前状态:
~~~bash
info replication
~~~
![](https://img.kancloud.cn/a0/67/a06703a851621fe435dfd3c39dec5f87_671x232.png)
上图中`role:master`表示当前`Redis`服务是一个`master`节点,`connected_slaves:0`表示当前还没有`slave`节点。
7. 打开另一个客户端,执行如下命令:
~~~bash
# 连接 6370 端口的 Redis 服务
/home/project/redis-6370/bin/redis-cli -p 6370
# 成为 6379 服务的从节点
replicaof 127.0.0.1 6379
# 查看当前节点状态
info replication
~~~
![](https://img.kancloud.cn/b8/95/b895383be42b608a995ed605802b5559_785x393.png)
上图中,`role:slave`表示当前是一个`slave`节点,红框内后面三条信息记录了当前`slave`节点的`master`节点信息,`up`表示`master`服务正常,如果是`down`表示`master`节点不在线
8. 这时候再回到`master`节点的`Redis`服务,执行如下命令:
~~~bash
info replication
~~~
![](https://img.kancloud.cn/24/41/244166ac09b2b04fb38533d024715ea3_759x249.png)
这时候可以看到,连接的`slave`节点数已经变成`1`,表示已经有一个`slave`节点连接
9. 再打开一个新的客户端,执行如下命令:
~~~bash
# 连接 6371 端口的 Redis 服务
/home/project/redis-6371/bin/redis-cli -p 6371
# 成为 6379 服务的从节点
replicaof 127.0.0.1 6379
# 查看当前节点状态
info replication
~~~
![](https://img.kancloud.cn/80/d3/80d38941818b89a9cce92c0f6ff40a5c_734x364.png)
10. 再回到`master`节点执行命令:
~~~bash
info replication
~~~
![](https://img.kancloud.cn/ba/aa/baaa7c453d909217715fd833f76263ab_666x277.png)
这时候可以看到已经有两个`slave`节点连接了。到这里,一主两从的`master-slave`集群就搭建完成了。
配置主从的命令除了可以在配置文件中配置,也可以直接在`Redis`服务器上执行,或者是在启动的时候执行`./redis-server --slaveof ip port`来指定主从服务器。
搭建好主从之后,主服务器上数据就会被同步到从服务器。注意,从服务器默认是只读的,可以通过配置文件`replica-read-only yes`来修改(默认是`yes`,修改为`no`则表示非只读)。
**题外话**:上面的`replicaof`命令可以替换为`slaveof`命令,但建议还是使用`replicaof`命令。`slaveof`在国外被理解为“奴隶制度”,当时因为这个原因`Redis`作者发起过一个投票,最后半数以上的人支持改名。所以后面`Redis`就采用了`replicaof`命令来替换`slaveof`命令,但是`slaveof`命令也没有被禁止使用。
- Redis 为什么这么快
- 什么是 Redis
- Redis 的安装
- Redis 到底有多快
- Redis 是单线程还是多线程
- Redis 为什么选择使用单线程来执行请求
- 什么是 IO 多路复用机制
- Redis 中 I/O 多路复用的应用
- 一个简单的字符串,为什么 Redis 要设计的如此特别
- Redis 的 9 种数据类型
- 二进制安全字符串
- sds 空间分配策略
- sds 和 C 语言字符串区别
- sds 是如何被存储的
- type 属性
- encoding 属性
- 通过牺牲速度来节省内存,Redis 是觉得自己太快了吗
- 什么是压缩列表
- ziplist 的存储结构
- entry 存储结构
- ziplist 数据示例
- ziplist 连锁更新问题
- 为了加快速度,Redis 都做了哪些“变态”设计
- 列表对象
- linkedlist
- linkedlist 和 ziplist 的选择
- quicklist
- 列表对象常用操作命令
- Redis 中哈希分布不均匀该怎么办
- 哈希对象
- hashtable
- ziplist
- ziplist 和 hashtable 的编码转换
- 哈希对象常用命令
- 同一份数据,Redis 为什么要存”两次”
- 五种基本类型之集合对象
- intset 编码
- 集合对象常用命令
- 五种基本类型之有序集合对象
- skiplist 编码
- ziplist 编码
- ziplist 和 skiplist 编码转换
- 有序集合对象常用命令
- 要想用活 Redis,Lua 脚本是绕不过去的坎
- 发布与订阅
- 基于频道的实现
- 基于模式的实现
- Lua 脚本
- Lua 脚本的调用
- Lua 脚本中执行 Redis 命令
- Lua 脚本摘要
- Lua 脚本文件
- 脚本异常
- 作为一款内存数据库,为什么断电后 Redis 数据不会丢失
- Redis 持久化机制
- RDB 持久化机制
- AOF 持久化机制
- 内存耗尽后 Redis 会发生什么
- 内存回收
- 过期策略
- 8 种淘汰策略
- LRU 算法
- LFU 算法
- 不能回滚的 Redis 事务还能用吗
- Redis 有事务吗
- Redis 事务实现原理
- Redis 事务 ACID 特性
- watch 命令
- watch 命令的作用
- watch 原理分析
- Redis 为什么不直接用 master-slave 集群
- Redis 集群方案
- 主从复制
- 配置一主两从 master-slave 集群
- 主从复制原理分析
- 主从服务的不足之处
- Sentinel(哨兵)机制为什么从神坛滑落
- 哨兵 Sentinel 机制
- Sentinel 原理分析
- 配置 Sentinel 集群
- Sentinel 机制实战
- Sentinel 机制的不足之处
- Redis Cluster 集群凭什么成为了最终的胜利者
- Redis 分布式集群方案
- 客户端实现分片
- 中间代理服务实现分片
- Redis Cluster 方案
- 手动配置一个 Redis Cluster 集群
- Redis Cluster 集群常用命令
- 客户端如何使用 Redis Cluster 集群
- Redis Cluster 的不足
- 如何从 10 亿数据中快速判断是否存在某一个元素
- 缓存雪崩
- 缓存击穿
- 缓存穿透
- 布隆过滤器(Bloom Filter)
- 布隆过滤器的 2 大特点
- 布隆过滤器的实现(Guava)
- 布隆过滤器的如何删除