前段时间DB同事离职,交接了redis服务器,顺便研究了下这种模式下的redis集群。
操作系统配置
vim /etc/rc.local
echo 511 > /proc/sys/net/core/somaxconn
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
redis 安装
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
ln -s redis-5.0.5 redis
cd redis
make
make install
mkdir -p /opt/redis_data/{data,conf,log}
配置redis.conf
bind 0.0.0.0
##关闭后允许远程连接
protected-mode no
port 6379
##未被 accept 的 TCP 连接的队列长度
tcp-backlog 511
##后台方式运行
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/opt/redis_data/log/redis_7383.log"
dbfilename dump_6379.rdb
dir /opt/redis_data/data
##启用集群模式
cluster-enabled yes
cluster-config-file nodes-6379.conf
##集群节点的超时时限
cluster-node-timeout 15000
各个配置文件均放在 /opt/redis_data/conf 中,配置文件名加上对应端口号。这里取的端口号是从 6379-6384
启动各个 redis 节点
redis-server redis_63XX.conf
配置 redis cluster
在 redis 4 之前均是依赖 redis-trib.rb 来配置 redis cluster,在redis 5 之后,则可以使用 redis-cli 来实现 redis-trib.rb 的功能。这里使用的是 redis 5 版本,通过 redis_cli 来搭建集群。
##创建集群 **6379 6380 6381 是master节点 6382 6383 6384是salve节点**
这里说明一下,因为我是自己搭建的 所以全部节点都是在一台服务器上 只是启动了不同的端口来实现集群测试,因此,这里的127.0.0.1 代表的其实是集群节点的IP地址。
先添加三个 master 节点,然后再添加对应的从节点,使用 redis-cli --cluster create xxx --cluster-replicas 1 搭建的集群,主从关系是在保证尽量不在同一台的情况下任意分配的,有时可能不是我们希望的。那就可以先添加主节点,然后安排对应的从节点,使用 redis-cli --cluster add-node --cluster-slave --cluster-master-id 即可。
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
##添加从节点
其中 83ff9f8d3413e7999253d3dc3f89f79998526354 是 master 节点的 id,127.0.0.1:6382 是从节点,而最后的 127.0.0.1:6379 是集群中master任意节点。 集群中节点 id 的获取,可以通过 redis-cli -p 6379 cluster nodes 命令查看。
redis-cli --cluster add-node --cluster-slave --cluster-master-id 83ff9f8d3413e7999253d3dc3f89f79998526354 127.0.0.1:6382 127.0.0.1:6379
如此添加其他从节点即可,最后就组成了希望的主从关系。
如果希望它自己自由分配的话可以使用下边命令:
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
配置完成后,可通过下面命令查看集群信息:
##查看集群信息
redis-cli -p 6379 cluster info
##查看节点信息
redis-cli -p 6379 cluster nodes
redis cluster 常用命令:
##创建集群
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas 1
##检查集群 slot 分配情况,是否全覆盖
redis-cli --cluster check host1:port1
##修复集群出现 slot 分配异常的问题
redis-cli --cluster fix host1:port1
##检查集群节点信息
redis-cli --cluster info host1:port1
##分配 slot
redis-cli --cluster reshard host1:port1
##检查节点中 slot 分配是否均衡
redis-cli --cluster rebalance host1:port1
##添加从节点
redis-cli --cluster add-node --cluster-slave --cluster-master-id 83ff9f8d3413e7999253d3dc3f89f79998526354 127.0.0.1:6382 127.0.0.1:6379
##删除节点,删除前要先移走对应的 slot
redis-cli --cluster del-node host1:port1 node_id
predixy的安装和配置:
predixy 是高性能的适用于 redis 集群和哨兵的代理。
predixy github 地址:https://github.com/joyieldInc/predixy
predixy 编译安装需要 C++11 版本的编译器,至少需要 CentOS 7及以上版本才能编译安装。对于 CentOS 6或更低版本,可以直接使用在 github release 中的二进制版本。
##安装
tar -xzf predixy-1.0.5-bin-amd64-linux.tar.gz
mv predixy-1.0.5 /usr/local/
cd /usr/local/predixy-1.0.5/conf/
修改里边的两个配置文件:predixy.conf cluster.conf
###predixy 支持多种架构,由于使用的是 redis cluster,只需配置 redis cluster 对应的配置文件cluster.conf 即可。
内容如下:
ClusterServerPool {
MasterReadPriority 60
StaticSlaveReadPriority 50
DynamicSlaveReadPriority 50
RefreshInterval 1
ServerTimeout 1
ServerFailureLimit 10
ServerRetryTimeout 1
KeepAlive 120
Servers {
+ 127.0.0.1:6379
+ 127.0.0.1:6380
+ 127.0.0.1:6381
+ 127.0.0.1:6382
+ 127.0.0.1:6383
+ 127.0.0.1:6384
}
}
在 Servers 部分配置集群中任意一个节点即可,predixy 会自动发现整个集群的信息,即使配置的节点挂掉后,predixy 代理仍然可正常工作。通过自动发现集群,可以减少 cluster.conf 配置文件的修改及对 predixy 的重启操作。但 predixy 无法删除曾经自动发现的节点,如果某节点下掉,predixy 仍会看到之前的节点,虽然不影响正常使用,日志则会不断报出错误信息。需重启 predixy 解决。
配置 predixy.conf
Name Predixy001
Bind 0.0.0.0:7617
Include cluster.conf
注意 Include 部分,只需包括 cluster.conf,其他的则注释掉,否则可能会影响到 predixy的使用。
启动predixy
cd /usr/local/predixy-1.0.5/bin/
cp predixy /usr/local/bin/
##启动
nohup predixy predixy.conf > /tmp/predixy.log 2>&1 &
##查看日志
tail -f /tmp/predixy.log
predixy 添加环境变量,在 /etc/profile 中添加,然后在 /etc/rc.local 中设置开机启动 nohup predixy /usr/local/predixy-1.0.5/conf/predixy.conf > /tmp/predixy.log 2>&1 &
##可以看到集群的信息
redis-cli -p 7617 info
参数说明:
MasterReadPriority,StaticSlaveReadPriority,DynamicSlaveReadPriority 三个参数和 redis 本身配置文件中的 slave-priority 没任何关系的。 如果是自动发现找到的节点,则 DynamicSlaveReadPriority 会起作用,如果是直接配置的节点,则 StaticSlaveReadPriority 会起作用。
Master/SlaveReadPriority |
Master |
Slave1 |
Slave2 |
Fail-over notes |
---|---|---|---|---|
60/50 | all requests | 0 requests | 0 requests | Master dead, read requests deliver to slave until master(maybe new master) alive |
60/0 | all requests | 0 requests | 0 requests | Master dead, all requests fail |
50/50 | all write requests, 33.33%read requests | 33.33% read requests | 33.33% read requests | - |
0/50 | all write requests, 0 read requests | 50% read requests | 50% read requests | all slaves dead, all read requests fail |
10/50 | all write requests, 0 read requests | 50% read requests | 50% read requests | all slaves dead, read requests deliver to master |
RefreshInterval : predixy 获取节点信息和集群 hash slot 集群信息的间隔 ServerFailureLimit : predixy 停止路由到节点之前失败的次数 ServerTimeout : 单个命令执行的超时时间