1.1 介绍
redisCluster:
在3.0版本以后支持,无中心,在某种情况下会造成数据丢失,其也是通过算法将数据分片保存至某个redis服务器,即不再通过客户端计算key保存的redis服务器,redis服务器需要提前设置好自己所负责的槽位,比如redis A负责处理0-5000的哈希槽位数据,redis B负责处理5001-10000的hash槽位数据,redis C负责处理10001-16384的hash槽位数据,redis cluster需要特定的客户端,要求客户端必须支持集群协议,但是目前还没有比较好的客户端。
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。比如说:
如果用户将新节点 D 添加到集群中,那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
与此类似,如果用户要从集群中移除节点 A ,那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C ,然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞,所以无论是添加新节点还是移除已存在节点,又或者改变某个节点包含的哈希槽数量,都不会造成集群下线。
rediscluster需要专门的客户端,比如python当中引入的redis模块也不能使用了,目前官方的客户端也不是很多,需要自己开发。
1.1.1 架构细节
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
1.1.2 容错
(1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail)?
a: 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
b: 如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN Thecluster is down)错误
1.2 集群环境搭建
(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)
10.0.3.56:6001
10.0.3.56:6002
10.0.3.56:6003
10.0.3.56:6004
10.0.3.56:6005
10.0.3.56:6006
1.2.1 redis下载
同上所示,下载官网3.0版本之后,支持集群模式
http://download.redis.io/releases/
1.2.2 redis源码安装
# cd /opt
# wgethttp://download.redis.io/releases/redis-3.0.5.tar.gz
# tar xvf redis-3.0.5.tar.gz
# ln -sv /opt/redis-3.0.5/usr/local/redis
# cd /usr/local/redis/
# make && make install
1.2.3 redis编译安装
1.2.3.1 创建集群软件存放目录
mkdir /application &&cd /application/
1.2.3.2 上传redis软件(集群搭建要求版本大于3.0)
[root@gxmzd-card-mxkmp application]# ll
total 10876
drwxrwxr-x. 7 root root 4096 May 16 22:59 redis-3.0.5
-rw-r--r--. 1 root root 63488 May 16 23:51 redis-3.0.5.gem
-rw-r--r--. 1 root root 1366160 May 16 22:50 redis-3.0.5.tar.gz
drwxr-xr-x. 23 1035 1035 4096 Mar 30 2016 ruby-2.1.9
-rw-r--r--. 1 root root 9395648 May 16 22:50 ruby-2.1.9.tar.xz
drwxr-xr-x. 7 1249840000 4096 May 31 2011 rubygems-1.8.5
-rw-r--r--. 1 root root 249170 May 16 22:50 rubygems-1.8.5.tgz
1.2.3.3 编译安装reids
ln -sv /application/redis-3.0.5 /usr/local/redis
cd /usr/local/redis
make && make install
echo $?
#检查编译是否报错
1.2.3.4 复制集群配置文件和创建集群实例目录
mkdir redis_cluster && cd redis_cluster
mkdir redis{6001..6006}
1.2.3.5 修改redis.conf配置文件
主要针对如下几项:其它默认即可
bind 0.0.0.0
port 6001
daemonize yes (默认是no,直接运行./redis-server是前台启动,在关闭运行的窗口后redis也将关闭,为了关闭窗口后不关闭redis,需要使用后台启动,所以调整为no)
pidfile /var/run/redis_6001.pid
logfile "/usr/local/redis/redis_cluster/redis6001/redis6001.log" #节点启动日志
dir /usr/local/redis/redis_cluster/redis6001/ #保存路径
maxmemory 512M #限制redis 最大使用内存
appendonly yes #是否开启AOF
appendfilename "appendonly_6001.aof" #保存路径,和RDB在一起
appendfsync everysec #每秒执行一次fsync,即将内存更改的数据写入磁盘
cluster-enabled yes #必须打开cluster功能,否则集群创建不成功
cluster-config-filenodes-6001.conf#每个主机一个配置文件,有集群创建和管理,集群内的各主机不能重名节点实例启动配置
1.2.3.6 批量生成其他节点的配置文件
#复制redis6001配置文件为模板,通过sed批量生成reids 配置文件
cp /usr/local/redis/redis_cluster/redis6001/redis.conf /application
sed "s#6001#6002#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6002/redis.conf
sed "s#6001#6003#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6003/redis.conf
sed "s#6001#6004#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6004/redis.conf
sed "s#6001#6005#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6005/redis.conf
sed "s#6001#6006#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6006/redis.conf
1.2.3.7 服务器批量启动redis 服务并验证端口存在
启动redis多节点服务
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6002/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6003/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6004/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6005/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6006/redis.conf
#查看进程启动情况
[root@gxmzd-card-mxkmp ~]# ps -ef|grep redis
root 46835 1 023:24 ? 00:00:00 /usr/local/redis/src/redis-server0.0.0.0:6001 [cluster]
root 46870 1 023:26 ? 00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6002 [cluster]
root 46875 1 023:26 ? 00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6003 [cluster]
root 46879 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6004 [cluster]
root 46884 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6005 [cluster]
root 46888 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6006 [cluster]
root 47244 43369 0 23:37 pts/2 00:00:00 grep redis
1.2.3.8 验证集群节点是否能登录
redis-cli -h 10.0.3.56 -p6001
redis-cli -h 10.0.3.56 -p6002
redis-cli -h 10.0.3.56 -p6003
redis-cli -h 10.0.3.56 -p6004
redis-cli -h 10.0.3.56 -p6006
redis-cli -h 10.0.3.56 -p6005
10.0.3.56:6005>
#出现此界面表示启动成功,节点正常!
1.3 安装ruby环境
执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:./redis-trib.rb:24:in`require': no such file to load -- rubygems (LoadError)
from./redis-trib.rb:24
1.3.1 yum安装 ruby
(强烈建议此方法)
yum -y install rubyrubygems
安装完成后,执行gem软件安装
cd /application
gem install redis-3.0.5.gem
1.3.2 编译安装ruby
安装ruby
tar xf ruby-2.1.9.tar.xz
cd ruby-2.1.9
./configure
make && make install
安装rubygems
tar -xf rubygems-1.8.5.tgz
cd rubygems-1.8.5
ruby setup.rb
1.3.3 编译安装 gem
需安装redis-3.0.5.gem软件包,本地上传该软件包后,执行如下操作:
下载:https://rubygems.org/gems/redis/versions/3.0.5
cd /application
gem install redis-3.0.5.gem
1.4 创建redis集群
单机部署redis cluster集群
输入 yes并按下回车确认之后, 集群就会将配置应用到各个节点, 并连接起(join)各个节点 ——也即是, 让各个节点开始互相通讯. (一般按如上步骤操作后即可正常安装)
1)复制ruby的管理脚本
cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/redis-trib
2)执行集群创建命令
redis-trib create --replicas 1 10.0.3.56:6001 10.0.3.56:6002 10.0.3.56:600310.0.3.56:6004 10.0.3.56:6005 10.0.3.56:6006
#命令在这里用于创建一个新的集群, 选项--replicas1 表示我们希望为集群中的每个主节点创建一个从节点。
问题记录:
注意:如果创建集群之前创建过请清空之前的文件,否则出现如下报错:
[ERR] Node XXXXXX is not empty.Either the node already knows other nodes (check with CLUSTER NODES) orcontains some key in database 0
解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb 文件(如果担心丢失,可执行mv 移动到别的文件夹)
1.5 使用redis-cli命令进入集群环境
使用客户端进行链接测试
本地登录测试 必须加参数“-c”才能进入到集群环境。
redis-cli -c -p 6005
远程客户端登录
redis-cli -h 10.0.3.56 -p 6001
redis-cli + IP + 端口
执行INFO名称查看各节点状态
10.0.3.56:6005> INFO
# Server
redis_version:3.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:fe615b439d6069da
redis_mode:cluster
……
如何关闭redis节点
通过命令redis01/redis-cli -p 7001 shutdown进行关闭,这样在关闭之前,数据才能够进行保存。
不能直接kill。
转载于:https://blog.51cto.com/zhanglm/1928580