使用Docker部署Redis集群
一、参考资料
- 【狂神说Java】Docker最新超详细版教程通俗易懂
- docker 实现redis集群
- 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会
- CentOS安装Docker
- 阿里云镜像加速器
- .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

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


浙公网安备 33010602011771号