在项目中重新搭建一套读写分离+高可用+多master的redis cluster集群

redis cluster模式下,不建议做物理的读写分离了

我们建议通过master的水平扩容,来横向扩展读写吞吐量,还有支撑更多的海量数据

redis单机,读吞吐是5w/s,写吞吐2w/s

扩展redis更多master,那么如果有5台master,不就读吞吐可以达到总量25/s QPS,写可以达到10w/s QPS

redis单机,内存,6G,8G,fork类操作的时候很耗时,会导致请求延时的问题

扩容到5台master,能支撑的总的缓存数据量就是30G,40G -> 100台,600G,800G,甚至1T+,海量数据

redis是怎么扩容的

1、加入新master

mkdir -p /var/redis/7007

port 7007
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7007.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7007.pid
dir /var/redis/7007
logfile /var/log/redis/7007.log
bind 192.168.31.227
appendonly yes

搞一个7007.conf,再搞一个redis_7007启动脚本

手动启动一个新的redis实例,在7007端口上

redis-trib.rb add-node 192.168.31.227:7007 192.168.31.187:7001

redis-trib.rb check 192.168.31.187:7001

连接到新的redis实例上,cluster nodes,确认自己是否加入了集群,作为了一个新的master

2、reshard一些数据过去

resharding的意思就是把一部分hash slot从一些node上迁移到另外一些node上

redis-trib.rb reshard 192.168.31.187:7001

要把之前3个master上,总共4096个hashslot迁移到新的第四个master上去

How many slots do you want to move (from 1 to 16384)?

1000

3、添加node作为slave

eshop-cache03

mkdir -p /var/redis/7008

port 7008
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7008.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7008.pid
dir /var/redis/7008
logfile /var/log/redis/7008.log
bind 192.168.31.227
appendonly yes

redis-trib.rb add-node --slave --master-id 28927912ea0d59f6b790a50cf606602a5ee48108 192.168.31.227:7008 192.168.31.187:7001

4、删除node

先用resharding将数据都移除到其他节点,确保node为空之后,才能执行remove操作

redis-trib.rb del-node 192.168.31.187:7001 bd5a40a6ddccbd46a0f4a2208eb25d2453c2a8db

2个是1365,1个是1366

当你清空了一个master的hashslot时,redis cluster就会自动将其slave挂载到其他master上去

这个时候就只要删除掉master就可以了

------------恢复内容开始------------


redis cluster最最基础的一些知识

redis cluster: 自动,master+slave复制和读写分离,master+slave高可用和主备切换,支持多个master的hash slot支持数据分布式存储

停止之前所有的实例,包括redis主从和哨兵集群

1、redis cluster的重要配置

cluster-enabled <yes/no>

cluster-config-file <filename>:这是指定一个文件,供cluster模式下的redis实例将集群状态保存在那里,包括集群中其他机器的信息,比如节点的上线和下限,故障转移,不是我们去维护的,给它指定一个文件,让redis自己去维护的

cluster-node-timeout <milliseconds>:节点存活超时时长,超过一定时长,认为节点宕机,master宕机的话就会触发主备切换,slave宕机就不会提供服务

2、在三台机器上启动6个redis实例

(1)在eshop-cache03上部署目录

/etc/redis(存放redis的配置文件),/var/redis/6379(存放redis的持久化文件)

(2)编写配置文件

redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,3个master,3个slave,最少的要求

正式环境下,建议都是说在6台机器上去搭建,至少3台机器

保证,每个master都跟自己的slave不在同一台机器上,如果是6台自然更好,一个master+一个slave就死了

3台机器去搭建6个redis实例的redis cluster

mkdir -p /etc/redis-cluster
mkdir -p /var/log/redis
mkdir -p /var/redis/7001

port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 192.168.31.187
appendonly yes

至少要用3个master节点启动,每个master加一个slave节点,先选择6个节点,启动6个实例

将上面的配置文件,在/etc/redis下放6个,分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf

(3)准备生产环境的启动脚本

在/etc/init.d下,放6个启动脚本,分别为: redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006

每个启动脚本内,都修改对应的端口号

(4)分别在3台机器上,启动6个redis实例

将每个配置文件中的slaveof给删除

3、创建集群

下面方框内的内容废弃掉

=======================================================================

wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar -zxvf ruby-2.3.1.tar.gz
./configure -prefix=/usr/local/ruby
make && make install
cd /usr/local/ruby
cp bin/ruby /usr/local/bin
cp bin/gem /usr/local/bin

wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l ./redis-3.3.0.gem
gem list --check redis gem

=======================================================================

因为,以前比如公司里面搭建集群,公司里的机器的环境,运维会帮你做好很多事情

在讲课的话,我们手工用从零开始装的linux虚拟机去搭建,那肯定会碰到各种各样的问题

yum install -y ruby
yum install -y rubygems
gem install redis

cp /usr/local/redis-3.2.8/src/redis-trib.rb /usr/local/bin

redis-trib.rb create --replicas 1 192.168.31.187:7001 192.168.31.187:7002 192.168.31.19:7003 192.168.31.19:7004 192.168.31.227:7005 192.168.31.227:7006

--replicas: 每个master有几个slave

6台机器,3个master,3个slave,尽量自己让master和slave不在一台机器上

yes

redis-trib.rb check 192.168.31.187:7001

4、读写分离+高可用+多master

读写分离:每个master都有一个slave
高可用:master宕机,slave自动被切换过去
多master:横向扩容支持更大数据量

================================开始搭建==================================

Cluster模式-3.0开始推出的

采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他节点连接

官方要求:至少6个节点才可以保证高可用,3主3从;扩展性强,更好做到高可用

各个节点会互相通信,采用gossip协议交换元数据信息

数据分散存储到各个节点上

 

集群环境准备:

旧版本需要使用ruby语言进行构建,新版本5之后直接使用redis-cli即可

6个节点,三主三从,主从节点会自动分配,不是人工指定

主节点故障后,从节点会替换主节点

 #是否开启集群
 cluster-enabled yes
 #生成的node文件,记录集群节点信息,默认no
 cluster-config-file nodes-6381.conf
 #集群节点ip,当前节点ip
 cluster-announce-ip 192.168.31.20
 #集群节点映射端口
 cluster-announce-port 6381
 #集群节点总线端口,节点之间互相通信,常规端口+2w
 cluster-announce-bus-port 26381
 

不过我们的是4.0版本使用ruby进行构建。

1.把集群相关的机器停止掉,包括哨兵

 redis-cli -h 192.168.31.186 -a 123456 -p  6379 SHUTDOWN
 redis-cli -h 192.168.31.186 -a 123456 -p 26379 SHUTDOWN
 redis-cli -h 192.168.31.244 -a 123456 -p 6379 SHUTDOWN
 redis-cli -h 192.168.31.244 -a 123456 -p 26379 SHUTDOWN
 redis-cli -h 192.168.31.20 -a 123456 -p 6379 SHUTDOWN
 redis-cli -h 192.168.31.20 -a 123456 -p 26379 SHUTDOWN

2.config需要增加重要的配置,修改如下,3个文件变成6个文件,修改启动测脚本,配置多个

31.20 机器上:

 mkdir -p /etc/redis-cluster
 mkdir -p /var/redis/7001
 mkdir -p /var/redis/7002

将etc/redis中的配置文件复制,cp 6379.conf 7001.conf

更改配置:

 port 7001
 cluster-enabled yes
 cluster-config-file /etc/redis-cluster/node-7001.conf
 cluster-node-timeout 15000
 daemonize yes
 pidfile /var/run/redis_7001.pid
 dir /var/redis/7001
 logfile "/usr/local/redis/log/7001.log"
 bind 192.168.31.20
 appendonly yes

cp 7001.conf 7002.conf

rm -rf 6379.conf

在当前目录

 scp 7002.conf root@192.168.31.186:/etc/redis/7003.conf
 scp 7002.conf root@192.168.31.186:/etc/redis/7004.conf

修改31.186的conf相关配置和上面的数据匹配,包括

 mkdir -p /etc/redis-cluster
 mkdir -p /var/redis/7003
 mkdir -p /var/redis/7004

7003和7004都需要进行更改对应数据

 port 7003
 cluster-enabled yes
 cluster-config-file /etc/redis-cluster/node-7003.conf
 cluster-node-timeout 15000
 daemonize yes
 pidfile /var/run/redis_7003.pid
 dir /var/redis/7003
 logfile "/usr/local/redis/log/7003.log"
 bind 192.168.31.186
 appendonly yes

31.244服务器上继续重复上面操作

 scp 7004.conf root@192.168.31.244:/etc/redis/7005.conf
 scp 7004.conf root@192.168.31.244:/etc/redis/7006.conf

 

准备生产环境的启动脚本

修改etc/init.d,把redis_6379,复制俩,删除源文件,修改redis_7001,redis_7002

主要修改文件这俩地方改为对应文件的端口地址

 REDISPORT=7001
 RESOURCE="/var/redis/7001"

都给start起来看一下

查看:/usr/local/redis/log/7003.log

 :C 04 Feb 16:30:21.683 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
 15733:C 04 Feb 16:30:21.683 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=15733, just started
 15733:C 04 Feb 16:30:21.683 # Configuration loaded
 15734:M 04 Feb 16:30:21.685 * Increased maximum number of open files to 10032 (it was originally set to 1024).
 15734:M 04 Feb 16:30:21.686 * No cluster configuration found, I'm 0dae0a094e826e02ab8cb8362c1e1976939326a8
 15734:M 04 Feb 16:30:21.688 * Running mode=cluster, port=7003.
 15734:M 04 Feb 16:30:21.688 # Server initialized
 15734:M 04 Feb 16:30:21.688 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
 15734:M 04 Feb 16:30:21.688 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
 15734:M 04 Feb 16:30:21.688 * DB loaded from append only file: 0.000 seconds
 15734:M 04 Feb 16:30:21.688 # I have keys for unassigned slot 449. Taking responsibility for it.
 15734:M 04 Feb 16:30:21.688 # I have keys for unassigned slot 12706. Taking responsibility for it.
 15734:M 04 Feb 16:30:21.689 * Ready to accept connections
 15734:M 04 Feb 16:45:22.101 * 1 changes in 900 seconds. Saving...
 15734:M 04 Feb 16:45:22.102 * Background saving started by pid 15870
 15870:C 04 Feb 16:45:22.131 * DB saved on disk
 15870:C 04 Feb 16:45:22.131 * RDB: 8 MB of memory used by copy-on-write
 15734:M 04 Feb 16:45:22.222 * Background saving terminated with success
 [root@MiWiFi-R4CM-srv log]#
 

 

安装插件:

yum install -y ruby
yum install -y rubygems
gem install redis

 

后面报错:

[root@MiWiFi-R4CM-srv redis]# gem install redis
Fetching: redis-4.6.0.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.4.0.

说需要版本升级:

https://www.ruby-lang.org/zh_cn/downloads/

官网最新3.1版本

目前是

ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

升级下载需要

 

RVM 是一个命令行工具,可以提供一个便捷的多版本 Ruby 环境的管理和切换。

 升级版本需要依赖rvm: rvm 安装 

我的redis安装目录中的

cp /root/redis-4.0.11/src/redis-trib.rb /usr/local/bin

 

 

 

 

 redis-trib.rb create --replicas 1 192.168.31.20:7001 192.168.31.20:7002 192.168.31.186:7003 192.168.31.186:7004 192.168.31.244:7005 192.168.31.244:7006

 

 把几份配置文件修改,protected-mode,和密码访问注释,还有复制的ip信息注释bind注释了。

修改办法:protected-mode no

 加了开机自启。

 

 再次访问命令后报错不一样了,哭...

 

 

 进入命令行想set值,不好意思,报错,没有分配槽

 (error) CLUSTERDOWN Hash slot not served

 

 

 

 搭建成功!

 

 

又失败了,我这分片分的就离谱,添加数据只能7006添加,别的添加报错,添加一条数据库都有一份,别的库还看不了

 

 

redis-cli报错:(error) MOVED 12706 (未以集群模式连接)

 需要改变思维了,用集群的方式连接才不会报错。

 

每个都能读,每个都能写

 

posted @ 2022-01-02 15:56  三号小玩家  阅读(401)  评论(0编辑  收藏  举报
Title
三号小玩家的 Mail: 17612457115@163.com, 联系QQ: 1359720840 微信: QQ1359720840