这篇博客是续redis集群理论篇后的redis集群实战篇,全篇没有任何理论,基本都是代码和一些备注
docker pull redis:6.0.9
用来存放redis的配置文件与持久化文件,日志文件等
# 新增目录
mkdir -p /www/redis/redis_001/ && mkdir -p /www/redis/redis_001/data/
# 切换目录
cd /www/redis/redis_001/
vim redis.conf
# 解除限制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
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 # 后台运行
上面的方法是启动一个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;
进入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 # 实例的密码,如果没有密码可以不带
# 上面会生产三主三从的集群,前面三个为主机,后面三个,依次是前面的主机的从机
不管是利用python直接操作,还是利用django进行操作,都要安装下面二个库
# 这里有个小插曲,一定要主要版本,redis-py-cluster连接reds实例的时候还是调用redis模块的,二个模块存在版本不兼容问题,建议直接使用下面二个版本,我测试了不 存在兼容问题,可以直接使用
redis==2.10.6
redis-py-cluster==1.3.6
python==3.6.8
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")
我的Django版本为2.0.4,Python版本为
# 其中 123456xxx 代表集群的连接密码
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': ["redis://:[email protected]:6379",
"redis://:[email protected]:6379",
"redis://:[email protected]:6379",
"redis://:[email protected]:6379",
"redis://:[email protected]:6379",
"redis://:[email protected]:6379",
],
'OPTIONS': {
'REDIS_CLIENT_CLASS': 'rediscluster.RedisCluster',
'CONNECTION_POOL_CLASS': 'rediscluster.connection.ClusterConnectionPool',
'CONNECTION_POOL_KWARGS': {
'skip_full_coverage_check': True
}
}
}
}