redis伪分布式
单机redis有单点故障、容量有限、压力过大三个问题
X:利用主从复制备份数据,解决单点故障问题
Y:一个服务上安装多个redis实例,解决容量有限问题
Z:当某一个实例压力过大时,再增加实例来分摊该实例压力
1. 主从复制
redis默认使用异步复制,其特点是低延迟高性能
1.1 拷贝redis配置文件
- 在家目录下创建一个test目录,将redis配置文件拷贝到目录下
mkdir test
cd test/
cp /usr/local/Redis/redis5/conf/* ./
1.2 修改配置文件
1.2.1 修改内容
- 这三个服务未来会前台阻塞运行,没有AOF
vim 3679.conf
vim 3680.conf
vim 3681.conf
- 修改内容
#取消redis后台运行(测试用)
daemonize no
#注释掉日志文件
#不让它往后台写日志,把日志打印到屏幕当中,前台阻塞运行,可以看到实时的数据输出
#logfile /usr/local/Redis/redis5/log/redis_6379.log
#单机持久化 关掉AOF模式,默认只有RDB
appendonly no
1.2.2 其他内容
- 链接主机配置
#链接配置
replicaof IP 端口号
#如果有密码的话配置主机密码
masterauth <master-password>
- 链接主机后 接收新数据的时间窗里 是否可以查询老的数据
# yes可以查询老的数据,no存储完才可以查询
replica-serve-stale-data yes
- 备机是否只支持查询,或者开启写入
#备机是只支持查询
replica-read-only yes
- 创建链接后,数据是先通过IO落到磁盘 再通过网络传到备机,还是直接通过网络传到备机
#数据先通过IO落到磁盘 再通过网络传到备机
repl-diskless-sync no
- 设置redis队列的大小
当从机挂掉后会有一个偏移量,恢复后同步主机数据,如果主机变更数据量将偏移量挤出队列,就会进行全量更新,如果偏移量还在队列内则根据偏移量进行增量更新
repl-backlog-size 1mb
1.3 删除持久化文件
- 这里面是redis三个服务的持久化目录,删掉目录里面的文件,留下空目录
cd /usr/local/Redis/redis5/lib/
rm -rf ./6379/*
rm -rf ./6380/*
rm -rf ./6381/*
1.4 启动服务
1.4.1 启动6379服务
- 6379服务启动后,在新标签中确认6379持久化目录为空
redis-server ~/test/6379.conf
cd /usr/local/Redis/redis5/lib/6379/
1.4.2 链接6379服务
- 在新标签中链接6379服务,确实服务什么都没有
redis-cli -p 6379
keys *
1.4.3 启动其他服务
- 在新标签中启动6380、3681,并在新标签中链接服务,并确认对应持久化目录为空
redis-server ~/test/6380.conf
redis-server ~/test/6381.conf
redis-cli -p 6380
redis-cli -p 6381
keys *
1.5 链接服务
- 以6379为主,3680、3681为从进行数据复制
SLAVEOF
使服务器成为另一个实例的副本,或将其升级为主实例。不推荐从Redis 5开始。请改用REPLICAOF
1.5.1 6381链接6379
REPLICAOF 127.0.0.1 6379
1.5.2 链接测试
- 主服务添加数据,从服务自动同步数据,从服务禁止写入
#6379服务
set k1 aaa
#6381服务
keys *
get k1
set k2 bbb
- 6380还没追随6379,添加一个数据测试从服务历史数据会被删除
set k2 bbb
keys *
get k2
REPLICAOF 127.0.0.1 6379
keys *
get k1
1.6 从服务挂掉
1.6.1 6380挂掉
- 从服务
- 主服务
1.6.2 6379继续添加数据
set k2 sdfa
set k3 dfa
set k4 sdfsg
set k5 gadad
1.6.3 启动6380
1.6.3.1 追加同步启动
- 6380快速修好后启动
#如果这个服务追随过6379,下面的启动方式不会进行删库步骤,且可以看到新数据
redis-server ~/test/6380.conf --REPLICAOF 127.0.0.1 6379
keys *
1.6.3.2 全量同步启动
# 添加 --appendonly yes 参数会走删库步骤
redis-server ~/test/6380.conf --REPLICAOF 127.0.0.1 6379 --appendonly yes
1.7 主服务挂掉
- 主服务
- 从服务
1.7.1 人工切换主服务
1.7.1.1 6381不再追随
REPLICAOF no one
1.7.1.2 6380追随6381
REPLICAOF 127.0.0.1 6381
- 6380
- 6381
- 测试,6381写入数据,6380可以查到
1.7.2 自动切换主服务
1.7.2.1 编辑哨兵配置文件
vim 26379.conf
- 填入以下内容
port 26379
#哨兵 监控 [名字] [主服务ip] [端口号] [几个服务确认错误切换主节点]
sentinel monitor mymaster 127.0.0.1 6379 2
- 复制并修改文件对应端口号
cp 26379.conf 26380.conf
cp 26379.conf 26381.conf
vim 26380.conf
vim 26381.conf
1.7.2.2 重新启动所有redis服务
redis-server ~/test/6379.conf
redis-server ~/test/6380.conf --REPLICAOF 127.0.0.1 6379
redis-server ~/test/6381.conf --REPLICAOF 127.0.0.1 6379
- 6379
- 6380
- 6381
1.7.2.3 启动哨兵服务
redis-server ./26379.conf --sentinel
redis-server ./26380.conf --sentinel
redis-server ./26381.conf --sentinel
#第二种启动方式
redis-sentinel
#命令存放目录/usr/local/Redis/redis-5.0.14/src
#redis自带配置文件存放在redis源码目录/usr/local/Redis/redis-5.0.14
- 6379
- 6380
- 6381
redis服务和哨兵全部启动后会在每个哨兵下面发现两个从服务和其它两个哨兵;
哨兵知道有哪些从服务 是因为主服务中会记录每个连接它的从服务;
哨兵可以检测到其他的哨兵 是因为所有哨兵都在主服务的一个发布订阅中说"hello"。
PSUBSCRIBE *
1.7.2.4 主服务挂掉
ctrl+c
挂掉6379,稍等一会后,会在其中一个哨兵日志中看到以下内容
- 6379
- 6380
- 6381
1.7.2.5 验证
- 在6380中写入数据,6381可以同步成功
- 哨兵在完成主机切换后会自动修改哨兵配置文件
2. 单节点容量问题
2.1 客户端拆分数据
客户端拆分数据,存放到不同reids服务上
2.2 服务端拆分数据
redis组建一套无主模型的多节点的cluster,且每个主机,每个实例要认领一些槽位。
客户端随便连一台redis服务,由redis服务确定数据存放在那台服务上,客户端再去对应服务上存取数据
2.2.1 读README
To create a cluster, follow these steps:
要创建集群,请执行以下步骤:
1. Edit create-cluster and change the start / end port, depending on the number of instances you want to create.
根据要创建的实例数量,编辑创建集群并更改开始/结束端口。
2. Use "./create-cluster start" in order to run the instances.
使用“./create-cluster start”来运行实例。
3. Use "./create-cluster create" in order to execute redis-cli --cluster create, so that an actual Redis cluster will be created.
使用“./create-cluster create”执行redis-cli --cluster create,这样将创建一个实际的redis集群。
4. Now you are ready to play with the cluster. AOF files and logs for each instances are created in the current directory.
现在,您已经准备好玩集群了。每个实例的AOF文件和日志都在当前目录中创建。
In order to stop a cluster:
要停止群集:
1. Use "./create-cluster stop" to stop all the instances. After you stopped the instances you can use "./create-cluster start" to restart them if you change your mind.
使用“./create-cluster stop”停止所有实例。停止实例后,如果您改变主意,可以使用“./create-cluster start”重新启动它们。
2. Use "./create-cluster clean" to remove all the AOF / log files to restart with a clean environment.
使用“./create-cluster clean”删除所有AOF/log文件,以便在干净的环境中重新启动。
Use the command "./create-cluster help" to get the full list of features.
使用命令“./create-cluster help”获取完整的功能列表。
2.2.2 编辑启动脚本
vim create-cluster
2.2.3 启动脚本
2.2.3.1 启动6个redis实例
./create-cluster start
2.2.3.1 创建集群并分配槽位
./create-cluster create
2.2.4 验证
2.2.4.1 链接30001
redis-cli -p 30001
set k1 adsfasd
- 根据算法返回,该key应该保存在30003服务上
redis-cli -c -p 30001
set k1 dsfag
get k1
- 直接跳转30003服务,然后创建key
2.2.4.1 事务
事务会因为服务跳转,导致开启和执行命令不在同一台服务上执行而报错
此时需要在key前面加一个限制,让命令在同一台服务器上执行,防止事务因为key不在同一台服务上,执行过程中切换服务报错
2.2.5 停止和清除数据
./create-cluster stop
./create-cluster clean
2.2.6 手动创建集群并分配槽位
redis-cli --cluster help
./create-cluster start
redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1
-
2.2.7 重新分配槽位
如果发生数据倾斜,某个服务数据量偏大,则需要将该服务的槽位移动一些到数据量较少的服务
移动槽位,槽位里的数据就会跟着移动
redis-cli --cluster reshard 127.0.0.1:30001
#你想移动多少个槽位(1 到 16384)
How many slots do you want to move (from 1 to 16384)? 2000
#接收节点ID是什么
#如果你新增一个服务器,就可以选该节点,本次选30002的节点id
What is the receiving node ID? ffbf02af1a8c3c311c81a9625fc930619e0a422a
# 请输入所有源节点ID
#将那个节点的
Please enter all the source node IDs.
#输入“all” 所有节点都将分配槽位过去
Type 'all' to use all the nodes as source nodes for the hash slots.
#输入完所有源节点ID后,输入“done”结束。
Type 'done' once you entered all the source nodes IDs.
- 是否继续执行建议的重新分配计划(是/否)
- 查看信息
redis-cli --cluster info 127.0.0.1:30001
redis-cli --cluster check 127.0.0.1:30001
2.3 代理层拆分数据
客户端链接代理层,再由代理层链接服务端,减少服务端链接压力,数据由代理层计算存放到哪台服务器上
2.3.1 推特代理
2.3.1.1 下载原码并构建twemproxy
githup下载twitter
根据readme提示构建twemproxy
cd /usr/local/Redis/
git clone https://github.com/twitter/twemproxy.git
cd twemproxy
# 如果命令不能执行需要安装 automake 和 libtool 参考2.3.1.7.2
autoreconf -fvi
./configure
make
src/nutcracker -h
autoreconf -fvi
命令执行成功后会多出configure
文件
./configure
make
- 出现可执行程序,成功
2.3.1.2 让twitter变成服务
#复制服务脚本
cp nutcracker.init /etc/init.d/twemproxy
cd /etc/init.d/
chmod +x twemproxy
vim twemproxy
mkdir /etc/nutcracker
cd /usr/local/Redis/twemproxy/conf
cp ./* /etc/nutcracker/
cd /etc/nutcracker/
cd /usr/local/Redis/twemproxy/src/
cp nutcracker /usr/bin/
- 配置好了就可以在操作系统的任何位置使用
nutcracker
命令了
2.3.1.3 修改配置文件
cd /etc/nutcracker/
cp nutcracker.yml nutcracker.yml.bak
vim nutcracker.yml
- 本次只需要监听一个端口,配置几个redis实例就可以了,光标后面的配置文件不需要,先按
d
再按shift+g
就可以删除光标后面的内容了。
2.3.1.3 启动两台redis服务
mkdir data
cd data/
mkdir 6379
mkdir 6380
#redis手工启动,启动目录就是它的持久化目录
cd 6379/
redis-server --port 6379
cd data/6380/
redis-server --port 6380
- 6379
- 6380
2.3.1.4 启动twitter
service twemproxy start
2.3.1.5 链接twitter
redis-cli -p 22121
- 6379
- 6380
2.3.1.6 缺点
#数据分治,代理层掉keys成本有点高,所以不支持
keys *
#不支持watch,不知道key在哪
watch k1
#不支持开启事务,key保存在哪台服务器上不确定
MULTI
2.3.1.7 老版本Linux可能出现的错误
2.3.1.7.1 如果克隆报错升级一下nss
yum update nss
-> y
同意
2.3.1.7.2 安装automake和libtool
yum install automake libtool -y
2.3.1.7.3 autoreconf
版本低
# 查询一下autoreconf版本
# autoreconf归属autoconf
yum search autoconf
- 如果用yum安装本地仓库版本偏低可以用外置阿里云仓库
- 按照提示,选择一个版本配置即可
cd /etc/yum.repos.d/
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#看一下epel.repo文件内容
vim epel.repo
#清掉缓存
yum clean all
- 重新查看即可发现新版本
yum search autoconf
- 安装新版本
yum install autoconf268
-> y
- 用新版本命令执行
autoreconf268 -fvi
2.3.1.7.4 启动twitter报错
#根据提示查看 polkit 状态
systemctl status polkit
#启动 polkit
systemctl start polkit
#检查是否安装了 polkit
yum list installed | grep polkit
#安装 polkit
yum install polkit
2.3.2 predixy代理
predixy
- 按照readme编译
- 直接下载编译好的
mkdir predixy
cd predixy/
wget https://github.com/joyieldInc/predixy/releases/download/7.0.1/predixyFreeEdition-7.0.1-amd64-linux.tar.gz
2.3.2.1 解压压缩包
tar xf predixyFreeEdition-7.0.1-amd64-linux.tar.gz
2.3.2.2 predixy配置
cd conf/
vim predixy.conf
- 开启7167端口
- 导入哨兵配置文件
- 编辑哨兵配置文件
vim standalone.conf
- 复制一个备份修改
光标位置按 ahift+:
进入末行模式,输入 .,$y
-> 回车
.
当前位置
$
最后一行
y
复制
ahift+g
到最后,p
粘贴
- 删除 #
光标位置按 ahift+:
进入末行模式,输入 .,$s/#//
把 #
替换成空 -> 回车
s
查找并替换
dG
删除光标所在行一直到文件末尾的所有内容
3dd
删除当前行(包括此行)后 n 行文本
#配置哨兵监听
+ 127.0.0.1:26379
+ 127.0.0.1:26380
+ 127.0.0.1:26381
2.3.2.3 编辑哨兵配置文件
- 26379
vim 26379.conf
port 26379
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2
- 26380
vim 26380.conf
port 26380
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2
- 26381
vim 26381.conf
port 26381
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2
2.3.2.4 启动哨兵
redis-server 26379.conf --sentinel
redis-server 26380.conf --sentinel
redis-server 26381.conf --sentinel
- 26379
- 26380
- 26381
2.3.2.5 启动两套redis主从复制集群
mkdir 36379
mkdir 36380
mkdir 46379
mkdir 46380
- 36379
cd 36379/
redis-server --port 36379
- 36380
cd ~/test/36380/
redis-server --port 36380 --replicaof 127.0.0.1 36379
- 46379
cd ~/test/46379/
redis-server --port 46379
- 46380
cd ~/test/46380/
redis-server --port 46380 --replicaof 127.0.0.1 46379
到这里启动了3个哨兵,两对主从,一共7个服务。
2.3.2.6 启动predixy服务
cd /usr/local/Redis/predixy/predixyFreeEdition-7.0.1/bin/
./predixy ../conf/predixy.conf
2.3.2.7 连接predixy服务
当一主服务挂掉后,等待哨兵把从服务替换为主后,并不影响predixy服务的使用
redis-cli -p 7617
- 36379
- 46379
2.3.2.8 代理支持特殊命令
7.0以前版本只支持代理一组主从复制时开启事务,7.0以后支持代理多组主从复制时开启事务
2.3.2.8.1 支持事务
- 客户端1,先监控k1,开启事务,输入命令,客户端1后执行事务
- 客户端2,后开启事务,输入命令,客户端2先执行事务
2.3.2.8.2 支持keys
Redis