同一台机器搭建多个redis实例 并测试主从同步

场景: 核心数据 主从同步 持久化
非核心 大并发 可以接受丢失但是尽量不丢失的,主从同步 ,从机持久化
日志类数据 需要转存 但是可以接受丢失 不开主从 不持久化

最简单的方法 还是创建多个实例来处理。下面记录过程。

redis
准备配置文件

需要三个实例,分别 是 ①核心数据 需要同步容灾 需要持久化 需要oss转存 ②临时数据 处理一些 limt 验证码等 不持久 不同步 ③设备日志临时存储 限制大小可丢一部分

1
2
3
4
wget http://repo.huaweicloud.com/redis/redis-7.0.8.tar.gz   #菊花家 官网https://github.com/redis/redis/archive/7.0.8.tar.gz
tar -zxvf redis-7.0.8.tar.gz 
cp ./redis-7.0.8/redis.conf /root/redis/redis-template.conf  #备份一份
rm -rf redis-7.0.8*
修改配置

持久化 ,只有main节点需要 并且是混合持久化 即:1秒aof一次 根据规则再压缩,默认配置文件 是关闭 rdb的但是开了 appendfsync everysec 1秒一次 以及 aof-use-rdb-preamble ,增长比例 auto-aof-rewrite-percentage 为100 文件大小 auto-aof-rewrite-min-size 64mb ,no-appendfsync-on-rewrite 默认为 no 就是 主线程和和子线程冲突 的时候,等待 会偶发堵塞但是不会丢数据。cache的 也默认开持久化,暂时不关闭,no-appendfsync-on-rewrite 改为yes 就是冲突的时候用硬盘缓存解决。 默认持久化文件:dump.rdb appendonly.aof

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
export redisName=db
rm -rf /data/redis/${main}* && cp /root/redis/redis-template.conf /root/redis/${redisName}.conf
sed -i "s@# requirepass foobared@requirepass cx6hYJcCpZybXT112233@g" /root/redis/${redisName}.conf  #修改密码
sed -i "s@appendonly no@appendonly yes@g" /root/redis/${redisName}.conf  # appendonly 打开混合持久化
sed -i "s@bind 127.0.0.1 -::1@#bind 127.0.0.1 -::1@g" /root/redis/${redisName}.conf  # ip
#启动 新版docker的redis 需要手动指定配置文件
docker stop ${redisName} && docker rm ${redisName}
docker run -itd --name ${redisName} --hostname ${redisName} -p 6381:6379 \
  -v /root/redis/${redisName}.conf:/redis.conf -v /root/redis/date-${redisName}:/data --restart=always \
  redis:7.0.8-alpine3.17  redis-server /redis.conf
docker logs -f -t --since="2020-02-08" --tail=50 ${redisName}
#其他
sed -i "s@no-appendfsync-on-rewrite no@no-appendfsync-on-rewrite yes@g" /root/redis/${redisName}.conf  #避开堵塞但是可能会丢数据  <不建议>

ram

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
export redisName=ram
rm -rf /data/redis/${main}* && cp /root/redis/redis-template.conf /root/redis/${redisName}.conf
sed -i "s@# requirepass foobared@requirepass cx6hYJcCpZybXT112233@g" /root/redis/${redisName}.conf  #修改密码
sed -i "s@bind 127.0.0.1 -::1@#bind 127.0.0.1 -::1@g" /root/redis/${redisName}.conf  # ip
sed -i 's@# save ""@save ""@g' /root/redis/${redisName}.conf  # 取消持久化

docker stop ${redisName} && docker rm ${redisName}
docker run -itd --name ${redisName} --hostname ${redisName} -p 6382:6379 \
  -v /root/redis/${redisName}.conf:/redis.conf  --restart=always \
  redis:7.0.8-alpine3.17  redis-server /redis.conf

devlog

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
export redisName=devlog  
rm -rf /data/redis/${redisName}* && cp /root/redis/redis-template.conf /root/redis/${redisName}.conf
sed -i "s@# requirepass foobared@requirepass cx6hYJcCpZybXT112233@g" /root/redis/${redisName}.conf  #修改密码
sed -i "s@bind 127.0.0.1 -::1@#bind 127.0.0.1 -::1@g" /root/redis/${redisName}.conf  # ip
sed -i 's@# save ""@save ""@g' /root/redis/${redisName}.conf  # 取消持久化
# 执行 ram的命令创建docker之前 再 限制一下大小
sed -i "s@# maxmemory <bytes>@maxmemory 268435456@g" /root/redis/${redisName}.conf #限制 256M
sed -i "s@# maxmemory <bytes>@maxmemory 536870912@g" /root/redis/${redisName}.conf #限制 512M
sed -i "s@# maxmemory <bytes>@maxmemory 1073741824@g" /root/redis/${redisName}.conf #限制 1G

docker stop ${redisName} && docker rm ${redisName}
docker run -itd --name ${redisName} --hostname ${redisName} -p 6383:6379 \
  -v /root/redis/${redisName}.conf:/redis.conf  --restart=always \
  redis:7.0.8-alpine3.17  redis-server /redis.conf

redis命令查看限制:info memory

最后 创建一个 slave-test 作为从机测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
export redisName=slave-test
rm -rf /data/redis/${redisName}* && cp /root/redis/redis-template.conf /root/redis/${redisName}.conf
sed -i "s@# requirepass foobared@requirepass cx6hYJcCpZybXT112233@g" /root/redis/${redisName}.conf  #修改密码
sed -i "s@bind 127.0.0.1 -::1@#bind 127.0.0.1 -::1@g" /root/redis/${redisName}.conf  # ip
sed -i 's@# save ""@save ""@g' /root/redis/${redisName}.conf  # 取消持久化
sed -i 's@# masterauth <master-password>@masterauth cx6hYJcCpZybXT112233@g' /root/redis/${redisName}.conf  # 设置主的密码


docker stop ${redisName} && docker rm ${redisName}
docker run -itd --name ${redisName} --hostname ${redisName} -p 6389:6379 \
  -v /root/redis/${redisName}.conf:/redis.conf  --restart=always \
  redis:7.0.8-alpine3.17  redis-server /redis.conf

docker restart slave-test
# 切换为 从机
docker exec -it slave-test redis-cli   -h localhost -p 6379  -a cx6hYJcCpZybXT112233  SLAVEOF 10.1.1.111  6381
# 切换为 主机
docker exec -it slave-test redis-cli   -h localhost -p 6379  -a cx6hYJcCpZybXT112233  slaveof NO ONE
  • 从机 从主机 同步的数据,如果主机是持久化,从级没有开启,但是丛机 会持久化这部分数据。
  • 从机可以从0数据 或者有一部分数据 或者 有其他数据 开始切换为从机模式
  • 从机 的数据 在开启 主从 后 会丢失,从机进入从模式后 无法写入数据

在简单的逻辑下,可以用shell脚本 免登录处理。

强制关闭 程序后,再进行切换操作。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计