前段时间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 : 单个命令执行的超时时间