Redis Cluster部署

环境

概述:

生产级Redis Cluster
集群中每个节点负责整个集群的一部分数据,每个节点上的数据多少可能不一样,节点之间通过一种特殊的二进制协议交互集群信息
Redis Cluster将所有数据划分为多个槽位,每个节点负责其中一部分槽位,槽位信息存储于每个节点中,当redis客户端来连接集群时,也会得到一份集群的槽位配置信息,这样当客户端要查找某个key时,可以直接定位到目标节点。
客户端为了可以直接找到具体key所在的节点,需要缓存槽位相关信息,这样就可快速定位到相对应的节点,同时可能存在客户端与服务器存储槽位信息不一致的情况,故需要纠正机制来实现槽位信息的校验调整

环境:
在这里插入图片描述

环境初始化

redis-master

hostname redis-master
bash
iptables -F
setenforce 0
systemctl stop firewalld
mount /dev/sr0 /media/cdrom/

redis-slave

hostname redis-master
bash
iptables -F
setenforce 0
systemctl stop firewalld
 mount /dev/sr0 /media/cdrom/

redis环境部署

redis-master上的操作
yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
然后输入rz命令从本地拿取一个叫redis-4.0.10.tar.gz的包
指定解压路径

  tar xf redis-4.0.10.tar.gz -C /usr/src/

cd到改目录下

cd /usr/src/redis-4.0.10/

编译

make

#避免碎片和可伸缩的并发支持

 make MALLOC=jemalloc

安装到/usr/local/redis

 make PREFIX=/usr/local/redis install

在/usr/localredis/里创建一个配置文件

mkdir -p /usr/local/redis/conf

复制当前目录包里的哨兵配置文件到该目录下

cp sentinel.conf /usr/local/redis/conf/ 

优化redis程序命令第一个是将redis-cluster的集群创建工具,第二条命令是将命令软连接方便操作

cp src/redis-trib.rb /usr/local/redis/bin/  
 ln -s /usr/local/redis/bin/* /usr/local/bin/	

复制包里的redis.conf配置文件到该目录下

 cp redis.conf /usr/local/redis/conf/	

到该目录下做一个备份(防止坏了用来恢复)

cd /usr/local/redis/
 cp conf/redis.conf{,.bak}

优化下配置文件去掉了#和空格

 egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf

系统调优配置
下面第一部分是启用透明大页面压缩优化

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local

下面第二部分是文件并发数、监听队列、内存分配
调整并发数10240

echo "* - nofile 10240" >> /etc/security/limits.conf 

监听队列

echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf

0内存不够,就会拒绝申请
1物理内存都允许分配给你,只要有内存就给你用,这样可以避免申请内存失败的问题

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

上面redis-master环境就好了,下面redis-slave安装下软件连接下命令就好了
redis-slave上的操作

 yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
 rz
 tar -xf redis-4.0.10.tar.gz -C /usr/src
 make
 make MALLOC=jemalloc
 make PREFIX=/usr/local/redis install
 ln -s /usr/local/redis/bin/* /usr/local/bin/

redis多实例配置

redis-master上的操作
mkdir -p /data/redis-cluster
cd /data/redis-cluster
 mkdir 7000 7001 7002
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7000/

把各里面各项参数改成相应的7000即可
vim /7000/redis.conf

cluster-enabled yes
bind 0.0.0.0
port 7000
pidfile /data/redis-cluster/7000/redis.pid
logfile "/data/redis-cluster/7000/redis.log"
dir /data/redis-cluster/7000/
tcp-backlog 1024
timeout 0
tcp-keepalive 0
daemonize yes
loglevel notice
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

把这个文件分别传给7001、7002并修改文件把7000改成7001
cp 7000/redis.conf 7001/
cp 7000/redis.conf 7002/
vim 7001/redis.conf
:%s/7000/7001/g
vim 7002/redis.conf
:%s/7000/7002/g
启动三个端口

 redis-server /data/redis-cluster/7001/redis.conf 
 redis-server /data/redis-cluster/7002/redis.conf 
 redis-server /data/redis-cluster/7000/redis.conf 

然后看一下端口是否起来

在这里插入图片描述
我们在去redis-slave上操作

 mkdir -p /data/redis-cluster
cd /data/redis-cluster
mkdir 8000 8001 8002

这里我们在redis-master上用scp把7000/redis.conf传给redis-slave

scp 7000/redis.conf  192.168.200.112:/data/redis-cluster/8000/
scp 7000/redis.conf  192.168.200.112:/data/redis-cluster/8001/
scp 7000/redis.conf  192.168.200.112:/data/redis-cluster/8002/

回到redis-slave上修改该三个文件对应参数
后启动三个端口

redis-server /data/redis-cluster/8001/redis.conf 
redis-server /data/redis-cluster/8002/redis.conf 
 redis-server /data/redis-cluster/8000/redis.conf 

查看端口是否启动

netstat -anptl |grep redis

在这里插入图片描述

构建redis cluster集群

redis-master上的操作
rz拿取ruby2.5.1tar包

rz

解压并指定路径

tar -xf ruby-2.5.1.tar.gz  -C /usr/src/

到该路径下进行配置、编译、安装

cd /usr/src/ruby-2.5.1/
 ./configure && make && make install

查看ruby版本

 ruby --version

在线安装ruby的redis扩展

/usr/local/bin/gem install redis

创建集群

redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

查看cluster集群的构建节点信息

 redis-cli -p 7000 cluster nodes


使用redis-cli去操作集群,需要加入-c参数

 redis-cli -c -p 7000

name存到了7001,age存到了7000
在这里插入图片描述
exit推出后,去中心化,随意一个入口都能查到信息
在这里插入图片描述
去redis-slave看看结果:7000失败了因为127.0.0.1是本地,而name数据在7001,访问7001则成功

 redis-cli -h 192.168.200.111 -c -p 7000 get name

在这里插入图片描述
在这里插入图片描述
回到redis-master上删除7000、7001、7002的nodes.conf集群配置文件

 rm -rf /data/redis-cluster/7000/nodes.conf 
 rm -rf /data/redis-cluster/7001/nodes.conf 
 rm -rf /data/redis-cluster/7002/nodes.conf 

停掉端口服务

 redis-cli -p 7000 shutdown
 redis-cli -p 7001 shutdown
 redis-cli -p 7002 shutdown

在启动端口服务

 redis-server /data/redis-cluster/7000/redis.conf 
 redis-server /data/redis-cluster/7001/redis.conf 
 redis-server /data/redis-cluster/7002/redis.conf

才可以重新创建redis-cluster集群

 redis-trib.rb create 192.168.200.111:7000 192.168.200.111:7001 192.168.200.111:7002

在这里插入图片描述
在redis-slave上进行远程连接cluster集群测试

redis-cli -h 192.168.200.111 -c -p 7000 set name lufei
redis-cli -h 192.168.200.111 -c -p 7001 get name 
redis-cli -h 192.168.200.111 -c -p 7002 get name 

在这里插入图片描述
redis-slave批量导入数据观察key的集群分布情况(1万个OK)

for line in `seq -w 10000`;do redis-cli -h 192.168.200.111 -p 7000 -c set key3_${line} value_${line};done

分析cluster集群key的节点分布情况(三个节点个数大概平均)

 redis-cli -h 192.168.200.111 -p 7000 info Keyspace
redis-cli -h 192.168.200.111 -p 7001 info Keyspace
redis-cli -h 192.168.200.111 -p 7002 info Keyspace

在这里插入图片描述

Cluster集群故障切换

启动redis-slave上所有的从库

 redis-server /data/redis-cluster/8000/redis.conf 
 redis-server /data/redis-cluster/8001/redis.conf 
 redis-server /data/redis-cluster/8002/redis.conf 

redis-cluster集群从库的添加,在redis-master上操作添加第一组从服务器

redis-trib.rb add-node --slave 192.168.200.112:8000 192.168.200.111:7000

redis-cluster集群从库的添加,在redis-master上操作添加第二组从服务器

redis-trib.rb add-node --slave 192.168.200.112:8001 192.168.200.111:7001

redis-cluster集群从库的添加,在redis-master上操作添加第三组从服务器

 redis-trib.rb add-node --slave 192.168.200.112:8002 192.168.200.111:7002

从库读写测试

redis-cli -h 192.168.200.112 -c -p 8000

set address beijing
exit

通过测试,我们发现redis的cluster集群不论是主库还是从库都可以进行set和get。因此,在使用中我们就没必要都去主库了。
在这里插入图片描述
查看主从cluster集群key的分布情况

 redis-cli -h 192.168.200.112 -c -p 8000 info Keyspace
	
redis-cli -h 192.168.200.112 -c -p 8001 info Keyspace

redis-cli -h 192.168.200.112 -c -p 8002 info Keyspace

 redis-cli -h 192.168.200.111 -c -p 7000 info Keyspace

 redis-cli -h 192.168.200.111 -c -p 7001 info Keyspace

 redis-cli -h 192.168.200.111 -c -p 7002 info Keyspace

在这里插入图片描述

把7000关掉后,redis集群的主从自动切换

 redis-cli -h 192.168.200.111 -p 7000 shutdown

查看一下是否自动切换

redis-cli -h 192.168.200.112 -p 8000 cluster nodes

手动down掉了7000端口的redis-server。从信息得知,7000挂了,8000被切换成了master
在这里插入图片描述
在主库重新启动7000端口的server,再次查看

 redis-server /data/redis-cluster/7000/redis.conf
  redis-cli -h 192.168.200.112 -p 8000 cluster nodes

7000变从了,并没有去抢主
在这里插入图片描述
手动将redis-server 7000端口重新切换成主库主要命令是cluster failover

  redis-cli -h 192.168.200.111 -c -p 7000 cluster failover

再次查看7000是否主还是从

 redis-cli -h 192.168.200.112 -p 8000 cluster nodes

7000master回来了
在这里插入图片描述
删除节点前先看id

 redis-cli -h 192.168.200.112 -p 8000 cluster nodes

4aefo开头就是id
删除节点带上id
redis-trib.rb del-node 192.168.200.112:8001 ‘id’
在这里插入图片描述
修复节点要清空8001节点现有数据不然会报错
这个错误
查看8001端口进程并停掉
kill -9 31220
在这里插入图片描述
清理8001节点数据

 rm -rf /data/redis-cluster/8001/dump.rdb 
 rm -rf /data/redis-cluster/8001/nodes.conf 
 rm -rf /data/redis-cluster/8001/redis.pid 
 redis-server /data/redis-cluster/8001/redis.conf

主库再次添加节点就可以了

 redis-trib.rb add-node --slave 192.168.200.112:8001 192.168.200.111:7001

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值