使用Docker部署Redis集群

一、参考资料

  1. 【狂神说Java】Docker最新超详细版教程通俗易懂
  2. docker 实现redis集群
  3. 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会
  4. CentOS安装Docker
  5. 阿里云镜像加速器
  6. .netcore CSRedis程序集调用Redis集群

二、搭建步骤

使用3主3从

1. 安装Redis

docker pull redis

2. 创建虚拟网卡

docker network create myredis

2. 增加Redis配置文件

for port in $(seq 1 6); do
mkdir -p /mydata/redis/node-$port/conf
touch /mydata/redis/node-$port/conf/redis.conf
cat <<EOF >/mydata/redis/node-$port/conf/redis.conf
port 637$port 
bind 0.0.0.0
cluster-enabled yes
protected-mode no 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 47.122.23.227
cluster-announce-port 637$port
cluster-announce-bus-port 1637$port
appendonly yes
EOF
done

配置文件结构

配置文件内容

3. 启动Docker

for port in $(seq 1 6);
do docker run -p 637$port:637$port -p 1637$port:1637$port --name redis-$port -v /mydata/redis/node-$port/data:/data -v /mydata/redis/node-$port/conf/redis.conf:/etc/redis/redis.conf -d --net myredis redis redis-server /etc/redis/redis.conf
done

Redis容器

4. 配置集群

(1)随便进入一个容器
docker exec -it redis-1 /bin/bash

(2) 创建Cluster

root@016e9584c062:/data# redis-cli --cluster create 47.122.23.227:6371 47.122.23.227:6372 47.122.23.227:6373 47.122.23.227:6374 47.122.23.227:6375 47.122.23.227:6376 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 47.122.23.227:6375 to 47.122.23.227:6371
Adding replica 47.122.23.227:6376 to 47.122.23.227:6372
Adding replica 47.122.23.227:6374 to 47.122.23.227:6373
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 680f7e2fb30ecff8f42b0d380bd6a675921ec6d8 47.122.23.227:6371
   slots:[0-5460] (5461 slots) master
M: 52a8268e5297358009abc3c0f03a913cef7edb96 47.122.23.227:6372
   slots:[5461-10922] (5462 slots) master
M: 86d4e7001eb940a8916465e41aa5e8ac2863b198 47.122.23.227:6373
   slots:[10923-16383] (5461 slots) master
S: ec97edbe3f948c2be4c3dd4c2657c721ea6319f5 47.122.23.227:6374
   replicates 680f7e2fb30ecff8f42b0d380bd6a675921ec6d8
S: e2698d8405b741a6f9e344730dc183f98ae8e7da 47.122.23.227:6375
   replicates 52a8268e5297358009abc3c0f03a913cef7edb96
S: fbf1863f6ab6e66088eae497f204e01a3d8d2f7f 47.122.23.227:6376
   replicates 86d4e7001eb940a8916465e41aa5e8ac2863b198
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 47.122.23.227:6371)
M: 680f7e2fb30ecff8f42b0d380bd6a675921ec6d8 47.122.23.227:6371
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ec97edbe3f948c2be4c3dd4c2657c721ea6319f5 47.122.23.227:6374
   slots: (0 slots) slave
   replicates 680f7e2fb30ecff8f42b0d380bd6a675921ec6d8
M: 52a8268e5297358009abc3c0f03a913cef7edb96 47.122.23.227:6372
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e2698d8405b741a6f9e344730dc183f98ae8e7da 47.122.23.227:6375
   slots: (0 slots) slave
   replicates 52a8268e5297358009abc3c0f03a913cef7edb96
S: fbf1863f6ab6e66088eae497f204e01a3d8d2f7f 47.122.23.227:6376
   slots: (0 slots) slave
   replicates 86d4e7001eb940a8916465e41aa5e8ac2863b198
M: 86d4e7001eb940a8916465e41aa5e8ac2863b198 47.122.23.227:6373
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

集群信息

5. 使用集群

(1)创建.Net Core WebAPI项目
(2)安装CSRedisCore
(3)配置RedisHelper

namespace Make.Redis
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

           //https://www.cnblogs.com/yyfnetcore/articles/15047723.html
            RedisHelper.Initialization(
               new CSRedis.CSRedisClient(null,
               "47.122.23.227:6371,password=,defaultDatabase=0,poolsize=50",
               "47.122.23.227:6372,password=,defaultDatabase=0,poolsize=50",
               "47.122.23.227:6373,password=,defaultDatabase=0,poolsize=50",
               "47.122.23.227:6374,password=,defaultDatabase=0,poolsize=50",
               "47.122.23.227:6375,password=,defaultDatabase=0,poolsize=50",
               "47.122.23.227:6376,password=,defaultDatabase=0,poolsize=50"));

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            //app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

(4)使用RedisHelper

[HttpGet(Name = "GetWeatherForecast")]
        public async Task<IEnumerable<WeatherForecast>> GetAsync()
        {            

            var result = await RedisHelper.GetAsync<IEnumerable<WeatherForecast>>("weath");

            if (result != null)
            {
                return result;
            }

            var aa = Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
          .ToArray();

            await RedisHelper.SetAsync("weath", aa);

            return aa;

        }

posted @ 2023-05-14 21:51  会搬砖的好孩子  阅读(119)  评论(0)    收藏  举报