1. Redis 单机搭建(以 6.0.6 版本为例)
安装 gcc 套装。
yum install cpp yum install binutils yum install glibc yum install glibc-kernheaders yum install glibc-common yum install glibc-devel yum install gcc yum install make
升级 gcc。
yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash
使 scl 长期有效。
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
下载 redis 。
wget http://download.redis.io/releases/redis-6.0.6.tar.gz
解压。
tar vxf redis-6.0.6.tar.gz
编译,安装。
cd redis-6.0.6/ make make PREFIX=/usr/local/redis install
创建配置文件、数据目录,并且将配置文件复制到目录中。
mkdir /usr/local/redis/conf mkdir /usr/local/redis/data cp ${REDIS_SRC_HOME}/redis.conf /usr/local/redis/conf/
修改配置文件
conf/redis.conf
。- 修改其中对应的内容。
# 后台启动的意思 daemonize yes # IP绑定,redis不建议对公网开放,直接绑定 0.0.0.0 没毛病 bind 0.0.0.0 # redis数据文件存放的目录 dir /usr/local/redis/data # 开启AOF appendonly yes
启动 redis。
cd /usr/local/redis ./bin/redis-server ./conf/redis.conf
测试。
./bin/redis-cli
- 也可以通过客户端连接。
2. Redis 哨兵高可用搭建
目前为了方便演示,在一台机器上以不同的端口启动 3 个服务。进行之前,先进行单节点上的前 8 个步骤。
复制出 3 份配置文件。
cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6380.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6381.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6382.conf
分别修改 3 个文件
redis-6380.conf
、redis-6381.conf
、redis-6382.conf
,修改其中对应的端口及 pid 对应的保存文件(注意:三个文件都需要修改)。# 端口号(如果同一台服务器上启动,注意要修改为不同的端口) port 6380 # 这个文件会自动生成(如果同一台服务器上启动,注意要修改为不同的端口) pidfile /var/run/redis_6380.pid
启动 3 个 redis。
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6381.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6382.conf
配置为 1 主 2 从
/usr/local/redis/bin/redis-cli -p 6381 slaveof 127.0.0.1 6380 /usr/local/redis/bin/redis-cli -p 6382 slaveof 127.0.0.1 6380
检查集群。
/usr/local/redis/bin/redis-cli -p 6380 info Replication
准备哨兵配置文件。
cp ${REDIS_SRC_HOME}/sentinel.conf /usr/local/redis/conf/ cp /usr/local/redis/conf/sentinel.conf /usr/local/redis/conf/sentinel-26380.conf cp /usr/local/redis/conf/sentinel.conf /usr/local/redis/conf/sentinel-26381.conf cp /usr/local/redis/conf/sentinel.conf /usr/local/redis/conf/sentinel-26382.conf
分别修改 3 个文件
sentinel-26380.conf
、sentinel-26381.conf
、sentinel-26382.conf
(注意:三个文件都需要修改)。# 绑定IP bind 0.0.0.0 # 后台运行 daemonize yes # 默认yes,没指定密码或者指定IP的情况下,外网无法访问 protected-mode no # 哨兵的端口,客户端通过这个端口来发现redis port 26380 # 这个文件会自动生成(如果同一台服务器上启动,注意要修改为不同的端口) pidfile /var/run/redis-sentinel-26380.pid # sentinel监控的master的名字叫做mymaster,初始地址为 127.0.0.1 6380,2代表两个及以上哨兵认定为死亡,才认为是真的死亡 sentinel monitor mymaster 127.0.0.1 6380 2
启动哨兵集群。
/usr/local/redis/bin/redis-server /usr/local/redis/conf/sentinel-26380.conf --sentinel /usr/local/redis/bin/redis-server /usr/local/redis/conf/sentinel-26381.conf --sentinel /usr/local/redis/bin/redis-server /usr/local/redis/conf/sentinel-26382.conf --sentinel
检测。
- 停掉 master 进程,可以看到,会从其他两台 slave 中选择一台,变成 master。
3. Redis 集群搭建
目前为了方便演示,在一台机器上以不同的端口启动 6 个服务。进行之前,先进行单节点上的前 8 个步骤。
1. 集群搭建
准备 6 份配置文件。
cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6381.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6382.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6383.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6384.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6385.conf cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6386.conf
分别修改
redis-6381.conf
、redis-6382.conf
、redis-6383.conf
、redis-6384.conf
、redis-6385.conf
、redis-6386.conf
文件中的以下内容。# 端口号(如果同一台服务器上启动,注意要修改为不同的端口) port 6381 # 开启集群 cluster-enabled yes # 会自动生成在上面配置的dir目录下(如果同一台服务器上启动,注意要修改为不同的端口) cluster-config-file nodes-6381.conf cluster-node-timeout 5000 # 这个文件会自动生成(如果同一台服务器上启动,注意要修改为不同的端口) pidfile /var/run/redis_6381.pid
启动 6 个 redis 实例。
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6381.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6382.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6383.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6384.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6385.conf /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6386.conf
创建 cluster。
/usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
集群检验和测试。
# 检查集群,查看所有节点信息 /usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 6381 cluster nodes # 执行后的信息(节点id ip+端口 角色 masterid 处理的ping数量 最后一个pong时间 节点配置版本 节点连接状态 slot槽分配情况) 386bfa4ad82ecf67800fb957899e6c0621cb73a6 127.0.0.1:6386@16386 slave 5352c77a1245f67f89bfaeb47caa04eb534e6724 0 1597911585458 1 connected 21a8ab725f458901e2d23781a9757b8ada023af1 127.0.0.1:6385@16385 slave 103e8326a6d583064a4d4448d285343536490659 0 1597911586000 3 connected 5352c77a1245f67f89bfaeb47caa04eb534e6724 127.0.0.1:6381@16381 myself,master - 0 1597911583000 1 connected 0-5460 103e8326a6d583064a4d4448d285343536490659 127.0.0.1:6383@16383 master - 0 1597911585052 3 connected 10923-16383 2d40bdd3bc9b01d67362110217123debb6f780cf 127.0.0.1:6384@16384 slave 2cd4da5b1a6d361216f620a21ec4e50da21a2e8a 0 1597911586582 2 connected 2cd4da5b1a6d361216f620a21ec4e50da21a2e8a 127.0.0.1:6382@16382 master - 0 1597911586479 2 connected 5461-10922 # 测试 Redis Cluster 的一种简单方法是使用 redis-cli 命令行实用程序。 # -c 是支持cluster重定向。 /usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 6381 # 然后执行一些命令,例如: > set a 1 # 查看一个 key a 属于哪一个槽位 > cluster keyslot a
2. 集群 slot 数量整理 reshard。
/usr/local/redis/bin/redis-cli --cluster help
可以查看所有这个命令和子命令的帮助信息。默认是 master 平均分了 0-16383 的所有虚拟 slot。可以进行调整,部分节点放多一点 slot (槽或者位置)。
/usr/local/redis/bin/redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
重新检查集群。
/usr/local/redis/bin/redis-cli --cluster check 127.0.0.1:6381
3. 测试自动故障转移。
- cluster 集群不保证数据一致,数据也可能丢失。
- 首先是运行客户端不断的写入或读取数据,以便能够发现问题。
- 然后是模拟节点故障:找一个主节点关闭,主从故障切换的过程中,这个时间段的操作,客户端而言,只能是失败。
- 官方描述 https://redis.io/topics/clust...,There is always a window of time when it is possible to lose writes during partitions.(分区的时间窗口内总是有可能丢失写操作) 。
4. 手动故障转移。
- 可能某个节点需要维护(机器下线、硬件升级、系统版本调整等等场景),需要手动的实现转移。
在 slave 节点上执行命令。
CLUSTER FAILOVER
- 注:CLUSTER help 可以看到帮助文档和简介。 相对安全的做法。
5. 扩容。
# 1、 启动新节点
/usr/local/redis/bin/redis-server /usr/local/redis/conf/6387.conf
# 2、 加入到已经存在的集群作为master
/usr/local/redis/bin/redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382
# 本质就是发送一个新节点通过 CLUSTER MEET 命令加入集群
# 新节点没有分配 hash 槽
# 3、 加入到已经存在的集群作为 slave
/usr/local/redis/bin/redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382 --cluster-slave
# 可以手工指定 master,否则就是选择一个 slave 数量较少的master
/usr/local/redis/bin/redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382 --cluster-slave --cluster-master-id <node-id>
# 还可以将空 master,转换为 slave(终端操作)。
cluster replicate <master-node-id>
# 4、 检查集群
/usr/local/redis/bin/redis-cli --cluster check 127.0.0.1:6382
6. 缩容(删除节点)。
# 注意:删除 master 的时候要把数据清空或者分配给其他主节点
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:6381 <node-id>
欢迎关注订阅号:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。