搭建Redis集群的时候,我们一般会考虑主从复制模式(master-slave),实现主从备份。当主节点(master)坏掉,自动启动从节点(slave)为主节点继续服务。一个主节点可以有N个从节点,根据业务不同,从节点的数量设置也不同。
基础知识
Redis 类型及端口
- Redis的数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sorted sets)、哈希表(hash)
- Redis服务默认端口是6379,默认前台运行(daemonize为false)
Redis与Memcache对比
- Redis可以用来做存储(storage),memcache是用来做缓存(cache),这是得益于Redis的持久化特性
- Redis存储存储的数据有结构(类型),而对于memcache,存储的数据只有字符串(string)一种类型
Redis的持久化方法
Redis将数据存储在内存中,或被配置为使用虚拟内存。有两种方法可以实现持久化:
- 使用截图的方式,将内存中的数据不断写入磁盘(性能高,但是可能会引起一定概率的数据丢失)
- 使用类似mysql的方式,记录每次更新的日志
适用场景
读写分离场景:master以写为主,可读可写;slave只可读,不可写。
容灾恢复场景:Master上写入的数据会自动同步到slave上,这样如果master出现故障造成数据丢失,可以通过slave进行恢复。注:由于数据不是实时同步的,所以当从slave恢复的数据可能会有丢失。
主从特点
- 一个master可以有多个slave
- slave除了可以连接到master外,也可以连接到其他slave
- master初次同步数据到slave时,不会阻塞client与master的通信,master会继续处理来自client的请求;相反,slave初次从master同步数据时,会阻塞而不处理来自client的请求。
- master-slave模式可以提高系统的可伸缩性,可以用多个slave专门处理用户的读请求,Slave也可以用作简单的数据冗余
- 可以再master上禁用数据持久化,在slave做数据持久化即可,只需要在配置文件里注释掉save配置即可
- 可以用作读写分离和容灾恢复
常用方式
- 一主二仆M(S1,S2),即一个master两个slave
- 薪火相传M->S1->S2,S1既是从M的从节点,又是S2的主节点。
- 反客为主(主节点down掉,手动升级从节点为主节点)及哨兵模式(主节点down掉,自动升级从节点为主节点)
搭建服务
我们演示一下“一主二仆”在Centos服务上的单机搭建方式。对于其他方式,可以看完这个流程后自然明白。对于多久搭建,只需要放到不同机器上,改下配置文件的IP地址即可。
1. 下载安装包
可以到redis官网下载:http://download.redis.io/releases/
我们这里下载redis-stable.tar.gz包,当然如果你要部署服务最好用这个包,稳定性高一点。
2. 解压安装包并进行install
tar -xvf redis-stable.tar.gz
cd redis-stable
make
cd src
make install PREFIX=/usr/local/redis
cd ..
cp redis.conf /usr/local/redis/redis.conf
3. 由于我们要部署1主2从三个节点,我们把redis.conf复制为3份分别为:
cd /usr/local/redis/
redis-master-6379.conf
redis-slave-6380.conf
redis-slave-6381.conf
结果如下:
4. 在进行master-slave的配置之前,我们先来了解一下redis.conf的内容
- daemonize:配置是否把redis转为后台运行,默认为no,即启动redis时,命令行处于阻塞模式;如果改成yes,则启动redis后,命令不会被阻塞,可以继续做其他操作
- pdifile:pid文件的存放路径,默认为/var/run/redis.pid,可以配置到其他地址
- bind:指定redis接收的IP请求,如果不设置则接收并处理所有的请求,在线上环境最好能设置为特定的IP
- port:监听端口,默认为6379
- timeout:设置客户端连接的超时时间,单位为秒
- loglevel:分为四个等级:debug、revbose、notice及warning,生产环境一般开启notice
- logfile:log文件的存储地址,默认为标准输出,即打印在命令行终端上
- database:设置数据库的个数,默认使用的数据库为0
- save:设置redis数据库镜像存储的频率
- rdbfilename:镜像备份文件的文件名
- dir:数据库镜像备份的文件放置的路径
- replicaof:设置数据库为其他数据库的从数据库,之前版本的配置项为slaveof,大家配置的时候留意一下
- masterauth:当连接主数据库时需要的密码验证
- requirepass:设置客户端连接后进行任何其他操作时需要使用的密码
- maxclients:限制同时连接的客户端数量
- maxmemory:设置redis能够使用的最大内存,这也觉得了我们memory能够cache的数据量大小
- appendonly:开启appendonly模式后,redis把每次接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
- appendfsync:设置appendonly.aof文件进行同步的频率
- vm_enabled:是否开启虚拟内存
- vm_swap_file:设置虚拟内存的交换文件的路径
- vm_page_size:设置虚拟内存页的大小,通常我们使用4k的倍数
- vm_max_threads:设置vm IO同时使用的线程数量
5. 根据配置文件的描述,我们把三个配置文件的daemonize设置为yes,让redis在后台运行。
daemonize | pdifile | bind | port | replicaof | |
---|---|---|---|---|---|
redis-master-6379.conf | yes | /var/run/redis-6379.pid | 127.0.0.1 | 6379 | # replicaof <masterip> <masterport> (注释) |
redis-slave-6380.conf | yes | /var/run/redis-6380.pid | 127.0.0.1 | 6380 | replicaof 127.0.0.1 6379 |
redis-slave-6381.conf | yes | /var/run/redis-6381.pid | 127.0.0.1 | 6381 | replicaof 127.0.0.1 6379 |
6. 我们尝试启动主从redis服务进行测试,注意:一定要先启动主节点再启动从节点。启动主节点:
cd /usr/local/redis/
./bin/redis-server redis-master-6379.conf
可以看到configure被load成功了。
7. 再开另外两个窗口,分别启动两个slave节点
8. 回到主窗口,然后通过client(redis-cli)登录到master节点,使用“info replication”命令可以查看master节点连接的slave情况
可以看到有两个slave从端口6380和6380来的连接。
9. 同样可以在另外两个窗口查看slave的状态
可以看到连接的本节点是slave,连接的master的status是“up”状态
10. 我们可以尝试在redis的master窗口发送测试“set test hello”
其中set是发送指令,test是测试指示,hello是测试用的信息,可以任意信息
11. 在slave窗口可以接受测试信息
12. 至此,redis相关的配置已经完成了,后面会继续添加关于sentinel自动切换slave为master的方法。
从安装包里复制sentinel.conf为sentinel-6380.conf 和sentinel-6381.conf分别为两个slave做配置。如果两个slave放到不同机器上,记得把这两个文件也分别放到对应的机器上。
daemonize | pdifile | bind | port | monitor | |
---|---|---|---|---|---|
sentinel-6380.conf | yes | /var/run/redis-sentinel-6380.pid | 127.0.0.1 | 26380 | sentinel monitor mymaster 127.0.0.1 6379 2 |
sentinel-6381.conf | yes | /var/run/redis-sentinel-6381.pid | 127.0.0.1 | 26381 | sentinel monitor mymaster 127.0.0.1 6379 |
13. 分别启动两个sentinel。注意:这里直接用redis-server启动的,也可以用redis-sentinel启动也是一样的,redis-sentinel实际上是redis-server的软连接
14. 查看sentinel的状态,可以redis-cli登录之后使用info查看所有相关信息,发现最后的Sentinel信息
15. 再次查看redis相关进程时,发现有两个sentinel已经处于活跃状态
16. 我们试图kill掉master,正常情况下,sentinel的Ping test会检测到master死掉,并通过之前获取的master的info信息找到对应slave,会从两个slave里面选择一个作为master,并修改配置文件。如果再次把原来的master加入,则会变成slave存在。从实验中,我们可以看到选择了端口为6381的slave作为了master。
当然可以对redis及sentinel加log(添加logfile字段指向对应的存放目录),可以方便的查看状态及相关的信息。