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
删除节点带上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