redis主从配置
实验环境:
一台机器上,启动两个redis服务,通过两个不同的端口,模拟两台机器。
拷贝一份redis配置文件:
[root@shuai-01 default]# cp /etc/redis.conf /etc/redis2.conf
更改配置文件的端口号,pidfile,logfile,dir
port 6380
pidfile /var/run/redis_6380.pid
logfile "/tmp/logs/redis2.log"
dir /data/redis2
这些修改完,还要增加主的IP端口号,配置主从的时候,主基本上不变,但是要在从上配置主是谁
创建/data/redis2目录,目录创建完后,就可以启动了
[root@shuai-01 default]# redis-server /etc/redis2.conf
启动两个redis服务,端口号一个是6379,一个端口号是6380
[root@shuai-01 default]# ps aux |grep redis
root 3165 0.1 0.9 147304 9828 ? Ssl 09:23 0:03 redis-server 127.0.0.1:6379
root 3293 7.5 0.9 147304 9728 ? Ssl 10:06 0:00 redis-server 127.0.0.1:6380
root 3300 0.0 0.0 112680 976 pts/0 R+ 10:06 0:00 grep --color=auto redis
登录到redis2服务查看
[root@shuai-01 default]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380>
127.0.0.1:6380> keys *
1) "set3"
2) "set6"
3) "list1"
4) "hset1"
5) "set1"
6) "mykey"
7) "set5"
8) "set2"
9) "set4"
10) "zset1"
11) "list2"
12) "hash1"
13) "k3"
14) "k1"
127.0.0.1:6380> CONFIG GET dir
1) "dir"
2) "/data/redis2"
127.0.0.1:6380> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"
配置文件中还哟一个只读文件不能写的一条配置
这条写上去,就从只能读,不能写
redis主从配置还是比较方便的,redis主从不用像MySQL一样,事先将两数据库的数据先同步,才能进行主从。redis可以事先不用同步数据库,它自己会进行同步。redis从只能读。
redis集群介绍
Redis cluster是分布式集群,支持横向扩展,Redis从V3.0版本后才支持集群功能。Redis集群的工作原理类似于磁盘的raid5
多个redis节点网络互联,数据共享
所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
支持在线增加、删除节点
客户端可以连任何一个主节点进行读写
redis集群搭建配置
实验环境准备:
两台机器,分别开启三个redis服务
A机器上三端口:7000,7002,7004
B机器上三端口:7001,7003,7005
两台机器上要编译安装redis,然后你每台器上写三个对应的配置文件,编辑完配置文件后,启动6个redis服务。
master机器:IP 192.168.176.135
编辑配置文件
[root@shuai-01 default]# cd /etc/
[root@shuai-01 etc]# vim redis_7000.conf
port 7000
bind 192.168.176.135
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
#开启cluster功能
cluster-enabled yes
#这条配置文件是可以在dir中自动生成的
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes
[root@shuai-01 etc]# cp redis_7000.conf redis_7002.conf
[root@shuai-01 etc]# vim redis_7002.conf
port 7002
bind 192.168.176.135
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes
[root@shuai-01 etc]# cp redis_7000.conf redis_7004.conf
[root@shuai-01 etc]# vim redis_7004.conf
port 7004
bind 192.168.176.135
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes
创建对应的目录
[root@shuai-01 etc]# mkdir /data/redis_data
[root@shuai-01 etc]# mkdir /data/redis_data/{7000,7002,7004}
启动相应的服务
[root@shuai-01 etc]# redis-server /etc/redis_7000.conf
4210:C 24 Apr 15:35:02.866 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4210:C 24 Apr 15:35:02.875 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=4210, just started
4210:C 24 Apr 15:35:02.875 # Configuration loaded
[root@shuai-01 etc]# redis-server /etc/redis_7002.conf
4215:C 24 Apr 15:35:19.571 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4215:C 24 Apr 15:35:19.571 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=4215, just started
4215:C 24 Apr 15:35:19.571 # Configuration loaded
[root@shuai-01 etc]# redis-server /etc/redis_7004.conf
4220:C 24 Apr 15:35:24.197 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4220:C 24 Apr 15:35:24.197 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=4220, just started
4220:C 24 Apr 15:35:24.197 # Configuration loaded
slave机器:IP 192.168.176.134
安装redis,可以直接把已经编译过的源码包拷贝到这台机器上
[root@shuai-01 src]# scp -r redis-4.0.2 192.168.176.134:/usr/local/src/
[root@shuai-02 etc]# cd /usr/local/src/redis-4.0.2/
[root@shuai-02 redis-4.0.2]# make install
[root@shuai-02 etc]# vim redis_7001.conf
port 7001
bind 192.168.176.134
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis_data/7001
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 10100
appendonly yes
[root@shuai-02 etc]# vim /etc/redis_7003.conf
port 7003
bind 192.168.176.134
daemonize yes
pidfile /var/run/redis_7003.pid
dir /data/redis_data/7003
cluster-enabled yes
cluster-config-file nodes_7003.conf
cluster-node-timeout 10100
appendonly yes
[root@shuai-02 etc]# vim /etc/redis_7005.conf
port 7005
bind 192.168.176.134
daemonize yes
pidfile /var/run/redis_7005.pid
dir /data/redis_data/7005
cluster-enabled yes
cluster-config-file nodes_7005.conf
cluster-node-timeout 10100
appendonly yes
创建目录
[root@shuai-02 etc]# mkdir /data/redis_data
[root@shuai-02 etc]# mkdir /data/redis_data/{7001,7003,7005}
启动服务
[root@shuai-02 redis-4.0.2]# redis-server /etc/redis_7001.conf
2469:C 24 Apr 15:45:50.616 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2469:C 24 Apr 15:45:50.616 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=2469, just started
2469:C 24 Apr 15:45:50.616 # Configuration loaded
[root@shuai-02 redis-4.0.2]# redis-server /etc/redis_7003.conf
2479:C 24 Apr 15:45:56.215 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2479:C 24 Apr 15:45:56.215 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=2479, just started
2479:C 24 Apr 15:45:56.215 # Configuration loaded
[root@shuai-02 redis-4.0.2]# redis-server /etc/redis_7005.conf
2486:C 24 Apr 15:46:00.457 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2486:C 24 Apr 15:46:00.457 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=2486, just started
2486:C 24 Apr 15:46:00.457 # Configuration loaded
两台机器上都要关闭iptables和selinux
[root@shuai-01 src]# getenforce
Disabled
[root@shuai-01 src]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[root@shuai-02 redis-4.0.2]# getenforce
Disabled
[root@shuai-02 redis-4.0.2]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
安装ruby
redis集群需要ruby的支持,但是对版本有要求,redis4.0需要ruby2.2及以上版本。centos7中自带版本2.0,yum安装也是2.0,我们要把源码包自作成yum安装包,在借助yum安装
安装yum开发工具
[root@shuai-01 src]# yum -y groupinstall "Development Tools"
升级库文件
[root@shuai-01 src]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel
创建制作rpm包的目录
[root@shuai-01 src]# cd /root/
[root@shuai-01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
下载ruby的源码包
[root@shuai-01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
下载specs文件,用于制作rpm包:
[root@shuai-01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
制作rpm包
[root@shuai-01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
安装ruby2.2:
既可以rpm安装,也可以yum安装
[root@shuai-01 ~]# rpm -ivh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
这样,可能对它会有需要依赖的包
yum安装:
[root@shuai-01 ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
查看ruby的版本:
[root@shuai-01 ~]# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
redis配置集群
安装redis配置集群的东西
[root@shuai-01 ~]# gem install redis
将redis-trib.rb命令加入环境变量目录中
[root@shuai-01 ~]# cp /usr/local/src/redis-4.0.2/src/redis-trib.rb /usr/bin
创建集群
[root@shuai-01 ~]# redis-trib.rb create --replicas 1 192.168.176.135:7000 192.168.176.135:7002 192.168.176.135:7004 192.168.176.134:7001 192.168.176.134:7003 192.168.176.134:7005
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#注意:redis-trib.rb create --replicas 1 表示一个master对应几个slave,此处的参数“1”表示master和slave一一对应
看见两OK就成功了
错误:
有些时候启动redis集群时,可能会产生如下的报错
[root@shuai-01 ~]# redis-trib.rb create --replicas 1 192.168.176.135:7000 192.168.176.135:7002 192.168.176.135:7004 192.168.176.134:7001 192.168.176.134:7003 192.168.176.134:7005
>>> Creating cluster
[ERR] Node 192.168.176.135:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
这种情况通常发生在非正常关闭redis集群的时候
将每个节点的redis数据库清除
[root@shuai-01 ~]# redis-cli -h 192.168.176.135 -p 7000
192.168.176.135:7000> flushdb
OK
(0.64s)
192.168.176.135:7000> quit
[root@shuai-01 ~]# redis-cli -h 192.168.176.135 -p 7002
192.168.176.135:7002> flushdb
OK
192.168.176.135:7002> quit
[root@shuai-01 ~]# redis-cli -h 192.168.176.135 -p 7004
192.168.176.135:7004> flushdb
OK
192.168.176.135:7004> quit
再将每个节点的aof文件和nodes文件及dump.rdb删除
[root@shuai-01 ~]# rm -rf /data/redis_data/7000/nodes_7000.conf
[root@shuai-01 ~]# rm -rf /data/redis_data/7002/nodes_7002.conf
[root@shuai-01 ~]# rm -rf /data/redis_data/7004/nodes_7004.conf
[root@shuai-01 ~]# rm -rf /data/redis_data/7000/appendonly.aof
[root@shuai-01 ~]# rm -rf /data/redis_data/7000/dump.rdb
[root@shuai-01 ~]# rm -rf /data/redis_data/7002/dump.rdb
[root@shuai-01 ~]# rm -rf /data/redis_data/7002/appendonly.aof
[root@shuai-01 ~]# rm -rf /data/redis_data/7004/appendonly.aof
[root@shuai-01 ~]# rm -rf /data/redis_data/7004/dump.rdb
重启redis服务
redis集群操作
连接:
[root@shuai-01 ~]# redis-cli -c -h 192.168.176.135 -p 7000
192.168.176.135:7000>
#-c 使用集群方式登录
创建数据:
192.168.176.134:7001> set key2 abc
-> Redirected to slot [4998] located at 192.168.176.135:7000
OK
192.168.176.135:7000> set key3 shaj
OK
192.168.176.135:7000> set key4 shauiao
-> Redirected to slot [13120] located at 192.168.176.135:7002
OK
#这些都是在集群里面进行操作
查看数据:
192.168.176.135:7002> get key3
-> Redirected to slot [935] located at 192.168.176.135:7000
"shaj"
192.168.176.135:7000> get key4
-> Redirected to slot [13120] located at 192.168.176.135:7002
"shauiao"
查看集群的状态:
[root@shuai-01 ~]# redis-trib.rb check 192.168.176.135:7000
>>> Performing Cluster Check (using node 192.168.176.135:7000)
M: 6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef 192.168.176.135:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 5d6a378507572dc626b25377869fe1d69d421027 192.168.176.135:7004
slots: (0 slots) slave
replicates f5b42a8af41dcc3b519e2ef661172d1caa511cf0
S: 506e7112c51c16dc9a021f99388b0a8ec752e256 192.168.176.134:7005
slots: (0 slots) slave
replicates 8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb
M: 8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb 192.168.176.135:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: f5b42a8af41dcc3b519e2ef661172d1caa511cf0 192.168.176.134:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 7f3ee2e14419696a6ae1b76fb576ba6fd9010119 192.168.176.134:7003
slots: (0 slots) slave
replicates 6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
列出节点列表:
[root@shuai-01 ~]# redis-cli -c -h 192.168.176.135 -p 7000
192.168.176.135:7000> CLUSTER NODES
5d6a378507572dc626b25377869fe1d69d421027 192.168.176.135:7004@17004 slave f5b42a8af41dcc3b519e2ef661172d1caa511cf0 0 1524641516203 4 connected
6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef 192.168.176.135:7000@17000 myself,master - 0 1524641515000 1 connected 0-5460
506e7112c51c16dc9a021f99388b0a8ec752e256 192.168.176.134:7005@17005 slave 8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb 0 1524641517213 6 connected
8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb 192.168.176.135:7002@17002 master - 0 1524641515187 2 connected 10923-16383
f5b42a8af41dcc3b519e2ef661172d1caa511cf0 192.168.176.134:7001@17001 master - 0 1524641516000 4 connected 5461-10922
7f3ee2e14419696a6ae1b76fb576ba6fd9010119 192.168.176.134:7003@17003 slave 6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef 0 1524641514181 5 connected
192.168.176.135:7000>
#这里面能看出节点个数,是master还是slave,并且有master和slave的对应关系
查看集群信息:
192.168.176.135:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:5488
cluster_stats_messages_pong_sent:5197
cluster_stats_messages_sent:10685
cluster_stats_messages_ping_received:5192
cluster_stats_messages_pong_received:5481
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:10678
192.168.176.135:7000>
添加节点:
首先,你的节点必须要有,而且启动服务了。
192.168.176.135:7000> cluster meet 192.168.176.134 7007
OK
192.168.176.135:7000> cluster meet 192.168.176.135 7006
OK
192.168.176.135:7000> CLUSTER NODES
733cebecace7f9cb6a7a7c579d2192411fbb6902 192.168.176.134:7007@17007 master - 0 1524642160004 0 connected
7e9cf408457f568e3313d15aa1104a25cf94f685 192.168.176.135:7006@17006 master - 0 1524642442000 0 connected
添加成功,并且是master身份
将当前节点设置为指定节点的从:
当前节点,就是你登录的节点
[root@shuai-01 ~]# redis-cli -c -h 192.168.176.135 -p 7006
192.168.176.135:7006> CLUSTER REPLICATE 733cebecace7f9cb6a7a7c579d2192411fbb6902
OK
#通过node号进行添加
192.168.176.135:7006> CLUSTER NODES
7e9cf408457f568e3313d15aa1104a25cf94f685 192.168.176.135:7006@17006 myself,slave 733cebecace7f9cb6a7a7c579d2192411fbb6902 0 1524642749000 0 connected
733cebecace7f9cb6a7a7c579d2192411fbb6902 192.168.176.134:7007@17007 master - 0 1524642753000 7 connected
#通过node号指导主从关系
移除节点:
移除的节点一定要是slave,不能是master,并且,你不能登录进移除节点里。
192.168.176.135:7006> CLUSTER FORGET 733cebecace7f9cb6a7a7c579d2192411fbb6902
(error) ERR Can't forget my master!
192.168.176.135:7006> CLUSTER FORGET 7e9cf408457f568e3313d15aa1104a25cf94f685
(error) ERR I tried hard but I can't forget myself...
删除7006节点
192.168.176.135:7000> CLUSTER FORGET 7e9cf408457f568e3313d15aa1104a25cf94f685
OK
192.168.176.135:7000> CLUSTER NODES
5d6a378507572dc626b25377869fe1d69d421027 192.168.176.135:7004@17004 slave f5b42a8af41dcc3b519e2ef661172d1caa511cf0 0 1524643641000 4 connected
6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef 192.168.176.135:7000@17000 myself,master - 0 1524643640000 1 connected 0-5460
506e7112c51c16dc9a021f99388b0a8ec752e256 192.168.176.134:7005@17005 slave 8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb 0 1524643642592 6 connected
733cebecace7f9cb6a7a7c579d2192411fbb6902 192.168.176.134:7007@17007 master - 0 1524643640000 7 connected
8e2a9c6db13b00770cf8a2df94ac4f6252aa1dbb 192.168.176.135:7002@17002 master - 0 1524643641000 2 connected 10923-16383
f5b42a8af41dcc3b519e2ef661172d1caa511cf0 192.168.176.134:7001@17001 master - 0 1524643641585 4 connected 5461-10922
7f3ee2e14419696a6ae1b76fb576ba6fd9010119 192.168.176.134:7003@17003 slave 6b30c71b5335dadb8c1caf3c35ab18abdd7b5bef 0 1524643640577 5 connected
192.168.176.135:7000>
把当前的操作存到配置文件中去
192.168.176.135:7000> CLUSTER SAVECONFIG
OK