一、多节点哨兵如何配置?
哨兵配置原理图
- 注意: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引擎一主两从架构