数据库架构之【Redis-Sentinel】缓存库集群方案

Redis是一个开源的(遵循BSD协议)Key-Value内存数据库系统。它使用ANSI C语言编写,安装部署简单,支持网络远程访问和数据持久化,并提供多种语言的API。

本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。集群使用服务器及网络资源较多,建议在实施前做好规划工作,有利于部署工作顺利、有序进行。

目录

1.前言

2.数据库集群部署拓扑图

3.单点数据库安装、配置和管理

4.主从数据库配置和管理

  4.1.非集群模式下的静态主从数据库

  4.2.集群模式下的动态主从数据库

5.集群数据库配置和管理

6.Java开发集成示例



1.前言

1、Redis的主要特性

1)支持Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型的存储。

2)支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

3)性能极高,数据读取速度是110000次/s,数据写入速度是81000次/s 。

4)操作具有原子性,多个操作也支持事务。

5)自带主备复制和集群功能,支持实时备份、读写分离和故障转移功能。

2、Redis适用的场景

Redis虽然具有持久化能力,但是只能作为数据损失的补救机制,主要还是解决临时性数据高并发读写的问题。使用Redis存储的数据通常具有临时性、低价值、可恢复、可损失的特点。

1)在使用负载均衡的Web架构服务器端程序中广泛用于Session的共享;

2)相对于传统的本地缓存,远程缓存数据库对内存资源的集约化和数据共享更适合微服务框架的应用,对于系统架构更有建树;

3)类如系统配置等具有高并发读,单用户写的功能,可以用JSON文件支持数据持久化,然后通过Redis作为中间库支持高并发读;

4)类如统计维度固化,统计逻辑复杂的数据报表,可以使用Redis中间库缓存降低数据库的性能损耗;

5)类如复杂的在线问卷,通常都会以用户为单元记录答卷进度,实现断线续答的功能。缓存数据具有临时性、数量大、价值低、写并发高的特点。在问卷没有正式提交前,用Redis作为中间库支持高并发写,可以大幅提高写入性能。

在上述临时性或者高并发读写的场景中,数据损失对于系统整体影响不大,通过持久化和高可用性又增加数据保障能力,因此实际造成损失的可能性很小。

3、Redis主从数据库

主从数据库由主要数据库节点和从属数据库节点组成,其中:

1)主要数据库节点只能有1个,节点上部署的数据库实例即能读也能写;

2)从属数据库节点至少有2个,根据应用场景可以部署≥2个的双数,节点上部署的数据库实例只能读;

3)当数据写入主要数据库节点后,主要节点将数据分发到所有的从属数据库节点上,使从属节点的数据与主要节点保持一致。

因此:

各个从属节点实现了数据库的实时备份,当主要节点服务器的磁盘或文件故障时,能够避免数据损失并为主要节点提供恢复副本,提高数据安全性

应用系统事务性的写入类操作可以通过主要节点完成,而较高性能损耗和高并发的读取类操作可以通过多个从属节点完成,实现读写分离提高应用系统性能

4、Redis集群模式

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当Redis做主备高可用方案时,假如主要数据库节点宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-Sentinel本身也是一个独立运行的进程,它能监控多个主备数据库集群,发现主要数据库节点宕机后能进行自动切换。主要解决在业务系统存在大量的读写并发时,通过负载均衡提高查询请求吞吐量,并将多个数据库节点集群化管理,在单点数据库故障时自动转移恢复,实现数据库高可用性。



2.数据库集群部署拓扑图

数据库集群部署最少需要两个节点,建议至少部署三个节点,性能不足时可以扩充多个"数据库集群"节点。集群部署拓扑图如下:

数据库集群部署拓扑图

网络资源规划:

1、数据库集群-1:数据库+集群服务器

1)操作系统:CentOS8;

2)IP地址和端口号:192.168.216.128:6379;

3)主机名:DBC-1;

4)数据库:Redis;

5)集群角色:活动集群节点+数据库主要节点。

2、数据库集群-2:数据库+集群服务器

1)操作系统:CentOS8;

2)IP地址和端口号:192.168.216.129:6379;

3)主机名:DBC-2;

4)数据库:Redis;

5)集群角色:备用集群节点+数据库从属节点。

3、数据库集群-≥3:数据库+集群服务器(可扩充)

1)操作系统:CentOS8;

2)IP地址和端口号:192.168.216.130:6379;

3)主机名:DBC-3;

4)数据库:Redis;

5)集群角色:备用集群节点+数据库从属节点。

4、客户端:同一网段计算机,部署应用系统的调用程序模块。



4.单点数据库安装、配置和管理

以"数据库集群-1"节点为例:

1、打开Redis官方网站下载页面【http://www.redis.cn/download.html】,下载Redis的源代码tar包到用户主目录中。

中文官方稳定版本

2、验证并安装依赖软件。通过源代码编译的方式安装Redis,需要依赖软件"make"和"gcc",验证或安装依赖软件。

[centos@DBC-1 ~]$ sudo dnf install make gcc

补充知识:

① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。

② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。

在Linux系统中,大多数通过源代码编译来安装的软件都需要依赖"make"和"gcc"。

3、解压缩源代码tar包到用户主目录下。

[centos@DBC-1 ~]$ tar zxvf redis-5.0.5.tar.gz

[centos@DBC-1 ~]$ ll

drwxrwxr-x. 6 centos centos    4096 3月  12 23:07 redis-5.0.5

-rw-rw-r--. 1 centos centos 1985757 3月  28 16:47 redis-5.0.5.tar.gz

4、进入源代码目录下的"src"目录,先编译Redis源代码文件,然后将编译后的程序安装到"/usr/local"目录中。

[centos@DBC-1 ~]$ cd redis-5.0.5/src

[centos@DBC-1 src ]$ make

[centos@DBC-1 src ]$ sudo make install PREFIX=/usr/local/redis-5.0.5

程序安装目录是"/usr/local/redis-5.0.5"。

补充知识:

① 安装时通过指定"PREFIX"参数来自定义程序安装目录。一般情况下,通过源代码编译安装的软件的程序安装目录是"/usr/local",通过建立一个子级安装目录将更有利于管理。

② 卸载Redis时,可以进入源代码目录通过"sudo make uninstall PREFIX=/usr/local/redis-5.0.5"命令卸载,也可以直接删除程序安装目录"/usr/local/redis-5.0.5"。

5、在程序安装目录中创建配置文件子目录"etc",并从源代码目录中拷贝配置文件模板到程序目录。

[centos@DBC-1 ~ ]$ sudo mkdir -p /usr/local/redis-5.0.5/etc

[centos@DBC-1 ~ ]$ sudo cp redis-5.0.5/redis.conf redis-5.0.5/sentinel.conf /usr/local/redis-5.0.5/etc/

6、在程序安装目录中创建数据持久化文件子目录"data"和"log",用于存储持久化数据和日志。

[centos@DBC-1 ~ ]$ sudo mkdir -p /usr/local/redis-5.0.5/data

[centos@DBC-1 ~ ]$ sudo mkdir -p /usr/local/redis-5.0.5/log

7、设置Reids数据库配置文件参数。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/local/redis-5.0.5/etc/redis.conf

修改或验证文件中的以下参数并保存:

# 服务监听IP地址(开机自启动时只能监听到127.0.0.1,但不影响人工启动),禁用"bind"监听全部地址。

# bind 127.0.0.1 192.168.216.128

# 是否启用安全模式。设置为yes时,"bind"和"requirepass"属性至少设置其中一个;若两个属性都不设置,则设置为no。

protected-mode yes

# 服务监听端口。

port 6379

# 日志文件位置。

logfile /usr/local/redis-5.0.5/log/redis.log

# 持久化文件目录。

dir /usr/local/redis-5.0.5/data

# 持久化文件名。

dbfilename dump.rdb

# PID文件位置

pidfile /var/run/redis_6379.pid

# 设置使用守护线程的方式启动,后台运行。

daemonize yes

# 登录口令(禁用该属性则允许免密访问)。

requirepass password

# 自动持久化规则

# 表示900秒内有1个修改key的操作,就持久化。

save 900 1       

# 表示300秒内有10个修改类的操作,就持久化。

save 300 10

#  表示60秒内有10000个修改类的操作,就持久化。

save 60  10000

# 支持创建数据库的个数,Redis中的数据库通过从0开始的正数序列标记。

databases 16

8、创建Redis管理用户和组,并设置为程序安装目录的拥有者。

[centos@DBC-1 ~ ]$ sudo groupadd redis

[centos@DBC-1 ~ ]$ sudo useradd -g redis -s /bin/false redis

[centos@DBC-1 ~ ]$ sudo chown -R redis:redis /usr/local/redis-5.0.5

9、配置Redis数据库服务开机自启动。

使用文本编辑器创建配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/redis-server.service

编写文件内容并保存如下:

[Unit]

Description=Redis Server

After=syslog.target network.target

[Service]

Type=forking

User=redis

Group=redis

ExecStart=/usr/local/redis-5.0.5/bin/redis-server /usr/local/redis-5.0.5/etc/redis.conf

ExecStop=/usr/local/redis-5.0.5/bin/redis-cli shutdown

[Install]

WantedBy=multi-user.target

设置开机启动:

[centos@DBC-1 ~]$ sudo systemctl daemon-reload

[centos@DBC-1 ~]$ sudo systemctl enable redis-server.service

10、启动Redis数据库服务。

[centos@DBC-1 ~]$  sudo systemctl start redis-server.service

11、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"6379"端口(Redis默认端口)访问服务器。

[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent

[centos@DBC-1 ~]$ sudo firewall-cmd --reload

在多个实例并行的情况下,全部实例使用统一的管理用户和组,但每个实例独立安装、独立端口、独立启动服务。

注意:其他"数据库集群"节点上全部需要按照以上步骤配置。

12、本地客户端工具

"redis-cli"是Reids自带的客户端工具,可以使用它连接Reids服务器并执行操作。它能够提供的功能可以通过"/usr/local/redis-5.0.5/bin/redis-cli --help"来查阅。

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password

127.0.0.1:6379>

-h 表示Redis服务地址,-p表示Redis服务端口号,-a 表示登录口令。

或者(进入数据库后验证口令)

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379>auth password

OK

或者(指定服务器和端口号时,默认登录服务"127.0.0.1:6379")

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli

127.0.0.1:6379>

13、Reids的运维管理

1)启动服务(任选一种方式)

[centos@DBC-1 ~]$ sudo systemctl start redis-server.service

或者(通过指定配置文件启动)

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-server /usr/local/redis-5.0.5/etc/redis.conf

或者(通过指定参数启动)

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-server --bind 192.168.216.128 --port 6379 --dir /usr/local/redis-5.0.5/data

或者(使用默认参数启动)

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-server

2)关闭服务(任选一种方式)

[centos@DBC-1 ~]$ sudo systemctl stop redis-server.service

或者

[centos@DBC-1 ~]$ sudo ps -ef | grep redis-server

redis 1093 1 2 13:15 ? 00:00:37 /usr/local/redis-5.0.5/bin/redis-server

[centos@DBC-1 ~]$ sudo kill -9 1093

或者

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password shutdown

3)查看服务状态(任选一种方式)

[centos@DBC-1 ~]$ sudo systemctl status redis-server.service

或者

[centos@DBC-1 ~]$ sudo netstat -ntap | grep redis-server

4)开启开机自启动

[centos@DBC-1 ~]$ sudo systemctl enable redis-server.service

5)禁用开机自启动

[centos@DBC-1 ~]$ sudo systemctl disable redis-server.service

6)数据持久化

① 同步持久化。

"save"命令是一个同步全量持久化命令。执行成功向客户端发送操作成功提示字符串;否则发送操作失败提示字符串。在内存数据写入磁盘未结束之前不会接受新客户端连接,也不会处理其他事务。

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password save

OK

② 异步持久化。

"bgsave"命令是一个异步全量持久化命令。开启后向客户端发送提示,不会影响接受新客户端连接和处理其他事务。

"lastsave"命令返回最近一次写磁盘操作的时间戳。用于验证"bgsave"命令是否已操作完成。

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password bgsave

Background saving started

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password lastsave

(integer) 1585535471



4.主从数据库配置和管理

首先在各个"数据库集群"节点上完成Redis数据库的安装和配置。

4.1.非集群模式下的静态主从数据库

1、主要数据库节点不需要任何额外的配置。

2、从属数据库节点的配置文件中增加主要节点的连接信息。以"从属数据库节点1"节点为例:

1)设置数据库配置文件的参数。

使用文本编辑器打开配置文件:

[centos@DBC-2 ~]$ sudo gedit /usr/local/redis-5.0.5/etc/redis.conf

修改或验证文件中的以下参数并保存:

# 连接的主要数据库节点服务地址和端口

replicaof 192.168.216.128 6379

# 连接的主要数据库节点服务口令(如果主要节点设置了"requirepass"属性的值,否则可以禁用该属性)

masterauth password

2)重新启动数据库。

[centos@DBC-2 ~]$ sudo systemctl restart redis-server.service

3、验证数据库节点配置。

在主要数据节点执行以下命令:

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379  -a password info replication

查询返回以下结果表示已成功完成主从数据库的搭建。

主从数据库查询结果


4.2.集群模式下的动态主从数据库

在集群模式下,所有的数据库节点受到故障转移与恢复的影响,主从节点是会相互替换的。因此需要注意:

1)所有节点的"requirepass"属性和"masterauth"属性的值需要统一设置且必须是一致的,可以都不设置或是都设置成为相同的值。

2)从属节点的"replicaof"属性在发生故障转移时由Sentinel(哨兵)自动变更设置。

1、初始的主要数据库节点配置。

1)设置数据库配置文件的参数。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/local/redis-5.0.5/etc/redis.conf

修改或验证文件中的以下参数并保存:

# 登录口令(禁用该属性则允许免密访问)。

requirepass password

# 作为从属节点时,连接主要数据库节点时使用的登录口令(如果主要节点设置了"requirepass"属性的值,否则可以禁用该属性)

masterauth password

2)重新启动数据库。

[centos@DBC-1 ~]$ sudo systemctl restart redis-server.service

2、初始的从属数据库节点配置。以"从属数据库节点1"节点为例:

1)设置数据库配置文件的参数。

使用文本编辑器打开配置文件:

[centos@DBC-2 ~]$ sudo gedit /usr/local/redis-5.0.5/etc/redis.conf

修改或验证文件中的以下参数并保存:

# 初始的主要数据库节点服务地址和端口

replicaof 192.168.216.128 6379

# 登录口令(禁用该属性则允许免密访问)。

requirepass password

# 作为从属节点时,连接主要数据库节点时使用的登录口令(如果主要节点设置了"requirepass"属性的值,否则可以禁用该属性)

masterauth password

2)重新启动数据库。

[centos@DBC-2 ~]$ sudo systemctl restart redis-server.service

3、验证数据库节点配置。

在主要数据节点执行以下命令:

[centos@DBC-1 ~]$ sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -h 127.0.0.1 -p 6379 -a password info replication

查询返回以下结果表示已成功完成主从数据库的搭建。

主从数据库查询结果



5.集群数据库配置和管理

以"数据库集群-1"节点为例:

1、设置Sentinel配置文件参数。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/local/redis-5.0.5/etc/sentinel.conf

修改或验证文件中的以下参数并保存:

# 服务监听IP地址(开机自启动时只能监听到127.0.0.1,但不影响人工启动),禁用"bind"监听全部地址。

# bind 127.0.0.1 192.168.216.128

# 是否启用安全模式。设置为yes时,"bind"和"requirepass"属性至少设置其中一个;若两个属性都不设置,则设置为no。

protected-mode no

# 设置使用守护线程的方式启动,后台运行。

daemonize yes

# 服务监听端口。

port 26379

# 日志文件位置。

logfile /usr/local/redis-5.0.5/log/redis-sentinel.log

# PID文件位置

pidfile /var/run/redis-sentinel.pid

# 初始的主要节点数据库的IP地址和端口;指定在2个及以上集群节点认为数据库宕机时启动故障转移(一般建议将其设置为sentinel节点的一半加1)。

sentinel monitor master 192.168.216.128 6379 2

# 初始的主要节点数据库的登录口令。

sentinel auth-pass master password

# 初始的主要节点数据库30秒无响应则认为宕机。

sentinel down-after-milliseconds master 30000

# 当启动故障转移时,每批次限1台从属数据库与新的主要数据库重置主从关系。

snetinel parallel-syncs master 1

# 故障转移的超时时间,默认为3分钟。

sentinel failover-timeout master 180000

2、创建Sentinel服务管理配置,但不要设置为开机启动。

使用文本编辑器创建配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/redis-sentinel.service

编写文件内容并保存如下:

[Unit]

Description=Redis Server

After=syslog.target network.target redis-server.service

[Service]

Type=forking

User=redis

Group=redis

ExecStart=/usr/local/redis-5.0.5/bin/redis-sentinel /usr/local/redis-5.0.5/etc/sentinel.conf

ExecReload=/bin/kill -HUP $MAINPID

ExecStop=/bin/kill -HUP $MAINPID

KillMode=mixed

KillSignal=SIGINT

[Install]

WantedBy=multi-user.target

加载服务到管理器中并禁用开机启动,Sentinel服务不宜使用开机自动启动的模式,建议人工操作。

[centos@DBC-1 ~]$ sudo systemctl daemon-reload

[centos@DBC-1 ~]$ sudo systemctl disable redis-sentinel.service

3、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"26379"端口(Sentinel默认端口)访问服务器。

[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=26379/tcp --permanent

[centos@DBC-1 ~]$ sudo firewall-cmd --reload

注意:其他"数据库集群"节点上全部需要按照以上步骤配置。

4、启动Sentinel。

启动Sentinel服务之前,应确保已正确启动了各数据库节点的Redis服务。

各节点的启动或重启的顺序为:

① 依次关闭全部节点的Sentinel服务;

② 启动Redis主要节点上的Sentinel服务;

③ 依次启动所有Redis从属节点上的Sentinel服务。

假设DBC1为数据库主要节点,DBC2和DBC3为从备节点。

[centos@DBC-3~]$ sudo systemctl stop redis-sentinel.service

[centos@DBC-2 ~]$ sudo systemctl stop redis-sentinel.service

[centos@DBC-1~]$ sudo systemctl stop redis-sentinel.service


[centos@DBC-1~]$ sudo systemctl start redis-sentinel.service

[centos@DBC-2~]$ sudo systemctl start redis-sentinel.service

[centos@DBC-3~]$ sudo systemctl start redis-sentinel.service

5、验证数据库集群节点配置。

在主要数据库集群节点执行以下命令:

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 info sentinel

集群查询结果

6、查看数据库集群服务端口和状态

在各个数据库集群节点执行以下命令,以"数据库集群-1"节点为例:

[centos@DBC-1 ~]$  sudo netstat -ntap | grep redis-sentinel

集群服务端口和状态查询结果

7、故障转移测试

1)查询当前主要数据库节点。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel get-master-addr-by-name master

1) "192.168.216.128"

2) "6379"

2)停止主要数据库节点的服务,假设数据库故障。

[centos@DBC-1 ~]$  sudo systemctl stop redis-server.service

3)重新查询当前主要数据库节点(需要等待至完成故障转移完成)。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel get-master-addr-by-name master

1) "192.168.216.129"

2) "6379"

8、集群管理命令

1)查询集群概要信息。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 info sentinel

2)查询主要数据库节点的当前状态。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel masters

3)根据主要数据库节点别名,查询从属节点的当前状态。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel slaves

4)根据主要数据库节点别名,查询当前主要数据库节点的IP地址和端口号。用于故障转移后获取新的主要数据库节点(读写节点)的连接信息。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel get-master-addr-by-name

1) "192.168.216.129"

2) "6379"

5)根据主要数据库节点别名,强制进行一次故障转移。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel failover

6)设置监听新的主要数据库节点。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel monitor

7)移除已监听的主要数据库节点。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel remove

8)设置集群属性。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel remove

9)永久清除集群中已失效的从属数据库节点。

[centos@DBC-1 ~]$  sudo -u redis /usr/local/redis-5.0.5/bin/redis-cli -p 26379 sentinel reset



6.Java开发集成示例

Jedis是Redis的JavaAPI包,以下是Maven项目的程序案例。

1、从Maven库中引入Jedis包。

redis.clients

jedis

3.2.0

2、集群+主从数据库节点读写分离示例。

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

import redis.clients.jedis.HostAndPort;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.exceptions.JedisException;

public class JedisApp

{

    public static void main( String[] args )

    {

        String mastername = "master";

        String password = "password";

        Set sentinels = new HashSet<>();

        sentinels.add("192.168.216.128:26379");

        sentinels.add("192.168.216.129:26379");

        sentinels.add("192.168.216.130:26379");

        List master = null;

        List> slaves = null;

        for(String sentinel : sentinels) {

            HostAndPort hap = HostAndPort.parseString(sentinel);

            Jedis jedis = null;

            try {

                jedis = new Jedis(hap.getHost(), hap.getPort());

                master = jedis.sentinelGetMasterAddrByName(mastername);

                slaves = jedis.sentinelSlaves(mastername);

                break;

            }catch (JedisException e) {

            }finally {

                if(jedis != null) {

                    jedis.close();

                }

            }

        }

        if(master != null && master.size() > 0) {

            Jedis jedisM = new Jedis(master.get(0),Integer.valueOf(master.get(1)));

            jedisM.auth(password);

            Jedis jedisS = null;

            if(slaves != null && slaves.size() > 0) {

                Map slave = slaves.get(0);

                jedisS = new Jedis(slave.get("ip"),Integer.valueOf(slave.get("port")));

                jedisS.auth(password);

            }

            else {

                jedisS = jedisM;

            }

            jedisM.set("random",String.valueOf(Math.random()*100));

            System.out.println("random:" + jedisS.get("random"));

            jedisM.close();

            jedisS.close();

        }

    }

}


3、集群+主要数据库节点读写示例。

import java.util.HashSet;

import java.util.Set;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisSentinelPool;

public class JedisApp {

    public static void main(String[] args) {

        String mastername = "master";

        String password = "password";

        Set sentinels = new HashSet<>();

        sentinels.add("192.168.216.128:26379");

        sentinels.add("192.168.216.129:26379");

        sentinels.add("192.168.216.130:26379");

        JedisSentinelPool pool = new JedisSentinelPool(mastername, sentinels, password);

        Jedis jedisM = pool.getResource();

        pool.destroy();

        jedisM.set("random", String.valueOf(Math.random() * 100));

        System.out.println("random:" + jedisM.get("random"));

        jedisM.close();

    }

}

4、主要数据库节点读写示例。

import redis.clients.jedis.Jedis;

public class JedisApp

{

    public static void main( String[] args )

    {

        String ip = "192.168.216.129";

        int port = 6379;

        String password = "password";

        Jedis jedis = new Jedis(ip,port);

        jedis.auth(password);

        jedis.set("random",String.valueOf(Math.random()*100));

        System.out.println("random:" + jedis.get("random"));

        jedis.close();

    }

}

你可能感兴趣的:(数据库架构之【Redis-Sentinel】缓存库集群方案)