redis cluster分布式搭建和使用

redis cluster 分布式
前提因为redis cluster 采用主从备份机制,所以要求至少6个redis实例节点才可组建,可以同一台机器6个端口或N台机器,自由灵活实现
搭建:
1.安装redis
wget http://download.redis.io/releases/redis-6.0.1.tar.gz
tar xzf redis-6.0.1.tar.gz
cd redis-6.0.1
make PREFIX=/usr/local/redis install //安装到/usr/local/redis目录

如果安装过程中提示ruby版本低需要升级
yum -y install ruby ruby-devel rubygems rpm-build
yum install -y centos-release-scl-rh
yum install -y rh-ruby25
scl enable rh-ruby25 bash

因为要使用 Ruby 工具,所以要先保证有 Ruby 环境,并且安装 Redis 插件
yum -y install ruby ruby-devel rubygems
gem install redis
gem install redis-3.2.1.gem

2.配置
修改redis.conf 文件配置项:
bind 0.0.0.0 // 测试环节,任何地址都可连接
port 6379 // 修改成对应的端口号
daemonize yes // 后台运行
pidfile /var/run/redis_6379.pid // pid文件
logfile "./redis.log" // 日志
appendonly yes // 开启 aop 备份
appendfsync always // 每写一条 备份 一次
cluster-enabled yes // 开启 Redis Cluster
cluster-config-file nodes-6379.conf // 记录集群信息,不用手动维护,Redis Cluster 会自动维护
cluster-node-timeout 15000 // Cluster 超时时间
cluster-require-full-coverage no // 只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no

以上文件需要在每个实例中配置,然后启动每一个实例 。
bin/redis-server etc/redis.conf

Redis Cluster 常用命令
cluster nodes 查看集群节点信息
cluster replicate <master-id> 进入一个从节点 Redis,切换其主节点,好像合集需要在从节点中执行
cluster failover 手动故障转移 可将slave节点变更为master,在从节点中使用此合集可将从节点升级为master节点
cluster forget <id> 忽略一个节点,前提是他不能是有 Solts 的主节点
cluster keyslot :计算键 key 应该被放置在哪个槽上。 如 cluster keysolt "name1" 结果为solt的id 可以根据cluster nodes 信息查询节点具体的槽,可以追寻到哪台机器上

创建集群:
bin/redis-cli --cluster create 192.168.0.110:6379 192.168.0.112:6379 192.168.0.113:6379 192.168.0.114:6379 192.168.0.116:6379 192.168.0.117:6379 --cluster-replicas 1

进入redis群集里的某一台
bin/redis-cli -c -h 192.168.0.110

添加节点:
bin/redis-cli --cluster add-node 192.168.0.112:6379 192.168.0.110:6379 --cluster-slave --cluster-master-id 42b5a2bb7e79cab2ed9e8578ca630ae7cc37bb9c
才上合集是为192.168.0.110添加从节点192.168.0.112

给指定机器分配插槽
第一步:bin/redis-cli --cluster reshard 192.168.0.118:6379 (连接集群中任意一个可用结点都行)
第二步:输入要分配的槽数量 How many slots do you want to move (from 1 to 16384)? 1000
第三步:输入接收槽的结点id What is the receiving node ID?
第四步:输入源结点id
输入源结点id,槽将从源结点中拿,分配后的槽在源结点中就不存在了。
输入all表示从所有源结点中获取槽。
输入done取消分配。
这里输入all
第五步:输入yes开始移动槽到目标结点id
第六步:查看结点信息

redis cluster 宕机情况:
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

redis.conf 配置的 redis-cluster 之cluster-require-full-coverage,
当cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,此种情况下,如果查询的key不在丢失的插槽里,依旧可以正常访问。如果key在fail主机的的插槽里则无法正常使用。
当cluster-require-full-coverage为yes时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群不可用

遇到的问题以及解决方法:
问题1:Node 192.168.10.204:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
这个是因为要新增的那个 Redis 节点中有原来残留的数据信息,新增前请把 AOF 和 RDB 备份的文件都删除掉,并且进入准备新增的 Redis 中执行一下下面两条命令
127.0.0.1:6379> FLUSHALL
127.0.0.1:6379> CLUSTER RESET
或者
先关闭redis删除 redis目录如下文件:
rm -f dump.rdb
rm -f nodes-6379.conf

PHP操作redis cluser 有两种方式
$servers = [
"192.168.0.110:6379",
"192.168.0.112:6379",
"192.168.0.113:6379",
"192.168.0.114:6379",
"192.168.0.116:6379",
"192.168.0.117:6379",
];
1.phpredis扩展
$client = new RedisCluster(NUll,$servers);
$client->set("name1", "22");
$name1 = $client->get('name1');
var_dump($name1);
2predis扩展
下载predis扩展包
require __DIR__.'/predis/autoload.php';
$options = array('cluster' => 'redis');
$client = new Predis\Client($servers, $options);
$client->set("test1", "tank12");
$result = $client->get("test1");
var_dump($result);