生产环境,如果你是单机在线上跑的话,那么风险很大,一般情况下都会使用一主多从的架构,这样你的系统的可用性才能达到 4 个 9 。
今天来讲讲如何部署读写分离架构,以及读写分离如何保证高可用?
假设你已经部署了 2 个 redis,如果不知道怎么安装部署,可以看看这篇文章:redis 生产环境安装
选择其中一个 redis 节点,作为 slave 节点,需要修改 redis.conf 文件;找到 slaveof 属性,设置 master 的 ip 和端口,这样主从架构就配置好了。
配置如下:
slaveof master-ip 6379
bind 当前机器的ip地址
slave-read-only yes
masterauth xxxx #注意:如果你master设置了requirepass,那么slave中需要配置下面这个配置
配置完之后,使用“redis-cli -h ip -p 6379 -a 你的密码”连上去,输入:info,可以看到主从配置信息
这个 redis 的 role 是 master。
这个 redis 的 role 是 slave。
也可以使用 slaveof 命令,
关闭 slave
利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。
到此主从架构的配置就好了。
但是如果某些原因,master 挂了,那么需要手动来把 slave 变成 master。幸好 redis 提供了 Sentinel(哨兵集群),可以不用人工介入就进行切换。使用该机制才能保证 4 个 9 。
sentinel 配置
首先 cd 到 redis 下面,找到 sentinel.conf 文件,把他 cp 到/etc/sentinal/目录下,并且命名为 5000.conf(表示端口为 5000)
mkdir /etc/sentinal
mkdir -p /var/sentinal/5000
cd /usr/local/redis
cp sentinel.conf /etc/sentinal
mv sentinel.conf 5000.conf
修改 5000.conf 的配置为
port 5000
dir /var/sentinal/5000
bind xxxx #指定你的ip地址
sentinel monitor mymaster 你的ip 6379 2 #哨兵监控的master。
quorum的解释:至少多少个哨兵要一致同意,master进程挂掉了,或者slave进程挂掉了,或者要启动一个故障转移操作
sentinel down-after-milliseconds mymaster 30000 #超过多少毫秒跟一个redis实例断了连接,哨兵就可能认为这个redis实例挂了
sentinel failover-timeout mymaster 60000 #若哨兵在配置值内未能完成故障转移操作,则任务本次故障转移失败。
sentinel parallel-syncs mymaster 1 #新的master被切换之后,同时有多少个slave被切换到去连接新master,重新做同步,数字越低,花费的时间越多
protected-mode no #保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效。
sentinel auth-pass mymaster redismasterpassword #如果你的redis设置了密码,那么你需要在这里配置密码
logfile /var/sentina/logs/sentinel.log #指明日志文件
使用 redis-sentinel /etc/sentinal/5000.conf 来启动哨兵。
看到下面结果,表示哨兵配置成功了。
可以使用下面这个命令,连上 sentinal,查看具体信息
redis-cli -h 你的 sentinal-ip -p 你的 sentinal-port
sentinel master mymaster #查看redis master的信息
SENTINEL slaves mymaster #查看redis slave的信息
SENTINEL sentinels mymaster #查看其它的sentinal信息
SENTINEL get-master-addr-by-name mymaster #查看谁是master redis
如果你把 master 关掉,哨兵就会自动帮你切换。
模拟把 master redis 关掉,哨兵切换过程如下图
再次查看当前主从架构的 master
已经切换为 6380 了(之前的 master 是 6379)
redis cluster 配置
一般配置 3 个 master,每个 master 下面配置一个 salve。这样的配置可以保证系统高可用。如果你想你的更加稳定,那么可以在 master 下面都配置一些 salve。
使用下面命令 创建文件夹
mkdir -p /etc/redis-cluster
mkdir -p /var/log/redis
mkdir -p /var/redis/6379
redis.conf 文件的配置为:
port 6379
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-6379.conf #这是指定一个文件,供cluster模式下的redis实例将集群状态保存在那里,包括集群中其他机器的信息,比如节点的上线和下限,故障转移。
cluster-node-timeout 15000 #节点存活超时时长,超过一定时长,认为节点宕机,master宕机的话就会触发主备切换,slave宕机就不会提供服务
daemonize yes
pidfile /var/run/redis\_6379.pid
dir /var/redis/6379
logfile /var/log/redis/6379.log
bind 你的ip地址
appendonly yes
redis 配置好了之后,就可以启动了
还需要安装 ruby
yum install -y ruby
yum install -y rubygems
gem install -l /home/downloads/redis-3.2.1.gem #去官网 https://rubygems.org/gems/redis 下载相应的.gem 文件,上传到服务器上
cp /usr/local/redis-3.2.8/src/redis-trib.rb /usr/local/bin
使用下面命令来创建集群
redis-trib.rb create --replicas 0 xxx:6379 xxx:6380 xxx:6381
出现了错误:
1、Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决:把 dump.db 数据清除掉。
2、[ERR] Sorry, can't connect to node
解决:因为一个节点我设置了密码,所以导致 redis-trib.rb 连接不上。requirepass 注释掉。
3、ERROR: Invalid configuration for cluster creation.Redis Cluster requires at least 3 master nodes.
解决:因为之前我配置了两个节点,他创建集群必须要 3 个节点,那么在创建一个节点。
如果你看到这个,说明你已经成功配置了 redis cluster
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于