Redis主从及集群搭建

↘锁芯ラ 提交于 2020-01-31 17:39:25

1. 主从配置

Redis主从主要用来实现数据的复制,避免数据丢失以及实现读写分离

Redis主从概念:主服务(master)、从服务(slave)
- ⼀个master可以配置多个slave,⼀个slave可以拥有多个slave
- 通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)

1. 主服务器配置
    - 修改Redis配置文件绑定IP为本地IP:192.168.31.199 端口:6379
    - 重启Redis服务:brew services start restart / sudo service redis restart
2. 从服务器配置
    - 复制主服务器配置文件为redis_slave.conf(从服务器配置文件)
    - 修改配置文件内容:
        绑定IP:本地IP 192.168.31.199(本地主从) 端口:6378
        连接的主服务器信息:replicaof 192.168.31.199 6379(连接的主服务器IP和端口)
        低版本:slaveof 192.168.31.199 6379(连接的主服务器IP和端口)
    - 启动从服务器: sudo /usr/local/opt/redis/bin/redis-server /usr/local/etc/redis_slave.conf
3. 查看主从关系:redis-cli -h 192.168.31.199 -p 6378 info Replication

主从搭建好之后,主服务器添加的键值对会自动同步到从服务器,从服务器只读不可写

image

2. 集群搭建

集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组并以单一系统的模式加以管理

一个客户与集群相互作用时,集群像是一个独立的服务器,集群主要是用于提高可用性和可缩放性

Redis集群:

  • 软件层面:一台电脑开启多个Redis服务(缺点:一个节点挂掉,整个集群不能使用)
  • 硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务

集群搭建相关资料:

  • https://www.cnblogs.com/wuxl360/p/5920330.html
  • https://www.cnblogs.com/silent2012/p/10697896.html
  • https://www.cnblogs.com/paul8339/p/11987345.html
此例子在两个电脑上搭建集群:172.16.179.130、172.16.179.131

1. 机器1配置:172.16.179.130
    - 创建conf目录,创建7000.conf、7001.conf、7002.conf文件,内容如下:
        - 7001.conf:
            port 7000
            bind 172.16.179.130
            daemonize yes
            pidfile 7000.pid
            cluster-enabled yes
            cluster-config-file 7000_node.conf
            cluster-node-timeout 15000
            appendonly yes
        - 7001.conf:
            port 7001
            bind 172.16.179.130
            daemonize yes
            pidfile 7001.pid
            cluster-enabled yes
            cluster-config-file 7001_node.conf
            cluster-node-timeout 15000
            appendonly yes
        - 7002.conf:
            port 7002
            bind 172.16.179.130
            daemonize yes
            pidfile 7002.pid
            cluster-enabled yes
            cluster-config-file 7002_node.conf
            cluster-node-timeout 15000
            appendonly yes
    - 使用配置文件启动Redis服务:
        sudo redis-server /conf/7000.conf
        sudo redis-server /conf/7001.conf
        sudo redis-server /conf/7002.conf
2. 机器2配置:172.16.179.131
    - 创建conf目录,创建7003.conf、7004.conf、7005.conf文件,内容和机器1相似:更改ip、port、pidfile、cluster-config-file即可
    - 使用配置文件启动Redis服务:
        sudo redis-server /conf/7003.conf
        sudo redis-server /conf/7004.conf
        sudo redis-server /conf/7005.conf
        
3. 创建集群
    - 高版本Redis创建集群:
        redis-cli --cluster create 172.17.0.9:7000 172.17.0.9:7001 172.17.0.9:7002 172.17.0.9:7003 172.17.0.9:7004 172.17.0.9:7005 --cluster-replicas 1(高版本使用)
    - 低版本Redis创建集群:
        - 使用redis-trib.rb命令⽤于创建集群:sudo cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/
        - 安装ruby环境:sudo apt-get install ruby
          创建出错设置gem源,安装最新版本的ruby:
            gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
            sudo gem install redis
        - 创建集群:
            redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005(低版本使用)

4. 数据验证:
    - 连接集群:redis-cli -h 172.17.0.9 -c -p 7003(-c表示连接到集群)
    - redis命令行相关操作:
        - 查看集群信息:cluster info
        - 查看集群节点信息:cluster nodes
        
注意:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务。

image

拓扑图如下:

集群相关操作:
    - 关闭集群的某个节点:redis-cli -a cyclone -c -h IP -p PORT shutdown
    - 重新启动该Redis示例,会自动加入集群当中
    - 集群关闭:使用kill -9 pid杀死Redis进程即可(如果需要关闭多个进程,进程号之间空格隔开即可)
    - 集群重启:
        - 保留数据:关闭Redis实例,重新启动即可
        - 丢弃数据:关闭实例,清空实例中数据存放目录的所有内容,然后逐个启动实例


集群运作原理:
Redis集群设计之初就考虑到了去中⼼化、去中间件即集群中的每个节点都是平等的关系,每个节点都保存各⾃的数据和整个集群的状态
每个节点都和其他所有节点连接⽽且保持活跃,保证我们只需要连接集群中的任意⼀个节点就可以获取到其他节点的数据(连接一个节点就连接了整个集群)
Redis集群没有使⽤传统的⼀致性哈希来分配数据,⽽采⽤⼀种叫做哈希槽(hash slot)的⽅式来分配的(redis cluster默认分配了16384个slot)
存储键值对的算法是CRC16算法(CRC16(key) % 16384):即当我们 设置⼀个key时,会⽤CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上
Redis集群会把数据存在⼀个master节点,然后在master和其对应的salve之间进⾏数据同步。当读取数据时也根据⼀致性哈希算法到对应的master节点获取数据,只有当⼀个master挂掉之后,才会启动⼀个对应的salve 节点充当master 

3. python与Redis集群交互

安装模块:pip install redis-py-cluster

from rediscluster import *

if __name__ == '__main__':
    try:
        # 构建所有的主节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
        startup_nodes = [
            {'host': '172.17.0.9', 'port': 7000},
            {'host': '172.17.0.9', 'port': 7001},
            {'host': '172.17.0.9', 'port': 7002},
        ]

        # 构建StrictRedisCluster对象
        src = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)

        # 设置键值对
        result = src.set('name', '中国')
        print(result)

        # 获取
        name = src.get('name')
        print(name)

    except Exception as e:
        print(e)

redis-py-cluster文档:https://redis-py-cluster.readthedocs.io/en/master/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!