一、集群规划
安装环境信息:CentOS Linux release 7.5.1804 、redis-6.2.1
三台服务器各部署一个主节点、一个从节点,同一台服务器上不是直接主从关系。
服务器 | 角色 | ip:端口 |
---|---|---|
node1 | master1/slave2 | 192.168.15.116:6379/192.168.15.116:6380 |
node2 | master2/slave3 | 192.168.15.117:6379/192.168.15.117:6380 |
node3 | master3/slave1 | 192.168.15.118:6379/192.168.15.118:6380 |
redis密码:123456
redis官网下载:http://download.redis.io/releases/
Linux命令安装:wget http://download.redis.io/releases/redis-6.2.1.tar.gz
二、服务器基础设置(可选)
服务器基础设置,云服务器默认已配置,可以忽略此想配置。
1、设置主机名
# 根据服务节点表对应设置服务器主机名 node1/node2/node3
$ hostnamectl --static set-hostname node1
2、hosts配置映射
# vi编辑hosts
$ vi /etc/hosts
# 添加节点映射
192.168.146.199 node1
192.168.146.200 node2
192.168.146.201 node3
3、时区调整,时间校准
# 查看时区信息
$ date -R
# 设定时区为上海时区
$ timedatectl set-timezone Asia/Shanghai
# 安装NTP服务器时间同步化协议
$ yum -y install ntp
# 设置时间同步阿里时钟服务器
$ ntpdate ntp1.aliyun.com
4、安装wget
# 安装自动下载文件工具
$ yum install -y wget
5、关闭selinux
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则),无专业运维情况建议关闭它。
# vi编辑selinux
$ vi /etc/sysconfig/selinux
# 设置为disabled无效
SELINUX=disabled
# 重启服务
$ shutdown -r now
# 验证
$ getenforce
Disabled
SELinux学习参考:一文彻底明白linux中的selinux到底是什么
linux启停命令参考:centos关机与重启命令详解
6、设置防火墙
# 开启6379端口
$ firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
# 开启6380端口
$ firewall-cmd --zone=public --add-port=6380/tcp --permanent
success
# 开启16379端口
$ firewall-cmd --zone=public --add-port=16379/tcp --permanent
success
# 开启16380端口
$ firewall-cmd --zone=public --add-port=16380/tcp --permanent
success
# 查看端口列表
$ firewall-cmd --permanent --zone=public --list-ports
6379/tcp 6380/tcp 16379/tcp 16380/tcp
# 重启防火墙命令
$ firewall-cmd --reload
success
环境信息其他配置参考:Centos7——防火墙(Firewall)开启常见端口命令
三、安装
三台服务器都需要部署两台节点,具体操作如下:
1、设置安装环境
1.1、创建redis组、redis用户
# 检查redis组和用户是否存在
$ cat /etc/group|grep redis
# 创建用户组
$ groupadd redis
# 创建用户并设置登录初始目录
$ useradd -g redis -G redis -d /usr/local/redis redis
# 设置用户密码(本实例密码:redis123)
$ passwd redis
1.2、更新安装编译环境
# 查看gcc版本,Centos7默认gcc版本4.8.5,需要升级版本
$ gcc -v
# 安装源,升级gcc到9.1版本
$ yum -y install centos-release-scl
$ yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 临时启用,系统重启后gcc恢复到默认版本
$ scl enable devtoolset-9 bash
# 长期使用gcc 9.1,加入环境变量
$ echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
gcc版本问题:
gcc版本过低导致执行 make 失败
...
server.c:5212:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员
redisSetCpuAffinity(server.server_cpulist);
^
server.c: 在函数‘hasActiveChildProcess’中:
server.c:1480:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
}
^
server.c: 在函数‘allPersistenceDisabled’中:
server.c:1486:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
}
^
server.c: 在函数‘writeCommandsDeniedByDiskError’中:
server.c:3826:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
}
^
server.c: 在函数‘iAmMaster’中:
server.c:5000:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
}
^
make[1]: *** [server.o] 错误 1
make[1]: 离开目录“/usr/local/mysoftwares/redis-6.2.1/src”
make: *** [install] 错误 2
2、下载Redis压缩包
-
官网下载后上传到linux,官网下载地址:http://download.redis.io/releases/
-
linux 系统中直接下载
# 创建安装软件存放目录(创建用户默认已创建此目录,此步骤可以忽略) $ mkdir /usr/local/redis $ cd /usr/local/redis # Linux直接下载 $ wget http://download.redis.io/releases/redis-6.2.1.tar.gz
3、解压
# 解压
$ tar -zxvf redis-6.2.1.tar.gz
# 删除安装包
$ rm -rf redis-6.2.1.tar.gz
# 修改源文件目录为server
$ mv redis-6.2.1/ server
4、编译并安装
# 切换源文件目录
$ cd server/
#编译redis
$ make MALLOC=libc
# 安装(建议默认安装/usr/local/bin/)
$ make install
# 指定目录安装(不建议,指定目录安装后需要配置执行文件)
$ make PREFIX=/usr/local/redis/ install
5、临时启动测试(可选)
# 启动redis服务
$ redis-server
# 客户端登录服务器(另起SSH操作)
$ redis-cli -p 6379
# 新增key
set test zhangsan
# 获取key
get test
# 删除key
del test
# 退出服务器
exit
# 关闭服务器
$ redis-cli shutdown
6、创建集群节点
6.1、创建节点目录
在每台主机上创建2个节点,步骤如下:
# 切换redis根目录
$ cd /usr/local/redis/
# 创建6379节点目录
$ mkdir -p redis_cluster/6379
# 创建6380节点目录
$ mkdir -p redis_cluster/6380
6.2、配置节点
vi 命令编辑redis.conf配置文件
配置6380节点
# 拷贝redis配置文件到6380节点目录
$ cp /usr/local/redis/server/redis.conf /usr/local/redis/redis_cluster/6380/
# 切换到6380节点
$ cd /usr/local/redis/redis_cluster/6380/
# 编辑修改redis.conf配置信息
$ vi redis.conf
配置信息如下:
daemonize yes # 开启守护进程
protected-mode no # 关闭保护模式
pidfile redis_6380.pid # 守护进程写入文件
port 6380 # 每个节点的端口号
cluster-enabled yes # 开启集群功能
cluster-config-file nodes-6380.conf # 集群配置文件
cluster-node-timeout 5000 # 集群节点超时时间
appendonly yes # 开启日志记录
#bind 127.0.0.1 # 注释访问IP白名单(生产环境使用开启)
masterauth 123456 # 设置密码
requirepass 123456 # 设置密码
配置信息非常重要建议修改完成后详细检查一遍,避免不必要的错误。
配置6379节点(主要是端口修改)
# 拷贝6380配置文件到6379节点目录
$ cp redis.conf /usr/local/redis/redis_cluster/6379/
# 切换到6379节点
$ cd /usr/local/redis/redis_cluster/6379/
# 修改redis.conf配置信息,主要是替换端口6380为6379
$ vi redis.conf
vi编辑快捷全局替换命令:
# 替换6380为6379 :%s/6380/6379/g
7、启动节点
# 进入节点目录,启动6379节点
$ cd /usr/local/redis/redis_cluster/6379/
$ redis-server redis.conf
# 进入节点目录,启动6380节点
$ cd /usr/local/redis/redis_cluster/6380/
$ redis-server redis.conf
# 查询redis启动线程
$ ps -ef | grep redis
root 4304 1 0 19:30 ? 00:00:00 redis-server *:6379 [cluster]
root 4309 1 0 19:30 ? 00:00:00 redis-server *:6380 [cluster]
root 4329 3501 0 19:30 pts/0 00:00:00 grep --color=auto redis
四、创建集群
1、创建集群
Redis5.0之后官方自带cluster集群模式,我们可以通过cluster创建集群。
通过某一台服务器创建集群信息,本实例使用的是node1-192.168.15.116服务器创建节点。
# 通过自带cluster集群模式创建集群
$ redis-cli --cluster create 192.168.15.116:6379 192.168.15.117:6379 192.168.15.118:6379 192.168.15.116:6380 192.168.15.117:6380 192.168.15.118:6380 -a 123456 --cluster-replicas 1
注意:
- –cluster-replicas 1 代表3主3从
- 前3个代表3个master
- 后3个代表3个slave
- 通过该方式创建的带有从节点的机器不能够自己手动指定主节点
2、集群模式客户端操作
# 查看redis集群信息
$ redis-cli -c -p 6379 -a 123456 cluster nodes
# 集群模式登录需要加 -c
$ redis-cli -c -p 6379 -a 123456
# 新增修改key
set test zhangsan
# 查询key
get test
# 删除key
del test
# 退出客户端
exit
redis常用集群命令参考:redis cluster(2)- redis集群常用命令
五、启停
1、集群关闭
集群关闭直接将各个节点的进程kill掉即可。
# 查看redis进程号
$ ps -ef | grep redis
# 停止进程,11516为进程号
$ kill -9 11516
2、切换redis用户启动redis
# 切换redis用户,输入密码loan123
$ su – redis
# 执行命令启动
$ cd /usr/local/redis/redis_cluster/6380/
$ redis-server ./redis.conf
同样步骤在另外节点执行一遍。
六、重新创建集群
创建集群之后,再使用相同的集群创建命令会报错
解决:集群关闭后,进入每个节点目录删掉节点集群信息相关文件,主要是和node相关的文件,rdb和aof文件,如需保留数据可以不用删除。
# 删除集群节点配置
$ cd /usr/local/redis/redis_cluster/6380/
$ rm -rf appendonly.aof dump.rdb nodes-6380.conf nodes.conf
# 重新创建集群
$ redis-cli --cluster create 192.168.15.116:6379 192.168.15.117:6379 192.168.15.118:6379 192.168.15.116:6380 192.168.15.117:6380 192.168.15.118:6380 -a 123456 --cluster-replicas 1
七、redis.conf 配置文件参数说明
1、通用配置(GENERAL)
-
daemonize no
redis是否作为守护进程的方式运行。
-
pidfile /var/run/redis.pid
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
-
loglevel notice
日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose。
-
logfile “”
日志输出的路径及文件名称。
-
databases 16
数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id。
2、网络相关(NETWORK)
-
bind 127.0.0.1
绑定的主机地址,只有绑定的主机才能访问。
-
port 6379
指定Redis监听端口,默认端口为6379,之所以选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码, MERZ取自意大利歌女Alessia Merz,来自程序员的浪漫。
-
tcp-backlog 511
TCP三次握手后会将接受的连接放到队列中,tcp-backlog就是队列的大小。该参数受操作系统影响,在linux操作系统中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在redis启动时会看到如下日志,并建议将/proc/sys/net/core/somaxconn调大。
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
-
tcp-keepalive 300
检测TCP连接活性的周期,默认300s,也就是每隔5分钟对它创建的TCP连接进行活性检测,防止大量的死链接占用系统资源。建议维护成60s。
-
timeout 300
客户端空闲连接的超时时间,一旦空闲时间达到了timeout,客户端就会被关闭,如果设置为0的话就不进行检测。
3、客户端配置(CLIENTS)
-
maxclients 128
同一时间客户端最大连接数,默认10000个连接,当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。
4、快照持久化(SNAPSHOTTING)
-
save <seconds> <changes>
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,Redis默认配置文件中提供了三个条件:
- save 900 1
- save 300 10
- save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
-
stop-writes-on-bgsave-error yes
默认情况下,如果redis最后一次后台保存失败,redis将停止接受写操作。如果后台保存进程重新工作了,redis也将自动的允许写操作。建议改成no。
-
dir ./
指定本地数据库存放目录
-
dbfilename dump.rdb
指定本地数据库文件名,默认值为dump.rdb
-
rdbcompression yes
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,RDB会消耗CPU,但是可大幅度降低文件的体积,建议开启。
-
rdbchecksum yes
读取和写入的时候是否支持CRC64校验,默认开启
5、安全相关(SECURITY)
-
requirepass foobared
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
6、AOF相关(APPEND ONLY MODE)
-
appendonly yes
指定是否在每次更新操作后进行日志记录。Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
-
appendfilename appendonly.aof
指定更新日志文件名,默认为appendonly.aof
-
appendfsync everysec
指定日志刷到磁盘的机制,共有3个可选值:
- no:由操作系统自行决定数据缓存何时刷到磁盘,相对较快。
- always:每次更新操作后手动调用fsync()将数据写到磁盘,性能相对较慢,但是最安全。
- everysec:每秒刷新到磁盘一次
-
no-appendfsync-on-rewrite no
指定后台aof文件在rewrite期间会调用fsync,默认为no,表示要调用fsync。
-
auto-aof-rewrite-percentage 100
表示redis触发aof文件rewrite的条件,默认100,表示与上次rewrite的aof文件大小相比,当aof的增长量超过上次aof文件大小的100%时就会触发backgroup rewrit。若配置为0,会禁用rewrite。
-
auto-aof-rewrite-min-size 64mb
指定触发rewrite的aof文件大小,若aof文件小于该值,及时文件增量达到auto-aof-rewrite-percentage配置的值时,也不会触发rewrite。即这两个条件同时满足时才触发rewrite。
-
aof-load-truncated yes
redis在执行恢复时,当最后一条指令被截断时,如果配置的yes时redis会记录日志并继续,如果设置为no时,redis会失败退出。
-
aof-rewrite-incremental-fsync yes
AOF重写过程中,是否采用增量文件同步的策略。
7、复制相关(REPLICATION)
-
slaveof <masterip> <masterport>
设置当本机为slav服务器时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。
-
masterauth <master-password>
当master服务设置了密码保护时,slav服务连接master的密码。
-
slave-serve-stale-data yes
当slave与master失去连接之后,或者当数据正在复制传输的时候,slave可以继续接受客户端的请求,否则会返回给客户端如下信息:“SYNC with master in progress”
-
slave-read-only yes
从库是否只读
-
repl-diskless-sync no
全量同步时是否先把快照存于本地,如果存于本地会占用磁盘IO,但是可以服用RDB文件,如果不存于磁盘就会直接把RDB文件发给从库,复用性降低。从库较少时建议设置为yes,采用不存储磁盘的方式。
-
repl-diskless-sync-delay 5
当repl-diskless-sync参数为yes时,采用不存储磁盘时,master等待一定时间,等待更多的从库要求增量复制,然后进行并行复制。
-
repl-disable-tcp-nodelay no
向从库传输数据时,是否禁用socket的TCP_NODELAY选项。若配置为yes则禁用TCP_NODELAY,则TCP协议栈会合并小包统一发送,这样可以节省带宽,但是会造成从库的延迟。若配置为no,表明启用TCP_NODELAY,则TCP协议栈会实时传输数据,减少了从库的延迟,但是需要更大的带宽。建议配置为no以减少从库的延迟。
-
slave-priority 100
从库的优先级。集群模式下,优先级越小越容易被选为主库,但是若配置为0,那么该slave永远不会成为master。
8、内存管理(MEMORY MANAGEMENT)
-
maxmemory <bytes>
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会根据maxmemory-policy清除策略先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再使用SET、LPUSH进行写入操作,但仍然可以进行GET操作。
-
maxmemory-policy提供了8种清除策略:
- valatie-lru:从所有最近最少访问数据范围内查找设置了过期时间的数据进行淘汰。
- allkeys-lru:从所有数据范围内查找最近最少使用的数据进行淘汰。
- volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。
- allkeys-random:从所有数据范围内随机选择key进行删除。
- Noevction:不执行任何淘汰策略,当达到内存限制后会报错。默认为此策略
- volatile-ttl:从设置了过期时间的数据范围内挑选将要过期的数据进行淘汰。
- Redis4.X版本开始支持LFU算法。
- valatie-lfu:在设置了过期时间的键空间中,移除使用次数最少的key。
- allkeys-lfu:在所有键空间范围内,移除使用次数最少的key。
9、慢日志(SLOW LOG)
-
slowlog-log-slower-than 10000
慢查询被记录的阀值(单位微秒)
-
slowlog-max-len 128
最多记录慢查询的条数。
10、集群参数(REDIS CLUSTER)
-
cluster-enabled yes
开启集群功能
-
cluster-config-file nodes-6379.conf
集群配置文件
-
cluster-node-timeout 15000
集群节点超时时间(单位毫秒)
-
cluster-migration-barrier 1
主从节点切换需要的最少从节点个数。
-
cluster-require-full-coverage yes
集群是否需要所有的slot都分配给在线节点才能正常访问。
-
repl-ping-slave-period 10
从服务器每隔一定时间向服务器发送ping探测,时间间隔由该参数配置。
-
cluster-slave-validity-factor 10
从节点有效判断因子,当从节点与主节点最后通信时间超过(((cluster-node-timeout) * (slave-validity-factor)) + (repl-ping-slave-period))时,对应的从节点不具备故障转移资格,防止断线时间过长的从节点进行故障转移。设置为0表示从节点永不过期。
参考: