Redis主从同步,读写分离设置

本文介绍如何通过Redis的主从同步功能实现读写分离,提高数据读写效率,并详细阐述了主从切换的过程及配置。

本文介绍使用Redis的主从同步功能(master, slave),使程序实现读写分离,避免io瓶颈,提高数据读写效率。

Redis支持一个master服务器对多个slave服务器同步,同步使用发布/订阅机制。
1个master对多个slave,还可以进行分层,每个slave下可以再同步slave,扩展成树状结构。

Redis 主从同步设置

Redis默认的端口是6379,我们为了不影响原有Redis,使用新的端口

master 配置 redis_master.conf

port 6300
requirepass 123456
masterauth 123456
daemonize yes

 
slave1 配置 redis_slave1.conf 设为master的slave

port 6301
slaveof 127.0.0.1 6300
requirepass 123456
masterauth 123456
daemonize yes

 
slave2 配置 redis_slave2.conf 设为master的slave

port 6302
slaveof 127.0.0.1 6300
requirepass 123456
masterauth 123456
daemonize yes

daemonize 表示后台启动。
requirepass 为主机认证密码。
masterauth 为从机访问主机验证密码,需要与主机的requirepass一致。
因后面需要演示主从切换,因此三组conf的验证密码都一致。

Redis 主从同步测试

依次启动master, slave1, slave2

redis-server redis_master.conf
redis-server redis_slave1.conf
redis-server redis_slave2.conf

执行后查看是否启动成功

ps aux|grep redis
root  1858  Ss  3:55  0:00.01 redis-server *:6302 
root  1849  Ss  3:54  0:00.01 redis-server *:6301 
root  1842  Ss  3:54  0:00.02 redis-server *:6300 

进入master,设置key abc的值为123

redis-cli -p 6300
127.0.0.1:6300> auth 123456
OK
127.0.0.1:6300> set abc 123
OK
127.0.0.1:6300> get abc
"123"

分别进入slave1, slave2检查是否同步数据
slave1:

redis-cli -p 6301
127.0.0.1:6301> auth 123456
OK
127.0.0.1:6301> get abc
"123"
127.0.0.1:6301>

slave2:

redis-cli -p 6302
127.0.0.1:6302> auth 123456
OK
127.0.0.1:6302> get abc
"123"
127.0.0.1:6302>

进入master修改key abc的值为456

127.0.0.1:6300> set abc 456
OK
127.0.0.1:6300> get abc
"456"

检查slave1, slave2是否同步
slave1:

127.0.0.1:6301> get abc
"456"

slave2:

127.0.0.1:6302> get abc
"456"


Redis主从切换

在运行过程中,如果master出现问题,我们可以通过设置,把另一台slave机自动设为master使用。这里主要用到Redis的sentinel功能来实现主从切换。

sentinel1.conf

port 26301
sentinel monitor master 127.0.0.1 6300 2
sentinel auth-pass master 123456
logfile "/tmp/sentinel.log"
daemonize yes

sentinel2.conf

port 26302
sentinel monitor master 127.0.0.1 6300 2
sentinel auth-pass master 123456
logfile "/tmp/sentinel.log"
daemonize yes

sentinel monitor master 127.0.0.1 6300 2 中的 2 表示有2个以上的sentinel服务检测到master失效,才会执行主从切换。
 
启动两个sentinel进程

redis-server sentinel1.conf --sentinel
redis-server sentinel2.conf --sentinel

ps aux|grep redis
root  2643  Ss  4:28 0:00.02 redis-server *:26302 [sentinel]  
root  2636  Ss  4:28 0:00.02 redis-server *:26301 [sentinel] 

Redis日志可以看到,启动成功开始监控

Running mode=sentinel, port=26301.
Sentinel ID is 3a23343948cd7f26662ccba1d01b92955311ef52
+monitor master master 127.0.0.1 6300 quorum 2
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300

Running mode=sentinel, port=26302.
Sentinel ID is ce0ee2af6b454205a3e475763945f505a10a7d6a
+monitor master master 127.0.0.1 6300 quorum 2
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300

+sentinel sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 @ master 127.0.0.1 6300
+sentinel sentinel ce0ee2af6b454205a3e475763945f505a10a7d6a 127.0.0.1 26302 @ master 127.0.0.1 6300

终止master,测试主从切换

kill master进程后,sentinel判断master失效,执行主从切换处理。

日志如下:

+failover-state-reconf-slaves master master 127.0.0.1 6300
+slave-reconf-sent slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+config-update-from sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 
+switch-master master 127.0.0.1 6300 127.0.0.1 6302
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6302
+slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302
-odown master master 127.0.0.1 6300
+slave-reconf-inprog slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave-reconf-done slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+failover-end master master 127.0.0.1 6300
+switch-master master 127.0.0.1 6300 127.0.0.1 6302
+convert-to-slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302

从日志可以看出,主从切换执行了以下操作:

1.将slave2切换为新的master,redis_slave2.conf 中的 slaveof 127.0.0.1 6300 被自动删除。

2.将redis_slave1.conf的 slaveof 127.0.0.1 6300 自动更新为 slaveof 127.0.0.1 6302,使用slave2作为新的master。

3.原master重启动后,会作为slave使用,redis_master.conf会自动加入slaveof 127.0.0.1 6302。

 
原master重启后进行主从同步测试

原master更新key abc为888,因为现在已经是slave,所以更新失败。

127.0.0.1:6300> set abc 888
(error) READONLY You can't write against a read only slave.

slave2 更新key abc为888

127.0.0.1:6302> set abc 888
OK
127.0.0.1:6302> get abc
"888"

原master,slave1检查是否同步

原master

127.0.0.1:6300> get abc
"888"

slave1

127.0.0.1:6301> get abc
"888"

经检查,主从切换后,slave2作为新的master,其他服务器作为slave,可正常使用。

<think>首先,用户的问题是:“我想查找redis主从复制读写分离的配置方法 请问redis主从复制读写分离的配置方法”,这是一个关于Redis主从复制和读写分离配置的查询。 根据系统级指令,我需要: - 使用中文回答。 - 确保行内数学表达式用$...$,但我看这里没有数学表达式,所以可能不需要。 - 独立公式用$$...$$,但同样可能不适用。 - LaTeX语法正确。 - 引用末尾添加引用标识。 - 生成相关问题。 - 回答结构清晰,逐步解决问题。 用户提供了几个引用: - [^1]: 主从复制和哨兵模式,手动切换主机。 - [^2]: 配置从节点的配置文件,使用slaveof指定主节点IP和端口,以及密码。 - [^3]: 哨兵机制的启动和配置。 - [^4]: Redis的安装和一些基本概念。 用户的问题焦点是“Redis主从复制读写分离的配置方法”。读写分离意味着写操作只在主节点执行,读操作可以在从节点执行。在Redis主从复制中,默认情况下,写操作在主节点执行,但读操作可以由客户端决定是否在从节点执行。 从引用中提取相关信息: - [^2] 直接给出了配置从节点的命令:在从节点的redis.conf中添加 `slaveof <master-ip> <port>`,如果需要密码,添加 `masterauth <password>`。 - [^1] 提到如果主机断开,可以用 `SLAVEOF no one` 提升从节点为新主节点。 - [^3] 讨论了哨兵模式,用于自动故障转移。 用户的问题是关于配置方法的,所以我需要解释如何配置主从复制以实现读写分离读写分离不是Redis内置的,而是由客户端实现的;客户端需要连接到从节点进行读操作。 步骤: 1. **配置主节点**:主节点不需要特殊配置;只需要确保Redis服务器运行。 2. **配置从节点**: - 在从节点的redis.conf文件中,设置 `slaveof <master-ip> <port>` 来指定主节点。 - 如果主节点有密码,设置 `masterauth <password>`。 - 重启从节点的Redis服务使配置生效。 3. **读写分离**: - 写操作应发送到主节点。 - 读操作可以发送到从节点。 - 客户端代码需要处理这个逻辑;例如,在应用程序中,设置不同的连接池:一个用于写(连接到主节点),一个或多个用于读(连接到从节点)。 4. **哨兵模式(可选)**:用于自动故障转移。配置哨兵来监控主节点,并在主节点失败时自动切换从节点为新主节点。 根据引用,配置方法主要是通过redis.conf文件设置slaveof。 结构回应: - 先简要解释Redis主从复制。 - 然后逐步说明配置方法。 - 最后提到读写分离的实现方式。 - 末尾添加引用标识。 - 生成相关问题。 确保回答真实可靠:基于Redis官方文档知识。Redis主从复制配置确实是通过slaveof命令或在配置文件中设置。 添加引用:在相关部分末尾添加[^2],因为[^2]直接涉及配置从节点。 生成相关问题:在末尾添加§§相关问题§§部分。 最终回应结构: 1. 介绍Redis主从复制和读写分离的概念。 2. 详细配置步骤: - 主节点配置(简要)。 - 从节点配置(详细,引用[^2])。 - 验证复制。 3. 实现读写分离的客户端做法。 4. 可选:哨兵模式配置(简要)。 5. 结论。 6. 相关问题。 </think>### Redis主从复制读写分离的配置方法 Redis主从复制允许创建一个主节点(Master)和多个从节点(Slave),实现数据的高可用和读写分离读写分离指写操作(如`SET`、`DEL`)仅在主节点执行,而读操作(如`GET`)可分发到从节点执行,以提升系统性能和吞吐量(注意:Redis本身不自动处理读写分离,需客户端实现逻辑)。以下基于Redis官方文档和最佳实践,逐步说明配置方法。配置主要涉及**主节点**和**从节点**的设置,并参考了站内引用的核心步骤[^2]。 #### 步骤1: 配置主节点(Master) - 主节点无需特殊配置,只需确保Redis服务正常运行。 - 如果主节点启用了密码认证(推荐),在`redis.conf`文件中设置`requirepass`参数: ```ini requirepass your_master_password # 设置主节点密码 ``` - 启动Redis服务: ```bash redis-server /path/to/redis.conf ``` - 验证主节点状态:登录Redis CLI执行`INFO replication`,应显示`role:master`。 #### 步骤2: 配置从节点(Slave)以实现主从复制 - 在每个从节点的`redis.conf`文件中添加以下配置: ```ini slaveof <master-ip> <master-port> # 指定主节点的IP和端口,例如 slaveof 192.168.111.222 6379 masterauth your_master_password # 如果主节点设置了密码,必须添加此行 ``` 此配置将自动同步主节点数据到从节点[^2]。 - 重启从节点Redis服务使配置生效: ```bash redis-server /path/to/redis.conf --daemonize yes ``` - 验证复制状态: - 在从节点执行`INFO replication`,应显示`role:slave`和主节点连接信息。 - 在主节点执行`INFO replication`,应显示连接的从节点列表。 #### 步骤3: 实现读写分离 - Redis主从复制本身只处理数据同步,读写分离需在**客户端应用层**实现: - **写操作**:应用程序将所有写请求(如`SET`、`HSET`)发送到主节点。 - **读操作**:应用程序将读请求(如`GET`、`HGETALL`)分发到从节点(可轮询或多个从节点负载均衡)。 - 示例客户端伪代码(使用Python Redis库): ```python import redis # 配置连接池:主节点用于写,从节点列表用于读 master_pool = redis.ConnectionPool(host='master_ip', port=6379, password='your_master_password') slave_pools = [ redis.ConnectionPool(host='slave1_ip', port=6379, password='your_master_password'), redis.ConnectionPool(host='slave2_ip', port=6379, password='your_master_password') ] # 写操作(只连接到主节点) def write_data(key, value): r_master = redis.Redis(connection_pool=master_pool) r_master.set(key, value) # 读操作(随机选择一个从节点) def read_data(key): import random r_slave = redis.Redis(connection_pool=random.choice(slave_pools)) return r_slave.get(key) ``` #### 步骤4: 可选增强——配置哨兵模式(Sentinel)实现自动故障转移 - 哨兵模式可在主节点故障时自动提升从节点为新主节点,避免手动干预[^1][^3]。 - 配置步骤: 1. 在每个Redis节点(主和从)上创建`sentinel.conf`文件: ```ini sentinel monitor mymaster <master-ip> <master-port> 2 # 监控主节点,"2"表示至少2个哨兵同意才切换 sentinel down-after-milliseconds mymaster 5000 # 超时判定为故障(5000毫秒) sentinel auth-pass mymaster your_master_password # 主节点密码 ``` 2. 启动哨兵服务: ```bash redis-sentinel /path/to/sentinel.conf ``` - 故障转移后,哨兵会自动更新从节点的`slaveof`配置,客户端需集成哨兵API以动态获取主节点地址。 #### 注意事项 - **数据一致性**:主从复制是异步的,读操作在从节点可能看到旧数据(延迟通常在毫秒级)。 - **性能优化**:确保网络带宽充足;从节点过多时,主节点可能负载过高。 - **安全**:始终使用密码认证(`masterauth`和`requirepass`)防止未授权访问[^2][^4]。 通过以上步骤,即可完成Redis主从复制和读写分离的配置。系统部署后,建议使用`redis-benchmark`测试读写性能以验证效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值