今天要部署一个redis伪分布式的集群,因为所有的redis实例都在一台机器上,只是他们的端口不同。
首先了解redis是什么。
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如
下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
系统的环境是centos7.3 64位
首先是下载redis3.0版本,3.0版本有集群的功能。
安装redis前需要安装gcc:yum install gcc-c++,因为redis的源码编译依赖gcc环境。
把下载好的redis-3.0.0.tar.gz拷贝到/usr/local下。
单机版:
解压源码
tar –zxf redis-3.0.0.tar.gz
进入解压后的目录进行编译
cd /usr/local/redis-3.0.0
make
安装到指定的目录如/usr/local/redis
cd /usr/local/redis-3.0.0
make install PREFIX=/usr/local/redis
redis.conf是redis的配置文件,redis.conf在redis源码目录下,默认指定的端口是6379
现在需要拷贝一份redis.conf到安装目录下
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
进入/usr/local/redis/bin下看有哪些文件:
redis-server redis服务器
redis-cli redis命令行客户端
redis-benchmark redis性能测试工具
redis-check-aof aof文件修复工具
redis-check-dump RDB文件检查工具
redis-sentinel redis集群管理工具
后端模式启动(推荐使用,前端模式启动就不说了)
需要修改redis.conf 文件中的daemonize yes
执行下面的命令
cd /usr/local/redis/bin
./redis.server ./redis.conf
查看是否启动
ps aux|grep redis
伪集群部署
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
拷贝redis-3.0.0.gem至/usr/local下
执行:
gem install /usr/local/redis-3.0.0.gem
这里用6个reids实例,端口7001-7006.
在/usr/local下创建redis-cluster目录,并创建7001,7002,7003,7004,7005,7006目录,并把将redis安装目录bin下的文件拷贝到每个700X目录内,同时将redis源码目录src下的redis-trib.rb拷贝到redis-cluster目录下。
修改每一个700X目录下的redis.conf 配置文件
port 7001
# bind 集群机ip
Cluster-enabled yes
启动每一个redis节点服务
./redis-server ./redis.conf
查看
ps aux |grep redis
执行创建集群命令
执行redis-trib.rb
./redis-trib.rb create --replicas 1 192.168.101.3:7001 192.168.101.3:7002192.168.101.3:7003 192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006
说明:
redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点
replicas指定为1表示每个主节点有一个从节点
注意:
如果执行时报如下错误:
[ERR]Node XXXXXX is not empty. Either the node already knows other nodes (check withCLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb。
还有的是
./redis-trib.rb create --replicas 1XXXX:PORT1 XXXX:PORT2 ....
的时候
一直等待 Waiting for the cluster to join 很久都没有反应
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
注意:iptables 放开,如果有安全组,也要放开这两个端口。
上面没有开放总线端口浪费我好几个小时。
创建集群输出如下:
>>> Creating cluster
Connecting to node 192.168.101.3:7001: OK
Connecting to node 192.168.101.3:7002: OK
Connecting to node 192.168.101.3:7003: OK
Connecting to node 192.168.101.3:7004: OK
Connecting to node 192.168.101.3:7005: OK
Connecting to node 192.168.101.3:7006: OK
>>> Performing hash slotsallocation on 6 nodes...
Using 3 masters:
192.168.101.3:7001
192.168.101.3:7002
192.168.101.3:7003
Adding replica 192.168.101.3:7004 to192.168.101.3:7001
Adding replica 192.168.101.3:7005 to192.168.101.3:7002
Adding replica 192.168.101.3:7006 to192.168.101.3:7003
M: cad9f7413ec6842c971dbcc2c48b4ca959eb5db4192.168.101.3:7001
slots:0-5460 (5461 slots) master
M: 4e7c2b02f0c4f4cfe306d6ad13e0cfee90bf5841192.168.101.3:7002
slots:5461-10922 (5462 slots) master
M: 1a8420896c3ff60b70c716e8480de8e50749ee65192.168.101.3:7003
slots:10923-16383 (5461 slots) master
S: 69d94b4963fd94f315fba2b9f12fae1278184fe8192.168.101.3:7004
replicates cad9f7413ec6842c971dbcc2c48b4ca959eb5db4
S: d2421a820cc23e17a01b597866fd0f750b698ac5192.168.101.3:7005
replicates 4e7c2b02f0c4f4cfe306d6ad13e0cfee90bf5841
S: 444e7bedbdfa40714ee55cd3086b8f0d5511fe54192.168.101.3:7006
replicates 1a8420896c3ff60b70c716e8480de8e50749ee65
Can I set the above configuration? (type'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different configepoch to each node
>>> Sending CLUSTER MEET messagesto join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check(using node 192.168.101.3:7001)
M: cad9f7413ec6842c971dbcc2c48b4ca959eb5db4192.168.101.3:7001
slots:0-5460 (5461 slots) master
M: 4e7c2b02f0c4f4cfe306d6ad13e0cfee90bf5841192.168.101.3:7002
slots:5461-10922 (5462 slots) master
M: 1a8420896c3ff60b70c716e8480de8e50749ee65192.168.101.3:7003
slots:10923-16383 (5461 slots) master
M: 69d94b4963fd94f315fba2b9f12fae1278184fe8192.168.101.3:7004
slots: (0 slots) master
replicates cad9f7413ec6842c971dbcc2c48b4ca959eb5db4
M: d2421a820cc23e17a01b597866fd0f750b698ac5192.168.101.3:7005
slots: (0 slots) master
replicates 4e7c2b02f0c4f4cfe306d6ad13e0cfee90bf5841
M: 444e7bedbdfa40714ee55cd3086b8f0d5511fe54192.168.101.3:7006
slots: (0 slots) master
replicates 1a8420896c3ff60b70c716e8480de8e50749ee65
[OK] All nodes agree about slotsconfiguration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试集群
[root@bogon redis-cluster]# 7001/bin/redis-cli-h 192.168.25.153 -p 7002 -c
[root@bogon redis-cluster]# 7001/bin /redis-cli-h 192.168.25.153 -p 7002
192.168.25.153:7002> set a 100
(error) MOVED 15495 192.168.25.153:7003
192.168.25.153:7002>
[root@bogon redis-cluster]# 7001/bin /redis-cli-h 192.168.25.153 -p 7002 -c
192.168.25.153:7002> set a 100
-> Redirected to slot [15495] located at192.168.25.153:7003
OK
192.168.25.153:7003>
关闭redis
7001/bin/redis-cli –p 7001 shutdown