前期操作
以下直接按步骤执行
systemctl stop firewalld
systemctl disable firewalld
swapoff -a
sed -i ‘s/.swap./#&/’ /etc/fstab
集群搭建和集群特点
redis cluster集群的特点:
多个redis节点网络互联,数据共享
所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
支持在线增加、删除节点
21.23/21.24 redis集群搭建配置
客户端可以连任何一个主节点进行读写全新的界面设计** ,将会带来全新的写作体验;
集群搭建
wget http://download.redis.io/releases/redis-4.0.0.tar.gz
tar -zxvf redis-4.0.0.tar.gz
yum install gcc gcc-c++
ln -s redis-3.0.7 redis //对解压缩目录redis-3.0.7创建一个软链接名叫redis相当于windows下的快捷方式
cd redis //进入redis软链接目录
make //对redis配置文件进行编译以
make install //对redis进行安装,使在src/目录下生成可执行配置文件
redis-server //启动redis服务器端
场景:
由于资源有限,所以只使用两台机器做这个实验,两台机器上分别开启三个Redis服务(不同的端口)
A机器的IP:192.168.77.130
B机器的IP:192.168.77.128
A机器上三个端口7000,7002,7004,全部为主
B机器上三个端口7001,7003,7005,全部为从
redis版本:4.0.1
两台机器的防火墙都是关闭的
两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
配置文件的内容可以在以下网址获得:
https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL
1.A机器上编辑配置文件:
[root@localhost ~]# vim /etc/redis_7000.conf
port 7000bind 192.168.77.130 # IP改为你自己的
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes
[root@localhost ~]# vim /etc/redis_7001.conf
port 7001bind 192.168.77.130
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@localhost ~]# vim /etc/redis_7002.conf
port 7002bind 192.168.77.130
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
2.B机器上编辑配置文件:
[root@localhost ~]# vim /etc/redis_7003.conf
port 7003bind 192.168.77.128
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@localhost ~]# vim /etc/redis_7004.conf
port 7004bind 192.168.77.128
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@localhost ~]# vim /etc/redis_7005.conf
port 7005bind 192.168.77.128
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
3.启动A机器上的redis服务,并检查进程和端口:
[root@localhost ~]# mkdir /data/redis_data/{7000,7001,7002}
[root@localhost ~]# redis-server /etc/redis_7000.conf
3321:C 04 Jan 19:06:50.351 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3321:C 04 Jan 19:06:50.351 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3321, just started
3321:C 04 Jan 19:06:50.351 # Configuration loaded
[root@localhost ~]# redis-server /etc/redis_7001.conf
3326:C 04 Jan 19:06:54.636 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3326:C 04 Jan 19:06:54.636 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3326, just started
3326:C 04 Jan 19:06:54.636 # Configuration loaded
[root@localhost ~]# redis-server /etc/redis_7002.conf
3331:C 04 Jan 19:06:57.955 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3331:C 04 Jan 19:06:57.955 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3331, just started
3331:C 04 Jan 19:06:57.955 # Configuration loaded
[root@localhost ~]# netstat -lntp |grep 700.
tcp 0 0 192.168.77.130:17000 0.0.0.0:* LISTEN 3322/redis-server 1
tcp 0 0 192.168.77.130:17001 0.0.0.0:* LISTEN 3327/redis-server 1
tcp 0 0 192.168.77.130:17002 0.0.0.0:* LISTEN 3332/redis-server 1
tcp 0 0 192.168.77.130:7000 0.0.0.0:* LISTEN 3322/redis-server 1
tcp 0 0 192.168.77.130:7001 0.0.0.0:* LISTEN 3327/redis-server 1
tcp 0 0 192.168.77.130:7002 0.0.0.0:* LISTEN 3332/redis-server 1
[root@localhost ~]# ps aux |grep redis
root 3322 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7000 [cluster]
root 3327 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7001 [cluster]
root 3332 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7002 [cluster]
root 3365 0.0 0.0 112668 972 pts/0 S+ 19:09 0:00 grep --color=auto redis
[root@localhost ~]#
4.启动B机器上的redis服务,并检查进程和端口:
[root@localhost ~]# mkdir /data/redis_data/{7003,7004,7005}
[root@localhost ~]# redis-server /etc/redis_7003.conf
4842:C 04 Jan 11:14:41.314 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4842:C 04 Jan 11:14:41.314 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4842, just started
4842:C 04 Jan 11:14:41.314 # Configuration loaded
[root@localhost ~]# redis-server /etc/redis_7004.conf
4847:C 04 Jan 11:14:43.907 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4847:C 04 Jan 11:14:43.907 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4847, just started
4847:C 04 Jan 11:14:43.907 # Configuration loaded
[root@localhost ~]# redis-server /etc/redis_7005.conf
4852:C 04 Jan 11:14:46.184 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4852:C 04 Jan 11:14:46.184 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4852, just started
4852:C 04 Jan 11:14:46.184 # Configuration loaded
[root@localhost ~]# netstat -lntp |grep 700.
tcp 0 0 192.168.77.128:17003 0.0.0.0:* LISTEN 4843/redis-server 1
tcp 0 0 192.168.77.128:17004 0.0.0.0:* LISTEN 4848/redis-server 1
tcp 0 0 192.168.77.128:17005 0.0.0.0:* LISTEN 4853/redis-server 1
tcp 0 0 192.168.77.128:7003 0.0.0.0:* LISTEN 4843/redis-server 1
tcp 0 0 192.168.77.128:7004 0.0.0.0:* LISTEN 4848/redis-server 1
tcp 0 0 192.168.77.128:7005 0.0.0.0:* LISTEN 4853/redis-server 1
[root@localhost ~]# ps aux |grep redis
root 4843 0.1 0.1 145244 7572 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7003 [cluster]
root 4848 0.1 0.1 145244 7568 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7004 [cluster]
root 4853 0.1 0.1 145244 7568 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7005 [cluster]
root 4911 0.0 0.0 112660 964 pts/0 S+ 11:17 0:00 grep --color=auto redis
[root@localhost ~]#
5.在A机器上安装ruby2.2:
安装好依赖:
[root@localhost ~]# yum -y groupinstall “Development Tools”
[root@localhost ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
[root@localhost ~]# cd /root/
[root@localhost ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
下载源码包,并把源码包打包成rpm包进行安装:
[root@localhost ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
[root@localhost ~]# mv ruby-2.2.3.tar.gz rpmbuild/SOURCES/
[root@localhost ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
[root@localhost ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec # 这一步需要等待一会
[root@localhost ~]# ls rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm # 检查是否打包成了rpm包
rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@localhost ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@localhost ~]# ruby -v # 检查是否安装完成
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
线上环境代理设置
sudo gem install --http-proxy http://proxy:11223344@10.10.10.47:3288
[root@localhost ~]# gem install redis # 安装与redis相关的包
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
[root@localhost ~]#
6.拷贝可执行文件(命令):
[root@localhost ~]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
7.创建replicas:
[root@localhost ~]# redis-trib.rb create --replicas 1 192.168.77.130:7000 192.168.77.130:7001 192.168.77.130:7002 192.168.77.128:7003 192.168.77.128:7004 192.168.77.128:7005
Creating cluster
Performing hash slots allocation on 6 nodes…
Using 3 masters: # 这里决定了哪3个作为master
192.168.77.130:7000
192.168.77.128:7003
192.168.77.130:7001 # 以下打印了主从关系
Adding replica 192.168.77.128:7004 to 192.168.77.130:7
000
Adding replica 192.168.77.130:7002 to 192.168.77.128:7003
Adding replica 192.168.77.128:7005 to 192.168.77.130:7001
M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000
slots:0-5460 (5461 slots) master
M: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001
slots:10923-16383 (5461 slots) master
S: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002
replicates c9cef49da3e8acbc47d9b3151b04589e349031b1
M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003
slots:5461-10922 (5462 slots) master
S: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004
replicates 03fc051e6ba17eee1efa6188e961455958b154e0
S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005
replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33c
Can I set the above configuration? (type ‘yes’ to accept): yes # 会询问是否可以这样配置
Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join…Performing Cluster Check (using node 192.168.77.130:7000)
M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002
slots: (0 slots) slave
replicates c9cef49da3e8acbc47d9b3151b04589e349031b1
M: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005
slots: (0 slots) slave
replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33c
S: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004
slots: (0 slots) slave
replicates 03fc051e6ba17eee1efa6188e961455958b154e0
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
[root@localhost ~]# echo $?
0
[root@localhost ~]#
打印了两个OK表示集群成功。
21.25 redis集群操作
以集群的方式登录redis,并创建一个key:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7000 # 加上-c选项表示以集群的方式登录
192.168.77.130:7000> set key1 123
-> Redirected to slot [9189] located at 192.168.77.128:7003 # 可以看到,这个key1被重定向到了192.168.77.128:7003这台redis机器上
OK
92.168.77.128:7003> set key2 abc
-> Redirected to slot [4998] located at 192.168.77.130:7000
OK
192.168.77.130:7000> set key3 test # 没有重定向提示信息的就表示存储到了本地上
OK
192.168.77.130:7000>
如果不加-c的话,只会登录目标机器,操作的也只是目标机器,而不会像集群那样重定向数据。任意一个节点都可以创建key,或者查看key。
检测集群状态:
[root@localhost ~]# redis-trib.rb check 192.168.77.130:7000Performing Cluster Check (using node 192.168.77.130:7000)
M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002
slots: (0 slots) slave
replicates c9cef49da3e8acbc47d9b3151b04589e349031b1
M: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005
slots: (0 slots) slave
replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33c
S: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004
slots: (0 slots) slave
replicates 03fc051e6ba17eee1efa6188e961455958b154e0
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
[root@localhost ~]#
cluster nodes命令可以列出节点:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7000
192.168.77.130:7000> cluster nodes
e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002@17002 slave c9cef49da3e8acbc47d9b3151b04589e349031b1 0 1515075493469 4 connected
ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001@17001 master - 0 1515075494478 2 connected 10923-16383
c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003@17003 master - 0 1515075496493 4 connected 5461-10922
d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005@17005 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515075495486 6 connected
03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000@17000 myself,master - 0 1515075489000 1 connected 0-5460
824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004@17004 slave 03fc051e6ba17eee1efa6188e961455958b154e0 0 1515075493000 5 connected
192.168.77.130:7000>
cluster info命令可以查看集群信息:
192.168.77.130: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:1076
cluster_stats_messages_pong_sent:1033
cluster_stats_messages_sent:2109
cluster_stats_messages_ping_received:1028
cluster_stats_messages_pong_received:1076
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2109
192.168.77.130:7000>
cluster meet ip port 命令可以添加节点,例如我现在在B机器上新增加了一个redis服务,端口为7006,现在我要把这个新增的redis服务加入到集群节点中来:
192.168.77.130:7000> cluster meet 192.168.77.128 7006
OK
192.168.77.130:7000> cluster nodes
deca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 master - 0 1515075895000 0 connected
…以下省略…
可以看到7006成功添加到了节点中,身份是master。
使用以上方式添加的节点,都会是master身份,而 cluster replicate node_id 命令可以将当前节点设置为指定节点的从(slave):
[root@localhost ~]# redis-cli -c -h 192.168.77.128 -p 7006
192.168.77.128:7006> cluster replicate ef2f571de1d8d1bfa5d96acab297ad857c09d33c
OK
192.168.77.128:7006> CLUSTER NODES
…以上省略…
deca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 myself,slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515047943000 0 connected
192.168.77.128:7006>
可以看到成功把7006指定为 ef2f571de1d8d1bfa5d96acab297ad857c09d33c 这个节点的slave,这个节点对应的端口是7001。
cluster forget node_id 命令可以移除某个节点,例如我把7006移除掉:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7001
192.168.77.130:7001> cluster forget deca81cf98ac8206419096f8b86a7a6e925078ad
OK
192.168.77.130:7001>
要注意的是,这个命令不能移除master身份的节点,而且当前登录的节点(myself)也不能移除,只能移除非当前登录的slave节点。如果想要移除master节点,只能先把这个master指定为slave之后再移除。
cluster saveconfig命令可以把当前集群的操作保存到配置文件里:
192.168.77.130:7001> CLUSTER SAVECONFIG
OK
192.168.77.130:7001> quit
[root@localhost ~]# cat /data/redis_data/7001/nodes_7001.conf
d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005@17005 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515076783944 2 connected
c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003@17003 master - 0 1515076785957 4 connected 5461-10922
03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000@17000 master - 0 1515076784951 1 connected 0-5460
deca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515076785153 2 connected
e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002@17002 slave c9cef49da3e8acbc47d9b3151b04589e349031b1 0 1515076787970 4 connected
ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001@17001 myself,master - 0 1515076786000 2 connected 10923-16383
824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004@17004 slave 03fc051e6ba17eee1efa6188e961455958b154e0 0 1515076786964 5 connected
vars currentEpoch 6 lastVoteEpoch 0
[root@localhost ~]#
重要:
经测试在一个整个muset全挂掉的情况下整个集群可用
本集群一共有6个节点3个master 3个salver 每个master负责不同的槽道管理。
当集群中有过半的节点挂掉,或者集群中有一个槽道上的master和salver全不挂掉集群死去。
我们的redis集群应该最少有3台电脑实现
redis的选举机制在不满足过半的情况下不会生效