linux系统——Redis集群搭建(主从+哨兵模式)
趁着这几天刚好有点空,就来写一下redis的集群搭建,我跟大家先说明,本文的redis集群因为linux服务器只是阿里云一台服务器,所以集群是redis启动不同端口,但是也能达到集群的要求。其实不同服务器也相当于启动不同端口一样。所以,一起来看看效果吧。
一:下载redis安装包(我的是这个版本:5.0.14)
二:在目录 /usr/local 创建文件夹:redis_6379,redis_6380,redis_6381
我这里之所以这么命名,是因为对应redis的端口号。
三:分别在这三个目录上传下载好的redis压缩包,使用:tar -xvf redis-5.0.14.tar.gz 命令解压
切换目录:cd redis-5.0.14 编译:make 编译完成继续切换目录:cd src 接着安装:make install 注:如出现/bin/sh: cc: command not found错误,是因为没有安装 gcc 环境,使用命令yum install gcc安装 gcc 环境即可。
四:抽离一些配置文件以及启动命令到文件夹,所以,先在根目录下创建文件夹:bin、config
1、切换到该目录:cd /usr/local/redis_6379(后面几台服务器一样操作) 2、创建两个目录:mkdir bin。mkdir config 3、复制配置文件到指定目录: cp redis.conf /usr/local/redis_6379/config cp src/mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis_6379/config
我这里的etc目录就是config目录。还有sectinel.conf是后面会讲到哨兵模式配置是回移动进来
五:现在尝试先启动一台(注意,此刻我还没有搭建主从分布的配置文件修改,这里启动仅仅是为了redis是否能够正常启动)
切换目录:cd /usr/local/redis_6379/redis-5.0.14/bin 执行启动命令:./redis-server /usr/local/redis_6379/redis-5.0.14/config/redis.conf 可以查看进程:ps axu | grep redis
两者其一都可以
这样算是启动成功的!!!
六:先暂时关闭redis:
cd /usr/local/redis_6379/redis-5.0.14/bin redis-cli -p 6379 shutdown
七:分割线————————————————开始集群搭建(主从+哨兵模式)——————————
主从分布式搭建,是多台服务器的redis配置文件修改来确定的。主从搭建是为了比如某一台服务器的redis写进了缓存,另外几台redis服务器也能获取到数据,熟称数据同步!!!
主从搭建好,还要考虑一点:哨兵模式,也就是为了容灾来考虑,也就是说,比如主redis服务器工作过程当中,因为某些原因,突然挂了,那么其他从redis服务器没有了主服务器,那就一直连接不上,导致数据不能同步,那么这个时候,就需要哨兵模式中的redis服务器中选出一个redis,来当主服务器。现在开始搭建!!!!
文章一开头我已说明:本人只有一台linux服务器,所以开三个端口号是为了跟三台服务器是一样的效果。
IP地址 | 端口号 | 角色 |
47.99.83.180 | 6379 | 主机 |
47.99.83.180 | 6380 | 从机 |
47.99.83.180 | 6381 | 从机 |
八:修改配置文件:
cd /usr/local/redis_6379/redis-5.0.14/config vim redis.conf
我们来看一下一些参数的意思:
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。 daemonize no # 指定redis进程的PID文件存放位置 pidfile /var/run/redis.pid # redis进程的端口号 port 6379 #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。 protected-mode yes # 绑定的主机地址 bind 127.0.0.1 # 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能 timeout 300 # redis日志级别,可用的级别有debug.verbose.notice.warning loglevel verbose # log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了 logfile stdout # 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id databases 16 # 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件 save <seconds> <changes> # 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储 rdbcompression yes # 指定本地数据库文件名 dbfilename dump.db # 指定本地数据问就按存放位置 dir ./ # 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步 replicaof <masterip> <masterport> # 当master设置了密码保护时,slave服务连接master的密码 masterauth <master-password> # 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭 requirepass footbared # 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息 maxclients 128 # 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区 maxmemory<bytes> # 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。 appendonly no # 指定跟新日志文件名默认为appendonly.aof appendfilename appendonly.aof # 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值); appendfsync everysec
接下来我们要改动的信息(三台服务器都要修改(此处是同一台服务器,三个不同端口),记住:port就是对应的端口号,比如对应上面步骤七的表格):
主机配置: bind:0.0.0.0 port:6379 protected-mode:no daemonize:yes logfile:./redis.log requirepass:testuser #--这个看自己的情况是否需要设置账号和密码 masterauth:123456 #--这个看自己的情况是否需要设置账号和密码
上面的参数说明:
bind:0.0.0.0 #Redis 默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。 port:6379 #监听端口默认为6379,想改其他也行。 protected-mode:no #关闭保护模式,可以外部访问。 daemonize:yes #设置为后台启动。 logfile:./redis.log #redis 日志文件,生成后在 bin 目录下可找到
从机配置:这里的port需要注意,从机本文配置的端口是6380、6382。读者根据自行而定。如果是独立的服务器,这里端口可以不用修改
bind:0.0.0.0 port:6380 protected-mode:no daemonize:yes logfile:./redis.log requirepass:testuser #--这个看自己的情况是否需要设置账号和密码 如果主机设置了,从机也要 masterauth:123456 #--这个看自己的情况是否需要设置账号和密码如果主机设置了,从机也要 replicaof 47.99.83.180 6379 #因为这里的从机的配置,所以这里就是设置主机的 ip+ 端口,来指明主机的redis
注意:以前的老版本是使用变量:slaveof 设置主机的,因为我用的是新版本。所以在变量:replicaof做配置
九:数据同步测试
上面的步骤修改配置文件,已经是可以实现主从分布的搭建,接下来就启动三台服务器,启动redis服务器前,先开放端口,否则连接会拒绝(防火墙安全拦截:可以在阿里云服务器的控制台直接增加防火墙端口开放,此处使用命令,如果命令不行,那就在阿里云服务器控制台设置)
#端口记得写正确 1、firewall-cmd --add-port=6379/tcp --permanent --zone=public #重启防火墙(修改配置后要重启防火墙) 2、firewall-cmd --reload
接下来启动主从服务器:
1:cd /usr/local/redis_6379/redis-5.0.14/bin 2:redis-server ../config/redis.conf 注意:目录redis_6379是对应的redis哈,别搞错
然后我们检查一下是否搭建主从成功:
1:redis-cli -p 6380 2: info replication #此处我是进入从机,也可以看得到主机、从机信息。slave就是从机的意思
此刻主从搭建完成!!!!接下来看数据能否同步:
分别进入6379、6380、6381的客户端连接:
主机写入
从机读取:
注意:这里的错误提示是因为我在从机写入,报错了,意思是从机没有写入权限
错误信息:(error) READONLY You can't write against a read only replica 在配置文件修改: 进入/usr/local/redis_6379/redis-5.0.14/config/redis.conf 配置文件,修改配置文件的slave-read-only为no, 那么从节点也就可以进行写的操作了,代码不会报错。 大伙记得不管主机从机都设置好这个属性,否则到时候从机写入不了数据
十:哨兵搭建(重点来了——————————哨兵搭建————————————)
每台服务器都配置一个哨兵,配置方式相同,如下
同样为了方便管理,首先将sentinel.conf复制到 config 下(记得三台服务器都要执行。sentinel.conf配置文件在根目录:
所以进入到到该目录下:
cp sentinel.conf config
修改哨兵配置文件:sentinel.conf
cd config
vim sentinel.conf
改动的地方如下:
//端口默认为26379。 主机,从机的这个端口记得修改,否则导致端口占用,启动不了。(因为我是在一台linux服务器部署,所以我的要修改,如果你是在不同linxu服务器部署,那么可以不用修改) port:26379 //关闭保护模式,可以外部访问。 protected-mode:no //设置为后台启动。 daemonize:yes //日志文件。 logfile:./sentinel.log //指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。 sentinel monitor mymaster 47.99.83.180 6379 2 //当在Redis实例中开启了requirepass,这里就需要提供密码并保持一致,如果没启用密码,那么不需要设置,屏蔽这个属性就好(默认是屏蔽的) sentinel auth-pass mymaster 12345 //这里设置了主机多少秒无响应,则认为挂了。 sentinel down-after-milliseconds mymaster 3000 //主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。 snetinel parallel-syncs mymaster 1 //故障转移的超时时间,这里设置为三分钟。 sentinel failover-timeout mymaster 180000
接下来防火墙设置:上面的配置文件改动的端口是多少,就对应即可
firewall-cmd --add-port=26379/tcp --permanent --zone=public #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload
十一:启动三个哨兵(记得在要启动三个,进入对应目录)
1、cd /usr/local/redis_6381/redis-5.0.14/bin/ 2、redis-sentinel /usr/local/redis_6381/redis-5.0.14/config/sentinel.conf
十二:查看哨兵信息
1、cd /usr/local/redis_6381/redis-5.0.14/bin/ #这里的26381是在上面的第十步骤的配置文件sentinel.conf里面的配置的端口号 2、redis-cli -p 26381 3、info sentinel
十三:容灾切换
现在模拟主机宕机,也就是是否能实现容灾切换,直接把主机宕机,也就是关闭主机redis。如果不知道哪台是主机,请执行下面命令:
1、先进入对应目录(随意一台服务器:cd /usr/local/redis_6381/redis-5.0.14/bin/ 2、执行命令(这里的端口号是redis启动的端口号):redis-cli -p 6379 3、info replication #看下图信息即可知道主机是那一台
此刻我们知道47.99.83.180:6380这一台是主机redis:
1、redis-cli -p 6380 2:showdown
然后我们进入从机的bin目录(因为redis.log在该目录下(我们在redis.conf里面做了设置):cat redis.log)
完事!!!!