在前篇有談到幾個搬移 redis 的方法,其中的 master-slave 搬移多少還是有點不安全。在前篇最下方有提到,即使在 slave 複寫過期時間,還是會在 master 過期時同時被刪掉。
此文會搭配 envoy 來做到搬移,並且不用修改程式碼。
ref:
https://betterprogramming.pub/migrate-from-standalone-redis-to-redis-cluster-f45b219330a3
步驟
- 建立新的 redis instance
2. 建立 envoy 當 redis proxy, 透過 envoy 的 request mirror, 可以將 request 送到兩個 redis
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-envoy-config
data:
envoy.yaml: |-
admin:
access_log_path: "/dev/null"
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 8001
static_resources:
listeners:
- name: redis_listener
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 6379
filter_chains:
- filters:
- name: envoy.filters.network.redis_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.redis_proxy.v3.RedisProxy
stat_prefix: redis_proxy
settings:
op_timeout: 5s
enable_redirection: true
prefix_routes:
catch_all_route:
cluster: old_redis
request_mirror_policy:
cluster: new_redis
exclude_read_commands: true
clusters:
- name: old_redis
connect_timeout: 3s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: old_redis
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: old_redis_address
port_value: old_redis_address_port
- name: new_redis
connect_timeout: 3s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: new_redis
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: new_redis_address
port_value: new_redis_address_port
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-envoy
spec:
replicas: 1
selector:
matchLabels:
app: redis-envoy
template:
metadata:
labels:
app: redis-envoy
spec:
containers:
- name: redis-envoy
image: envoyproxy/envoy:v1.17.0
volumeMounts:
- name: config
mountPath: /etc/envoy
args:
- "--config-path"
- "/etc/envoy/envoy.yaml"
volumes:
- name: config
configMap:
name: redis-envoy-config
---
apiVersion: v1
kind: Service
metadata:
name: redis-envoy
spec:
clusterIP: None
ports:
- port: 6379
selector:
app: redis-envoy
3. 待搬移/同步後,直接連至新 redis
P.S.
透過 envoy 連線至 redis 並不是每個指令都能使用,記得先確認是否有用到其他指令
ref: