mysql读写分离 存储过程_基于maxscale的读写分离部署笔记

使用maxscale搭建的读写分离架构,后期还可以再结合MHA做master的故障转移,这样业务层面上不需要做任何的改动即可。

wKioL1lggmPgCxkEAASclllqflU160.png

wKiom1lggnPhz_qzAAWSkuYLxpw996.png

wKioL1lggofTVYREAAYnqzfN1L4427.png

基于connect方式的不要使用。从库延迟他还会继续分发请求过去,暂时不适合生产使用。

实验演示:

目前的主从结构:

node93     10.1.20.93 master

node94  10.1.20.94 slave

node95  10.1.20.95 slave

node96  10.1.20.96 maxscale

先在master主库上创建相关的账户:

在开始配置之前,需要在master中为MaxScale创建两个用户,用于监控模块和路由模块。

创建监控用户,用于[MySQL Monitor]段的配置中:

> create database maxscale_schema ;    # maxscale监控用的心跳信息会写到这个库里面

> create user scalemon@'%' identified by"111111";

> grant replication slave, replication client on*.* to scalemon@'%';

> grant all on maxscale_schema.* to scalemon@'%';

创建路由用户,用于[Read-Write Service]段的配置中:

> create user maxscale@'%' identified by"111111";

> grant select on mysql.* to maxscale@'%';

maxscale部署:

rpm -ivh maxscale-2.0.2021年01月28日.rhel.6.x86_64.rpm

主要生成文件如下:

/etc/maxscale.cnf

/etc/maxscale.cnf.template

/usr/bin/cdc.py

/usr/bin/cdc_kafka_producer.py

/usr/bin/cdc_last_transaction.py

/usr/bin/cdc_users.py

/usr/bin/maxadmin

/usr/bin/maxavrocheck

/usr/bin/maxbinlogcheck

/usr/bin/maxkeys

/usr/bin/maxpasswd

/usr/bin/maxscale

/var

/var/lib

/var/lib/maxscale

创建秘钥文件:

[root@maxscale /root ]# maxkeys /var/lib/maxscale

生成加密后的密码:

[root@maxscale /root ]# maxpasswd/var/lib/maxscale/.secrets 123456

上面划掉的这2步骤我们用不到,直接在配置文件/etc/maxscale.cnf里写上明文密码就行了。(这里踩了坑,配置这个参数,导致后面maxscale起来后,无法连接到其他库提示access denied)

vim/etc/security/limits.conf:

* softnofile 65535

* hardnofile 65535

vim/etc/sysctl.conf :

fs.file-max=655350

net.ipv4.ip_local_port_range= 1025 65000

net.ipv4.tcp_tw_reuse= 1

修改完内和参数后,需要重启下服务器。

修改配置文件:

cat /etc/maxscale.cnf

[maxscale]

threads=auto

ms_timestamp=1             #timestamp精度

syslog=1                   #将日志写入到syslog中

maxlog=1                   #将日志写入到maxscale的日志文件中

log_to_shm=0               #不将日志写入到共享缓存中,开启debug模式时可打开加快速度

log_warning=1              #记录告警信息

log_notice=1               #记录notice

log_info=1                 #记录info

log_debug=0                #不打开debug模式

log_augmentation=1         #日志递增

# Server definitions

#

# Set the address of the server to the network

# address of a MySQL server.

#

#需要把master和slave地址都配上,maxscale会自动分辨出哪个是master和slave

[server1]

type=server

address=10.1.20.93

port=3306

protocol=MySQLBackend

[server2]

type=server

address=10.1.20.94

port=3306

protocol=MySQLBackend

[server3]

type=server

address=10.1.20.95

port=3306

protocol=MySQLBackend

# Monitor for the servers

#

# This will keep MaxScale aware of the state of theservers.

# MySQL Monitor documentation:

# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md

[MySQL Monitor]

type=monitor

module=mysqlmon

servers=server1,server2,server3    #这里要把全部server都写上,以便maxscale去监测

user=scalemon

passwd=111111

monitor_interval=10000    #每隔10s检查一次

detect_replication_lag=true     #检查复制延迟的情况

detect_stale_master=true       #当所有的slave都不可用时,select查询请求会转发到master。

# Service definitions

#

# Service Definition for a read-only service and

# a read/write splitting service.

#

# ReadConnRoute documentation:

#https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md

由于我们使用了[Read-Write Service],可以删除另一个服务[Read-Only Service],注释掉下面整块儿内容即可。

#需要把master和slave地址都配上

#[Read-Only Service]

#type=service

#router=readconnroute

#servers=server1,server2,server3

#user=maxscale           #读写分离的账户和密码

#passwd=111111           #读写分离的账户和密码

#router_options=slave

# ReadWriteSplit documentation:

# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md

#配置的读写分离,需要把master和slave地址都配上

[Read-Write Service]

type=service

router=readwritesplit

servers=server1,server2,server3

user=maxscale        #读写分离的账户和密码

passwd=111111       #读写分离的账户和密码

max_slave_connections=100%         #所有的slave提供select查询服务

max_slave_replication_lag = 5      # slave超时5秒,就把请求转发到其他slave

use_sql_variables_in = all         #

# This service enables the use of the MaxAdmininterface

# MaxScale administration guide:

#https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Reference/MaxAdmin.md

[MaxAdmin Service]

type=service

router=cli

# Listener definitions for the services

#

# These listeners represent the ports the

# services will listen on.

#

#[Read-Only Listener]

#type=listener

#service=Read-Only Service

#protocol=MySQLClient

#port=4008

[Read-Write Listener]

type=listener

service=Read-Write Service

protocol=MySQLClient

port=4006

[MaxAdmin Listener]

type=listener

service=MaxAdmin Service

protocol=maxscaled

socket=default

启动maxscale:

maxscale -f/etc/maxscale.cnf

ss -lnt可以看到4006端口启动了。

可以使用之前的业务账号连接到maxscale的4006端口上,例如:

mysql -utest -ptest -P 4006 -h 10.1.20.96

wKioL1lggsKSQ8XSAABJEt2GxO4201.png

注意begin;select @@hostname;commit;这种的select会在主库上执行。此外,执行存储过程或者函数时候也是会自动在主库去执行的。

执行SQL > begin;select@@hostname; commit; insert into t2 select 3; select @@hostname;对应的在/var/log/maxscale/maxscale.log记录如下:

wKiom1lggtehJeHsAADp_RLXWOc748.png

很明显的可以看:开启事务、插入等操作会被转发到主库去处理。而单纯的select则会被转发到某个从库去处理。

maxscale不能对master进行故障切换,可以配合使用MHA来进行。MHA的故障切换后,maxscale可以自动识别哪台机器是master。然后自动将求发送到新的主从结构中。

maxscale的延迟检测:

和pt-heartbeat的原理类似。maxscale会对master和slave上replication_heartbeat表的master_timestamp时间戳进行对比,相减得出差异。这个差异就是MySQL主从同步的延迟值。

select * frommaxscale_schema.replication_heartbeat;

wKioL1lggvbQZiMCAAAfEg6JqYU636.png

从库故障或延迟过大会被自动剔除:

我们可以在192.168.2.12上stop slave;稍等片刻,再执行查询操作的话,会发现请求不会被转发到192.168.2.12的mysql上,maxscale里面自动将这个机器踢下线了。如下图:

wKioL1lggyLA4vLlAAAsyi-o3XE349.png

192.168.2.12出现延迟,则在maxscale日志显示如下:wKioL1lggyOiGgepAAAjNSLjm0E824.png

192.168.2.12的3306端口不通(可能mysqld挂掉或者服务器宕机),则在maxscale日志显示如下:

wKiom1lggyPCDJbBAAAqeLJSkUQ250.png

其他后补充进笔记的,管理maxscale的一些命令:

maxadmin -S /tmp/maxadmin.sock

wKioL1lgg6nCnYGKAACRKPkpOWo658.png

wKiom1lgg6nQZRaXAAAn3qoIKL0430.png

wKioL1lgg6nRDTuBAABZTvFHhw0158.png

wKiom1lgg6qQJ-LZAAAkmjGPzbc802.png

wKiom1lgg6rBfZw_AABR42RE1Yg434.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python读书笔记2000_流畅的Python读书笔记

特殊方法的存在是为了Python解释器调用的,你自己并不需要去调用他们,比如说my_object.len()这种写法是没有的,应该使用len(my_object)。在使用len(my_object)的时候,如果my_object是一个自定义类的对象,那么Python会自…

antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。0. 一分钟体验首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。0.1. 新建项目目录假如我们的项目名称叫hello-cli,使用如…

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯,但酒后乘车却容易造成财物遗失。目前正值春运返程高峰,从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒,便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…

java加减乘除运算顺序_java 实现加减乘除混合运算

初衷:解决小学一年级到四年级 基本加减乘除混合运算基本思路:表达式:10032-200(10000/5(100/2))此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换,转化为100, 3, , 2, , 200, -, 10000, 5, /, 100, 2, /, , …

java integer valueof_对 Java Integer.valueOf() 的一些了解

从一道选择题开始分析选项A选项A中比较的是i01和i02,Integer i0159这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。而int i0259由于int是基本类型…

java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态

大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面。但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。…