主从和哨兵可以解决高并发读和高可用问题。但是无法解决高并发写的问题。
试想,如果我有3GB的数据,在每台主机器没有联系,互相不知道对方存在的时候,每台主机器上都写入3GB的数据,总共就要用到9GB的内存,这倒没什么大事,无非是花点钱买个内存条,但是,向某个主机器中添加数据,为了保证一致性,肯定要向其它主机器添加数据吧,此时就要涉及到很多技术,要考虑到很多问题,非常复杂!
要问有没有什么技术可以非常简便地解决这个问题呢?有的!Redis集群技术。
每个master之间实现消息互通,master节点有两重身份,一种是数据写入的节点,另一种是充当哨兵。
下面就让我们开始搭建redis集群吧!
首先在/docker目录下创建目录:
mkdir /docker
# -p 递归创建文件夹
mkdir -p 8001/conf 8002/conf 8003/conf 9001/conf 9002/conf 9003/conf
再在docker目录下准备一个空的redis.conf
touch /docker/redis.conf
编辑redis.conf,将下面内容写入到redis.conf中:
port 8001
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /docker/8001/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /docker/8001
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize no # 不能选择yes,否则会与启动命令中的-d冲突
# 注册的实例ip
replica-announce-ip 192.168.157.130
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /docker/8001/run.log
将这个文件拷贝到每个目录下:
# 进入/docker目录
cd /docker
# 拷贝文件
echo 8001/conf 8002/conf 8003/conf 9001/conf 9002/conf 9003/conf | xargs -t -n 1 cp redis.conf
修改每个目录下的redis.conf文件,将其中的8001修改成与目录一致:
# 进入/docker目录
cd /docker
# 修改配置文件
printf '%s\n' 8001 8002 8003 9001 9002 9003 | xargs -I{} -t sed -i 's/8001/{}/g' {}/conf/redis.conf
创建docker-compose.yml文件:
cd /docker
touch docker-compose.yml
写入命令:(需要开放两个端口,一个用于给正常的client(如8001)提供服务,另一个用于数据端口(如18001通常 + 10000))
version: '3'
services:
redis-cluster-8001:
image: "redis:latest"
container_name: redis-cluster-8001
ports:
- "8001:8001"
- "18001:18001"
volumes:
- "/docker/8001/conf/:/etc/redis/conf/"
- "/docker/8001/tmp/:/tmp/"
- "/docker/8001/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
redis-cluster-8002:
image: "redis:latest"
container_name: redis-cluster-8002
ports:
- "8002:8002"
- "18002:18002"
volumes:
- "/docker/8002/conf/:/etc/redis/conf/"
- "/docker/8002/tmp/:/tmp/"
- "/docker/8002/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
redis-cluster-8003:
image: "redis:latest"
container_name: redis-cluster-8003
ports:
- "8003:8003"
- "18003:18003"
volumes:
- "/docker/8003/conf/:/etc/redis/conf/"
- "/docker/8003/tmp/:/tmp/"
- "/docker/8003/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
redis-cluster-9001:
image: "redis:latest"
container_name: redis-cluster-9001
ports:
- "9001:9001"
- "19001:19001"
volumes:
- "/docker/9001/conf/:/etc/redis/conf/"
- "/docker/9001/tmp/:/tmp/"
- "/docker/9001/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
redis-cluster-9002:
image: "redis:latest"
container_name: redis-cluster-9002
ports:
- "9002:9002"
- "19002:19002"
volumes:
- "/docker/9002/conf/:/etc/redis/conf/"
- "/docker/9002/tmp/:/tmp/"
- "/docker/9002/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
redis-cluster-9003:
image: "redis:latest"
container_name: redis-cluster-9003
ports:
- "9003:9003"
- "19003:19003"
volumes:
- "/docker/9003/conf/:/etc/redis/conf/"
- "/docker/9003/tmp/:/tmp/"
- "/docker/9003/data/:/data/"
command:
redis-server /etc/redis/conf/redis.conf
输入命令:docker-compose up -d (docker-compose down可以删除启动的容器)启动容器
接下来就该创建集群了!
输入以下命令,ip自行修改:
redis-cli --cluster create --cluster-replicas 1 192.168.157.130:8001 192.168.157.130:8002 192.168.157.130:8003 192.168.157.130:9001 192.168.157.130:9002 192.168.157.130:9003
输入yes:
显示这个,分片集群就搭建好了!