参考文章:html
https://www.cnblogs.com/boshen-hzb/p/7699783.htmljava
sentinel monitor mymaster 127.0.0.1 7001 2node
一:安装redisredis
1.参照网上的例子。确保机器上面有gcc、ruby环境。验证的命令是:gcc -v、ruby-v。若是没有这两个环境,就须要安装。brew install gcc;brew install rubyruby
2.下载redis源码。下载地址:http://www.redis.cn/。服务器
3.编译安装redis测试
make make install PREFIX=/usr/local/redis cp redis.conf /usr/local/redis/bin/redis.conf
4.运行redis命令行
在/usr/local/redis/bin/目录下面,运行 ./redis-server redis.conf 命令线程
5.验证redis是否启动成功,仍是在usr/local/redis/bin/目录下面3d
MacBook-Pro:bin a$ ./redis-cli -p 6379 127.0.0.1:6379> get (error) ERR wrong number of arguments for 'get' command 127.0.0.1:6379> set a abc OK 127.0.0.1:6379> get a "abc" 127.0.0.1:6379>
二:安装集群(集群模式)
1.建立文件夹:usr/local/redis-cluster/
2.将redis文件复制到该目录下面,而且从新命名redis1.复制redis1文件夹五分,从reidis1到redis6
3.要作集群就应当修改这些里面的配置文件。主要的修改内容以下:端口修改从7001-7006
daemonize yes port 7001 #日志文件 logfile "./redis-7001.log" protected-mode no pidfile /var/run/redis_7001.pid cluster-enabled yes
#注意,这里必定要改,否则默认是经过nodes-6379配置启动,当你启动第二台的时候,就会爆文件被占用的错误
cluster-config-file nodes-7001.conf
2.修改文件权限,不然可能会爆没有权限访问对应的日志文件
chmod 777 xxx
最好将配置redis集群的文件夹的全部者改成当前系统登陆人,不然可能会出现一些莫名其妙的错误
chown -R a /usr/local/redis-cluster/
3。配置完后,逐个启动cluster。
MacBook-Pro:redis-cluster a$ ./redis1/redis-server ./redis1/nodes-7001.conf MacBook-Pro:redis-cluster a$ ./redis3/redis-server ./redis3/nodes-7003.conf MacBook-Pro:redis-cluster a$ ./redis4/redis-server ./redis4/nodes-7004.conf MacBook-Pro:redis-cluster a$ ./redis5/redis-server ./redis5/nodes-7005.conf MacBook-Pro:redis-cluster a$ ./redis6/redis-server ./redis6/nodes-7006.conf
查看已经启动的线程信息
MacBook-Pro:redis-cluster a$ ps aux|grep redis a 3084 0.0 0.0 4276968 884 s003 S+ 4:43下午 0:00.00 grep redis a 3080 0.0 0.0 4293756 2200 ?? Ss 4:43下午 0:00.01 ./redis6/redis-server 127.0.0.1:7006 [cluster] a 3078 0.0 0.0 4301948 2204 ?? Ss 4:43下午 0:00.03 ./redis5/redis-server 127.0.0.1:7005 [cluster] a 3075 0.0 0.0 4293756 2208 ?? Ss 4:42下午 0:00.04 ./redis4/redis-server 127.0.0.1:7004 [cluster] a 3072 0.0 0.0 4301948 2216 ?? Ss 4:42下午 0:00.05 ./redis3/redis-server 127.0.0.1:7003 [cluster] a 3068 0.0 0.0 4293756 2188 ?? Ss 4:41下午 0:00.09 ./redis1/redis-server 127.0.0.1:7001 [cluster] a 3062 0.0 0.0 4310140 2256 ?? Ss 4:41下午 0:00.12 ./redis2/redis-server 127.0.0.1:7002 [cluster]
启动成功后输出。能够看到,01,02,03是master。其余的做为从
#该命令告诉系统个人redis集群由哪些节点组成
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
MacBook-Pro:redis-cluster a$ ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7006 to 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001 slots:0-5460 (5461 slots) master M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002 slots:5461-10922 (5462 slots) master M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003 slots:10923-16383 (5461 slots) master S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004 replicates c3414bd40496b9f2910f72a41b17463d6ac9d708 S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005 replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006 replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced 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:7001) M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004 slots: (0 slots) slave replicates c3414bd40496b9f2910f72a41b17463d6ac9d708 S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005 slots: (0 slots) slave replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006 slots: (0 slots) slave replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
4.测试
必定得使用参数 ./redis6/redis-cli -c -p 7006
-c -p
-c
链接集群结点时使用,此选项可防止moved和ask异常。
启动一次后,redis的集群就创建好了。从上面的实验能够看出。从库在获取数据的时候,会有一种给人飘忽不定的感受,在网上查询相关原理是是这样解释的:redis提供的slot(插槽)有16383个,而后在获取的时候是经过CRC(key) % 16383取模的,飘到哪一个节点就算是哪一个节点。
用集群的方式去部署redis集群,在停掉一个master节点后,在slave上面使用get命令的时候可能会偏移到已经停掉的节点上面,这时会报错
(error) CLUSTERDOWN The cluster is down
猜测可能使用集群方式部署redis集群,一个master节点挂掉以后,整个集群也就挂掉了。
猜测。可能在7001上面set的值并无同步到其余节点。7001重启以后整个集群就从新恢复工做了,可是,7001没有关闭以前,7006是7001的从节点,当7001关闭后,7006升级为主节点,从新开启7001后,7001变为7006的从节点。
查看节点信息命令:
./redis1/redis-cli -p 7001 cluster nodes
返回结果:
9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001@17001 myself,slave 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 0 1527641808000 1 connected 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006@17006 master - 0 1527641807000 7 connected 0-5460 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005@17005 slave a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 0 1527641807547 5 connected c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002@17002 master - 0 1527641808000 2 connected 5461-10922 a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003@17003 master - 0 1527641808556 3 connected 10923-16383 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004@17004 slave c3414bd40496b9f2910f72a41b17463d6ac9d708 0 1527641809563 4 connected
查看集集群状态:
cluster nodes
返回结果
给slave节点赋值master节点命令:
#最后这个参数是经过cluster node命令获得的master的hash值
./redis4/redis-cli -p 7006 cluster replicate a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1
让全部节点相互感知:cluster meet 命令
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7001 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7002 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7004 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7005 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7006
查看集群状态
查看对应节点的集群状态:cluster info
若是查看到对应的节点的集群状态是fail,那么使用cluster meet命令与其余节点相互感知。而后在从新启动。
127.0.0.1:7003> cluster info cluster_state:fail //代表集群已经挂了。 cluster_slots_assigned:16381 cluster_slots_ok:16381 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 //集群节点数 cluster_size:3 cluster_current_epoch:8 cluster_my_epoch:3 cluster_stats_messages_ping_sent:1962 cluster_stats_messages_pong_sent:1954 cluster_stats_messages_sent:3916 cluster_stats_messages_ping_received:1953 cluster_stats_messages_pong_received:1962 cluster_stats_messages_meet_received:1 cluster_stats_messages_received:3916
当经过cluster info命令查看到状态是fail而且其余参数都是正常的时候,说明此时redis集群已经挂了。因此你在命令行输入获取或者添加的命名就会报异常,此时须要将全部节点重启。
redis集群挂掉的缘由:
1.集群的任意master挂掉,而且该master没有相应的slave
2.超过半数以上的master挂掉
二:哨兵模式创建redis集群(sentinel)
工做模式:
设置一个节点为master,多个监控器(sentinels)。当sentinel主观判断master下线时,系统会自动从slave节点中选举一个做为新的master节点。
使用哨兵模式搭建的redis集群,slave节点不容许写数据,只可以读取数据,要想写数据智能切换到master节点
同上,须要创建几个节点信息。修改对应的配置文件。
复制创建redis1,redis2,redis3.。。。。
修改配置文件。须要将 cluster-enable yes改成no
daemonize yes Port 7001 #Bind 127.0.0.1 logfile "./redis-7001.log" protected-mode no cluster-config-file nodes-7001.conf
改完后,分别启动对应的节点。并进入到该节点中手动指定对应的主节点.
#若是以前的cluster-enable yes没改的话。运行这个命令就会报错
salveof 127.0.0.0 7001
sentinel
从redis的压缩包复制sentinel.conf过来。修改对应的配置信息
port 7005
#设置127.0.0.1 的7001是master,而且当2个sentinel监控他挂掉再从slave中选举节点来作为master
sentinel monitor mymaster 127.0.0.1 7001 2
protected-mode no
启动sentinel实例
./redis-sentinel/sentinel1/redis-sentinel ./redis-sentinel/sentinel1/sentinel.conf &
进入sentinel查看相关的监控信息
MacBook-Pro:local a$ ./redis/bin/redis-cli -p 27001
127.0.0.1:27001> sentinel masters
相关命令
① INFO
sentinel的基本状态信息
②SENTINEL masters
列出全部被监视的主服务器,以及这些主服务器的当前状态
③ SENTINEL slaves
列出给定主服务器的全部从服务器,以及这些从服务器的当前状态
④SENTINEL get-master-addr-by-name
返回给定名字的主服务器的 IP 地址和端口号
⑤SENTINEL reset
重置全部名字和给定模式 pattern 相匹配的主服务器。重置操做清除主服务器目前的全部状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的全部从服务器和 Sentinel 。
⑥SENTINEL failover
当主服务器失效时, 在不询问其余 Sentinel 意见的状况下, 强制开始一次自动故障迁移,可是它会给其余sentinel发送一个最新的配置,其余sentinel会根据这个配置进行更新。
如今默认的主是7001节点。当手动杀掉7001节点后,27001,27002这两个哨兵主观判断7001节点已经挂掉就选举出7003来当选新的master节点。