redis集群会自动实现redis哨兵的功能
redis集群的每个节点的数据是拆分的,每个节点并不是全量的,它是通过CRC16算法取模,把集群的内存划分为16384个槽位
一种方式是:在客户端实现,由客户端决定往哪台redis主节点写
一种方式是:利用代理实现,故障转移、扩容之后,会更改算法,比较危险,不常用
搭建集群
环境前提:
1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。
2.每个节点必须开启的参数
#必须开启集群状态,开启后redis 进程会有cluster显示
816 cluster-enabled yes
#此文件有redis cluster集群自动创建和维护,不需要任何手动操作
824 cluster-confifig-fifile nodes-6380.conf
3.所有redis服务器必须没有任何数据
4.先启动为单机redis且没有任何key value
目前实验是在单个虚拟机上,运行10个redis实例:
首先配置一个模板配置文件:
[root@redis]#vim /apps/redis6379/etc/redis.conf 69 bind 0.0.0.0 92 port 6379 158 pidfile /apps/redis6379/run/redis_6379.pid 171 logfile /apps/redis6379/logs/redis_6379.log 235 stop-writes-on-bgsave-error no 263 dir /apps/redis6379/data 500 requirepass 123123 814 cluster-enabled yes 822 cluster-config-file nodes-6379.conf
然后配置模板服务启动文件:
[root@redis ~]#vim /usr/lib/systemd/system/redis6379.service [Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] #ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd ExecStart=/apps/redis6379/bin/redis-server /apps/redis6379/etc/redis.conf --supervised systemd ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target ExecStop=/bin/kill -s QUIT $MAINPID
复制redis服务目录,修改conf文件:
[root@redis apps]#ll /apps/ total 0 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6379 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6380 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6381 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6382 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6383 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6384 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6385 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6386 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6387 drwxr-xr-x 7 redis redis 63 Sep 17 14:34 redis6388
复制多实例服务启动脚本,修改文件内路径配置:
[root@redis ~]#ll /usr/lib/systemd/system/redis* -rw-r--r-- 1 root root 539 Sep 17 15:03 /usr/lib/systemd/system/redis6379.service -rw-r--r-- 1 root root 539 Sep 17 15:13 /usr/lib/systemd/system/redis6380.service -rw-r--r-- 1 root root 539 Sep 17 15:21 /usr/lib/systemd/system/redis6381.service -rw-r--r-- 1 root root 539 Sep 17 15:21 /usr/lib/systemd/system/redis6382.service -rw-r--r-- 1 root root 539 Sep 17 15:21 /usr/lib/systemd/system/redis6383.service -rw-r--r-- 1 root root 539 Sep 17 15:21 /usr/lib/systemd/system/redis6384.service -rw-r--r-- 1 root root 539 Sep 17 15:22 /usr/lib/systemd/system/redis6385.service -rw-r--r-- 1 root root 539 Sep 17 15:25 /usr/lib/systemd/system/redis6386.service -rw-r--r-- 1 root root 539 Sep 17 15:22 /usr/lib/systemd/system/redis6387.service -rw-r--r-- 1 root root 539 Sep 17 15:22 /usr/lib/systemd/system/redis6388.service [root@redis ~]#cat /usr/lib/systemd/system/redis63* |grep "^ExecStart" ExecStart=/apps/redis6379/bin/redis-server /apps/redis6379/etc/redis.conf --supervised systemd ExecStart=/apps/redis6380/bin/redis-server /apps/redis6380/etc/redis.conf --supervised systemd ExecStart=/apps/redis6381/bin/redis-server /apps/redis6381/etc/redis.conf --supervised systemd ExecStart=/apps/redis6382/bin/redis-server /apps/redis6382/etc/redis.conf --supervised systemd ExecStart=/apps/redis6383/bin/redis-server /apps/redis6383/etc/redis.conf --supervised systemd ExecStart=/apps/redis6384/bin/redis-server /apps/redis6384/etc/redis.conf --supervised systemd ExecStart=/apps/redis6385/bin/redis-server /apps/redis6385/etc/redis.conf --supervised systemd ExecStart=/apps/redis6386/bin/redis-server /apps/redis6386/etc/redis.conf --supervised systemd ExecStart=/apps/redis6387/bin/redis-server /apps/redis6387/etc/redis.conf --supervised systemd ExecStart=/apps/redis6388/bin/redis-server /apps/redis6388/etc/redis.conf --supervised systemd
如果是多主机方式,就打包,没有日志文件、快照文件、配置文件等等
tar czvf redis.tar.gz /apps/redis scp redis.tar.gz 1**.***.***.***:/apps/
在开启了redist cluster功能之后,redis在数据端口(6379)的基础之上+10000,而监听的集群端口,用于集群选举
[root@redis ~]#ss -lntp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 511 *:6379 *:* users:(("redis-server",pid=34447,fd=6)) LISTEN 0 511 *:6380 *:* users:(("redis-server",pid=34576,fd=6)) LISTEN 0 511 *:6381 *:* users:(("redis-server",pid=35467,fd=6)) LISTEN 0 511 *:6382 *:* users:(("redis-server",pid=35479,fd=6)) LISTEN 0 511 *:6383 *:* users:(("redis-server",pid=35828,fd=6)) LISTEN 0 511 *:6384 *:* users:(("redis-server",pid=35839,fd=6)) LISTEN 0 511 *:6385 *:* users:(("redis-server",pid=35851,fd=6)) LISTEN 0 511 *:6386 *:* users:(("redis-server",pid=35862,fd=6)) LISTEN 0 511 *:6387 *:* users:(("redis-server",pid=35874,fd=6)) LISTEN 0 511 *:6388 *:* users:(("redis-server",pid=35887,fd=6)) LISTEN 0 128 *:22 *:* users:(("sshd",pid=8654,fd=3)) LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=9369,fd=13)) LISTEN 0 511 *:16379 *:* users:(("redis-server",pid=34447,fd=8)) LISTEN 0 511 *:16380 *:* users:(("redis-server",pid=34576,fd=8)) LISTEN 0 511 *:16381 *:* users:(("redis-server",pid=35467,fd=8)) LISTEN 0 511 *:16382 *:* users:(("redis-server",pid=35479,fd=8)) LISTEN 0 511 *:16383 *:* users:(("redis-server",pid=35828,fd=8)) LISTEN 0 511 *:16384 *:* users:(("redis-server",pid=35839,fd=8)) LISTEN 0 511 *:16385 *:* users:(("redis-server",pid=35851,fd=8)) LISTEN 0 511 *:16386 *:* users:(("redis-server",pid=35862,fd=8)) LISTEN 0 511 *:16387 *:* users:(("redis-server",pid=35874,fd=8)) LISTEN 0 511 *:16388 *:* users:(("redis-server",pid=35887,fd=8)) LISTEN 0 128 :::22 :::* users:(("sshd",pid=8654,fd=4)) LISTEN 0 100 ::1:25 :::* users:(("master",pid=9369,fd=14))
后面必须带有cluster标识
[root@redis ~]#ps -ef |grep redis redis 34447 1 0 15:13 ? 00:00:05 /apps/redis6379/bin/redis-server 0.0.0.0:6379 [cluster] redis 34576 1 0 15:14 ? 00:00:05 /apps/redis6380/bin/redis-server 0.0.0.0:6380 [cluster] redis 35467 1 0 15:31 ? 00:00:03 /apps/redis6381/bin/redis-server 0.0.0.0:6381 [cluster] redis 35479 1 0 15:31 ? 00:00:03 /apps/redis6382/bin/redis-server 0.0.0.0:6382 [cluster] redis 35828 1 0 15:38 ? 00:00:03 /apps/redis6383/bin/redis-server 0.0.0.0:6383 [cluster] redis 35839 1 0 15:38 ? 00:00:03 /apps/redis6384/bin/redis-server 0.0.0.0:6384 [cluster]
一、在3.*和4.*的大版本下,redis官方提供的集群管理工具在源码包里,但是对ruby的版本有要求,不能太低:
#创建redis cluster命令,在集群的任一节点执行一次即可
[root@mini73 ~]#cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/bin/
#解决ruby版本较低问题:
[root@redis src]#wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.5.tar.gz [root@redis src]# tar xf ruby-2.5.5.tar.gz [root@redis src]# cd ruby-2.5.5 [root@redis ruby-2.5.5]# ./configure [root@redis ruby-2.5.5]# make -j 2 [root@redis ruby-2.5.5]# make install [root@redis ruby-2.5.5]# gem install redis
#如果无法在线安装,可以下载reids模块安装包离线安装
#https://rubygems.org/gems/redis #先下载redis模块安装包
#gem install -l redis-3.3.0.gem #安装redis模块
验证redis-trib.rb命令是否可执行:
[root@s1 ruby-2.5.4]# redis-trib.rb Usage: redis-trib <command> <options> <arguments ...>
至此,初始环境,接下来是创建使用;
修改密码redis 登录密码,所有的节点,密码保持一致
[root@redis ruby-2.5.5]# vim /usr/local/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb 15 :password => 123123,
创建redis cluster集群:
[root@redis ~]#redis-trib.rb create --replicas 1 172.18.5.82:6379 172.18.5.82:6380 172.18.5.82:6381 172.18.5.82:6382 172.18.5.82:6383 172.18.5.82:6384 >>> Creating cluster /usr/local/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 172.18.5.82:6379 172.18.5.82:6380 172.18.5.82:6381 Adding replica 172.18.5.82:6383 to 172.18.5.82:6379 Adding replica 172.18.5.82:6384 to 172.18.5.82:6380 Adding replica 172.18.5.82:6382 to 172.18.5.82:6381 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: eb9c437f3d2301307ee5642014de061f21b57c98 172.18.5.82:6379 slots:0-5460 (5461 slots) master M: 292c0a3ce21370745e5b1a507870d74d4ba042cb 172.18.5.82:6380 slots:5461-10922 (5462 slots) master M: ec6eafdde964dcc1520f38d22471fc832a042d9f 172.18.5.82:6381 slots:10923-16383 (5461 slots) master S: b3c24d40a2f39c4442c834a806aee618cbfe589f 172.18.5.82:6382 replicates eb9c437f3d2301307ee5642014de061f21b57c98 S: f668ad6c34d219ca6cb261c283b2719ec0584e6f 172.18.5.82:6383 replicates 292c0a3ce21370745e5b1a507870d74d4ba042cb S: 31bd8b6cc63466828a13dfb510713ae5666da475 172.18.5.82:6384 replicates ec6eafdde964dcc1520f38d22471fc832a042d9f 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 172.18.5.82:6379) M: eb9c437f3d2301307ee5642014de061f21b57c98 172.18.5.82:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 31bd8b6cc63466828a13dfb510713ae5666da475 172.18.5.82:6384 slots: (0 slots) slave replicates ec6eafdde964dcc1520f38d22471fc832a042d9f S: b3c24d40a2f39c4442c834a806aee618cbfe589f 172.18.5.82:6382 slots: (0 slots) slave replicates eb9c437f3d2301307ee5642014de061f21b57c98 S: f668ad6c34d219ca6cb261c283b2719ec0584e6f 172.18.5.82:6383 slots: (0 slots) slave replicates 292c0a3ce21370745e5b1a507870d74d4ba042cb M: 292c0a3ce21370745e5b1a507870d74d4ba042cb 172.18.5.82:6380 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: ec6eafdde964dcc1520f38d22471fc832a042d9f 172.18.5.82:6381 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. [root@redis ~]#redis-trib.rb check 172.18.5.82:6379 /usr/local/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated >>> Performing Cluster Check (using node 172.18.5.82:6379) M: eb9c437f3d2301307ee5642014de061f21b57c98 172.18.5.82:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 31bd8b6cc63466828a13dfb510713ae5666da475 172.18.5.82:6384 slots: (0 slots) slave replicates ec6eafdde964dcc1520f38d22471fc832a042d9f S: b3c24d40a2f39c4442c834a806aee618cbfe589f 172.18.5.82:6382 slots: (0 slots) slave replicates eb9c437f3d2301307ee5642014de061f21b57c98 S: f668ad6c34d219ca6cb261c283b2719ec0584e6f 172.18.5.82:6383 slots: (0 slots) slave replicates 292c0a3ce21370745e5b1a507870d74d4ba042cb M: 292c0a3ce21370745e5b1a507870d74d4ba042cb 172.18.5.82:6380 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: ec6eafdde964dcc1520f38d22471fc832a042d9f 172.18.5.82:6381 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. [root@redis ~]#redis-trib.rb info 172.18.5.82:6379 /usr/local/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated 172.18.5.82:6379 (eb9c437f...) -> 0 keys | 5461 slots | 1 slaves. 172.18.5.82:6380 (292c0a3c...) -> 0 keys | 5462 slots | 1 slaves. 172.18.5.82:6381 (ec6eafdd...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. 此时集群虽然建立,但是主从关系没有真正建立,需要在三个(所有)的slave上配置主节点密码,直到INFO出现UP: [root@redis ~]#redis-cli -p 6384 127.0.0.1:6384> AUTH 123123 OK 127.0.0.1:6384> CONFIG SET masterauth 123123 OK 127.0.0.1:6384> INFO # Replication role:slave master_host:172.18.5.82 master_port:6381 master_link_status:up 验证master状态: [root@redis ~]#redis-cli -p 6379 127.0.0.1:6379> AUTH (error) ERR wrong number of arguments for 'auth' command 127.0.0.1:6379> AUTH 123123 OK 127.0.0.1:6379> INFO # Replication role:master connected_slaves:1 slave0:ip=172.18.5.82,port=6382,state=online,offset=56,lag=0 master_replid:6538badbdd07a1ff66e88a2dbddd702a6abf92b4 master_replid2:0000000000000000000000000000000000000000
二、在5.*的大版本下,直接使用redi-cli命令即可
[root@redis-s1 ~]# redis-cli -a 123123 --cluster create 172.22.6.11:6379 192.168.7.101:6380 192.168.7.102:6379 192.168.7.102:6380 192.168.7.103:6379 192.168.7.103:6380 --cluster-replicas 1 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.7.102:6380 to 192.168.7.101:6379 Adding replica 192.168.7.101:6380 to 192.168.7.102:6379 Adding replica 192.168.7.103:6380 to 192.168.7.103:6379 >>> Trying to optimize slaves allocation for anti-affinity [OK] Perfect anti-affinity obtained! M: f4cfc5cf821c0d855016488d6fbfb62c03a14fda 192.168.7.101:6379 #带M的为masterslots:[0-5460] (5461 slots) master #当前master的槽位起始和结束位 S: 2b6e5d9c3944d79a5b64a19e54e52f83d48438d6 192.168.7.101:6380 #带S的slave replicates 70de3821dde4701c647bd6c23b9dd3c5c9f24a62 M: 116c4c6de036fdbac5aaad25eb1a61ea262b64af 192.168.7.102:6379 slots:[5461-10922] (5462 slots) master #当前master的槽位起始和结束位 S: 7186c6d03dd9a5e3be658f2d08e800bc55b04a09 192.168.7.102:6380 replicates f4cfc5cf821c0d855016488d6fbfb62c03a14fda M: 70de3821dde4701c647bd6c23b9dd3c5c9f24a62 192.168.7.103:6379 slots:[10923-16383] (5461 slots) master #当前master的槽位起始和结束位 S: 7eda0bcf0c01bb7343313b81267c42dd1b26c8a6 192.168.7.103:6380 replicates 116c4c6de036fdbac5aaad25eb1a61ea262b64af Can I set the above configuration? (type 'yes' to accept): yes #输入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 192.168.7.101:6379) M: f4cfc5cf821c0d855016488d6fbfb62c03a14fda 192.168.7.101:6379 #master的ID及端口 slots:[0-5460] (5461 slots) master #已经分配的槽位 1 additional replica(s) #分配了一个slave S: 7186c6d03dd9a5e3be658f2d08e800bc55b04a09 192.168.7.102:6380 slots: (0 slots) slave #slave没有分配槽位 replicates f4cfc5cf821c0d855016488d6fbfb62c03a14fda M: 70de3821dde4701c647bd6c23b9dd3c5c9f24a62 192.168.7.103:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 116c4c6de036fdbac5aaad25eb1a61ea262b64af 192.168.7.102:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 2b6e5d9c3944d79a5b64a19e54e52f83d48438d6 192.168.7.101:6380 slots: (0 slots) slave replicates 70de3821dde4701c647bd6c23b9dd3c5c9f24a62 S: 7eda0bcf0c01bb7343313b81267c42dd1b26c8a6 192.168.7.103:6380 slots: (0 slots) slave replicates 116c4c6de036fdbac5aaad25eb1a61ea262b64af [OK] All nodes agree about slots configuration. #所有节点槽位分配完成 >>> Check for open slots... #检查打开的槽位 >>> Check slots coverage... #检查插槽覆盖范围 [OK] All 16384 slots covered. #所有槽位(16384个)分配完成
故障转移,启动恢复,都是自动完成