Redis哨兵模式之Sentinel模式(二)

发布于:2025-07-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、多节点哨兵如何配置?

哨兵配置原理图

  • 注意:sentinel哨兵模式的搭建是建立在redis主从复制节点配置基础而搭建,在主从配置中从库需要配置好replicaof关联上主库并关闭安全模式,然后设置好bind端口才能关联上机器,而这里的如果设置了一台哨兵机器,首先哨兵机器会通过monitor来监控你的主机器redis-master是否有宕机的可能(状态表现为sdown-,odown-),然后哨兵会自动对slave配置文件进行配置,定位到master机器,然后后期只针对master机器进行监控即可

## 关闭redis服务
pkill redis

## 创建3个哨兵文件
sentinel_26379.conf、sentinel_26380.conf、sentinel_26381.conf

模版如下:                                                                                                                                                                                            

port 26379
daemonize yes
pidfile /var/run/redis-sentinel_26379.pid
logfile /var/log/sentinel_26379.log(哨兵日志)
dir /data/26379
sentinel monitor mymaster 10.0.0.7 6379 2(填写主库地址)
sentinel down-after-milliseconds mymaster 3000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
                                                                        

哨兵节点突发宕机,如何裁决?

  • 如果发生了意外故障主节点突然宕机了,那么就只能通过投票选举让哨兵之间进行商量选举出最终的主机,然后switch-fork实现了主从间关系的转移,最后确定之后重新绑定master、slave之间的关系

redis配置文件详解

二、LNMP对接哨兵服务

根据博客一Redis哨兵模式之Sentinel模式(一)-CSDN博客的信息已经完成了主从节点与哨兵节点的调试工作,那么现在问题来了,我究竟如何能让php-fpm后端连接上redis哨兵来监控主master宕机并进行灵活的转换呢????

由于php-fpm后端管理页面无法直接填写哨兵来完成与redis协议,可以考虑的解决方案有两种要么对php源码文件编写(通常交给程序员解决),要么通过shell脚本来实现master 脚本的动态获取,然后将主master节点依照哨的情况进行动态切换

  • 首先需要完成后端php_redis连接的配置

  • 写shell脚本方式来动态获取哨兵

#!/bin/bash 
############################
## auto check redis master
############################
while true 
do
        REDIS_MASTER=$(grep -aiE "monitor mymaster" /usr/local/redis/sentinel.conf | awk '{print $4}')
        grep -aiE "$REDIS_MASTER" /etc/hosts
        if [ $? -ne 0 ];then
                sed -i '/redis.jf.com/d' /etc/hosts
                echo "$REDIS_MASTER" >>  /etc/hosts
                echo Change time:`date`
        fi
        sleep 5
done    

三、MYSQL读写分离

  • 场景分析

当用户首次访问网页时,首先会将数据请求转发到到MySQL服务器如果首次数据量过大,那么就会导致首次服务器就会出现宕机风险,此时我们就引入了分库 ,分布式机器或MYSQL读写分离来进一步缓解服务器压力了

  • 原理分析

MYSQL读写分离的本质是将增删改的数据交给主库去处理,而数据查询就需要交给从库来做进一步的处理了,MYSQL读写分离实际上是基于MySQL主从复制而设定的,这样设计保证了在master端口写入数据,slave同步后,Web应用就可以直接读取从库的数据了。

  • mycat中间件

  • 实验部署

机器准备

master(主机) 10.0.0.6
slave(从机) 10.0.0.7
mycat机器 10.0.0.8

实验步骤

##(mycat机器操作)
## Jdk环境安装部署
yum -y install java

## mycat的jar包和zip包上传
mycat2-1.21-release-jar-with-dependencies.jar
mycat2-install-template-1.21.zip

## 压缩mycat程序
unzip mycat2-install-template-1.21.zip 
\mv mycat /usr/local/

## 拷贝mycat依赖环境
cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/


#授予Mycat bin目录下文件执行权限;
chmod +x /usr/local/mycat/bin/*

#查看Mycat程序是否部署成功;
ls -l /usr/local/mycat/




## (master机器操作)
## 创建专有用户
CREATE USER 'mycat'@'%' IDENTIFIED BY 'aaaAAA111.';
#授权用户访问;
GRANT XA_RECOVER_ADMIN ON *.* to 'mycat'@'%';
GRANT ALL PRIVILEGES ON *.* to 'mycat'@'%';
FLUSH PRIVILEGES;
# 创建数据原型库mycat----->mycat数据表存放地
create database mycat;





## 修改mycat数据源配置(参见下图)

vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json


## 创建物理型数据库实现读写分离
## 拷贝模板文件,生成master和slave配置文件
\cp prototypeDs.datasource.json master.datasource.json
\cp prototypeDs.datasource.json slave-01.datasource.json





mycat配置文件修改

mycat-master数据源配置信息

mycat-slave数据源配置信息

配置物理数据源cluster集群信息

cd  /usr/local/mycat/conf/clusters
\cp prototype.cluster.json master-slave.cluster.json

## 配置cluster.conf文件配置信息
cat>master-slave.cluster.json<<EOF
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetry":3,
                "minSwitchTimeInterval":300,
                "slaveThreshold":0
        },
        "masters":[
                "master"
        ],

        "replicas":[
                "slave-01"
        ],

        "maxCon":5000,
        "name":"master-slave",
        "readBalanceType":"BALANCE_ALL",
        "switchType":"NOT_SWITCH"
}
EOF

将物理数据库与集群绑定起来

cd /usr/local/mycat/conf/schemas

## 创建discuz框架文件
cat>discuz.schema.json<<EOF
{
    "schemaName": "discuz",
    "targetName": "master-slave",
    "normalTables": {}
}
EOF

mycat数据读取流程

修改 Mycat 登录用户信息

cd /usr/local/mycat/conf/users/

#修改root.user.json文件,代码;
{
        "dialect":"mysql",
        "ip":null,
        "password":"aaaAAA111.",
        "transactionType":"xa",
        "username":"root"
}

有关mycat启动服务、查看状态、帮助情况

#启动服务;
/usr/local/mycat/bin/mycat start
#查看服务状态;
/usr/local/mycat/bin/mycat status
#查看Mycat帮助信息;
/usr/local/mycat/bin/mycat --help

 检查是否存在报错问题(无法连接上mysql数据库):

下面针对mycat服务启动时发现mysql服务器未创建用户解决方案

ALTER USER 'root'@'localhost' IDENTIFIED BY 'aaaAAA111.';

update mysql.user set host='%' where user="root";

检查mycat的监听端口

netstat -tnlp | grep -E "8066|9066"

mysql测试连接情况

验证读写分离

## 在slave中创建数据表
create table t1 (id char(20),name char(20),job char(10));
insert into t1 values (01,'wanger','IT'); 
insert into t1 values (02,'zhangsan','IT'); 

补充一个MySQL从服务器配置mycat读写分离

(配置了一主两从架构)

开放的一台新机器IP地址为10.0.0.5

## 安装mysql,mysql-server软件包
yum -y install mysql mysql-server

## 将master机器加上读锁
flush  tables  with  read  lock;
## 数据备份完成之后解开锁
unlock tables;

## 备份主表的数据
mysqldump -B -uroot -paaaAAA111. --all-databases > 0707all.sql

## 将主表的数据发送给新机器
scp -r 0707all.sql 10.0.0.5:/root/

## 重启mysql服务
service mysqld start

## 编辑mysql配置,编写server-id配置
vim /etc/my.cnf.d/mysql-server.cnf 

## 数据导入
mysql -uroot -p < 0707all.sql 

## 与master机器绑定建立关联(根据master状态来决定)
change master to 
master_host='10.0.0.6',master_user='repl',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=2679454;
start slave;
show slave status\G;

## 检查还无法启动
stop slave;
reset slave;

##拷贝02数据源(修改name)
cp slave-01.datasource.json slave-02.datasource.json

## 修改集群架构配置文件
cd ../clusters/
vim master-slave.cluster.json(在replica中加入slave-02) 

mysql-mycat引擎一主两从架构


    网站公告

    今日签到

    点亮在社区的每一天
    去签到