架构图
我们采用的是一个predixy代理两套哨兵机制的主从复制, 每套主从复制都是一个主节点2个从节点
搭建
前期准备
要搭建两套哨兵机制,需要3个sentinel实例,2套主从复制(每套一个主节点,一个从节点),参考文章: redis集群搭建之主从复制 ; Redis哨兵-实现Redis高可用
这里是一个sentinel实例分别监听两个master,配置文件如下:
三个sentinel和6个redis实例全部启动; sentinel日志输出:
下载predixy
- 下载源码,predixy源码地址 我们进去后会发现:要求是c++11编译,我的是centOS6,不支持,但是有直接编译好的
我们采用下载官网编译好的predixy的可执行程序
# 下载
wget https://github.com/joyieldInc/predixy/releases/download/1.0.5/predixy-1.0.5-bin-amd64-linux.tar.gz
# 解压
tar -xf predixy-1.0.5-bin-amd64-linux.tar.gz
# 解压后的目录
drwxrwxr-x 2 501 501 4096 Oct 20 2018 bin //可执行程序
drwxrwxr-x 2 501 501 4096 Mar 25 11:27 conf //配置文件
drwxrwxr-x 3 501 501 4096 Oct 20 2018 doc
-rw-rw-r-- 1 501 501 1537 Oct 20 2018 LICENSE
-rw-rw-r-- 1 501 501 5680 Oct 20 2018 README_CN.md
-rw-rw-r-- 1 501 501 4200 Oct 20 2018 README.md
drwxrwxr-x 2 501 501 4096 Oct 20 2018 test
配置
配置文件目录(/usr/local/software/redis/predixy-1.0.5/conf)
-rw-rw-r-- 1 501 501 2395 Oct 20 2018 auth.conf
-rw-rw-r-- 1 501 501 1041 Oct 20 2018 cluster.conf //分片配置文件
-rw-rw-r-- 1 501 501 3426 Oct 20 2018 command.conf
-rw-rw-r-- 1 501 501 781 Oct 20 2018 dc.conf
-rw-rw-r-- 1 501 501 2121 Oct 20 2018 latency.conf
-rw-rw-r-- 1 501 501 2547 Oct 20 2018 predixy.conf //主配置文件(引入其他的配置文件:sentinel.conf等,需要手动开启)
-rw-rw-r-- 1 501 501 1421 Oct 20 2018 sentinel.conf // 哨兵配置文件
-rw-rw-r-- 1 501 501 2016 Oct 20 2018 standalone.conf
-rw-rw-r-- 1 501 501 98 Oct 20 2018 try.conf
配置哨兵
打开sentinel.conf
配置为我们自己的
SentinelServerPool {
Databases 16
Hash crc16
HashTag "{}"
Distribution modula
MasterReadPriority 60
StaticSlaveReadPriority 50
DynamicSlaveReadPriority 50
RefreshInterval 1
ServerTimeout 1
ServerFailureLimit 10
ServerRetryTimeout 1
KeepAlive 120
Sentinels {
+ 127.0.0.1:26379
+ 127.0.0.1:26380
+ 127.0.0.1:26381
}
Group shard001 {mymaster}
Group shard002 {youmaster}
打开predixy.conf 放开端口和引入sentinel.conf的设置
放开端口: 7617
引入服务,只引入sentinel.conf, 把 try.conf注释掉,否则会报predixy running exception:Conf.cpp:180 Can’t define ClusterServerPool/StandaloneServerPool at the same time异常
启动
进入predixy的bin目录执行./predixy ../conf/predixy.conf
调试
启动predixy的客户端
redis-cli -p 7617
在6380和16380的客户端验证数据分区
这时候我们发现数据分开了,K1和K3落在了一个节点,K2落在了另一个节点, 那么如何让指定的数据落在同一个redis实例上?
发现相同标识{}的数据,都会落在同一台机器上,比如{mn} 或者是带{abc}的,总之带相同标识{}的都会落在一台机器,这是predixy专门为客户提供的,可以根据业务需要,人为的让数据都落在一台机器上
predixy只支持单实例事物,不支持多实例事物
我们去掉一个实例,打开sentinel.conf注释掉youmaster,再来观察
我们关掉6380master节点,看看是否会有新的节点上来
6381节点被选为主节点,然而客户端没有丝毫察觉