Redis三种集群模式-主从模式

本文详细介绍了Redis主从模式的配置方法及工作原理,包括如何搭建主从集群、配置细节及读写分离的优势。同时也讨论了主从模式的优缺点,如自动数据同步和高可用性增强,以及其在大规模数据量和高可用性需求场景下的局限性。

一、引言

  Redis有三种集群模式,第一个就是主从模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,我们今天就来说一下Redis第一种集群模式:主从集群模式。

二、配置说明
         实现主从复制(Master-Slave Replication)的工作原理:Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令。Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
        如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行

主从复制配置:
       第一步:修改从节点的配置文件:slaveof <masterip> <masterport>
       第二步:如果设置了密码,就要设置:masterauth <master-password>
       主从复制的配置很简单,主要操作从节点的配置文件,主节点不需要任何改动。我们可以使用info查看role角色即可知道是主服务或从服务。

版本特点:测试版本为redis-5.0.5

    REPLICATION,主从模式的配置。注意,之前版本的redis,配置为slave of,现在改为REPLICATION。

  主从模式,可以是树状的,从服务属于多台主服务,且从服务也可以有从服务。

  主从模式,可实现读写分离;高可用模式下,主服务出现问题,也可以通过哨兵切换从服务为主服务;

  可实现主服务不用数据持久化,从服务进行持久化工作,减轻主服务负担等等。

  • replicaof <masterip> <masterport>:配置主服务的ip和端口。配置之后,就是这台机器的小弟了。主服务也能知道谁是他的小弟。
  • masterauth <master-password>:如果主服务需要密码认证,这里需要配置从服务连接主服务的密码。
  • replica-read-only:默认为yes,配置从服务默认为只读模式。

三、主从模式的配置

1.redis主从

  1)创建主从目录

  /usr/software/redis/redis-ms/

    mkdir 7001

    mkdir 7002

    mkdir 7003

  2)复制redis.conf到主从目录

    cp /usr/software/redis/redis.conf    /usr/software/redis/redis-ms/7001

    cp/usr/software/redis/redis.conf     /usr/software/redis/redis-ms/7002

    cp /usr/software/redis/redis.conf    /usr/software/redis/redis-ms/7003

  3)修改主./7001/redis.conf

    vim ./7001/redis.conf

    #修改如下key的值  

 bind 0.0.0.0#任意ip都可以连接

    protected-mode no#关闭保护,允许非本地连接

    port 7001#端口号

    daemonize yes#后台运行

    pidfile /var/run/redis_7001.pid#进程守护文件,就是存放该进程号相关信息的地方

    dir /usr/software/redis/redis-ms/7001/data//#db等相关目录位置

    logfile "/usr/software/redis/redis-ms/7001/log/redis.log"

    appendonly yes#开启日志形式

    requirepass XX#密码

 

  4)修改从./7002/redis.conf

    vim ./7002/redis.conf

    #修改如下key的值 

bind 0.0.0.0#任意ip都可以连接

    protected-mode no#关闭保护,允许非本地连接

    port 7002#端口号

    daemonize yes#后台运行   

    pidfile /var/run/redis_7002.pid#进程守护文件,就是存放该进程号相关信息的地方

    dir /usr/software/redis/redis-ms/7002/data//#db等相关目录位置  

    logfile "/usr/software/redis/redis-ms/7002/log/redis.log"

    replicaof <masterip> <masterport>#主信息

    masterauth <master-password>#主信息

    appendonly yes#开启日志形式

    requirepass XX#密码

 

  5)修改从./7003/redis.conf

    vim ./7003/redis.conf 

    #修改如下key的值 

 bind 0.0.0.0#任意ip都可以连接

    protected-mode no#关闭保护,允许非本地连接

    port 7003#端口号

    daemonize yes#后台运行

    pidfile /var/run/redis_7003.pid#进程守护文件,就是存放该进程号相关信息的地方

    dir /usr/software/redis/redis-ms/7003/data//#db等相关目录位置    

    logfile "/usr/software/redis/redis-ms/7003/log/redis.log"

    replicaof <masterip> <masterport>#主信息

    masterauth <master-password>#主信息

    appendonly yes#开启日志形式

    requirepass XX#密码

 2.启动测试

  1)启动

    redis-server /usr/software/redis/redis-ms/7001/redis.conf

    redis-server /usr/software/redis/redis-ms/7002/redis.conf

    redis-server /usr/software/redis/redis-ms/7003/redis.conf

    ps -ef|grep redis

    

    #查看主从是否搭建成功

    /redis-cli -p 7001 -a password

    info

    如图:

    

    

  2)测试

    redis-cli -p 7001 -a ww

    

    redis-cli -p 7002 -a ww

    

    --raw 中文显示

    主7001设置name值,可以在从7002、7003取到,但是从不能设置值。

四、主从模式的优缺点
          1、Redis的Replication的特点和优点:
                  1】、同一个Master可以同步多个Slaves。
                  2】、Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。
                  3】、Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
                  4】、Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
                  5】、为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了

        很大的提高。
                  6】、Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
                  7】、支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
         2、Redis的Replication的缺点:
                1】、Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
                2】、主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
                3】、Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,

      这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和

      主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
                4】、Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,

      这对资源造成了很大的浪费。

五、结束

         其实redis的主从模式很简单,在实际的生产环境中是很少使用的,我也不建议在实际的生产环境中使用主从模式来提供系统的高可用性,之所以不建议使用都是由它的缺点造成的,在数据量非常大的情况,或者对系统的高可用性要求很高的情况下,主从模式也是不稳定的。虽然这个模式很简单,但是这个模式是其他模式的基础,所以必须深刻的理解,对其他模式的学习才会有帮助作用。

 

转载于:https://www.cnblogs.com/pinghengxing/p/11139997.html

### Redis 集群模式主从模式的区别及配置方法 #### 一、Redis 主从模式的配置 在主从模式下,Redis 的主节点负责处理写操作并将数据同步到多个从节点上。以下是具体的配置过程: 1. **编辑 `redis.conf` 文件** 修改主节点从节点的配置文件中的参数,例如设置端口号绑定地址: ```conf port 6379 bind 0.0.0.0 ``` 2. **启用主从关系** 在从节点的 `redis.conf` 中添加以下内容来指定其对应的主节点 IP 端口: ```conf slaveof <master-ip> <master-port> ``` 这样可以确保从节点能够连接并同步主节点的数据。 3. **启动 Redis 实例** 使用命令行启动 Redis 实例,并加载各自的配置文件[^4]: ```bash redis-server /path/to/redis.conf ``` #### 二、Redis 集群模式的配置 集群模式允许 Redis 节点之间自动分配键空间并通过分片存储数据,从而提升性能可扩展性。以下是具体步骤: 1. **修改配置文件** 编辑每个 Redis 实例的 `redis.conf` 文件,开启集群支持功能: ```conf cluster-enabled yes cluster-config-file nodes-<port>.conf cluster-node-timeout 5000 appendonly yes ``` 此外,还需要为每个实例定义不同的端口号日志路径以防止冲突[^2]。 2. **启动 Redis 实例** 启动所有参与集群构建的服务实例时需指明各自独立的配置文件位置: ```bash redis-server /path/to/custom_redis_conf_file --daemonize no ``` 3. **创建集群拓扑结构** 利用官方工具 `redis-cli` 创建实际物理机器间的逻辑网络关联: ```bash redis-cli --cluster create \ <ip1>:<port1> <ip2>:<port2> ... <ipN>:<portN> \ --cluster-replicas <num_of_replicas_per_shard> ``` #### 三、两种模式的主要区别 | 特性 | 主从模式 | 集群模式 | |---------------------|-----------------------------------|----------------------------------| | 数据分布 | 单个主节点集中管理 | 多节点间均匀划分 | | 扩展能力 | 基本无弹性 | 支持动态增加新节点 | | 故障恢复自动化 | 不具备 | 自动选举新的主节点 | | 性能优化方向 | 提高读取吞吐量 | 平衡负载 | #### 四、代码示例 下面展示了一个简单的 Python 客户端脚本来测试已建立好的 Redis Cluster 是否工作正常。 ```python import redis from redis.cluster import RedisCluster if __name__ == "__main__": startup_nodes = [ {"host": "localhost", "port": "7000"}, {"host": "localhost", "port": "7001"} ] rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True) rc.set("foo", "bar") # 设置键值对 value = rc.get("foo") # 获取键值对 print(f"Value of 'foo': {value}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值