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
            }
        }
    }
}


赞(1) 更多分享

上篇: Oracle日常巡检——数据库基本情况检查
下篇: Linux系统部署redis集群