场景:
核心数据 主从同步 持久化
非核心 大并发 可以接受丢失但是尽量不丢失的,主从同步 ,从机持久化
日志类数据 需要转存 但是可以接受丢失 不开主从 不持久化
最简单的方法 还是创建多个实例来处理。下面记录过程。
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脚本 免登录处理。
强制关闭 程序后,再进行切换操作。