在这里主要讲述主从复制、哨兵模式、Redis Cluster集群这三种方式。
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
从节点开启主从复制,有3种方式:
配置文件: 在从服务器的配置文件中加入:slaveof
启动命令: redis-server启动命令后加入 --slaveof
客户端命令: Redis服务器启动后,直接通过客户端执行命令:slaveof
,则该Redis实例成为从节点。
通过 info replication 命令可以看到复制的一些信息
当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
它的功能包括以下两个:
在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态,基本已经可以实现高可用,读写分离。
而Redis Cluster 是 Redis 的分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 在 分布式 方面的需求。当遇到 单机内存、并发、流量 等瓶颈时,可以采用 Cluster 架构方案达到 负载均衡 的目的。
在 redis-cluster 架构中,redis-master节点一般用于接收读写,而redis-slave节点则一般只用于备份, 其与对应的 master 拥有相同的 slot 集合,若某个 redis-master 意外失效,则再将其对应的 slave 进行升级为临时 redis-master。
优点:
缺点:
数据通过异步复制,不保证数据的强一致性。
多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况。
redis官方推荐使用6个节点,其中3个为主节点,3个为从节点。
一旦有master 发生故障的时候,Redis Cluster集群可以选举出对应的slave成为新的主节点,继续对外服务,从而保证服务的高可用性。
这里的实验模拟采用两个虚拟机,每个虚拟机三个网卡,充当6个节点。
节点类型 | IP地址 | 操作系统 | 所需软件包 |
---|---|---|---|
master | 192.168.100.128 192.168.100.100 192.168.100.101 |
centos7 | redis-5.0.7.tar.gz rvm-1.29.9.tar.gz |
slave | 192.168.100.131 192.168.100.102 192.168.100.103 |
centos7 | redis-5.0.7.tar.gz |
1、master 和 slave节点都安装redis包,步骤一样
//先安装防火墙
systemctl stop firewalld
setenforce 0
//通过yum工具,安装编译工具
yum install gcc gcc-c++ make -y
//解压redis软件包
tar xzvf redis-5.0.7.tar.gz -C /opt
//编译且安装
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
//开启服务,设置各类文件
cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] //定义主配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] //定义日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] //数据文件
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server //可执行文件路径,需要自行定义
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
//创建软链接,便于服务控制
ln -s /usr/local/redis/bin/* /usr/local/bin/
2、主从节点都修改配置文件,进行优化
vim /etc/redis/6379.conf
70行/注释掉 bind 项 #注释后监听所有IP地址
89/ protected mode no #关闭保护模式
93/ port 6379
137/ daemonize yes #以独立进程启动
700/ appendonly yes #开启aof持久化功能
833/ cluster-enabled yes #开启群集功能
841/ pluster-config-file nodes-6379.conf #群集名称文件设置
847/ cluster-node- timeout 15000 #群集超时时间设置
service redis_6379 restart #重启服务
ls /var/lib/redis/6379/ //生成下列三个文件说明设置成功
文件有:
1、持久化 appendonly.aof 文件
2、节点首次启动生成的nodes-6379.conf 配置文件。
//安装管理 ruby的工具:rvm ,安装命令在官网找:http://rvm.io/
1、安装GPG keys
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
注意:若出现超时状态,重新导入一次即可
2、安装RVM
curl -sSL https://get.rvm.io | bash -s stable
安装完提示去网站下载ruby安装包:https://github.com/rvm/rvm/archive/1.29.9.tar.gz
tar xzvf rvm-1.29.9.tar.gz -C /opt
cd /opt/rvm-1.29.9/
./install
source /etc/profile.d/rvm.sh #执行环境变量
rvm list known #列出ruby可以安装的版本
rvm install 2.4.1 #安装ruby2.4.1版本,安装版本的事件会比较长
ruby -v #查看当前ruby版本
gem install redis #再次安装redis
4、分别在主、从服务器上添加两张网卡(NAT模式),设置IP地址
主服务器的IP地址:
[root@localhost network-scripts]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.100.128 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::c7ca:cf27:f0bb:92aa prefixlen 64 scopeid 0x20
ether 00:0c:29:67:b0:5d txqueuelen 1000 (Ethernet)
RX packets 816405 bytes 290626803 (277.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1003561 bytes 150373025 (143.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163 mtu 1500
inet 192.168.100.100 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::d4d1:edc1:f4fe:dc9c prefixlen 64 scopeid 0x20
inet6 fe80::7aa5:ee9:42b9:c023 prefixlen 64 scopeid 0x20
ether 00:0c:29:67:b0:71 txqueuelen 1000 (Ethernet)
RX packets 4642 bytes 1339135 (1.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4207 bytes 746165 (728.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163 mtu 1500
inet 192.168.100.101 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::4c48:e4cd:3aa9:a652 prefixlen 64 scopeid 0x20
inet6 fe80::b066:20a7:751d:dc88 prefixlen 64 scopeid 0x20
ether 00:0c:29:67:b0:67 txqueuelen 1000 (Ethernet)
RX packets 4646 bytes 1340305 (1.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4195 bytes 743666 (726.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
从服务器的IP地址:
[root@localhost network-scripts]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.100.131 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::3661:4f5c:6149:3ae1 prefixlen 64 scopeid 0x20
inet6 fe80::c7ca:cf27:f0bb:92aa prefixlen 64 scopeid 0x20
ether 00:0c:29:72:f9:68 txqueuelen 1000 (Ethernet)
RX packets 680326 bytes 405482087 (386.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 682537 bytes 100916715 (96.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163 mtu 1500
inet 192.168.100.102 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::7aa5:ee9:42b9:c023 prefixlen 64 scopeid 0x20
ether 00:0c:29:72:f9:7c txqueuelen 1000 (Ethernet)
RX packets 4387 bytes 1273664 (1.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3669 bytes 644059 (628.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163 mtu 1500
inet 192.168.100.103 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::b066:20a7:751d:dc88 prefixlen 64 scopeid 0x20
ether 00:0c:29:72:f9:72 txqueuelen 1000 (Ethernet)
RX packets 2677 bytes 756825 (739.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1855 bytes 328843 (321.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5、创建集群
[root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.100.128:6379 192.168.100.100:6379 192.168.100.101:6379 192.168.100.131:6379 192.168.100.102:6379 192.168.100.103:6379
>>> 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.100.102:6379 to 192.168.100.131:6379
Adding replica 192.168.100.103:6379 to 192.168.100.100:6379
Adding replica 192.168.100.132:6379 to 192.168.100.101:6379
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379
slots:[0-5460] (5461 slots) master
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.100:6379
slots:[5461-10922] (5462 slots) master
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.101:6379
slots:[10923-16383] (5461 slots) master
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379
replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.102:6379
replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.103:6379
replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
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 192.168.100.131:6379)
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379
slots:[0-16383] (16384 slots) master
1 additional replica(s)
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379
slots: (0 slots) slave
replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
6、验证群集功能,一个主节点master对应一个从节点slave。
[root@localhost ~]# redis-cli -h 192.168.100.128 -p 6379 #进入192.168.100.128的数据库里
192.168.100.128:6379> set name zhangsan #创建一个键值对
OK
192.168.100.128:6379> keys * #查看所有键
1) "name"
192.168.100.128:6379> get name #查看name键的值
"zhangsan"
192.168.100.128:6379> exit
[root@localhost ~]# redis-cli -h 192.168.100.102 -p 6379 #进入192.168.100.102的数据库里
192.168.100.102:6379> keys *
1) "name"
192.168.100.102:6379> get name
(error) MOVED 5474 192.168.100.131:6379
192.168.100.102:6379> exit
[root@localhost ~]# redis-cli -h 192.168.100.131 -p 6379
192.168.100.131:6379> keys *
1) "name"
192.168.100.131:6379> get name
"zhangsan"