您的位置:首页 > 数据库 > Redis

linux搭建redis集群测试

2017-08-06 13:20 501 查看
一、安装Redis及环境介绍

安装Redis省略,参考http://blog.csdn.net/wangdw1984/article/details/75948174

我的安装目录是/home/redis/,版本为4.0,我用了两台虚拟机做试验,系统均为Centos6,192.168.1.81和192.168.1.82各安装3个节点

二、安装RUBY

执行命令:

yum -yinstall ruby ruby-devel rubygems rpm-build
gem install redis


三、集群搭建
[/code]

1、创建 Redis 节点
[/code]

  先在192.168.1.81 /home/redis/下创建redis-cluster目录(mkdir redis-cluster),在redis-cluster下创建三个目录,分别为7000、7001、7002

2、复制/home/redis/redis.conf配置文件到7000、7001、7002下

cp /home/redis/redis.conf /home/redis/redis-cluster/7000/redis.conf
cp /home/redis/redis.conf /home/redis/redis-cluster/7001/redis.conf
cp /home/redis/redis.conf /home/redis/redis-cluster/7002/redis.conf


3、分别修改7000\7001\7002下的redis.conf,为了修改方便,可以先拿到出修改后再放到相应目录下,主要修改以下几项即可:

port 7000                             //端口7000、7002、7003,端口和对应的目录一样(不一定需要一样,只是为了方便查看)
bind 192.168.1.81                      //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes                          //redis后台运行
pidfile /var/run/redis_7000.pid       //不同的节点设置不同的pid
cluster-enabled  yes                   //开启集群
cluster-config-file nodes_7000.conf   //集群的配置,不同的节点设置不同的配置文件
cluster-node-timeout 5000            //请求超时,默认15秒,可自行设置
appendonly yes                        //aof日志开启  有需要就开启,它会每次写操作都记录一条日志
logfile "/home/redis/redis-cluster/7000/redis.log" //这个配置不是必须的,但为了方便查询错误日志,最好配置下


5、检查节点启动情况

[root@localhost redis]# ps -ef | grep redis
root      1327     1  0 13:11 ?        00:00:09 redis-server 192.168.1.81:7000 [cluster]
root      1332     1  0 13:11 ?        00:00:09 redis-server 192.168.1.81:7001 [cluster]
root      1337     1  0 13:11 ?        00:00:08 redis-server 192.168.1.81:7002 [cluster]
root      1346  1284  0 13:46 pts/0    00:00:00 grep redis

[root@localhost redis]# netstat -tnlp | grep redis
tcp        0      0 192.168.1.81:17000          0.0.0.0:*                   LISTEN      1327/redis-server 1
tcp        0      0 192.168.1.81:17001          0.0.0.0:*                   LISTEN      1332/redis-server 1
tcp        0      0 192.168.1.81:17002          0.0.0.0:*                   LISTEN      1337/redis-server 1
tcp        0      0 192.168.1.81:7000           0.0.0.0:*                   LISTEN      1327/redis-server 1
tcp        0      0 192.168.1.81:7001           0.0.0.0:*                   LISTEN      1332/redis-server 1
tcp        0      0 192.168.1.81:7002           0.0.0.0:*                   LISTEN      1337/redis-server 1
第一个命令看到ip:port[cluster],一定要有cluster字样才允许加入集群,另外发现还有一组端口占用,17000、17001、17002,看这个应该是对应的端口+10000。

6、复制redis-trib.rb到/usr/local/bin目录下,让redis-trib.rb在任何地方都可执行

cp /home/redis/src/redis-trib.rb /usr/local/bin/

7、重复上面6步,在192.168.1.82上创建7003、7004、7005三个节点

8、创建集群

[root@localhost redis]# redis-trib.rb  create --replicas 1 192.168.1.81:7000 192.168.1.81:7001 192.168.1.81:7002 192.168.1.82:7003 192.168.1.82:7004 192.168.1.82:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.82:7003
192.168.1.81:7000
192.168.1.82:7004
Adding replica 192.168.1.81:7001 to 192.168.1.82:7003
Adding replica 192.168.1.82:7005 to 192.168.1.81:7000
Adding replica 192.168.1.81:7002 to 192.168.1.82:7004
M: 77d55c8aebe6ddfac5516ab715daa3433e9ae8d5 192.168.1.81:7000
slots:5461-10922 (5462 slots) master
S: 35f74d40c6d0a94e92727a8a401f3fbca33c397d 192.168.1.81:7001
replicates 2b5ba7f30fc36d36f318e546d1099c9d81724228
S: 3e8692785b37c3e6edfca01fd3c0888e97edeb82 192.168.1.81:7002
replicates 144a3b39be603d34122a38907c6516a911136912
M: 2b5ba7f30fc36d36f318e546d1099c9d81724228 192.168.1.82:7003
slots:0-5460 (5461 slots) master
M: 144a3b39be603d34122a38907c6516a911136912 192.168.1.82:7004
slots:10923-16383 (5461 slots) master
S: 434b1117ff25bbd9ca5c6065b756167c2cc3aa53 192.168.1.82:7005
replicates 77d55c8aebe6ddfac5516ab715daa3433e9ae8d5
Can I set the above configuration? (type 'yes' to accept):
执行到这里时输入yes按回车即可,意思是他给你随机分配了3个master节点(7003、7000、7004),问你是否允许他这样配置,接着会显示:
>>> 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.1.81:7000)
M: 77d55c8aebe6ddfac5516ab715daa3433e9ae8d5 192.168.1.81:7000
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 3e8692785b37c3e6edfca01fd3c0888e97edeb82 192.168.1.81:7002
sl
4000
ots: (0 slots) slave
replicates 144a3b39be603d34122a38907c6516a911136912
S: 35f74d40c6d0a94e92727a8a401f3fbca33c397d 192.168.1.81:7001
slots: (0 slots) slave
replicates 2b5ba7f30fc36d36f318e546d1099c9d81724228
M: 144a3b39be603d34122a38907c6516a911136912 192.168.1.82:7004
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 2b5ba7f30fc36d36f318e546d1099c9d81724228 192.168.1.82:7003
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 434b1117ff25bbd9ca5c6065b756167c2cc3aa53 192.168.1.82:7005
slots: (0 slots) slave
replicates 77d55c8aebe6ddfac5516ab715daa3433e9ae8d5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
当出现[OK] All 16384 slots covered.表示集群已经创建成功。

如果出现提示某个ip:port不可到达或输入yes后界面一直停留在Waiting for the cluster to join...的情况,请检查防火墙设置,修改iptables

[root@localhost redis]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17005 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited


把7000、7001、7002、17000、17001、17002等端口全部加入白名单中,上面的例子是我第二台虚拟机的,然后重启防火墙

service iptables restart

如果第一次创建集群失败了,再创建的时候提示类似这样的错误[ERR] Node 192.168.1.81:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

删除生成的配置文件(redis.conf中指定的cluster-config-file),我的是在/home/redis/nodes-7000.conf在/root下也有一,如果不确宝或找不到,用命令find -namenodes-7000.conf查找。

四、集群测试

用第一台虚拟机(192.168.1.81)连接第二台虚拟机(192.168.1.82)端口,并设置一个key名为mykey的数据

[root@localhost redis]# redis-cli -c -h 192.168.1.82 -p 7003
192.168.1.82:7003> set mykey "this is mykey value"
-> Redirected to slot [14687] located at 192.168.1.82:7004
OK
192.168.1.82:7004>
出现OK表示设置成功,并且同步到slave节点7004上

然后用第二台虚拟机连接第一台虚拟机,并获取mykey

[root@localhost src]# redis-cli -c -h 192.168.1.81 -p 7000
192.168.1.81:7000> get mykey
-> Redirected to slot [14687] located at 192.168.1.82:7004
"this is mykey value"
192.168.1.82:7004>


可以看到,连接到7000端口也可以成功获取到刚设置的key,说明集群已成功创建

五、集群相关命令

官方文档地址:https://redis.io/topics/cluster-tutorial

连接其中一个节点,查看集群节点情况

[root@localhost ~]# redis-cli -c -h 192.168.1.81 -p 7000 cluster nodes
1b3387f7c77b90a5df85ee725e39437b5b1f0ea8 192.168.1.82:7005@17005 slave 9b6e234847a29a7fef3dcf21dc51ddd744d5c063 0 1502014182592 6 connected
6bf6bfc76b7bbfccef3ae385b6fcab39acdf8e69 192.168.1.81:7002@17002 slave 3eeaafc89210b41982ac00d676e8a030f252ae3a 0 1502014182087 5 connected
7ee57712c0f50a9e43f15a20a3536327ac0ae665 192.168.1.81:7001@17001 slave 8d428cca5ed67644eefabb9075ab58928bc150c1 0 1502014183095 4 connected
8d428cca5ed67644eefabb9075ab58928bc150c1 192.168.1.82:7003@17003 master - 0 1502014182000 4 connected 0-5460
3eeaafc89210b41982ac00d676e8a030f252ae3a 192.168.1.82:7004@17004 master - 0 1502014183096 5 connected 10923-16383
9b6e234847a29a7fef3dcf21dc51ddd744d5c063 192.168.1.81:7000@17000 myself,master - 0 1502014182000 1 connected 5461-10922


输入以下命令修复某个节点

redis-trib.rb fix 192.168.1.82:7004

修复完后检查节点状态

 redis-trib.rb check 192.168.1.82:7004

添加一个节点到集群,如果不指定slave,会添加一个master节点

redis-trib.rb add-node --slave 192.168.1.82:7006 192.168.1.81:7000

移除一个集群节点,node-id可用上面的cluster nodes查看,显示的第一列就是,经试验,不仅会从集群中删除该节点,还会关闭掉该节点

redis-trib.rb del-node 192.168.1.81:7000`<node-id>`

正常关闭节点,如果不加-h ip 则默认是127.0.0.1

redis-cli -h 192.168.1.81 -p 7000 shutdown

Redis集群在宕机后(全部节点都死掉,系统断电等极端情况),开机只需要把各节点启动即可主动加入集群,无需再次执行create --replicas命令,但有可能会导致某些节点异常,大多数情况下用fix命令可修复,重新启动后的主从节点会重新分配


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息