docker部暑redis 6.2.3 cluster,使用acl认证(支持amd64和arm64)
集群规划:3台服务器各部署一个主节点、一个从节点,同一台服务器上不是直接主从关系。(真实集群使用6台服务)三个节点服务器上都执行以下安装脚本。
·
集群规划:3台服务器各部署一个主节点、一个从节点,同一台服务器上不是直接主从关系。(真实集群使用6台服务)
- 服务器 | 角色 | ip:端口 |
---|---|---|
node1 | master1/slave2 | 192.168.11.192:6379/192.168.11.193:6380 |
node2 | master2/slave3 | 192.168.11.193:6379/192.168.11.194:6380 |
node3 | master3/slave1 | 192.168.11.194:6379/192.168.11.192:6380 |
- 设置hosts
cat >> /etc/hosts << 'EOF'
192.168.11.192 redis01
192.168.11.193 redis02
192.168.11.194 redis03
192.168.11.193 redis04
192.168.11.194 redis05
192.168.11.192 redis06
EOF
三个节点服务器上都执行以下安装脚本
1、master
mkdir /data/redis_cluster/ -p
touch /data/redis_cluster/users.aclfile
cat > /data/redis_cluster/redis.conf << 'EOF'
port 6379
appendonly yes
dir /data/redis
maxmemory 1G
masterauth Redis123456
requirepass Redis123456
#以下两个参数是redis6的多线程开启,io-threads取值为总CPU数的75%。
io-threads 4
io-threads-do-reads yes
aclfile "/data/redis/users.aclfile"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
#io-threads的线程数,建议取值为总CPU数的75% (redis6)
io-threads 2
#开启IO多线程(redis)
io-threads-do-reads yes
#当负责一个槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用
cluster-require-full-coverage no
#副本backlog大小
repl-backlog-size 500m
#启动内存碎片整理
activedefrag yes
#内存碎片的字节数达到100MB时,开始清理
active-defrag-ignore-bytes 100mb
#存碎片空间占操作系统分配给Redis的总空间比例达到10%时,开始清理
active-defrag-threshold-lower 10
#自动清理过程CPU时间的比例不低于25%
active-defrag-cycle-min 25
#自动清理过程CPU时间的比例不高于75%,超过就止清理
active-defrag-cycle-max 75
#当空间不足时,会使用allkeys-lru进行内存回收,适合做缓存的策略
maxmemory-policy volatile-lru
#性能最好
appendfsync no
#连接超时,当连接没有数据传输时,主动断开连接
timeout 86400
#持久化策略900秒1次更新
save 900 1
#持久化策略300秒10次更新
save 300 10
#持久化策略60秒10000次更新
save 60 10000
#单位微秒,100毫秒视为慢
slowlog-log-slower-than 100000
#慢查询最大的条数,是个FIFO队列
slowlog-max-len 128
EOF
cat > /data/redis_cluster/startup.sh << 'EOF'
docker run -d \
--restart=always \
--name redis_cluster \
-v /etc/localtime:/etc/localtime \
-v /data/redis_cluster:/data/redis \
--network host \
redis:6.2.3 \
redis-server /data/redis/redis.conf
EOF
bash /data/redis_cluster/startup.sh
#进入redis_master容器,acl授权
sleep 5
docker exec -i redis_cluster redis-cli -p 6379 << 'EOF'
ACL SETUSER default on >Redis123456 +@all
ACL SETUSER xbzeng on >Redis123456 +@all
ACL save
EOF
2、slave
mkdir /data/redis_cluster_slave/ -p
touch /data/redis_cluster_slave//users.aclfile
cat > /data/redis_cluster_slave/redis.conf << 'EOF'
port 6380
appendonly yes
dir /data/redis
maxmemory 1G
masterauth Redis123456
requirepass Redis123456
#以下两个参数是redis6的多线程开启,io-threads取值为总CPU数的75%。
io-threads 4
io-threads-do-reads yes
aclfile "/data/redis/users.aclfile"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
#io-threads的线程数,建议取值为总CPU数的75% (redis6)
io-threads 2
#开启IO多线程(redis)
io-threads-do-reads yes
#当负责一个槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用
cluster-require-full-coverage no
#副本backlog大小
repl-backlog-size 500m
#启动内存碎片整理
activedefrag yes
#内存碎片的字节数达到100MB时,开始清理
active-defrag-ignore-bytes 100mb
#存碎片空间占操作系统分配给Redis的总空间比例达到10%时,开始清理
active-defrag-threshold-lower 10
#自动清理过程CPU时间的比例不低于25%
active-defrag-cycle-min 25
#自动清理过程CPU时间的比例不高于75%,超过就止清理
active-defrag-cycle-max 75
#当空间不足时,会使用allkeys-lru进行内存回收,适合做缓存的策略
maxmemory-policy allkeys-lru
#性能最好
appendfsync no
#连接超时,当连接没有数据传输时,主动断开连接
timeout 86400
#持久化策略900秒1次更新
save 900 1
#持久化策略300秒10次更新
save 300 10
#持久化策略60秒10000次更新
save 60 10000
#单位微秒,100毫秒视为慢
slowlog-log-slower-than 100000
#慢查询最大的条数,是个FIFO队列
slowlog-max-len 128
EOF
cat > /data/redis_cluster_slave/startup.sh << 'EOF'
docker run -d \
--restart=always \
--name redis_cluster_slave \
-v /etc/localtime:/etc/localtime \
-v /data/redis_cluster_slave:/data/redis \
--network host \
redis:6.2.3 \
redis-server /data/redis/redis.conf
EOF
bash /data/redis_cluster_slave/startup.sh
#进入redis_master容器,acl授权
sleep 5
docker exec -i redis_cluster_slave redis-cli -p 6380 << 'EOF'
ACL SETUSER default on >Redis123456 +@all
ACL SETUSER xbzeng on >Redis123456 +@all
ACL save
EOF
3、初始化redis cluster
注意ip的顺序
docker exec -i redis_cluster \
redis-cli --cluster create \
192.168.11.192:6379 \
192.168.11.193:6379 \
192.168.11.194:6379 \
192.168.11.193:6380 \
192.168.11.194:6380 \
192.168.11.192:6380 \
--cluster-replicas 1 \
-a Redis123456
4、验证集群
#查看集群状态:
docker exec -i redis_cluster \
redis-cli -c \
-h 192.168.11.192 \
-p 6379 \
-a Redis123456 \
cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:380
cluster_stats_messages_pong_sent:391
cluster_stats_messages_sent:771
cluster_stats_messages_ping_received:386
cluster_stats_messages_pong_received:380
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:771
#查看集群节点信息:
docker exec -i redis_cluster \
redis-cli -c \
-h 192.168.11.192 \
-p 6379 \
-a Redis123456 \
cluster nodes
f8d6ad254943c92977e16d6f19dce1e5f96515fa 192.168.11.193:6379@16379 master - 0 1629081529000 2 connected 5461-10922
778c77344a737541ea920c958d2c90a193ec8a4a 192.168.11.193:6380@16380 slave 6ce3015bae9de265e9498847b1f1419cf258dbe4 0 1629081527000 1 connected
1668f95766252b40a1e90ebbe4f11236016a9e06 192.168.11.194:6380@16380 slave f8d6ad254943c92977e16d6f19dce1e5f96515fa 0 1629081527484 2 connected
3530bbe241e5c90b34ec8a0c7cf58e9ee0982c62 192.168.11.194:6379@16379 master - 0 1629081527000 3 connected 10923-16383
6ce3015bae9de265e9498847b1f1419cf258dbe4 192.168.11.192:6379@16379 myself,master - 0 1629081528000 1 connected 0-5460
a10c5a473ec6ae1e87162d52193f83a0db4d199d 192.168.11.192:6380@16380 slave 3530bbe241e5c90b34ec8a0c7cf58e9ee0982c62 0 1629081529604 3 connected
5、redis web管理工具
#安装mysql
mkdir /data/mysql/{etc,data,log} -p
chown 999 /data/mysql/log
cat >/data/mysql/etc/my.cnf << 'EOF'
[mysqld]
skip-host-cache
skip-name-resolve
skip_ssl
datadir=/var/lib/mysql
secure-file-priv=/var/lib/mysql-files
collation-server=utf8_bin
character-set-server=utf8
init_connect='set names utf8'
user=mysql
port=3306
max_connections=2000
group_concat_max_len=102400
max_allowed_packet=256M
#symbolic-links=0
log-bin=mysql-bin
server-id=1 #主库server-id为1,备库server-id为2
binlog_format=row
relay-log-purge=0
#read_only=1 #备库配置
#log-slave-updates=true #备库配置
#skip-slave-start=1 #备库配置
binlog-ignore-db=mysql
replicate-ignore-db=mysql
####半自动同步+GTID
gtid-mode=on
enforce-gtid-consistency=1
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 2000
rpl_semi_sync_slave_enabled = 1
################### Slow Log ######################
slow_query_log = ON
# 开启慢查询日志
slow_query_log_file = /var/log/mysql/slow.log
# 慢查询日志存放路径
long_query_time = 10
# 超过10秒的查询,记录到慢查询日志,默认值10
log_queries_not_using_indexes = ON
# 没有使用索引的查询,记录到慢查询日志,可能引起慢查询日志快速增长
log_slow_admin_statements = ON
# 执行缓慢的管理语句,记录到慢查询日志
# 例如 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
################### Error Log ####################
log_error = /var/log/mysql/error.log
# 错误日志存放路径
log_error_verbosity = 2
# 全局动态变量,默认3,范围:1~3
# 表示错误日志记录的信息,1:只记录error信息;2:记录error和warnings信息;3:记录error、warnings和普通的notes信息
EOF
cat > /data/mysql/start.sh << 'EOF'
docker run -itd \
-e MYSQL_ROOT_PASSWORD=Mysql123456 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/etc/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /etc/localtime:/etc/localtime:ro \
--name mysql-server \
--network host \
--restart=always \
biarms/mysql:5.7.30
EOF
bash /data/mysql/start.sh
docker exec -it mysql-server mysql -uroot -pMysql123456 -e 'CREATE DATABASE `redis_manager` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;'
mkdir -p /data/redis-manager/
cat > /data/redis-manager/start.sh << 'EOF'
docker run -d \
--net=host \
--name redis-manager \
-e DATASOURCE_DATABASE='redis_manager' \
-e DATASOURCE_URL='jdbc:mysql://127.0.0.1:3306/redis_manager?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8' \
-e DATASOURCE_USERNAME='root' \
-e DATASOURCE_PASSWORD='Mysql123456' \
reasonduan/redis-manager
EOF
bash /data/redis-manager/start.sh
浏览器输入 192.168.11.192:8182 即可
默认用户名/密码:admin/admin
6 、 代理
1、redis cluster proxy
2、camellia-redis-proxy
3、twemproxy
4、predixy
5、bilibili-overlord
- predixy代理
mkdir -p /data/predixy/conf
cd /data/predixy
wget https://github.com/joyieldInc/predixy/releases/download/1.0.5/predixy-1.0.5-bin-amd64-linux.tar.gz
tar zxvf predixy-1.0.5-bin-amd64-linux.tar.gz --strip-components 1
cat > /data/predixy/conf/auth.conf << 'EOF'
Authority {
Auth "redis" {
Mode write
}
Auth "Redis123456" {
Mode admin
}
}
EOF
cat > /data/predixy/conf/predixy.conf << 'EOF'
Name Predixy
Bind /tmp/predixy
Bind 0.0.0.0:7617
WorkerThreads 3
ClientTimeout 300
LogVerbSample 0
LogDebugSample 0
LogInfoSample 10000
LogNoticeSample 1
LogWarnSample 1
LogErrorSample 1
Include auth.conf
Include cluster.conf
Include latency.conf
EOF
cat > /data/predixy/conf/cluster.conf << 'EOF'
ClusterServerPool {
Password Redis123456
MasterReadPriority 0
StaticSlaveReadPriority 50
DynamicSlaveReadPriority 50
RefreshInterval 1
ServerTimeout 1
ServerFailureLimit 10
ServerRetryTimeout 1
KeepAlive 120
Servers {
+ 192.168.11.192:6379
+ 192.168.11.193:6379
+ 192.168.11.194:6379
+ 192.168.11.193:6380
+ 192.168.11.194:6380
+ 192.168.11.192:6380
}
}
EOF
cat > /data/predixy/conf/latency.conf << 'EOF'
LatencyMonitor all {
Commands {
+ all
- blpop
- brpop
- brpoplpush
}
TimeSpan {
+ 100
+ 200
+ 300
+ 400
+ 500
+ 600
+ 700
+ 800
+ 900
+ 1000
+ 1200
+ 1400
+ 1600
+ 1700
+ 1800
+ 2000
+ 2500
+ 3000
+ 3500
+ 4000
+ 4500
+ 5000
+ 6000
+ 7000
+ 8000
+ 9000
+ 10000
}
}
LatencyMonitor get {
Commands {
+ get
}
TimeSpan {
+ 100
+ 200
+ 300
+ 400
+ 500
+ 600
+ 700
+ 800
+ 900
+ 1000
}
}
LatencyMonitor set {
Commands {
+ set
+ setnx
+ setex
}
TimeSpan {
+ 100
+ 200
+ 300
+ 400
+ 500
+ 600
+ 700
+ 800
+ 900
+ 1000
}
}
LatencyMonitor blist {
Commands {
+ blpop
+ brpop
+ brpoplpush
}
TimeSpan {
+ 1000
+ 2000
+ 3000
+ 4000
+ 5000
+ 6000
+ 7000
+ 8000
+ 9000
+ 10000
+ 20000
+ 30000
+ 40000
+ 50000
+ 60000
+ 70000
+ 80000
+ 90000
+ 100000
}
}
EOF
cat > /data/predixy/start.sh << 'EOF'
#!/bin/bash
ps aux|grep `pwd`/bin/predixy|awk '{print $2}'|xargs kill
`pwd`/bin/predixy `pwd`/conf/predixy.conf &
EOF
bash /data/predixy/start.sh
#使用docker启动(mark)
cat > /data/predixy/start_predixy.sh << 'EOF'
#!/bin/bash
docker rm -f predixy
docker run -d \
--restart=always \
--name predixy \
-v /etc/localtime:/etc/localtime \
-v `pwd`/conf:/etc/predixy/conf \
-p 7617:7617 \
haandol/predixy:latest
EOF
bash /data/predixy/start_predixy.sh
predixy详细配置:
https://github.com/joyieldInc/predixy/blob/master/doc/config_CN.md
redis压测:
https://github.com/joyieldInc/predixy/blob/master/doc/bench/redis/benchmark_with_redis_CN.md
更多推荐
所有评论(0)