redis主安装在公网IP为x.x.x.x,内网IP为x1.x1.x1.x1的服务器上
redis从安装在公网IP为y.y.y.y,内网IP为y1.y1.y1.y1的服务器上
redis从安装在公网IP为z.z.z.z,内网IP为z1.z1.z1.z1的服务器上
Redis Sentinel哨兵模式通过监控的方式获取主机的工作状态是否正常,当主机发生故障时,sentinel会自动进行故障转移,并将其监控的从机提升主服务器,从而保证了系统的高可用性。
sentinel的原理:
sentinel负责监控主从节点的“健康”状态。当主节点挂掉时,自动选择一个最优的从节点切换为主节点。客户端来连接sedis集群时,会首先连接sentinel,通过sentinel来查询主节点的地址,然后再去连接主节点进行数据交互。当主节点发生故障时,客户端会重新向sentinel要地址,sentinel会将最新的主节点地址告诉客户端。因此应用程序无需重启即可自动完成主从节点切换。
sentinel的分布式特性:
Redis Sentinel是一个分布式系统,sentinel运行在有许多sentinel进程互相合作的环境下。当多个sentinel同意一个master不再可用的时候,才可以执行故障检测,明显降低了错误概率。即使并非全部的sentinel都在工作,sentinel也可以正常工作,这使得系统非常健康稳定。所有的sentinels、redis实例,连接到sentinel和redis的客户端,本身就是一个有着特殊性质的大型分布式系统。
redis主、从安装
第一步,安装编译工具及库文件。
命令:yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
命令:cd /usr/local/src
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
命令:tar zxvf redis-4.0.10.tar.gz -C /usr/local
第四步,编译安装redis。
命令:cd /usr/local/redis-4.0.10
make
cd /usr/local/redis-4.0.10/src
make install
注意:执行完 make 后,再执行 make install,会将 /usr/local/redis-4.0.10/src下的可执行文件复制到 /usr/local/bin 目录下,该目录下的都配置到环境变量里,相当于添加了快捷方式,就可以在任意目录执行redis的软件的命令,如启动、停止等命令,如果不执行make install也可以使用redis,只不过比较麻烦,执行命令时要进入redis的bin目录里操作了。
redis主、从配置
第一步,为了方便管理,在/usr/local中新建/redis/etc文件夹,并在将/usr/local/redis-4.0.10文件夹中的conf配置文件复制粘贴到/usr/local/redis/etc。原生的配置文件不用变,改完之后还能回到原来的样子,以保证安全。
命令:mkdir -p /usr/local/redis/etc
cp /usr/local/redis-4.0.10/redis.conf /usr/local/redis/etc
第二步,在/usr/local中新建/redis/bin、/redis/db和/redis/logs文件夹,/usr/local/redis-4.0.10/src文件夹中的常用命令复制粘贴到/usr/local/redis/bin。
命令:mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/db
mkdir -p /usr/local/redis/logs
cd /usr/local/redis-4.0.10/src
cp mkreleasdhdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
第三步,编辑配置/etc/sysctl.conf文件。
配置sysctl.conf文件的内核参数,否则redis脚本在重启或停止redis时,将会报错,并且不能自动在停止服务前同步数据到磁盘上。
命令:vim /etc/sysctl.conf
在最后一行添加下面代码:
vm.overcommit_memory = 1
# 使设置立即生效
命令:sysctl -p
第四步,redis开启外部访问权限的方法。
redis主编辑配置/usr/local/redis/etc/redis.conf文件,做以下几处修改:
“bind 127.0.0.1”改为“bind 0.0.0.0”,
“daemonize no”改为“daemonize yes”,
“requirepass foobared”改为requirepass "redis123456",
“dir ./”改为“dir /usr/local/redis/db”,
“logfile ”改为“logfile /usr/local/redis/logs/redis.log”。
redis从编辑配置/usr/local/redis/etc/redis.conf文件,做以下几处修改:
“bind 127.0.0.1”改为“bind 0.0.0.0”,
“port 3679”改为“port 3680”或“port 3681”,
“slaveof <masterip> <masterport>”改为“slaveof x1.x1.x1.x1 6379”,
“masterauth <master-password>”改为masterauth "redis123456",
“daemonize no”改为“daemonize yes”,
“requirepass foobared”改为requirepass "redis123456",
“dir ./”改为“dir /usr/local/redis/db”,
“logfile ”改为“logfile /usr/local/redis/logs/redis.log”。
redis主、从启动与关闭服务
说明:前台启动:redis-server 后台启动:redis-server &
第一步,前台启动redis服务。
命令:cd /usr/local/redis/bin
./redis-server
注意:执行完该命令后,如果Lunix关闭当前会话,则redis服务也随即关闭。正常情况下,启动redis服务需要从后台启动,并且指定启动配置文件。
第二步,后台启动redis服务。
再次启动redis服务,并指定启动服务配置文件。
命令:cd /usr/local/redis/bin
redis-server /usr/local/redis/etc/redis.conf
#结果第一行最后面显示redis端口
ps -ef | grep redis
#结果第一行最后面显示redis进程号
netstat -nap | grep 6379(6380或6381)
服务端启动成功后,启动redis 客户端,查看端口号。
第三步,外部IP地址访问redis。
命令:ip a
redis-cli -h x1.x1.x1.x1 -p 6379
redis-cli -h y1.y1.y1.y1 -p 6380
redis-cli -h z1.z1.z1.z1 -p 6381
auth "redis123456"
keys *
set [key] [value]
get [key]
exit
第四步,前台和后台关闭redis服务。
命令:cd /usr/local/redis/bin
pkill redis-server
redis-cli shutdown
netstat -nap | grep 6379(6380或6381)
或 ss -tnlp|grep 6379(6380或6381)
关机重启,redis主、从会自动启动
使用redis启动/usr/local/redis-4.0.10/utils中的脚本redis_init_script设置开机自启动。
第一步,修改redis_init_script脚本代码。
redis_init_script脚本代码如下:
#!/bin/sh
...
REDISPORT=6379
#服务端所处位置
EXEC=/usr/local/redis/bin/redis-server
#客户端位置
CLIEXEC=/usr/local/redis/bin/redis-cli
#redis的PID文件位置,需要修改
PIDFILE=/var/run/redis_6379.pid
#redis的配置文件位置,需将${REDISPORT}修改为文件名
CONF="/usr/local/redis/etc/redis.conf"
...
第二步,将redis_init_script复制到/etc/rc.d/init.d目录下。
redis_init_script复制到/etc/rc.d/init.d,复制粘贴的启动脚本会被命名为redisd(通常都以d结尾表示是后台自启动服务)。
命令:cd /usr/local/redis-4.0.10/utils
cp redis_init_script /etc/rc.d/init.d/redisd
chmod +x /etc/rc.d/init.d/redisd
#设置为开机自启动服务器
chkconfig redisd on
#打开服务
service redisd start
#关闭服务
service redisd stop
在设置开机自启动时,发现错误:
service redisd does not support chkconfig
这个错误的解决办法是在启动脚本开头添加如下注释来修改运行级别,如下:
#!/bin/sh
# chkconfig: 2345 90 10
再用命令:chkconfig redisd on设置即可。
不进入根目录即可进行相应的操作
打开服务命令:service redisd start
关闭服务命令:service redisd stop
配置sentinel
三个redis服务器,每个服务器都需要做下面的操作。
第一步,在/usr/local/redis文件夹下创建sentinel文件夹。
命令:cd /usr/local/redis/
mkdir sentinel
第二步,在/usr/local/redis/sentinel下创建sentinel配置文件sentinel.conf。
主服务器上sentinel.conf文件中可以写入下面的代码:
port 26379
bind 0.0.0.0
daemonize yes
logfile "/usr/local/redis/sentinel/logs/redis-sentinel.log"
dir "/usr/local/redis/db"
sentinel monitor mymaster x1.x1.x1.x1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 2
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster redis123456
sentinel known-slave mymaster y1.y1.y1.y1 6380
sentinel known-slave mymaster z1.z1.z1.z1 6381
sentinel current-epoch 1
从服务器上的类似,只需要把“port 端口”更改为“port 26380”“port 26381”。
第三步,创建批量执行脚本start-all.sh和shutdown-all.sh。
在/usr/local/redis/sentinel文件夹中创建批量启动脚本start-all.sh,代码如下:
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel/sentinel.conf
在/usr/local/redis/sentinel文件夹中创建批量关闭脚本shutdown-all.sh,代码如下:(IP地址和端口号需要修改)
/usr/local/redis/bin/redis-cli -h x1.x1.x1.x1 -p 6379 shutdown
/usr/local/redis/bin/redis-cli -h x1.x1.x1.x1 -p 26379 shutdown
第四步,为批量执行脚本赋予权限。
命令:cd /usr/local/redis/sentinel
chmod +x start-all.sh shutdown-all.sh
第五步,启动和关闭Redis Sentinel。
先启动主服务器,再启动从服务器。
命令:cd /usr/local/redis/sentinel
./start-all.sh
./shutdown-all.sh
ps -ef | grep redis
第六步,分别在主、从服务器登录哨兵节点,并查看是否启动成功。
命令:cd /usr/local/redis/bin
redis-cli -h x1.x1.x1.x1 -p 26379
redis-cli -h y1.y1.y1.y1 -p 26380
redis-cli -h z1.z1.z1.z1 -p 26381
输入“ping”
若结果为“PONG”,则连接测试成功。
输入“info sentinel”
若结果显示
master0:name=mymaster,status=sdown,address=x1.x1.x1.x1:6379,slaves=2,sentinels=3
则主服务器上的哨兵节点启动成功。
# 在主、从服务器查看master服务器详细信息命令:
输入“sentinel master mymaster”
# 在主、从服务器查看slave服务器的详细信息命令:
输入“sentinel slaves mymaster”
# 如果将当前的主服务器中的redis服务杀掉,哨兵会从slave服务器中选举新的主服务器。
命令:cd /usr/local/redis/sentinel
./shutdown-all.sh
pkill redis-server
ps -ef | grep redis
cd /usr/local/redis/bin
redis-cli -h y1.y1.y1.y1 -p 26380
redis-cli -h z1.z1.z1.z1 -p 26381
输入“info sentinel”
若结果显示
master0:name=mymaster,status=ok,address=z1.z1.z1.z1:6381,slaves=2,sentinels=3
则主服务器转移成功。