redis集群部署

来源:互联网 发布:宽带无网络 编辑:程序博客网 时间:2024/06/16 13:46
redis集群的特点:
1.所有节点彼此互联,内部使用二进制协议优化传输速度和带宽
2.节点的fail是集群中超过半数的节点检测失效
3.redis_cluster把所有物理节点映射到0-16383个哈希槽上,cluster负责位数node-》哈希槽-》value,redis内置偶2的14次方个槽点,进行存储的时候根据设置的key进行算法加密后的结果进行取余,得到的值为槽的编号,槽在哪个节点就存储在哪个节点
4.redis集群要有至少3个主节点,每个主节点至少要有一个从节点
5.7000和7005是集群环境,在一台机器7000上创建一个key 值为test,到7005机器上可以得到这个key的值。
集群中的每个节点都是平等的关系,每个节点保存各自的数据和整个集群的状态,每个节点和其他所有节点连接,并且保持连接的活跃,这样就保证了我们连接其中任意一个节点,就可以获取到其他节点的数据。

redis集群的部署:
1. 下载并解压
cd /root/software
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
tar -zxvf redis-3.2.4.tar.gz 
2. 编译安装
cd redis-3.2.4make && make install 
4. 创建 Redis 节点
首先在 192.168.31.245 机器上 /root/software/redis-3.2.4 目录下创建 redis_cluster 目录;
mkdir redis_cluster  
在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
mkdir700070017002<br>cp redis.conf redis_cluster/7000cp redis.conf redis_cluster/7001cp redis.conf redis_cluster/7002  
分别修改这三个配置文件,修改如下内容
port7000//端口7000,7002,7003bind 本机ip//默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群daemonize yes//redis后台运行pidfile /var/run/redis_7000.pid//pidfile文件对应7000,7001,7002cluster-enabled yes//开启集群 把注释#去掉cluster-config-file nodes_7000.conf//集群的配置 配置文件首次启动自动生成 7000,7001,7002cluster-node-timeout15000//请求超时 默认15秒,可自行设置appendonly yes//aof日志开启 有需要就开启,它会每次写操作都记录一条日志 
  • 接着在另外一台机器上(192.168.31.210),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可
5. 启动各个节点
第一台机器上执行redis-server redis_cluster/7000/redis.confredis-server redis_cluster/7001/redis.confredis-server redis_cluster/7002/redis.conf 另外一台机器上执行redis-server redis_cluster/7003/redis.confredis-server redis_cluster/7004/redis.confredis-server redis_cluster/7005/redis.conf
6. 检查 redis 启动情况
##一台机器<br>ps -ef | grep redisroot610201002:14 ? 00:00:01 redis-server 127.0.0.1:7000 [cluster] root 610241002:14 ? 00:00:01 redis-server 127.0.0.1:7001 [cluster] root 610291002:14 ? 00:00:01 redis-server 127.0.0.1:7002 [cluster]
7.创建集群
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。
redis-trib.rb create --replicas1192.168.31.245:7000192.168.31.245:7001192.168.31.245:7002192.168.31.210:7003192.168.31.210:7004192.168.31.210:7005
其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。

运行到这里的时候报错,是因为没有安装ruby环境。
yum install -y ruby //安装ruby
yum install -y rubygems //安装rubygem组件
 gem install redis       //安装redis的接口包
 gem list            //查看接口包是否安装成功
涉及到版本问题:
curl -L get.rvm.io | bash -s stable source /etc/profile.d/rvm.sh //安装rvm rvm install 1.9.3 //安装ruby1.9.3 rvm use 1.9.3 --default //设置ruby1.9.3为默认的ruby
gem sources -a http://ruby.taobao.org/
关于安装ruby环境:
windos的安装是用yum命令,mac本使用brew命令即可
安装:brew install xxx
删除:brew remove xxx
查看:brew list
更新:brew upgrade
$ curl -L https://get.rvm.io | bash -s stable 
$ source ~/.rvm/scripts/rvm
$ rvm -v  
$ rvm list known  
$ rvm install 2.0.0  
$ rvm list  
rvm user 2.0.0 --default
brew install ruby
gem sources -a http://ruby.taobao.org/
gem install redis
gem list

创建集群节点的结果:M表示主节点,S表示从节点,注意主节点从节点不要在一台机器上
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-trib.rb create --replicas 1 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
Adding replica 127.0.0.1:7007 to 127.0.0.1:7004
Adding replica 127.0.0.1:7008 to 127.0.0.1:7005
M: b9d925c506de8ef992aacb0b93c88ac8738d8d50 127.0.0.1:7003
slots:0-5460 (5461 slots) master
M: 62ffd143002724ab89749043721cb10d9f1949d3 127.0.0.1:7004
slots:5461-10922 (5462 slots) master
M: f0aee78e748317ad62fc835ef454fe50d68ecf0c 127.0.0.1:7005
slots:10923-16383 (5461 slots) master
S: 842e66cbfc89d7d94a31245127398ab6622833aa 127.0.0.1:7006
replicates b9d925c506de8ef992aacb0b93c88ac8738d8d50
S: 4d361e6a0b69ef5e07291e0af69f0ca72693332e 127.0.0.1:7007
replicates 62ffd143002724ab89749043721cb10d9f1949d3
S: f405372fba68b5538b15e511297fc73df46f873d 127.0.0.1:7008
replicates f0aee78e748317ad62fc835ef454fe50d68ecf0c
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 127.0.0.1:7003)
M: b9d925c506de8ef992aacb0b93c88ac8738d8d50 127.0.0.1:7003
slots:0-5460 (5461 slots) master
M: 62ffd143002724ab89749043721cb10d9f1949d3 127.0.0.1:7004
slots:5461-10922 (5462 slots) master
M: f0aee78e748317ad62fc835ef454fe50d68ecf0c 127.0.0.1:7005
slots:10923-16383 (5461 slots) master
M: 842e66cbfc89d7d94a31245127398ab6622833aa 127.0.0.1:7006
slots: (0 slots) master
replicates b9d925c506de8ef992aacb0b93c88ac8738d8d50
M: 4d361e6a0b69ef5e07291e0af69f0ca72693332e 127.0.0.1:7007
slots: (0 slots) master
replicates 62ffd143002724ab89749043721cb10d9f1949d3
M: f405372fba68b5538b15e511297fc73df46f873d 127.0.0.1:7008
slots: (0 slots) master
replicates f0aee78e748317ad62fc835ef454fe50d68ecf0c
[OK] All nodes agree about slots configuration.

集群连接测试:
1.在7005端口号加入一个键
./redis-cli -h 127.0.0.1 -c -p 7005
127.0.0.1:7005> keys *
(empty list or set)
127.0.0.1:7005> set test 11111
-> Redirected to slot [6918] located at 127.0.0.1:7004
OK
--切换到7004端口号,可以得到这个键的值
./redis-cli -h 127.0.0.1 -c -p 7004
127.0.0.1:7004> get test
"11111"
127.0.0.1:7004>

当一半的主节点宕机后,整个集群宕机,再在从节点放数据放不进去,
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -h 127.0.0.1 -c -p 7007
127.0.0.1:7007> set mm www
(error) CLUSTERDOWN The cluster is down

另外,redis集群是根据哈希槽存放数据的
./redis-cli -h 127.0.0.1 -c -p 7007
127.0.0.1:7007> set mm ww
-> Redirected to slot [125] located at 127.0.0.1:7003
OK
127.0.0.1:7003> get mm
"ww"
127.0.0.1:7003> set test 44
-> Redirected to slot [6918] located at 127.0.0.1:7004
OK

redis集群不可用的情况:
1.当超过半数以上的主服务挂掉后,不管有没有从服务,都会导致集群不可用。
如果一台机器上都是主,一台机器都是从,当主机器宕机后,并没有重新参与选举,让从机器上的从服务被选举为主,恢复使用,而是整个集群不可用,除非重启主机器,病别重启主机器上的redis实例。
2.如果集群任意master挂掉,并且当前master没有slave,整个集群不可用。

redis集群的优缺点:
1.在master下线后,主节点会自动提升为从节点,保存集群持续提供服务,证明如下,7005下线后,7008成为主了:
127.0.0.1:7006> cluster nodes
f405372fba68b5538b15e511297fc73df46f873d 127.0.0.1:7008 master - 0 1504513278719 8 connected 10923-16383
b9d925c506de8ef992aacb0b93c88ac8738d8d50 127.0.0.1:7003 master - 0 1504513280739 1 connected 0-5460
842e66cbfc89d7d94a31245127398ab6622833aa 127.0.0.1:7006 myself,slave b9d925c506de8ef992aacb0b93c88ac8738d8d50 0 0 4 connected
f0aee78e748317ad62fc835ef454fe50d68ecf0c 127.0.0.1:7005 master,fail - 1504512826457 1504512824138 3 disconnected
4d361e6a0b69ef5e07291e0af69f0ca72693332e 127.0.0.1:7007 slave 62ffd143002724ab89749043721cb10d9f1949d3 0 1504513279730 5 connected
62ffd143002724ab89749043721cb10d9f1949d3 127.0.0.1:7004 master - 0 1504513277710 2 connected 5461-10922
127.0.0.1:7006>
2.当节点恢复后,会自动添加到集群中,变为从节点(7005恢复后,7005成为了7008的从节点:)
./redis-server /Users/yp-tc-m-7129/redis/redis-3.0.7/redis_cluster/7005/redis.conf
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -c -p 7005
127.0.0.1:7005> cluster nodes
62ffd143002724ab89749043721cb10d9f1949d3 127.0.0.1:7004 master - 0 1504513473282 2 connected 5461-10922
f405372fba68b5538b15e511297fc73df46f873d 127.0.0.1:7008 master - 0 1504513475297 8 connected 10923-16383
b9d925c506de8ef992aacb0b93c88ac8738d8d50 127.0.0.1:7003 master - 0 1504513477312 1 connected 0-5460
4d361e6a0b69ef5e07291e0af69f0ca72693332e 127.0.0.1:7007 slave 62ffd143002724ab89749043721cb10d9f1949d3 0 1504513476305 5 connected
f0aee78e748317ad62fc835ef454fe50d68ecf0c 127.0.0.1:7005 myself,slave f405372fba68b5538b15e511297fc73df46f873d 0 0 3 connected
缺点:
由于redis的集群使用异步机制,在自动故障转移过程中,集群可能会丢失写命令

redis节点的增删改查操作:
1.查询redis集群的各个节点状态:
--从节点参数有:我自己的id,我的ip和端口号,我是从节点还是主节点,我的主节点的id(表明我属于哪个主节点),最近一次向节点发送ping命令后过了多长时间还没回复,节点最近一次返回pong回复的时间,节点的配置纪元,节点的网络连接情况,节点目前包含的槽
127.0.0.1:7006> cluster nodes
f405372fba68b5538b15e511297fc73df46f873d127.0.0.1:7008 slave f0aee78e748317ad62fc835ef454fe50d68ecf0c0 1504511275183 6 connected
b9d925c506de8ef992aacb0b93c88ac8738d8d50 127.0.0.1:7003 master - 0 1504511274174 1 connected0-5460
842e66cbfc89d7d94a31245127398ab6622833aa 127.0.0.1:7006 myself,slave b9d925c506de8ef992aacb0b93c88ac8738d8d50 0 0 4 connected
f0aee78e748317ad62fc835ef454fe50d68ecf0c 127.0.0.1:7005 master - 0 1504511273167 3 connected 10923-16383
4d361e6a0b69ef5e07291e0af69f0ca72693332e 127.0.0.1:7007 slave 62ffd143002724ab89749043721cb10d9f1949d3 0 1504511271152 5 connected
62ffd143002724ab89749043721cb10d9f1949d3 127.0.0.1:7004 master - 0 1504511273670 2 connected 5461-10922

2.删除节点:(没有数据需要转移的)
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-trib.rb del-node 127.0.0.1:7006 '842e66cbfc89d7d94a31245127398ab6622833aa'
>>> Removing node 842e66cbfc89d7d94a31245127398ab6622833aa from cluster 127.0.0.1:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

3.添加主节点
前面地址是新添加的主节点ip和端口号,后面是已存在的集群中的任意一台./redis-trib.rb add-node 192.168.101.3:7007 192.168.101.3:7001
添加完节点后,我们还需要给新添加的节点分配哈希槽
./redis-trib.rb reshard 192.168.142.128:7007
4.添加从节点./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口这个相对繁琐点,需要查看一下master节点的id,这个通过直接node.conf或者clouster nodes 命令都可以看到。例如: 主节点id,主节点地址和端口,从节点地址和端口./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 192.168.101.3:7008 192.168.101.3:7001
5.删除节点./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017ps:这时候需要首先将该节点的存在的数据,也就是槽点进行删除才能够进行移除节点操作

6.cluster info 的返回信息参数
127.0.0.1:7006> cluster info
cluster_state:ok
如果当前redis发现有failed的slots,默认为把自己cluster_state从ok个性为fail, 写入命令会失败。如果设置cluster-require-full-coverage为no,则无此限制。
cluster_slots_assigned:16384#已分配的槽
cluster_slots_ok:16384#槽的状态是ok的数目
cluster_slots_pfail:0#可能失效的槽的数目
cluster_slots_fail:0#已经失效的槽的数目
cluster_known_nodes:6#集群中节点个数
cluster_size:3#集群中设置的分片个数
cluster_current_epoch:6 #集群中最新的这个数,这个数越高表示节点配置或者操作越新
cluster_my_epoch:1#当前节点的config epoch
cluster_stats_messages_sent:437
cluster_stats_messages_received:437

redis 的主从复制和读写分离--在非集群模式下:
下载安装包,解压,进入主目录:
make && make install 之后再src目录下就出现了server-cli等可执行文件,建立主节点,建立从节点,多了一句话 slaveof 127.0.0.1 7011即可,下面测试实现了主从复制,读写分离。
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-server /Users/yp-tc-m-7129/soft/redis/redis-3.0.7/master7011/redis.conf
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -h 127.0.0.1 -p 7011
127.0.0.1:7011> set mm mm
OK
127.0.0.1:7011>
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-server /Users/yp-tc-m-7129/soft/redis/redis-3.0.7/slave7012/redis.conf
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -h 127.0.0.1 -p 7012
127.0.0.1:7012> get mm
"mm"
127.0.0.1:7012> set kk kk
(error) READONLY You can't write against a read only slave.

关于集群环境下redis的读写分离和主从复制问题:
建立集群环境后,遇到的问题:
1.作为从节点,不允许插入元素,但是看你有没有建立了集群,不要采用集群方式启动redis实例,如下,仍是把数据写到了7008实例中。理论上不会实现的,因为7008上没有哈希槽的
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -c -p 7006
127.0.0.1:7006> set jiji hh
-> Redirected to slot [11757] located at 127.0.0.1:7008
OK

2.建立了集群环境,70003,7008,7004是主节点,7006,7005,7007是从节点,7009 7010不处于集群环境中,想用这两个来测试读写分离.。可能设置完集群需要重启redis或者重启电脑的
./redis-trib.rb 127.0.0.1:7009
Unknown redis-trib subcommand '127.0.0.1:7009'

./redis-cli -h 127.0.0.1 -c -p 7009
127.0.0.1:7009> set mm kk
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7009>

./redis-server /Users/yp-tc-m-7129/redis/redis-3.0.7/redis_cluster/7009/redis.conf
yp-tc-m-7129deMacBook-Air:src yp-tc-m-7129$ ./redis-cli -p 7009
127.0.0.1:7009> set mm mm
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7009>


原创粉丝点击