Redis集群

#老版用法
help slaveof

#新版用法
help replicaof

replicaof 127.0.0.1 6379

redis集群搭建流程

aqua mea cierra
两个
两个 两个
哨兵

redis单节点容量问题解决方案

代理模型

1.哈希取模(弊端:模数固定,也就是说节点的拓展比较麻烦,新增一台机器必须重新取模)

2.随机(弊端:取回数据的时候比较麻烦,需要遍历)

3.一致性哈希算法(优点:的确可以分担其他节点的压力,也不会造成全局洗牌.弊端:新增节点会造成一小部分数据无法命中)

没有取模,client的key和node都需要进行计算,规划成一个哈希环

导致的问题:

1.可能造成击穿

2.增加复杂度,每次取离数据最近的2个物理节点

哈希环上的节点数尽可能多,可以解决数据倾斜的问题,也就是虚拟节点技术.

代理方案

3种代理方式

twemproxy

predixy

cluster

预分区概念+槽位

数据分治,聚合操作很难实现,事物,由此产生hash tag,也就是相当于redis分区

redis集群有16384个哈希槽位

集群搭建

请同学们学习的时候不要无脑ctrl+c,一定要尝试理解每步的具体含义,如果按照本教程ctrl+c的话,未必能跑的通,因为有一些选项是需要根据你的实际情况更改的,我仅仅是贴出适合我环境的指令,并不提供语法模板.

twemproxy

准备三台机器,我的分别是aqua,mea,cierra,请不要在意名字

yum install automake libtool
autoreconf -fvi

发现报错

原因:autoreconf版本低了,不受支持,去阿里镜像找更高版本的autoreconf,本人linux版本centos6.6

cd /etc/yum.repos.d/

外网环境使用这种指令

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

外网情况请执行如下指令

yum search autoconf
yum install autoconf268

我是内网服务器,只能手工操作,不过这都是小事,内网环境可以这样做,去朋友那里找一台外网机器

yum install yum-plugin-downloadonly
yum install --downloadonly --downloaddir=. autoconf268
ll

可以看到rpm包已经下载好了,我们便可以把这个包拷到内网环境上

rpm -ivh autoconf-2.63-5.1.el6.noarch.rpm
rpm -ivh autoconf268-2.68-2.el6.noarch.rpm

可以看到已经有autoconf268的命令了,代表成功!撒花庆祝

autoconf268

在twemproxy目录下执行

autoconf268 -fvi
./configure
make
cd scripts
cp nutcracker.init /etc/init.d/twemproxy
cd twemproxy/conf

把配置文件全都拷过去

cp * /etc/nutcracker/

这样做可以在任何路径下都能直接使用命令

cp nutcracker /usr/bin/

进入redis目录

make

redis的清除cache命令

make distclean

开始安装redis

make install PREFIX=/opt/yupsoftware/redis-5.0.5/
cd /opt/yupsoftware/redis-5.0.5/utils
./install_server.sh

输入你自己配置的参数,然后检查一下服务是否正常

service redis_6379 status

搞定之后去搞其他的机器,等到三台机器全部搞好之后回主机,看看代理是否正常

service twemproxy start
service twemproxy status

日,查找资料得修改redis的配置文件,这里应该能有找到报错的地方,不过现在我不知道,有时间应该查一下资料

#bind 127.0.0.1
protected-mode no

redis-cli -h mea
redis-cli -h cierra

继续

redis-cli -p 22121

卧槽?什么情况?
查询资料得知,正常情况,不要担心,继续
不支持keys *,事物,watch,flushall等等,详情请参照twemproxy官方文档

# 不支持
keys *

其实这里已经大功告成,可以新开client去连redis-server,直接就能找到key了

不过个人搭建期间还是遇到了不少问题,同学们一定要多多注意,我贴一下我遇到的一个小问题

解决方法也很简单,改配置文件就行了,注意缩进

predixy

首先去predixy下载,然后解压,进入配置文件目录,打开predixy.conf文件,进行如下修改

Bind 127.0.0.1:7617
Include sentinel.conf
# Include try.conf

保存,退出,打开sentinel.conf,参照example里面进行你自己的修改,使用vim的命令行工具

#光标放置SentinelServerPool这一行
.,$y
#粘贴命令,p
p
.,$s/#//

普及一个小小的vim快捷键指令

gg 跳转到文档开头
G 跳转到文档末尾

继续修改配置文件

#Sentinels里面改成你的哨兵的端口号,group改成你的哨兵名
Sentinels {
        + aqua:26379
        + mea:26379
        + cierra:26379
}
Group nakiri {
}
Group nemu {
}

新建哨兵的配置文件26379.conf

# 哨兵的启动端口
port 26379
# 哨兵监控的第一个master的端口
sentinel monitor nakiri aqua 36379 2
# 哨兵监控的第二个master的端口
sentinel monitor nemu aqua 46379 2

启动哨兵

redis-server 26379.conf --sentinel --bind aqua --protected-mode no
redis-server 26379.conf --sentinel --bind mea --protected-mode no
redis-server 26379.conf --sentinel --bind cierra --protected-mode no

启动主(aqua)

# redis-server --port 36379
# redis-server --port 46379
redis-server --port 36379 --bind aqua --protected-mode no
redis-server --port 46379 --bind aqua --protected-mode no

启动从(mea,cierra)

redis-server --port 36380 --replicaof aqua 36379 --bind mea --protected-mode no
redis-server --port 36380 --replicaof aqua 36379 --bind cierra --protected-mode no
redis-server --port 46380 --replicaof aqua 46379 --bind mea --protected-mode no
redis-server --port 46380 --replicaof aqua 46379 --bind cierra --protected-mode no

启动predixy

./predixy ../conf/predixy.conf

启动client

redis-cli -p 7617
set hololive minatoaqua
get hololive

可以看到结果,代表成功,然后新开cli去找一下数据在哪看看,可以看到数据已经打散分布到各个机器上

继续测试控制存储,插入数据

set {aqua}aqua mea
set {aqua}mea aqua

可以看到,可以由你自己控制存在哪里

watch {aqua}aqua

不支持,因为有两套主从,想要事物,只能存在一个group

所以修改配置文件,删除一个group

set aqua mea
set mea aqua
keys *
watch aqua
multi
get aqua
set aqua
exec

可以发现已经支持事物了

继续测试,可以发现组二的已经全部查不到了,但是组一的还在,可以正常查

info看一下信息

# Proxy
Version:1.0.5
Name:PredixyExample
Bind:127.0.0.1:7617
RedisMode:proxy
SingleThread:false
WorkerThreads:1
Uptime:1568684273
UptimeSince:2019-09-17 09:37:53

# SystemResource
UsedMemory:66776
MaxMemory:0
MaxRSS:4296704
UsedCpuSys:0.510
UsedCpuUser:0.025

# Stats
Accept:2
ClientConnections:1
TotalRequests:2096
TotalResponses:2097
TotalRecvClientBytes:718
TotalSendServerBytes:101957
TotalRecvServerBytes:1146244
TotalSendClientBytes:307

# Servers
Server:192.168.3.72:36380
Role:master
Group:nakiri
DC:
CurrentIsFail:0
Connections:2
Connect:2
Requests:21
Responses:21
SendBytes:590
RecvBytes:140

Server:192.168.3.70:36379
Role:slave
Group:nakiri
DC:
CurrentIsFail:0
Connections:0
Connect:0
Requests:0
Responses:0
SendBytes:0
RecvBytes:0


# LatencyMonitor
LatencyMonitorName:all
<=          100                   59                6 24.00%
<=          400                 1407                4 40.00%
<=          500                 2652                6 64.00%
<=          700                 1953                3 76.00%
<=          800                  782                1 80.00%
<=          900                 1635                2 88.00%
<=         1000                 1896                2 96.00%
<=         1200                 1060                1 100.00%
T           457                11444               25

LatencyMonitorName:get
<=          400                 1407                4 26.67%
<=          500                 2236                5 60.00%
<=          700                 1953                3 80.00%
<=          900                  815                1 86.67%
<=         1000                  946                1 93.33%
>          1000                 1060                1 100.00%
T           561                 8417               15

LatencyMonitorName:set
<=          800                  782                1 50.00%
<=          900                  820                1 100.00%
T           801                 1602                2

LatencyMonitorName:blist

可以看到现在server是cierra的36380

ctrl+c取消cierra的主服务

过一会,哨兵自动更换主

这时再回去info看一下

# Proxy
Version:1.0.5
Name:PredixyExample
Bind:127.0.0.1:7617
RedisMode:proxy
SingleThread:false
WorkerThreads:1
Uptime:1568684273
UptimeSince:2019-09-17 09:37:53

# SystemResource
UsedMemory:70872
MaxMemory:0
MaxRSS:4354048
UsedCpuSys:1.189
UsedCpuUser:0.058

# Stats
Accept:2
ClientConnections:1
TotalRequests:5649
TotalResponses:5657
TotalRecvClientBytes:1172
TotalSendServerBytes:275554
TotalRecvServerBytes:3118933
TotalSendClientBytes:13785

# Servers
Server:192.168.3.72:36380
Role:slave
Group:nakiri
DC:
CurrentIsFail:0
Connections:2
Connect:2
Requests:31
Responses:31
SendBytes:874
RecvBytes:202

Server:192.168.3.70:36379
Role:master
Group:nakiri
DC:
CurrentIsFail:0
Connections:0
Connect:0
Requests:0
Responses:0
SendBytes:0
RecvBytes:0


# LatencyMonitor
LatencyMonitorName:all
<=          100                  459               15 33.33%
<=          300                  854                3 40.00%
<=          400                 3658               11 64.44%
<=          500                 2652                6 77.78%
<=          600                  513                1 80.00%
<=          700                 1953                3 86.67%
<=          800                  782                1 88.89%
<=          900                 1635                2 93.33%
<=         1000                 1896                2 97.78%
<=         1200                 1060                1 100.00%
T           343                15462               45

LatencyMonitorName:get
<=          300                  854                3 12.00%
<=          400                 3312               10 52.00%
<=          500                 2236                5 72.00%
<=          600                  513                1 76.00%
<=          700                 1953                3 88.00%
<=          900                  815                1 92.00%
<=         1000                  946                1 96.00%
>          1000                 1060                1 100.00%
T           467                11689               25

LatencyMonitorName:set
<=          800                  782                1 50.00%
<=          900                  820                1 100.00%
T           801                 1602                2

LatencyMonitorName:blist

可以发现,主已经被更换,服务还能正常使用,并且对于7617的用户来说,并没有任何的感知,该怎么用还是怎么用

cluster

(这地方挺简单的,就不贴图了)

不需要代理,redis自行实现,无主模型

cd utils/create-cluster
vim create-cluster

直接启动

./create-cluster start

进行分赃

./create-cluster create

进去看看

# 自动跳转
redis-cli -c -p 30001
set aqua minatoaqua

尝试一下事物

multi
set mea kaguramea
get mea
exec

不可以,更换

watch {aqua}aqua minatoaqua
multi
set {aqua}aqua minatoaqua
get {aqua}aqua
exec

成功

关闭集群

./create-cluster stop
./create-cluster clean

这个脚本实际相当于

redis-cli --cluster help

手动实现

redis-cli --cluster create 127.0.0.1:40001 127.0.0.1:40002 127.0.0.1:40003 127.0.0.1:40004 127.0.0.1:40005 127.0.0.1:40006 --cluster-replicas 1

新开一个客户端

redis-cli -c -p 40001
redis-cli --cluster reshard 127.0.0.1:40001
redis-cli --cluster info 127.0.0.1:40001
redis-cli --cluster check 127.0.0.1:40001