redis伪分布式

单机redis有单点故障、容量有限、压力过大三个问题

X:利用主从复制备份数据,解决单点故障问题

Y:一个服务上安装多个redis实例,解决容量有限问题

Z:当某一个实例压力过大时,再增加实例来分摊该实例压力

alt

准备3个redis服务

1. 主从复制

redis默认使用异步复制,其特点是低延迟高性能

alt

1.1 拷贝redis配置文件

  • 在家目录下创建一个test目录,将redis配置文件拷贝到目录下
mkdir test
cd test/

cp /usr/local/Redis/redis5/conf/* ./

alt

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

alt

alt

alt

alt

1.2.2 其他内容

  • 链接主机配置
#链接配置
replicaof IP 端口号

#如果有密码的话配置主机密码
masterauth <master-password>

alt

  • 链接主机后 接收新数据的时间窗里 是否可以查询老的数据
# yes可以查询老的数据,no存储完才可以查询
replica-serve-stale-data yes

alt

  • 备机是否只支持查询,或者开启写入
#备机是只支持查询
replica-read-only yes

alt

  • 创建链接后,数据是先通过IO落到磁盘 再通过网络传到备机,还是直接通过网络传到备机

alt

#数据先通过IO落到磁盘 再通过网络传到备机
repl-diskless-sync no

alt

  • 设置redis队列的大小

当从机挂掉后会有一个偏移量,恢复后同步主机数据,如果主机变更数据量将偏移量挤出队列,就会进行全量更新,如果偏移量还在队列内则根据偏移量进行增量更新

repl-backlog-size 1mb

alt

1.3 删除持久化文件

  • 这里面是redis三个服务的持久化目录,删掉目录里面的文件,留下空目录
cd /usr/local/Redis/redis5/lib/

rm -rf ./6379/*
rm -rf ./6380/*
rm -rf ./6381/*

alt

1.4 启动服务

1.4.1 启动6379服务

  • 6379服务启动后,在新标签中确认6379持久化目录为空
redis-server ~/test/6379.conf

cd /usr/local/Redis/redis5/lib/6379/

alt

alt

1.4.2 链接6379服务

  • 在新标签中链接6379服务,确实服务什么都没有
redis-cli -p 6379

keys *

alt

1.4.3 启动其他服务

  • 在新标签中启动6380、3681,并在新标签中链接服务,并确认对应持久化目录为空
redis-server ~/test/6380.conf
redis-server ~/test/6381.conf

redis-cli -p 6380
redis-cli -p 6381

keys *

alt

alt

alt

alt

alt

1.5 链接服务

  • 以6379为主,3680、3681为从进行数据复制

SLAVEOF 使服务器成为另一个实例的副本,或将其升级为主实例。不推荐从Redis 5开始。请改用REPLICAOF

alt

1.5.1 6381链接6379

REPLICAOF 127.0.0.1 6379

alt

alt

alt

1.5.2 链接测试

  • 主服务添加数据,从服务自动同步数据,从服务禁止写入
#6379服务
set k1 aaa

#6381服务
keys *
get k1
set k2 bbb

alt

alt

  • 6380还没追随6379,添加一个数据测试从服务历史数据会被删除
set k2 bbb
keys *
get k2
REPLICAOF 127.0.0.1 6379
keys *
get k1

alt

1.6 从服务挂掉

1.6.1 6380挂掉

  • 从服务

alt

  • 主服务

alt

1.6.2 6379继续添加数据

set k2 sdfa
set k3 dfa
set k4 sdfsg
set k5 gadad

alt

1.6.3 启动6380

1.6.3.1 追加同步启动

  • 6380快速修好后启动
#如果这个服务追随过6379,下面的启动方式不会进行删库步骤,且可以看到新数据
redis-server ~/test/6380.conf --REPLICAOF 127.0.0.1 6379

keys *

alt

alt

1.6.3.2 全量同步启动

# 添加 --appendonly yes 参数会走删库步骤
redis-server ~/test/6380.conf --REPLICAOF 127.0.0.1 6379 --appendonly yes

alt

1.7 主服务挂掉

  • 主服务

alt

  • 从服务

alt

1.7.1 人工切换主服务

1.7.1.1 6381不再追随

REPLICAOF no one

alt

alt

1.7.1.2 6380追随6381

REPLICAOF 127.0.0.1 6381

alt

  • 6380

alt

  • 6381

alt

  • 测试,6381写入数据,6380可以查到

1.7.2 自动切换主服务

redis的高可用

alt

1.7.2.1 编辑哨兵配置文件

vim 26379.conf

alt

  • 填入以下内容
port 26379
#哨兵 监控 [名字] [主服务ip] [端口号] [几个服务确认错误切换主节点]
sentinel monitor mymaster 127.0.0.1 6379 2

alt

  • 复制并修改文件对应端口号
cp 26379.conf 26380.conf
cp 26379.conf 26381.conf
vim 26380.conf
vim 26381.conf

alt

alt

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

alt

  • 6380

alt

  • 6381

alt

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

alt

  • 6379

alt

  • 6380

alt

  • 6381

alt

redis服务和哨兵全部启动后会在每个哨兵下面发现两个从服务和其它两个哨兵;

哨兵知道有哪些从服务 是因为主服务中会记录每个连接它的从服务;

哨兵可以检测到其他的哨兵 是因为所有哨兵都在主服务的一个发布订阅中说"hello"。

PSUBSCRIBE *

alt

1.7.2.4 主服务挂掉

ctrl+c挂掉6379,稍等一会后,会在其中一个哨兵日志中看到以下内容

  • 6379

alt

alt

  • 6380

alt

alt

  • 6381

alt

alt

1.7.2.5 验证

  • 在6380中写入数据,6381可以同步成功

alt

alt

  • 哨兵在完成主机切换后会自动修改哨兵配置文件

alt

alt

2. 单节点容量问题

2.1 客户端拆分数据

客户端拆分数据,存放到不同reids服务上

alt

2.2 服务端拆分数据

redis组建一套无主模型的多节点的cluster,且每个主机,每个实例要认领一些槽位。

客户端随便连一台redis服务,由redis服务确定数据存放在那台服务上,客户端再去对应服务上存取数据

alt

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

alt

alt

2.2.3 启动脚本

2.2.3.1 启动6个redis实例

./create-cluster start

alt

2.2.3.1 创建集群并分配槽位

./create-cluster create

alt

2.2.4 验证

2.2.4.1 链接30001

redis-cli -p 30001

set k1 adsfasd
  • 根据算法返回,该key应该保存在30003服务上

alt

redis-cli -c -p 30001

set k1 dsfag

get k1
  • 直接跳转30003服务,然后创建key

alt

alt

2.2.4.1 事务

事务会因为服务跳转,导致开启和执行命令不在同一台服务上执行而报错

alt

此时需要在key前面加一个限制,让命令在同一台服务器上执行,防止事务因为key不在同一台服务上,执行过程中切换服务报错

alt

2.2.5 停止和清除数据

./create-cluster stop

./create-cluster clean

alt

2.2.6 手动创建集群并分配槽位

redis-cli --cluster help

alt

./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


-

alt

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.

alt

  • 是否继续执行建议的重新分配计划(是/否)

alt

  • 查看信息
redis-cli --cluster info 127.0.0.1:30001

alt

redis-cli --cluster check 127.0.0.1:30001

alt

2.3 代理层拆分数据

客户端链接代理层,再由代理层链接服务端,减少服务端链接压力,数据由代理层计算存放到哪台服务器上

alt

2.3.1 推特代理

2.3.1.1 下载原码并构建twemproxy

githup下载twitter

根据readme提示构建twemproxy

alt

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

alt

  • autoreconf -fvi 命令执行成功后会多出 configure文件

alt

  • ./configure

alt

  • make

alt

  • 出现可执行程序,成功

alt

2.3.1.2 让twitter变成服务

#复制服务脚本
cp nutcracker.init /etc/init.d/twemproxy

cd /etc/init.d/

chmod +x twemproxy

vim twemproxy

alt

alt

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 命令了

alt

2.3.1.3 修改配置文件

cd /etc/nutcracker/

cp nutcracker.yml nutcracker.yml.bak

vim nutcracker.yml

alt

  • 本次只需要监听一个端口,配置几个redis实例就可以了,光标后面的配置文件不需要,先按 d 再按 shift+g 就可以删除光标后面的内容了。

alt

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

alt

  • 6380

alt

2.3.1.4 启动twitter

service twemproxy start

alt

2.3.1.5 链接twitter

redis-cli -p 22121
  • twitter

alt

alt

  • 6379

alt

alt

  • 6380

alt

2.3.1.6 缺点

#数据分治,代理层掉keys成本有点高,所以不支持
keys *

#不支持watch,不知道key在哪
watch k1

#不支持开启事务,key保存在哪台服务器上不确定
MULTI 

alt

2.3.1.7 老版本Linux可能出现的错误

2.3.1.7.1 如果克隆报错升级一下nss

yum update nss -> y 同意

alt

alt

2.3.1.7.2 安装automake和libtool
yum install automake libtool -y

alt

2.3.1.7.3 autoreconf 版本低

alt

# 查询一下autoreconf版本
# autoreconf归属autoconf
yum search autoconf

alt

alt

  • 按照提示,选择一个版本配置即可

alt

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

alt

alt

alt

  • 重新查看即可发现新版本 yum search autoconf

alt

  • 安装新版本

yum install autoconf268 -> y

alt

  • 用新版本命令执行 autoreconf268 -fvi

alt

2.3.1.7.4 启动twitter报错

alt

polkit启动报错

#根据提示查看 polkit 状态
systemctl status polkit

#启动 polkit
systemctl start polkit

#检查是否安装了 polkit
yum list installed | grep polkit

#安装 polkit
yum install polkit

alt

2.3.2 predixy代理

alt predixy

  1. 按照readme编译

alt

  1. 直接下载编译好的

alt

alt

mkdir predixy

cd predixy/

wget https://github.com/joyieldInc/predixy/releases/download/7.0.1/predixyFreeEdition-7.0.1-amd64-linux.tar.gz

alt

2.3.2.1 解压压缩包

tar xf predixyFreeEdition-7.0.1-amd64-linux.tar.gz

alt

2.3.2.2 predixy配置

predixy配置详细文档

cd conf/

vim predixy.conf


alt

  • 开启7167端口

alt

  • 导入哨兵配置文件

alt

  • 编辑哨兵配置文件
vim standalone.conf
  • 复制一个备份修改

光标位置按 ahift+: 进入末行模式,输入 .,$y -> 回车

. 当前位置

$ 最后一行

y 复制

alt

alt

ahift+g 到最后,p 粘贴

alt

  • 删除 #

光标位置按 ahift+: 进入末行模式,输入 .,$s/#//# 替换成空 -> 回车

s 查找并替换

alt

alt

alt

dG 删除光标所在行一直到文件末尾的所有内容

alt

alt

3dd 删除当前行(包括此行)后 n 行文本

alt

#配置哨兵监听
+ 127.0.0.1:26379
+ 127.0.0.1:26380
+ 127.0.0.1:26381

alt

2.3.2.3 编辑哨兵配置文件

  • 26379
vim 26379.conf

alt

port 26379
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2

alt

  • 26380
vim 26380.conf
port 26380
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2

alt

  • 26381
vim 26381.conf
port 26381
sentinel monitor ooxx 127.0.0.1 36379 2
sentinel monitor xxoo 127.0.0.1 46379 2

alt

2.3.2.4 启动哨兵

redis-server 26379.conf --sentinel

redis-server 26380.conf --sentinel

redis-server 26381.conf --sentinel
  • 26379

alt

  • 26380

alt

  • 26381

alt

2.3.2.5 启动两套redis主从复制集群

mkdir 36379
mkdir 36380
mkdir 46379
mkdir 46380

alt

  • 36379
cd 36379/

redis-server --port 36379

alt

  • 36380
cd ~/test/36380/

redis-server --port 36380 --replicaof 127.0.0.1 36379

alt

  • 46379
cd ~/test/46379/

redis-server --port 46379

alt

  • 46380
cd ~/test/46380/

redis-server --port 46380 --replicaof 127.0.0.1 46379

alt

到这里启动了3个哨兵,两对主从,一共7个服务。

alt

2.3.2.6 启动predixy服务

cd /usr/local/Redis/predixy/predixyFreeEdition-7.0.1/bin/

./predixy ../conf/predixy.conf

alt

2.3.2.7 连接predixy服务

当一主服务挂掉后,等待哨兵把从服务替换为主后,并不影响predixy服务的使用

redis-cli -p 7617

alt

  • 36379

alt

  • 46379

alt

2.3.2.8 代理支持特殊命令

7.0以前版本只支持代理一组主从复制时开启事务,7.0以后支持代理多组主从复制时开启事务

2.3.2.8.1 支持事务
  • 客户端1,先监控k1,开启事务,输入命令,客户端1后执行事务

alt

  • 客户端2,后开启事务,输入命令,客户端2先执行事务

alt

2.3.2.8.2 支持keys

alt

Redis 文章被收录于专栏

Redis

全部评论

相关推荐

2 1 评论
分享
牛客网
牛客企业服务