集群规划: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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐