阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis 5.0 Cluster集群带认证及客户端连接

119次阅读
没有评论

共计 8210 个字符,预计需要花费 21 分钟才能阅读完成。

Redis 在 3.0 版正式引入 redis-cluster 集群这个特性。Redis 集群是一个提供在多个 Redis 间节点间共享数据的程序集。Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 内存 K / V 服务,集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),比如 Redis 集群并不支持处理多个 keys 的命令,因为这需要在不同的节点间移动数据,从而达不到像 Redis 那样的性能,在高负载的情况下可能会导致不可预料的错误。还有比如 set 里的并集(unions)和交集(intersections)操作,就没有实现。通常来说,那些处理命令的节点获取不到键值的所有操作都不会被实现。在将来,用户或许可以通过使用 MIGRATE COPY 命令,在集群上用计算节点(Computation Nodes)来执行多键值的只读操作,但 Redis 集群本身不会执行复杂的多键值操作来把键值在节点间移来移去。Redis 集群不像单机版本的 Redis 那样支持多个数据库,集群只有数据库 0,而且也不支持 SELECT 命令。Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。

Redis 集群的优点:

无中心架构,分布式提供服务。数据按照 slot 存储分布在多个 redis 实例上。增加 slave 做 standby 数据副本,用于 failover,使集群快速恢复。实现故障 auto failover,节点之间通过 gossip 协议交换状态信息;投票机制完成 slave 到 master 角色的提升。支持在线增加或减少节点。降低硬件成本和运维成本,提高系统的扩展性和可用性。

Redis 集群的缺点:

client 实现复杂,驱动要求实现 smart client,缓存 slots mapping 信息并及时更新。目前仅 JedisCluster 相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”。客户端的不成熟,影响应用的稳定性,提高开发难度。节点会因为某些原因发生阻塞 (阻塞时间大于 clutser-node-timeout),被判断下线。这种 failover 是没有必要,sentinel 也存在这种切换场景。

#hosts 文件配置

cat >> /etc/hosts << EOF
192.168.5.65 redis65
192.168.5.66 redis65
EOF

一、搭建 redis5.0 集群

从 redis 3.0 之后版本支持 redis-cluster 集群,redis-4.0.0 开始支持 module,redis-5.0.0 开始支持类似于 kafka 那样的消息队列,Redis-Cluster 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。这样就可以很好的保证 redis 的高可用性,下面就来部署个 Redis Cluster,在两台服务器上部署 6 个 redis 节点

IP 和端口配置文件名

192.168.5.65:600165_6001/redis.conf

192.168.5.65:600265_6002/redis.conf

192.168.5.65:600365_6003/redis.conf

192.168.5.66:600166_6001/redis.conf

192.168.5.66:600266_6002/redis.conf

192.168.5.66:600366_6003/redis.conf

1、修改系统参数

# 修改最大可打开文件数

cat >> /etc/security/limits.conf << EOF
* soft nofile 102400
* hard nofile 102400
EOF
 

#TCP 监听队列大小

echo "net.core.somaxconn = 32767" >> /etc/sysctl.conf
sysctl -p
 

#OOM 相关:vm.overcommit_memory

echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
 

# 开启内核的“Transparent Huge Pages (THP)”特性

echo never > /sys/kernel/mm/transparent_hugepage/enabled
 

# 请将“echo never > /sys/kernel/mm/transparent_hugepage/enabled”加入到文件 /etc/rc.local 中

2、安装 redis 并配置 redis-cluster

[root@redis65 /]# cd /opt
[root@redis65 /]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz
[root@redis65 /]# tar -zxvf redis-5.0.0.tar.gz
[root@redis65 /]# cd redis-5.0.0/
[root@redis65 /]# make
[root@redis65 /]# make install PREFIX=/usr/local/redis-cluster

# 创建实例目录

[root@redis65 redis-5.0.0]# mkdir -p /usr/local/redis-cluster/{65_6001,65_6002,65_6003}
[root@redis66 redis-5.0.0]# mkdir -p /usr/local/redis-cluster/{66_6001,66_6002,66_6003}

# 配置官方配置文件,去掉 #开头的和空格行

cat redis.conf |grep -v ^# |grep -v ^$

#redis65 6001 配置文件

[root@redis65 /]#cd /usr/local/redis-cluster
[root@redis65 redis-cluster]# cat >> 65_6001/redis.conf << EOF
bind 0.0.0.0
protected-mode no
port 6001
daemonize no
dir /usr/local/redis-cluster/65_6001
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/65_6001/nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/redis-cluster/65_6001/redis.pid
logfile /usr/local/redis-cluster/65_6001/redis.log
EOF

#redis65 6002 配置文件

[root@redis65 redis-cluster]# sed 's/6001/6002/g' 65_6001/redis.conf > 65_6002/redis.conf

#redis65 6003 配置文件

[root@redis65 redis-cluster]# sed 's/6001/6003/g' 65_6001/redis.conf > 65_6003/redis.conf

# 写一个启动脚本 start-redis-cluster.sh

[root@redis65 /]#cat /usr/local/redis-cluster/start-redis-cluster.sh
#!/bin/sh
REDIS_HOME=/usr/local/redis-cluster
$REDIS_HOME/bin/redis-server $REDIS_HOME/65_6001/redis.conf
$REDIS_HOME/bin/redis-server $REDIS_HOME/65_6002/redis.conf
$REDIS_HOME/bin/redis-server $REDIS_HOME/65_6003/redis.conf
 
chmod +x /usr/local/redis-cluster/start-redis-cluster.sh
/usr/local/redis-cluster/start-redis-cluster.sh
 

#redis66 6001 配置文件

[root@redis66 /]# cd /usr/local/redis-cluster
[root@redis66 redis-cluster]# cat >> 66_6001/redis.conf << EOF
bind 0.0.0.0
protected-mode no
port 6001
daemonize no
dir /usr/local/redis-cluster/66_6001
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/66_6001/nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/redis-cluster/66_6001/redis.pid
logfile /usr/local/redis-cluster/66_6001/redis.log
EOF
 

#redis66 6002 配置文件

[root@redis66 redis-cluster]# sed 's/6001/6002/g' 66_6001/redis.conf > 66_6002/redis.conf
 

#redis66 6003 配置文件

[root@redis66 redis-cluster]# sed 's/6001/6003/g' 66_6001/redis.conf > 66_6003/redis.conf
 
[root@redis66 /]#cat /usr/local/redis-cluster/start-redis-cluster.sh
 
#!/bin/sh
REDIS_HOME=/usr/local/redis-cluster
$REDIS_HOME/bin/redis-server $REDIS_HOME/66_6001/redis.conf
$REDIS_HOME/bin/redis-server $REDIS_HOME/66_6002/redis.conf
$REDIS_HOME/bin/redis-server $REDIS_HOME/66_6003/redis.conf
 
chmod +x /usr/local/redis-cluster/start-redis-cluster.sh
 

# 启动 redis

/usr/local/redis-cluster/start-redis-cluster.sh
 

Redis 5.0 Cluster 集群带认证及客户端连接

Redis 5.0 Cluster 集群带认证及客户端连接

# 查看 redis 进程启动状态

ps -ef | grep redis

Redis 5.0 Cluster 集群带认证及客户端连接

Redis 5.0 Cluster 集群带认证及客户端连接

# 创建 redis cluster,如果只是想快速创建和启动 redis 集群,可使用 redis 官方提供的脚本 create-cluster,注意 redis-5.0.0 版本开始才支持“–cluster”

cd /usr/local/redis-cluster/bin
./redis-cli --cluster create 192.168.5.65:6001 192.168.5.65:6002 192.168.5.65:6003 192.168.5.66:6001 192.168.5.66:6002 192.168.5.66:6003 --cluster-replicas 1
 

Redis 5.0 Cluster 集群带认证及客户端连接

如果配置项 cluster-enabled 的值不为 yes,则执行时会报错“[ERR] Node 192.168.5.65:6001 is not configured as a cluster node.”。这个时候需要先将 cluster-enabled 的值改为 yes,然后重启 redis-server 进程,之后才可以重新执行 redis-cli 创建集群。

redis-cli 的参数说明:

1) create

表示创建一个 redis 集群。

2) –cluster-replicas 1

表示为集群中的每一个主节点指定一个从节点,即一比一的复制

# 查看 redis 进程是否已切换为集群状态(cluster)

ps -ef|grep redis
 

# 停止 redis 实例,直接使用 kill 命令即可

kill -9 15025
 

# 命令行工具 redis-cli

[root@redis65 /]# ln -s /usr/local/redis-cluster/bin/redis-cli /bin/redis-cli
[root@redis65 bin]# redis-cli -c -p 6001
 

# 查看集群中的节点:

127.0.0.1:6001> cluster nodes
 

Redis 5.0 Cluster 集群带认证及客户端连接

127.0.0.1:6002> set name 65-7001
-> Redirected to slot [5798] located at 192.168.5.66:6001
OK
192.168.5.66:6001> quit
[root@redis65 bin]# redis-cli -c -p 6003
127.0.0.1:6003> get name
-> Redirected to slot [5798] located at 192.168.5.66:6001
"65-7001"
 
[root@redis65 bin]# redis-cli -h 192.168.5.66 -p 6002
 

# 检查节点状态

[root@redis65 bin]# redis-cli --cluster check 192.168.5.66:6001
 

Redis 5.0 Cluster 集群带认证及客户端连接

# 查看集群信息

[root@redis65 bin]# redis-cli -c -p 6003
127.0.0.1:6003> cluster info
 

# 给 redis cluster 集群加上认证,登录到 redis 节点执行下面的操作

[root@redis65 /]# redis-cli -h 192.168.5.65 -p 6001 -c
> config set masterauth zxc789
> config set requirepass zxc789
> auth zxc789
> config rewrite
 

Redis 5.0 Cluster 集群带认证及客户端连接

# 各个节点都完成上面的 3 条 config 操作,重启 redis 各节点,看下各节点的 redis.conf,可以发现最后多了 3 行内容

[root@redis65 /]# killall redis-server
[root@redis65 /]# /usr/local/redis-cluster/start-redis-cluster.sh
[root@redis66 ~]# cat /usr/local/redis-cluster/66_6001/redis.conf
 

Redis 5.0 Cluster 集群带认证及客户端连接

# 加了认证的 redis 登录

redis-cli -h 192.168.5.65 -p 6001 -c -a 'zxc789'
 

二、安装 php 的 redis 扩展

1、在现有的 web 服务器上安装 php 的 redis 扩展

[root@web33 ~]# cd /opt
[root@web33 opt]# wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip
[root@web33 opt]# unzip master.zip
[root@web33 opt]# cd phpredis-master/
[root@web33 phpredis-master]# /usr/local/php/bin/phpize
[root@web33 phpredis-master]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@web33 phpredis-master]# make && make install
 

# 这里进行 make 的时候报错

Redis 5.0 Cluster 集群带认证及客户端连接

 

2、那是因为最新的 phpredis 分了几大分支, 针对最新的 PHP 稳定发行版 php7 有专门为 php7 的分支,所以我们从 github 拉下 phpredis 源码 需要切换到 PHP7 的分支 首先 git clone phpredis 下来

[root@web33 ~]# cd /opt
[root@web33 ~]# git clone https://github.com/nicolasff/phpredis
[root@web33 ~]# git checkout php7
[root@web33 opt]# cd phpredis
[root@web33 phpredis]# /usr/local/php/bin/phpize
[root@web33 phpredis]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@web33 phpredis]# make && make install
 

3、修改 php.ini 加上“extension=redis.so”

vi /usr/local/php/etc/php.ini
extension = "redis.so"
 

4、重启 php-fpm

/etc/init.d/php-fpm restart
 

# 用 phpinfo 验证下 redis 扩展是否安装成功

Redis 5.0 Cluster 集群带认证及客户端连接

5、单实例 redis 通过 php 连接测试 
 
<?php
    // 连接 192.168.5.65 的 Redis 服务
   $redis = new Redis();
   $redis->connect('192.168.5.65', 6001);
   $redis->auth('zxc789'); //redis 认证
   echo "Connection to server sucessfully";
         // 查看服务是否运行
   echo "Server is running:" . $redis->ping();
?>
 

# 执行脚本,输出结果为:

Connection to server sucessfully

Server is running: PONG

 

6、Java 操作 Redis cluster 集群可使用 jredis,PHP 要操作 redis cluster 集群有两种方式

  1)使用 phpredis 扩展,这是个 c 扩展,性能更高,但是这个方案参考资料很少

  2)使用 predis,纯 php 开发,使用了命名空间,需要 php5.3+,灵活性高, 我这里用的是 predis,下载地址 https://github.com/nrk/predis

[root@web33 tmp]# git clone https://github.com/nrk/predis.git
#将 predis 放到网站根目录下
[root@web33 tmp]# mv predis /data/www/predis
[root@web33 tmp]# cd /data/www/
 

[root@web33 www]# cat predis.php

<?php
require 'predis/autoload.php';// 引入 predis 相关包  
//redis 实例  
$servers = array(  
    'tcp://192.168.5.65:6001',  
    'tcp://192.168.5.65:6002',  
    'tcp://192.168.5.65:6003',  
    'tcp://192.168.5.66:6001',  
    'tcp://192.168.5.66:6002',  
    'tcp://192.168.5.66:6003',  
); 
$options = ['cluster' =>'redis','parameters' => ['password' => 'zxc789']];
$client = new Predis\Client($servers,$options);
$client->set('name1', '1111111');
$client->set('name2', '2222222');
$client->set('name3', '3333333');
$name1 = $client->get('name1');
$name2 = $client->get('name2');
$name3 = $client->get('name3');
var_dump($name1, $name2, $name3);die;
?>
 

Redis 5.0 Cluster 集群带认证及客户端连接

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计8210字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中