Redis主从与集群

Redis搭建主从服务

  1. 配置主服务器,然后利用该配置文件启动主服务器

    1
    2
    # 修改redis的配置文件中的bind绑定地址为服务器所在的地址
    bind 192.168.85.129
  2. 配置从服务器,然后利用该配置文件启动从服务器

    1
    2
    3
    4
    # 修改从服务器的配置文件slave.conf文件
    bind 192.168.85.128
    slaveof 192.168.85.129 6379
    port 6379
  3. 查看主从关系

    1
    redis-cli -h 192.168.85.129 -p 6379 info Republication

Redis集群搭建

背景

集群:是多台设备通过高速网路连接,并以同一的方式进行管理,共同对外提供服务。redis集群可以在一台机器上部署,也可以在多台机器上进行部署

Redis集群特点:

  • Redis去中心化,每个节点都是平等的,每个节点都保存了各自数据和整个集群的状态,并且各个节点之间保持活跃,这样就保证只要连接到其中任意一个节点,都能够获取到所有节点的数据
  • Redis集群中的数据存储通过CRC16算法来计算数据存放的位置。Redis集群中将存储分为16384个槽,每个存入的键值都存放于这些槽中,而我们存储的数据都需要通过CRC16算法来计算得出存放的节点,而不能人为设定
  • Redis集群中会将数据存放于主节点中,然后主节点的从服务器与其数据同步,获取数据也只是获取主节点上的。只有当主节点挂了,这个时候该主节点的从服务器才会被启动充当主节点继续服务
  • Redis集群必须要3个及3个以上的主节点才能够启动成功。当存活的节点数小于总节点数的一半的时候,redis集群就无法提供服务

搭建

  1. 安装依赖环境,redis集群依赖于ruby环境

    1
    sudo apt-get install ruby

    如果下面创建redis出错时,可能是因为ruby安装的不是最新版的原因,可以通过以下更换源

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看自己的gem源,若是https://rubyrems.org则需要更换
    gem source -l

    # 更换源为国内的
    gem source --add https://gems.ruby-china.org/ --remove https://rubyrems.org

    # 通过gem安装redis的相关依赖
    sudo gem install redis
  2. 在不同的服务器上依次创建对应的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 配置文件内容如下:
    # 绑定端口, 果是同一台服务器,则端口号不能相同
    port 6379
    # 绑定IP
    bind 192.168.85.129
    # 后台运行
    daemonize yes
    # 运行以后进行的ID写入的文件,数字需要与port保持一致
    pidfile 6379.pid
    # 标识该redis服务允许成为一个集成节点
    cluster-enabled yes
    # 标识该Redis服务在集群中的一个配置文件,数字必须与port保持一致
    cluster-config-file 6379_node.conf
    # 标识连接节点的超时时间
    cluster-node-timeout 15000
    # 标识数据文件的追加
    appendonly yes
  3. 运行命令创建集群

    1
    2
    # --cluster-replicas 1:表示每创建一个节点(主节点)的时候,都会为其分配一个从属服务器
    redis-cli --cluster create 192.168.85.129:7000 192.168.85.129:7001 192.168.85.129:7002 --cluster-replicas 1
  4. 测试数据连接认证

    1
    2
    # -c:表示连接到集群
    redis-cli -p [节点IP] -p [节点端口] -c

Redis集群与Python交互

  1. 安装环境

    1
    2
    3
    # 由于redis-py-cluster与redis的包可能存在冲突,导致导入的时候会报错,因此需要注意版本搭配
    # 目前已知版本搭配:redis==2.10.6,redis-py-cluster:1.3.6
    pip install redis-py-cluster
  2. 编写程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    from rediscluster import * 

    if __name__=="__main__":
    try:
    # 构建redis所有的服务器节点,Redis会根据CRC16算法,将键和值写在某个节点上
    startup_nodes = [
    {"host":"192.168.85.129", "port":7001},
    {"host":"192.168.85.129", "port":7002},
    {"host":"192.168.85.129", "port":7003},
    ]
    # 构建StrictRedisCluster对象,用于操作redis数据库
    src = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
    result = src.set('key', 'value')
    print(result)
    name = src.get("name")
    print(name)
    except Exception as msg:
    print(msg)