Redis集群实战篇
2021/02 作者:ihunter 0 次 0
1. 拉取redis镜像
docker pull redis
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 } } } }