本文共 15713 字,大约阅读时间需要 52 分钟。
笔记内容:redis集群
笔记内容:2018-1-04redis cluster(redis集群)是redis3.0之后的版本才支持的架构,和其他集群一样,redis集群也是为了解决单台服务器不够用的情况。redis cluster是一个分布式的集群方案,它支持横向扩展。redis的集群方案不单止官方的redis cluster,还有第三方的Codis集群方案。Codis类似于LVS做负载均衡一样,它用的是路由的技术。而官方的redis cluster则是把所有的节点都互联,实现数据共享。
redis cluster集群的特点:
场景:
两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
配置文件的内容可以在以下网址获得:
1.A机器上编辑配置文件:
[root@localhost ~]# vim /etc/redis_7000.confport 7000bind 192.168.77.130 # IP改为你自己的daemonize yespidfile /var/run/redis_7000.piddir /data/redis_data/7000cluster-enabled yescluster-config-file nodes_7000.confcluster-node-timeout 10100appendonly yes[root@localhost ~]# vim /etc/redis_7001.confport 7001bind 192.168.77.130daemonize yespidfile /var/run/redis_7001.piddir /data/redis_data/7001cluster-enabled yescluster-config-file nodes_7001.confcluster-node-timeout 10100appendonly yes[root@localhost ~]# vim /etc/redis_7002.confport 7002bind 192.168.77.130daemonize yespidfile /var/run/redis_7002.piddir /data/redis_data/7002cluster-enabled yescluster-config-file nodes_7002.confcluster-node-timeout 10100appendonly yes
2.B机器上编辑配置文件:
[root@localhost ~]# vim /etc/redis_7003.confport 7003bind 192.168.77.128daemonize yespidfile /var/run/redis_7003.piddir /data/redis_data/7003cluster-enabled yescluster-config-file nodes_7003.confcluster-node-timeout 10100appendonly yes[root@localhost ~]# vim /etc/redis_7004.confport 7004bind 192.168.77.128daemonize yespidfile /var/run/redis_7004.piddir /data/redis_data/7004cluster-enabled yescluster-config-file nodes_7004.confcluster-node-timeout 10100appendonly yes[root@localhost ~]# vim /etc/redis_7005.confport 7005bind 192.168.77.128daemonize yespidfile /var/run/redis_7005.piddir /data/redis_data/7005cluster-enabled yescluster-config-file nodes_7005.confcluster-node-timeout 10100appendonly yes
3.启动A机器上的redis服务,并检查进程和端口:
[root@localhost ~]# mkdir /data/redis_data/{7000,7001,7002}[root@localhost ~]# redis-server /etc/redis_7000.conf 3321:C 04 Jan 19:06:50.351 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo3321:C 04 Jan 19:06:50.351 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3321, just started3321:C 04 Jan 19:06:50.351 # Configuration loaded[root@localhost ~]# redis-server /etc/redis_7001.conf 3326:C 04 Jan 19:06:54.636 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo3326:C 04 Jan 19:06:54.636 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3326, just started3326:C 04 Jan 19:06:54.636 # Configuration loaded[root@localhost ~]# redis-server /etc/redis_7002.conf 3331:C 04 Jan 19:06:57.955 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo3331:C 04 Jan 19:06:57.955 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3331, just started3331:C 04 Jan 19:06:57.955 # Configuration loaded[root@localhost ~]# netstat -lntp |grep 700.tcp 0 0 192.168.77.130:17000 0.0.0.0:* LISTEN 3322/redis-server 1 tcp 0 0 192.168.77.130:17001 0.0.0.0:* LISTEN 3327/redis-server 1 tcp 0 0 192.168.77.130:17002 0.0.0.0:* LISTEN 3332/redis-server 1 tcp 0 0 192.168.77.130:7000 0.0.0.0:* LISTEN 3322/redis-server 1 tcp 0 0 192.168.77.130:7001 0.0.0.0:* LISTEN 3327/redis-server 1 tcp 0 0 192.168.77.130:7002 0.0.0.0:* LISTEN 3332/redis-server 1 [root@localhost ~]# ps aux |grep redisroot 3322 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7000 [cluster]root 3327 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7001 [cluster]root 3332 0.1 0.4 145248 7564 ? Ssl 19:06 0:00 redis-server 192.168.77.130:7002 [cluster]root 3365 0.0 0.0 112668 972 pts/0 S+ 19:09 0:00 grep --color=auto redis[root@localhost ~]#
4.启动B机器上的redis服务,并检查进程和端口:
[root@localhost ~]# mkdir /data/redis_data/{7003,7004,7005}[root@localhost ~]# redis-server /etc/redis_7003.conf4842:C 04 Jan 11:14:41.314 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo4842:C 04 Jan 11:14:41.314 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4842, just started4842:C 04 Jan 11:14:41.314 # Configuration loaded[root@localhost ~]# redis-server /etc/redis_7004.conf4847:C 04 Jan 11:14:43.907 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo4847:C 04 Jan 11:14:43.907 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4847, just started4847:C 04 Jan 11:14:43.907 # Configuration loaded[root@localhost ~]# redis-server /etc/redis_7005.conf4852:C 04 Jan 11:14:46.184 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo4852:C 04 Jan 11:14:46.184 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4852, just started4852:C 04 Jan 11:14:46.184 # Configuration loaded[root@localhost ~]# netstat -lntp |grep 700.tcp 0 0 192.168.77.128:17003 0.0.0.0:* LISTEN 4843/redis-server 1 tcp 0 0 192.168.77.128:17004 0.0.0.0:* LISTEN 4848/redis-server 1 tcp 0 0 192.168.77.128:17005 0.0.0.0:* LISTEN 4853/redis-server 1 tcp 0 0 192.168.77.128:7003 0.0.0.0:* LISTEN 4843/redis-server 1 tcp 0 0 192.168.77.128:7004 0.0.0.0:* LISTEN 4848/redis-server 1 tcp 0 0 192.168.77.128:7005 0.0.0.0:* LISTEN 4853/redis-server 1 [root@localhost ~]# ps aux |grep redisroot 4843 0.1 0.1 145244 7572 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7003 [cluster]root 4848 0.1 0.1 145244 7568 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7004 [cluster]root 4853 0.1 0.1 145244 7568 ? Ssl 11:14 0:00 redis-server 192.168.77.128:7005 [cluster]root 4911 0.0 0.0 112660 964 pts/0 S+ 11:17 0:00 grep --color=auto redis[root@localhost ~]#
5.在A机器上安装ruby2.2:
安装好依赖:
[root@localhost ~]# yum -y groupinstall "Development Tools"[root@localhost ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve[root@localhost ~]# cd /root/[root@localhost ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
下载源码包,并把源码包打包成rpm包进行安装:
[root@localhost ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz[root@localhost ~]# mv ruby-2.2.3.tar.gz rpmbuild/SOURCES/[root@localhost ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS[root@localhost ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec # 这一步需要等待一会[root@localhost ~]# ls rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm # 检查是否打包成了rpm包rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm[root@localhost ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm[root@localhost ~]# ruby -v # 检查是否安装完成ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux][root@localhost ~]# gem install redis # 安装与redis相关的包Fetching: redis-4.0.1.gem (100%)Successfully installed redis-4.0.1Parsing documentation for redis-4.0.1Installing ri documentation for redis-4.0.1Done installing documentation for redis after 1 seconds1 gem installed[root@localhost ~]#
6.拷贝可执行文件(命令):
[root@localhost ~]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
7.创建replicas:
[root@localhost ~]# redis-trib.rb create --replicas 1 192.168.77.130:7000 192.168.77.130:7001 192.168.77.130:7002 192.168.77.128:7003 192.168.77.128:7004 192.168.77.128:7005>>> Creating cluster>>> Performing hash slots allocation on 6 nodes...Using 3 masters: # 这里决定了哪3个作为master192.168.77.130:7000192.168.77.128:7003192.168.77.130:7001 # 以下打印了主从关系Adding replica 192.168.77.128:7004 to 192.168.77.130:7000Adding replica 192.168.77.130:7002 to 192.168.77.128:7003Adding replica 192.168.77.128:7005 to 192.168.77.130:7001M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000 slots:0-5460 (5461 slots) masterM: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001 slots:10923-16383 (5461 slots) masterS: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002 replicates c9cef49da3e8acbc47d9b3151b04589e349031b1M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003 slots:5461-10922 (5462 slots) masterS: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004 replicates 03fc051e6ba17eee1efa6188e961455958b154e0S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005 replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33cCan 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 clusterWaiting for the cluster to join...>>> Performing Cluster Check (using node 192.168.77.130:7000)M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000 slots:0-5460 (5461 slots) master 1 additional replica(s)S: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002 slots: (0 slots) slave replicates c9cef49da3e8acbc47d9b3151b04589e349031b1M: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001 slots:10923-16383 (5461 slots) master 1 additional replica(s)M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003 slots:5461-10922 (5462 slots) master 1 additional replica(s)S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005 slots: (0 slots) slave replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33cS: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004 slots: (0 slots) slave replicates 03fc051e6ba17eee1efa6188e961455958b154e0[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.[root@localhost ~]# echo $?0[root@localhost ~]#
打印了两个OK表示集群成功。
以集群的方式登录redis,并创建一个key:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7000 # 加上-c选项表示以集群的方式登录192.168.77.130:7000> set key1 123-> Redirected to slot [9189] located at 192.168.77.128:7003 # 可以看到,这个key1被重定向到了192.168.77.128:7003这台redis机器上OK92.168.77.128:7003> set key2 abc-> Redirected to slot [4998] located at 192.168.77.130:7000OK192.168.77.130:7000> set key3 test # 没有重定向提示信息的就表示存储到了本地上OK192.168.77.130:7000>
如果不加-c的话,只会登录目标机器,操作的也只是目标机器,而不会像集群那样重定向数据。任意一个节点都可以创建key,或者查看key。
检测集群状态:
[root@localhost ~]# redis-trib.rb check 192.168.77.130:7000>>> Performing Cluster Check (using node 192.168.77.130:7000)M: 03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000 slots:0-5460 (5461 slots) master 1 additional replica(s)S: e95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002 slots: (0 slots) slave replicates c9cef49da3e8acbc47d9b3151b04589e349031b1M: ef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001 slots:10923-16383 (5461 slots) master 1 additional replica(s)M: c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003 slots:5461-10922 (5462 slots) master 1 additional replica(s)S: d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005 slots: (0 slots) slave replicates ef2f571de1d8d1bfa5d96acab297ad857c09d33cS: 824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004 slots: (0 slots) slave replicates 03fc051e6ba17eee1efa6188e961455958b154e0[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.[root@localhost ~]#
cluster nodes命令可以列出节点:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7000192.168.77.130:7000> cluster nodese95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002@17002 slave c9cef49da3e8acbc47d9b3151b04589e349031b1 0 1515075493469 4 connectedef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001@17001 master - 0 1515075494478 2 connected 10923-16383c9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003@17003 master - 0 1515075496493 4 connected 5461-10922d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005@17005 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515075495486 6 connected03fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000@17000 myself,master - 0 1515075489000 1 connected 0-5460824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004@17004 slave 03fc051e6ba17eee1efa6188e961455958b154e0 0 1515075493000 5 connected192.168.77.130:7000>
cluster info命令可以查看集群信息:
192.168.77.130:7000> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:1076cluster_stats_messages_pong_sent:1033cluster_stats_messages_sent:2109cluster_stats_messages_ping_received:1028cluster_stats_messages_pong_received:1076cluster_stats_messages_meet_received:5cluster_stats_messages_received:2109192.168.77.130:7000>
cluster meet ip port 命令可以添加节点,例如我现在在B机器上新增加了一个redis服务,端口为7006,现在我要把这个新增的redis服务加入到集群节点中来:
192.168.77.130:7000> cluster meet 192.168.77.128 7006OK192.168.77.130:7000> cluster nodesdeca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 master - 0 1515075895000 0 connected .....以下省略......
可以看到7006成功添加到了节点中,身份是master。
使用以上方式添加的节点,都会是master身份,而 cluster replicate node_id 命令可以将当前节点设置为指定节点的从(slave):
[root@localhost ~]# redis-cli -c -h 192.168.77.128 -p 7006192.168.77.128:7006> cluster replicate ef2f571de1d8d1bfa5d96acab297ad857c09d33cOK192.168.77.128:7006> CLUSTER NODES .....以上省略......deca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 myself,slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515047943000 0 connected192.168.77.128:7006>
可以看到成功把7006指定为 ef2f571de1d8d1bfa5d96acab297ad857c09d33c 这个节点的slave,这个节点对应的端口是7001。
cluster forget node_id 命令可以移除某个节点,例如我把7006移除掉:
[root@localhost ~]# redis-cli -c -h 192.168.77.130 -p 7001192.168.77.130:7001> cluster forget deca81cf98ac8206419096f8b86a7a6e925078adOK192.168.77.130:7001>
要注意的是,这个命令不能移除master身份的节点,而且当前登录的节点(myself)也不能移除,只能移除非当前登录的slave节点。如果想要移除master节点,只能先把这个master指定为slave之后再移除。
cluster saveconfig命令可以把当前集群的操作保存到配置文件里:
192.168.77.130:7001> CLUSTER SAVECONFIG OK192.168.77.130:7001> quit[root@localhost ~]# cat /data/redis_data/7001/nodes_7001.conf d75dd3c61389200941c6987062a79ba8db576741 192.168.77.128:7005@17005 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515076783944 2 connectedc9cef49da3e8acbc47d9b3151b04589e349031b1 192.168.77.128:7003@17003 master - 0 1515076785957 4 connected 5461-1092203fc051e6ba17eee1efa6188e961455958b154e0 192.168.77.130:7000@17000 master - 0 1515076784951 1 connected 0-5460deca81cf98ac8206419096f8b86a7a6e925078ad 192.168.77.128:7006@17006 slave ef2f571de1d8d1bfa5d96acab297ad857c09d33c 0 1515076785153 2 connectede95229afb8b6f22ff4414aaf1173574e39a12526 192.168.77.130:7002@17002 slave c9cef49da3e8acbc47d9b3151b04589e349031b1 0 1515076787970 4 connectedef2f571de1d8d1bfa5d96acab297ad857c09d33c 192.168.77.130:7001@17001 myself,master - 0 1515076786000 2 connected 10923-16383824b56352f1b464918702aba2597e9bf46eb70dc 192.168.77.128:7004@17004 slave 03fc051e6ba17eee1efa6188e961455958b154e0 0 1515076786964 5 connectedvars currentEpoch 6 lastVoteEpoch 0[root@localhost ~]#
redis 哨兵相关文章:
转载于:https://blog.51cto.com/zero01/2057375