1. 首页
  2. >
  3. 数据库技术
  4. >
  5. Redis

Redis集群实战篇

1. 拉取redis镜像

docker pull redis:6.0.9

2. 配置文件

2.1 生成目录

用来存放redis的配置文件与持久化文件,日志文件等

# 新增目录 mkdir -p /www/redis/redis_001/ && mkdir -p /www/redis/redis_001/data/  # 切换目录 cd /www/redis/redis_001/  vim  redis.conf

2.2 建立配置文件

# 解除限制redis只能本地访问 bind 0.0.0.0  # 默认yes,开启保护模式,限制为本地访问,改成no protected-mode no  # 连接端口 port 6379  # 指定redis是否要用守护线程的方式启动(在docker中只能为no,不然无法启动) daemonize no  # 改为后台启动后,会在对于地方生成pid文件 pidfile /data/redis.pid  # 日志文件 logfile /data/redis.log  #数据库个数 databases 18  #本地redis数据库存放文件夹 dir /data  #redis持久化 appendonly yes   # 连接密码 requirepass 123456xxx  # 开启集群 cluster-enabled yes    # 集群配置信息文件 cluster-config-file redis_cluster.conf    # 节点互连超时时间,单位为毫秒 cluster-node-timeout 15000    # 从节点转主节点策略 cluster-slave-validity-factor 10    # 从节点转主节点策略 cluster-migration-barrier 1    # 集群所有节点状态为ok才提供服务 cluster-require-full-coverage no 

3. 启动redis实例

3.1 .启动一个实例(带参数说明)

docker run -d --privileged=true --restart=always --hostname redis_001 --net=randeng_network --ip 192.168.1.31 -p 6379:6379 -v /www/redis/redis_master_1/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_001/data:/data --name redis_master_1 redis:6.0.9 redis-server /etc/redis/redis.conf  --name redis_master_1 # 容器命名 --privileged=true # 特权模式 --restart=always # 随容器启动 --net=randeng_network --ip 192.168.1.31 # 加入randeng_network,并使用192.168.1.31 -p 6379:6379 # 暴露端口 -v /www/redis/redis_001/redis.conf:/etc/redis/redis.conf # 挂载配置文件 -v /www/redis/redis_001/data:/data # 挂载目录 redis-server /etc/redis/redis.conf # 指定配置文件启动 -d # 后台运行

3.2 .利用批量命令,同时启动6个实例

上面的方法是启动一个redis实例,如果要组建集群,最少需要6个实例,三主三从。同样的方法,启动6个实例即可。

# 配置文件和数据文件 mkdir -p /www/redis/redis_{001,002,003,004,005,006}/ && mkdir -p /www/redis/redis_{001,002,003,004,005,006}/data/;  # 编辑配置文件,复制2.2的配置文件即可 vim /www/redis/redis_001/redis.conf  # 把配置文件,复制6份即可 cp /www/redis/redis_001/redis.conf /www/redis/redis_002/redis.conf; cp /www/redis/redis_001/redis.conf /www/redis/redis_003/redis.conf; cp /www/redis/redis_001/redis.conf /www/redis/redis_004/redis.conf; cp /www/redis/redis_001/redis.conf /www/redis/redis_005/redis.conf; cp /www/redis/redis_001/redis.conf /www/redis/redis_006/redis.conf;  # 启动6个集群 docker run -d --privileged=true --restart=always --hostname redis_001 --net=randeng_network --ip 192.168.1.31 -p 6379:6379 -v /www/redis/redis_001/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_001/data:/data --name redis_001 redis:6.0.9 redis-server /etc/redis/redis.conf; docker run -d --privileged=true --restart=always --hostname redis_002 --net=randeng_network --ip 192.168.1.32 -p 6380:6379 -v /www/redis/redis_002/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_002/data:/data --name redis_002 redis:6.0.9 redis-server /etc/redis/redis.conf; docker run -d --privileged=true --restart=always --hostname redis_003 --net=randeng_network --ip 192.168.1.33 -p 6381:6379 -v /www/redis/redis_003/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_003/data:/data --name redis_003 redis:6.0.9 redis-server /etc/redis/redis.conf; docker run -d --privileged=true --restart=always --hostname redis_004 --net=randeng_network --ip 192.168.1.34 -p 6382:6379 -v /www/redis/redis_004/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_004/data:/data --name redis_004 redis:6.0.9 redis-server /etc/redis/redis.conf; docker run -d --privileged=true --restart=always --hostname redis_005 --net=randeng_network --ip 192.168.1.35 -p 6383:6379 -v /www/redis/redis_005/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_005/data:/data --name redis_005 redis:6.0.9 redis-server /etc/redis/redis.conf; docker run -d --privileged=true --restart=always --hostname redis_006 --net=randeng_network --ip 192.168.1.36 -p 6384:6379 -v /www/redis/redis_006/redis.conf:/etc/redis/redis.conf -v /www/redis/redis_006/data:/data --name redis_006 redis:6.0.9 redis-server /etc/redis/redis.conf;

5. 编排集群操作

进入6个redis实例的任何一个,进行操作即可

redis-cli --cluster create --cluster-replicas 1 -a 123456xxx 192.168.1.31:6379 192.168.1.32:6379 192.168.1.33:6379 192.168.1.34:6379 192.168.1.35:6379 192.168.1.36:6379  --cluster-replicas 1 # 每个主机带几个从机 -a # 实例的密码,如果没有密码可以不带 # 上面会生产三主三从的集群,前面三个为主机,后面三个,依次是前面的主机的从机

6. 连接集群,进行读写操作

不管是利用python直接操作,还是利用django进行操作,都要安装下面二个库

# 这里有个小插曲,一定要主要版本,redis-py-cluster连接reds实例的时候还是调用redis模块的,二个模块存在版本不兼容问题,建议直接使用下面二个版本,我测试了不	存在兼容问题,可以直接使用  redis==2.10.6 redis-py-cluster==1.3.6 python==3.6.8

6.1 .Python直接进行操作

from rediscluster import StrictRedisCluster  # 设置连接池 startup_nodes = [{"host": "192.168.1.31", "port": 6379},                  {"host": "192.168.1.32", "port": 6379},                  {"host": "192.168.1.33", "port": 6379},                  ] # redis集群如果设置密码,要求所有密码一致,在连接的时候,设置password参数即可 rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True, password='123456xxx') rc.set("key", "values")

6.2 .Django进行操作

我的Django版本为2.0.4,Python版本为

# 其中 123456xxx 代表集群的连接密码  CACHES = {     'default': {         'BACKEND': 'django_redis.cache.RedisCache',         'LOCATION': ["redis://:123456xxx@192.168.1.31:6379",                       "redis://:123456xxx@192.168.1.32:6379",                      "redis://:123456xxx@192.168.1.33:6379",                      "redis://:123456xxx@192.168.1.34:6379",                      "redis://:123456xxx@192.168.1.35:6379",                      "redis://:123456xxx@192.168.1.36:6379",                      ],         'OPTIONS': {             'REDIS_CLIENT_CLASS': 'rediscluster.RedisCluster',             'CONNECTION_POOL_CLASS': 'rediscluster.connection.ClusterConnectionPool',             'CONNECTION_POOL_KWARGS': {                 'skip_full_coverage_check': True             }         }     } }