MySQL两主四从怎么做 不同职业类型的培训应该如何开展

如何配置两个MySQL数据库之间的主从同步功能一、概述
MySQL从3.23.15版本以后提供数据库复制(replication)功能MySQL两主四从怎么做,利用该功能可以实现两个数据库同步、主从模式、互相备份模式MySQL两主四从怎么做的功能 。本文档主要阐述MySQL两主四从怎么做了如何在linux系统中利用mysql的replication进行双机热备的配置 。
二、环境
操作系统:Linux 2.6.23.1-42.fc8 # SMP(不安装XEN)
Mysql版本:5.0.45-4.fc8
设备环境:PC(或者虚拟机)两台
三、配置
数据库同步复制功能的设置都在MySQL的配置文件中体现,MySQL的配置文件(一般是my.cnf):在本环境下为/etc/my.cnf 。
3.1 设置环境:
IP的设置:
A主机 IP:10.10.0.119
Mask:255.255.0.0
B主机 IP:10.10.8.112
Mask:255.255.0.0
在IP设置完成以后,需要确定两主机的防火墙确实已经关闭 。可以使用命令service iptables status查看防火墙状态 。如果防火墙状态
为仍在运行 。使用service iptables stop来停用防火墙 。如果想启动关闭防火墙,可以使用setup命令来禁用或定制 。
最终以两台主机可以相互ping通为佳 。
3.2 配置A主(master) B从(slave)模式
3.2.1 配置A 为master
 、增加一个用户同步使用的帐号:
GRANT FILE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;
GRANTREPLICATION SLAVE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;
赋予10.10.8.112也就是Slave机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以 。
、增加一个数据库作为同步数据库:
create database test;
、创建一个表结构:
create table mytest (username varchar(20),password varchar(20));
、修改配置文件:
修改A的/etc/my.cnf文件,在my.cnf配置项中加入下面配置:
server-id = 1#Server标识
log-bin
binlog-do-db=test#指定需要日志的数据库
、重起数据库服务:
service mysqld restart
查看server-id:
show variable like ‘server_id’;
实例:
mysql show variables like 'server_id';
--------------- -------
| Variable_name | Value |
--------------- -------
| server_id| 1|
--------------- -------
1 row in set (0.00 sec)
、用show master status/G命令看日志情况 。
正常为:
mysql show master status/G
*************************** 1. row ***************************
File: mysqld-bin.000002
Position: 198
Binlog_Do_DB: test,test
Binlog_Ignore_DB:
1 row in set (0.08 sec)
3.2.2 配置B 为slave
、增加一个数据库作为同步数据库:
create database test;
、创建一个表结构:
create table mytest (username varchar(20),password varchar(20));
、修改配置文件:
修改B的/etc/my.cnf文件,在my.cnf配置项中加入下面配置:
server-id=2
master-host=10.10. 0.119
master-user=backup#同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60 #预设重试间隔秒
replicate-do-db=test#告诉slave只做backup数据库的更新
、重起数据库服务:
service mysqld restart
查看server-id:
show variables like ‘server_id’;
实例:
mysql show variables like 'server_id';
--------------- -------
| Variable_name | Value |
--------------- -------
| server_id| 2|
--------------- -------
1 row in set (0.00 sec)
、用show slave status/G命令看日志情况 。
正常为:
mysql show slave status/G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.0.119
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 236
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test,test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 236
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.01 sec)
3.2.3 验证配置
分别使用insert, delete , update在A主机进行增删改查数据库;查看B主机的数据库是否与A主机一致;若一致,则配置成功 。
3.3双机互备模式
如果在A主机加入slave设置,在B主机加入master设置,则可以做B-A的同步 。
、在A主机的配置文件中 mysqld配置项加入以下设置:
master-host=10.10.8.112
master-user=backup
master-password=1234
replicate-do-db=test
master-connect-retry=10
、在B的配置文件中 mysqld配置项加入以下设置:
log-bin
binlog-do-db=test
注意:当有错误产生时,*.err日志文件同步的线程退出,当纠正错误后,要让同步机制进行工作,运行slave start 。
重起A、B机器,则可以实现双向的热备份 。
四、常见问题及解决
、Slave机器的权限问题,不但要给slave机器File权限 , 还要给它REPLICATION SLAVE的权限 。
、在修改完Slave机器/etc/my.cnf之后,slave机器的mysql服务启动之前 , 记得要删除掉master.info
、在show master status或着show slave status不正常时,看看.err是怎样说的 。
、Slave上Mysql的Replication工作有两个线程, I/O thread和SQL thread 。I/O的作用是从
master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更
新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的语句,于是同步
就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var
/lib/mysql/relay-log.info.
、启动slave,命令用start slave;重新启动用restart slave
MySQL 主从,5 分钟带你掌握MySQL 主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多 。
比如楼哥之前面试小米 , 就被问到过主从复制的原理,以及主从延迟的解决方案,因为回答的非常不错 , 给面试官留下非常好的印象 。你之前面试,有遇到过哪些 MySQL 主从的问题呢?
所谓 MySQL 主从,就是建立两个完全一样的数据库 , 一个是主库,一个是从库,主库对外提供读写的操作 , 从库对外提供读的操作,下面是一主一从模式:
对于数据库单机部署,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS,当遇到一些活动时,查询流量骤然,就需要进行主从分离 。
大部分系统的访问模型是读多写少,读写请求量的差距可能达到几个数量级,所以我们可以通过一主多从的方式,主库只负责写入和部分核心逻辑的查询,多个从库只负责查询,提升查询性能,降低主库压力 。
MySQL 主从还能做到服务高可用,当主库宕机时,从库可以切成主库,保证服务的高可用,然后主库也可以做数据的容灾备份 。
整体场景总结如下:
MySQL 的主从复制是依赖于 binlog 的,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件 。
主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步的完成 。
详细流程如下:
当主库和从库数据同步时,突然中断怎么办?因为主库与从库之间维持了一个长链接,主库内部有一个线程,专门服务于从库的这个长链接的 。
对于下面的情况,假如主库执行如下 SQL,其中 a 和 create_time 都是索引:
我们知道,数据选择了 a 索引和选择 create_time 索引,最后 limit 1 出来的数据一般是不一样的 。
所以就会存在这种情况:在 binlog = statement 格式时,主库在执行这条 SQL 时,使用的是索引 a,而从库在执行这条 SQL 时,使用了索引 create_time,最后主从数据不一致了 。
那么我们改如何解决呢?
可以把 binlog 格式修改为 row , row 格式的 binlog 日志记录的不是 SQL 原文,而是两个 event:Table_map 和 Delete_rows 。
Table_map event 说明要操作的表,Delete_rows event用于定义要删除的行为,记录删除的具体行数 。row 格式的 binlog 记录的就是要删除的主键 ID 信息,因此不会出现主从不一致的问题 。
但是如果 SQL 删除 10 万行数据,使用 row 格式就会很占空间的,10 万条数据都在 binlog 里面,写 binlog 的时候也很耗 IO 。但是 statement 格式的 binlog 可能会导致数据不一致 。
设计 MySQL 的大叔想了一个折中的方案,mixed 格式的 binlog,其实就是 row 和 statement 格式混合使用,当 MySQL 判断可能数据不一致时,就用 row 格式,否则使用就用 statement 格式 。
有时候我们遇到从数据库中获取不到信息的诡异问题时,会纠结于代码中是否有一些逻辑会把之前写入的内容删除 , 但是你又会发现,过了一段时间再去查询时又可以读到数据了 , 这基本上就是主从延迟在作怪 。
主从延迟,其实就是“从库回放” 完成的时间 , 与 “主库写 binlog” 完成时间的差值,会导致从库查询的数据,和主库的不一致。
谈到 MySQL 数据库主从同步延迟原理,得从 MySQL 的主从复制原理说起:
总结一下主从延迟的主要原因:主从延迟主要是出现在 “relay log 回放” 这一步,当主库的 TPS 并发较高,产生的 DDL 数量超过从库一个 SQL 线程所能承受的范围,那么延时就产生了,当然还有就是可能与从库的大型 query 语句产生了锁等待 。
我们一般会把从库落后的时间作为一个重点的数据库指标做监控和报警,正常的时间是在毫秒级别,一旦落后的时间达到了秒级别就需要告警了 。
解决该问题的方法 , 除了缩短主从延迟的时间,还有一些其它的方法,基本原理都是尽量不查询从库 。
具体解决方案如下:
在实际应用场景中,对于一些非常核心的场景 , 比如库存,支付订单等,需要直接查询从库,其它非核心场景,就不要去查主库了 。
两台机器 A 和 B,A 为主库 , 负责读写,B 为从库,负责读数据 。
如果 A 库发生故障,B 库成为主库负责读写,修复故障后,A 成为从库,主库 B 同步数据到从库 A 。
一台主库多台从库,A 为主库 , 负责读写,B、C、D为从库,负责读数据 。
如果 A 库发生故障,B 库成为主库负责读写,C、D负责读,修复故障后,A 也成为从库 , 主库 B 同步数据到从库 A 。
基于MySQL双主的高可用解决方案理论及实践 MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段 。本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求、各高可用技术特点对比、实施、测试等过程进行整理 , 完善Mysql高可用方案,同时为后续开展分布式数据库相关测试做相应准备 。
存储复制技术: 传统IOE架构下,常用高可用方案,靠存储底层复制技术实现数据的一致性,优点数据安全性有保障,限制在于是依赖存储硬件,实施成本较高 。
keepalived 双主复制: 两台MySQL互为主从关系,即双主模式,通过Keepalived配置虚拟IP , 实现当其中的一台数据库故障时,自动切换VIP到另外一台MySQL数据库,备机快速接管业务来保证数据库的高可用 。
MHA:MHA部署在每台mysql服务器上,定时探测集群中的master节点,当master出现故障时,它可以自动将最新的slave提升为新的master , 然后将所有其他的slave重新指向新的master,优点在最大程度保证数据的一致性的前提下实现快速切换,最少需要3台服务器,存在数据丢失的可能性 。
PXC:Percona eXtra Cluster是Percona基于galera cluster封装的集群方案 。不同于普通多主复制,PXC保障强一致性和实时同步,故障切换更快 。但是也需要3个节点,配置相对复杂,对性能也稍有影响 。
除MySQL两主四从怎么做了上述方案外,还有MMM、Heartbeat DRBD等高可用方案,此处不做详细介绍 。
综合评估下,本次实施采用了 keepalived mysql双主实现数据库同城双机房的高可用 。MySQL版本为: 5.7.21 。操作系统:Red Hat Enterprise Linux Server 7.3 。
配置过程如下:
Mysql-master1: IP地址1 --以下简称master1
Mysql-master2: IP地址2 --以下简称master2
Mysql-vip : VIP地址 --应用连接使用
Mysql复制相关概念描述:
1、 Mysql主从复制图示:
2、 Mysql主从复制过程描述:
(1)master记录二进制日志:在每个事务更新数据完成之前,master在二进制日志记录这些改变 。MySQL将事务写入二进制日志 。在事务写入二进制日志完成后,master通知存储引擎提交事务 。
(2)slave将master的binarylog拷贝到自己的中继日志:首先,slave开始一个工作线程——I/O线程 。I/O线程在master上打开一个普通的连接,然后开始binlog dump process 。Binlog dump process从master的二进制日志中读取事务,如果已经同步了master,它会睡眠并等待master产生新的事件 。I/O线程将这些事务写入中继日志 。
(3)SQL slave thread处理该过程的最后一步:SQL线程从中继日志读取事务,并重放其中的事务而更新slave的数据,使其与master中的数据一致 。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中 , 所以中继日志的开销很小 。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步至备端 。
为了便于后续数据库服务器的扩展,且在整个复制环境中能够自动地切换 , 降低运维成本,引入了当前主流的基于Mysql GTID的复制特性,工作原理及优缺点简介如下 。
【MySQL两主四从怎么做 不同职业类型的培训应该如何开展】3、 GTID工作原理简介:
(1) master更新数据时,会在事务前产生GTID,一同记录到Binlog日志中 。
(2) slave的I/O线程将变更的binlog写入到本地的relay log中 。
(3) slave的sql线程从relay log中获取GTID , 然后对比slave端的binlog是否有记录 。
(4) 如果有记录说明该GTID的事务已经执行,slave会忽略 。
(5) 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog 。
(6) 在解析的过程中会判断是否有主键,如果有就用索引,如果没有就用全部扫描 。
4、 GTID优点:
(1) 一个事务对应一个唯一的ID,一个GTID在一个服务器上 只会执行一次 。(2) GTID是用来替代传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置 。
(3) 减少手工干预和降低服务故障时间,当主机宕机之后会通过软件从众多的备机中提升一台备机为新的master 。
5、 GTID也存在一些限制:
(1) 不支持非事务引擎 。
(2) 不支持create table … select 语句复制(主库直接报错) 。
(3) 不允许一个sql同时更新一个事务引擎表和非事务引擎表 。
(4) 在一个复制组中 , 必须要求统一开启GTID或者是统一关闭GTID 。
(5) 开启GTID需要重启(5.7版本除外) 。
(6) 开启GTID后,就不再使用原理的传统复制方式 。
(7) 不支持create temporary table 和 drop temporary table语句 。
(8) 不支持sql_slave_skip_counter 。
前置条件:
主备两个节点使用行内统一的安装部署脚本安装mysql5.7.21介质(略)
Master1端创建应用的数据库(略)
1、 修改MySQL配置文件
参考相关配置规范,分别设置master1、master2的my.cnf文件,
其中server-id参数设置为不同值;
由于后续keepalived会挂起VIP , 应用通过VIP连接数据库,为了避免应用程序无法通过VIP访问 , 需将两个节点的bind-address参数注释掉MySQL两主四从怎么做;
2、 设置master1端自动半同步模式
Mysql的同步模式主要有如下3种:
a. 主从同步复制:数据完整性好,但是性能消耗略高;
b. 主从异步复制:性能消耗低 , 但容易出现不一致;
c. 主从半自动复制:介于上述两种之间,既保持了数据的完整性,又提高了性能;
基于上述特性 , 建议采用半自动同步模式,由于后续要配置为双主模式,因此任一节点其角色既为master又为slave , 因此相关的master/slave插件要同时配置,过程如下 。
(1) 首先查看库是否支持动态加载(默认都支持)
(2) 主从库上分别安装插件
作为主库,安装插件semisync_master.so
作为从库 , 安装插件semisync_slave.so
(3) 安装完成后,从plugin表中能够看到刚刚安装的插件
(4) 分别打开主从库半同步复制
同时添加到各自的my.cnf中,在后续数据库实例重启时自动加载该配置 。
此时查看状态还没有启动
(5) 两个节点分别启动IO进程
(6) 查看半同步状态
3、 将master1设为master2的主服务器
(1)在master1主机上创建授权账户,允许在master2主机上连接
(2)将主库master1数据导出
(3)将master.sql传输到master2上并导入
(4)在master2端将master1设置为自己的主库,并开启slave功能
在master2上查看slave状态
至此master1到master2的主从复制关系已经建立完成 。
4、 将master2设为master1的主服务器
在master1上执行
在master1上查看slave状态
1、keepalived相关概念说明:
keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障
keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议 。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议 , 即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip , master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了 。
keepalived主要有三个模块,分别是core 、check和vrrp 。core模块为keepalived的核心 , 负责主进程的启动、维护以及全局配置文件的加载和解析 。check负责 健康 检查,包括常见的各种检查方式 。vrrp模块是来实现VRRP协议的 。同时为了避免出现脑裂,应关闭防火墙或者开启防火墙但允许接收VRRP协议 。
2、keepalived的安装配置
(1)配置本地yum源,在master1和master2两台服务器上安装keepalived的相关依赖包Kernel-devel/openssl-devel/popt-devl等
配置指向rhel-7.5.iso的yum本地源,步骤略
注意:如不知道keepalived需要哪些依赖包,可到下载后的源码解压目录下查看INSTALL 文件内容,安装需要的依赖包,源码安装任何一个软件都要养成查看源码包文档的习惯,比如INSTALL,README,doc等文档,可以获得很多有用的信息 。
(2)在两台mysql上解压缩并编译安装keepalived
(3)master1、master2上分别配置keepalived.conf
注意上图红色字体中两个节点配置相同处及差异 。
说明:keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域:
· global_defs:主要是配置故障发生时的通知对象以及机器标识 。
· vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性 。
· virtual_server:虚拟服务器定义
(4)同时两个节点上都需要添加检测脚本
作用:是当mysql停止工作时自动关闭本机的keeplived服务,从而实现将故障主机踢出热备组,因每台机器上keepalived只添加了本机为realserver , 所以当mysqld正常启动后,我们还需要手动启动keepalived服务 。
(5)分别启动两个节点的keepalived服务
检查两个节点keepalived启动进程
检查两个节点的vip挂载情况
(6)主备机故障切换测试
停止master2的mysql服务,看keepalived 健康 检查程序是否会触发脚本,自动进行故障切换,步骤略
查看master1节点的VIP挂载情况,验证是否实现了自动切换,步骤略
说明在master2服务器的mysql服务发生故障时,触发了脚本,自动完成了切换 。
(7)现在我们把master2的mysql服务开起来,并且keepalived的服务也需要启动 。
即便master2的mysql服务和keepalived服务都重新开启了,master1仍然是主master了,master2未对主master的权利进行抢夺,说明设置的nopreempt参数生效了,为了保证群集的稳定性,生产环境不允许抢占配置,只有当master1的mysql服务坏掉的时候,master2才会再次成为主master,否则它永远只能当master1的备份 。(注:nopreempt一般是在优先级高的mysql上设置)
Sysbench是一个模块化的、跨平台、多线程基准测试工具,可用于评估数据库负载情况,通过sysbench命令配置IP地址、端口号、用户名、密码连接到指定的数据库db1中,创建多个表,并快速插入指定条数的记录,观察主备库同步效率
(1) 下载开源工具sysbench-0.4.12.14.tar.gz,放置在相应目录下并解压
(2) 使用iso配置本地yum源并安装Sysbench如下的依赖包(步骤略):autoconf/automake/cdbs/debhelper(=9)/docbook-xml/docbook-xsl/libmysqlclient15-dev/libtool/xsltproc
(3) 编译sysbench
编辑配置文件/etc/ld.so.conf中添加mysql lib目录/mysql/app/5.7.21/lib,并执行命令ldconfig生效
(4) 执行sysbench压测
使用sysbench工具向主节点的db1数据库中创建5张表 , 并且每张表分别插入10万条记录
同时观察备机同步效率
几个重要的参数说明:
B、半自动同步模式、异步模式切换测试
(1) 检查主备同步状态,及同步参数设置
rpl_semi_sync_master_enabled参数表示启用半同步模式;
rpl_semi_sync_master_timeout参数单位为毫秒,表示主库事务等待从库返回commit成功信息超过10秒就降为异步模式,不再等待从库,等探测到从库io线程恢复后,再返回为半自动同步;
rpl_semi_sync_master_wait_no_slave参数表示事务提交后需要等待从库返回确认信息;
(2) 将slave的io线程停止
(3) 使用sysbench向master写入少量的数据,本例创建一张表,并插入10条记录 , 命令包装在1.sh测试脚本中
通过记录的时间戳发现,master在等待了slave10秒无响应,自动切换为异步模式,将数据写入本地 。
(4) Slave启动io线程,数据自动追平
至此MySQL主主复制配置完成 , 运行在半自动同步模式,通过keepalived实现Mysql的HA高可用 。
上线后应符合统一的标准监控策略,添加备份协议对数据进行周期备份并保存到带库中 , 以及定期的数据恢复测试 。
由于是靠keepalived实现的高可用,还应将如下资源添加到监控管理平台:
1、 对每台数据库主机的3个keepalived进程进行监控;
2、 对主备节点的io线程、sql线程工作状态进行监控;
MySQL Mycat 分布式架构 参考:
图中是两组分片,红色我们称为shard1,蓝色我们称为shard2
51 52是服务器
两个3307互为主从(双主),3309是本地3307的从库
说明:没有明确说明是只在某一个节点上做的,就是两个节点都做
两台虚拟机 db01 db02
每台创建四个mysql实例:3307 3308 3309 3310
mysql软件我们之前已完成二进制安装,直接初始化即可
我们server-id规划为:db01上是7/8/9/10,db02上是17/18/19/20
"箭头指向谁是主库"
10.0.0.51:3307-----10.0.0.52:3307
10.0.0.51:3309------10.0.0.51:3307
10.0.0.52:3309------10.0.0.52:3307
两个分片,每个分片四个mysql节点
shard1:
Master:10.0.0.51:3307
slave1:10.0.0.51:3309
Standby Master:10.0.0.52:3307
slave2:10.0.0.52:3309
shard2:
Master:10.0.0.52:3308
slave1:10.0.0.52:3310
Standby Master:10.0.0.51:3308
slave2:10.0.0.51:3310
shard1
10.0.0.51:3307 ----- 10.0.0.52:3307
db02
db01
db02
10.0.0.51:3309 ------ 10.0.0.51:3307
db01
10.0.0.52:3309 ------ 10.0.0.52:3307
db02
shard2
10.0.0.52:3308 ----- 10.0.0.51:3308
db01
db02
db01
10.0.0.52:3310 ----- 10.0.0.52:3308
db02
10.0.0.51:3310 ----- 10.0.0.51:3308
db01
这个复制用户在谁上建都行
注:如果中间出现错误 , 在每个节点进行执行以下命令
常见方案:
360 Atlas-Sharding360
Alibabacobar阿里
Mycat开源
TDDL淘宝
Heisenberg百度
Oceanus58同城
Vitess谷歌
OneProxy
DRDS阿里云
我们装的是openjdk,不是官方的那个
Mycat-server-xxxxx.linux.tar.gz
配置环境变量
我们mycat的命令也是在bin目录下
启动
8066就是对外提供服务的端口,9066是管理端口
连接mycat:
默认123456
db01:
我们一般先把原schema.xml备份,然后自己新写一个:
xml和html看起来差不多,xml是从下往上调用的
前三行我们不用看,直接从第四行schema开始看起:
定义了schema,然后以/schema结尾
为什么要用逻辑库?
业务透明化
此配置文件就是实现读写分离的配置
重启mycat
读写分离测试
总结:
以上案例实现了1主1从的读写分离功能,写操作落到主库,读操作落到从库.如果主库宕机,从库不能在继续提供服务了 。
我们推荐这种架构
一写三读,
不设置双写的原因是:性能没提升多少,反而引起主键冲突的情况
配置文件:
之后重启:mycat restart
真正的 writehost:负责写操作的writehost
standbywriteHost:和readhost一样,只提供读服务
我们此处写了两个writehost , 默认使用第一个
当写节点宕机后 , 后面跟的readhost也不提供服务 , 这时候standby的writehost就提供写服务,
后面跟的readhost提供读服务
测试:
读写分离测试
对db01 3307节点进行关闭和启动,测试读写操作
结果应为另一台(52)的3307(17)是写,3309(19)是读
一旦7号节点恢复,此时因为7落后了 , 写节点仍是17
balance属性
负载均衡类型,目前的取值有3种:
writeType属性
负载均衡类型,目前的取值有2种:
switchType属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status
datahost其他配置
dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql"dbDriver="native" switchType="1"
maxCon="1000":最大的并发连接数
minCon="10" :mycat在启动之后 , 会在后端节点上自动开启的连接线程,长连接,好处是连接速度快,弊端是占内存
tempReadHostAvailable="1"
这个一主一从时(1个writehost,1个readhost时) , 可以开启这个参数,如果2个writehost,2个readhost时
heartbeatselect user()/heartbeat监测心跳
其他参数sqlMaxLimit自动分页,必须在启用分表的情况下才生效
创建测试库和表:
我们重启mycat后连接到8066
发现跟一个库一样,实际上已经分到不同的物理硬件上了
分片:对一个"bigtable",比如说t3表
热点数据表 核心表
(1)行数非常多,800w下坡
(2)访问非常频繁
分片的目的:
(1)将大数据量进行分布存储
(2)提供均衡的访问路由
分片策略:
范围 range800w1-400w 400w01-800w 不适用于业务访问不均匀的情况
取模 mod(取余数) 和节点的数量进行取模
枚举按枚举的种类分,如移动项目按省份分
哈希 hash
时间 流水
优化关联查询(否则join的表在不同分片上 , 效率会比单库还要低)
全局表
ER分片
案例:移动统一:先拆出边缘业务,再按地域分片,但对应用来说是统一的
vim rule.xml
tableRule name="auto-sharding-long"
rule
columnsid/columns
algorithmrang-long/algorithm
/rule
function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong"
property name="mapFile"autopartition-long.txt/property
/function
===================================
vim autopartition-long.txt
0-10=0
11-20=1
创建测试表:
mysql -S /data/3307/mysql.sock -e "use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock-e "use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);"
测试:
重启mycat
mycat restart
mysql -uroot -p123456 -h 127.0.0.1 -P 8066
insert into t3(id,name) values(1,'a');
insert into t3(id,name) values(2,'b');
insert into t3(id,name) values(3,'c');
insert into t3(id,name) values(4,'d');
insert into t3(id,name) values(11,'aa');
insert into t3(id,name) values(12,'bb');
insert into t3(id,name) values(13,'cc');
insert into t3(id,name) values(14,'dd');
取余分片方式:分片键(一个列)与节点数量进行取余,得到余数,将数据写入对应节点
vim schema.xml
table name="t4" dataNode="sh1,sh2" rule="mod-long" /
vim rule.xml
property name="count"2/property
准备测试环境
创建测试表:
mysql -S /data/3307/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"
重启mycat
mycat restart
测试:
mysql -uroot -p123456 -h10.0.0.52 -P8066
use TESTDB
insert into t4(id,name) values(1,'a');
insert into t4(id,name) values(2,'b');
insert into t4(id,name) values(3,'c');
insert into t4(id,name) values(4,'d');
分别登录后端节点查询数据
mysql -S /data/3307/mysql.sock
use taobao
select * from t4;
mysql -S /data/3308/mysql.sock
use taobao
select * from t4;
t5 表
id name telnum
1bj1212
2sh22222
3bj3333
4sh44444
5bj5555
sharding-by-intfile
vim schema.xml
table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" /
vim rule.xml
tableRule name="sharding-by-intfile"
rule columnsname/columns
algorithmhash-int/algorithm
/rule
/tableRule
function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"
property name="mapFile"partition-hash-int.txt/property
property name="type"1/property
property name="defaultNode"0/property
/function
partition-hash-int.txt 配置:
bj=0
sh=1
DEFAULT_NODE=1
columns 标识将要分片的表字段 , algorithm 分片函数 , 其中分片函数配置中 , mapFile标识配置文件名称
准备测试环境
mysql -S /data/3307/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"
重启mycat
mycat restart
mysql -uroot -p123456 -h10.0.0.51 -P8066
use TESTDB
insert into t5(id,name) values(1,'bj');
insert into t5(id,name) values(2,'sh');
insert into t5(id,name) values(3,'bj');
insert into t5(id,name) values(4,'sh');
insert into t5(id,name) values(5,'tj');
abcd
join
t
selectt1.name,t.xfromt1
join t
selectt2.name,t.xfromt2
join t
selectt3.name,t.xfromt3
join t
使用场景:
如果你的业务中有些数据类似于数据字典,比如配置文件的配置,
常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,
而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表 , 无须对数据进行切分,
要在所有的分片上保存一份数据即可 , Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,
避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据 。
vim schema.xml
table name="t_area" primaryKey="id"type="global" dataNode="sh1,sh2" /
后端数据准备
mysql -S /data/3307/mysql.sock
use taobao
create table t_area (id int not null primary key auto_increment,name varchar(20) not null);
mysql -S /data/3308/mysql.sock
use taobao
create table t_area(id int not null primary key auto_increment,name varchar(20) not null);
重启mycat
mycat restart
测试:
mysql -uroot -p123456 -h10.0.0.52 -P8066
use TESTDB
insert into t_area(id,name) values(1,'a');
insert into t_area(id,name) values(2,'b');
insert into t_area(id,name) values(3,'c');
insert into t_area(id,name) values(4,'d');
A
join
B
为了防止跨分片join , 可以使用E-R模式
AjoinB
ona.xx=b.yy
join C
on A.id=C.id
table name="A" dataNode="sh1,sh2" rule="mod-long"
childTable name="B" joinKey="yy" parentKey="xx" /
/table
如何设计mysql 的主从关系MySQL主从关系设置
一MySQL两主四从怎么做,概要
1.这个文档主要实现的是MYSQL主从备份(主机数据库任何修改,备份机器都会有实现)
2.但是有个问题,就是如果对备份机器数据库进行操作 , 可能会导致连接失败 。
二,准备工作
1.可以是多台主机和从机 , 在这里我只用一台主机和从机为例讲解主从关系配置 。2.主机IP:192.168.0.100(例子)从机IP:192.168.0.101(例子)3.主机和从机的IP地址必须是一个网段的 。
4.MySQL版本:mysql-5.5.15-win32.msi安装路径:D:\MySQL\(例子)5.其MySQL两主四从怎么做他相关软件:
①.MySQL管理客户端:Navicat8forMySQL(Windows) 。
②.编辑工具:Notepad(建议用此编辑工具修改MySQL配置文件 , 点击此链接进入下载
页面)
三,配置主机【master】(IP:192.168.0.100)
1.在命令行窗口中执行:netstopmysql关闭mysql服务 。
2.在mysql安装路径下找到配置文件my.ini文件(Linux下是文件my.cnf) , 一般都在MySQL安装目录下,本实验中在D:\MySQL\下 。记得先备份以下原来的配置文件 。并用Notepad打开 。然后在文件末尾加入下面的代码:
server-id=1#配一个唯一的ID编号
log-bin=NEW_NAME#指定日志类型
binlog-do-db=bojinv2#设置要进行主从复制的数据库名 , 同时也要在从机
【Slave】上设定(同步多个另起一行输入这行代码)
Binlog-ignore-db=mysql#设置不要进行主从复制的数据库名,同时也要在
【Slave】上设定(不同步多个另起一行输入这行代码
即可 。)
3.在系统管理命令窗口输入:netstartmysql按回车启动mysql服务
4.在MySQL5.5CommandLineClient命令窗口(路径:开始菜单》程序》MySQL下),
输入数据库密码:******回车,如下图所示:
然后输入:grantreplicationslaveon*.*toslaveuser@从机IP(例:192.168.1.101)identifiedby'从机数据库密码(例:123456)'回车后如下图所示:
var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;
出现这样的提示后 , 继续输入:flushprivileges;按回车,如下图所示:
出现这样的提示后,继续输入:showmasterstatus;按回车,如下图所示:
记住出现的表格中的File列和Position的值 。
5.在系统管理命令窗口输入:netstopmysql按回车关闭mysql服务
6.进入MySQL管理客户端:Navicat8forMySQL(Windows) 。点击菜单栏用户,右侧显示你
刚才创建slaveuser@192.168.1.101的用户,选中该用户 。点击编辑用户链接 。弹出窗口 , 再
选择权限,将所有权限都选上保存,这样主机就配置好了 。重启一下MySQL服务 。
四 , 配置从机【slave】(Ip:192.168.1.101)
1.在命令行窗口中执行:netstopmysql关闭mysql服务 。
2.在mysql安装路径下找到配置文件my.ini文件(Linux下是文件my.cnf),一般都
在MySQL安装目录下 , 本实验中在D:\MySQL\下 。记得先备份以下
原来的配置文件 。并用Notepad打开 。然后在文件末尾加入下面的代
码:
server-id=2#配一个唯一的ID编号,不能与主机和其MySQL两主四从怎么做他的从机相同
replicate-do-db=bojinv2#设置要进行主从复制的数据库名,数据库名与主机
相同
replicate-ignore-db=mysql#设置不要进行主从复制的数据库名 , 数据库名与
主机相同
别忘了保存修改后的文件 。
3.在系统管理命令窗口输入:netstartmysql按回车启动mysql服务
4.在MySQL5.5CommandLineClient命令窗口(路径:开始菜单》程序》MySQL下),
输入数据库密码 , 按回车成功登录数据库 。5.登录成功后,在该命令窗口输入:
Changemastertomaster_host='主机IP(192.168.1.100)',master_user='
如何使用mysql 主从服务器一. 准备服务器
准备两台主机,分别安装好Mysql (要相同版本),确定版本无误,确保mysql服务正常启动,确保两台主机处于同一个局域网中,确定好哪台做为主、备机器,假设A为主机,B为备机,假设:
A主机IP地址为:172.16.16.90 端口3306
B主机IP地址为: 172.16.99.98 端口3306
二. Mysql建立主-从服务器热备配置步骤
1. 创建同步用户
进入MySql操作界面,在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICATION SLAVE权限 。
操作指令如下:
1) grant select,replication slave on *.* to 'replicate'@'172.16.99.98' identified by '1234567';
2) flush privileges;
2. 修改Mysql配置
如果上面的准备工作做好,就可以进行对Mysql配置文件进行修改了,首先找到主服务器Mysql安装文件所有在目录,找到my.ini文件用记事本打开 。在[mysqld]下增加如下内容:
server-id = 1
log-bin=mysql-bin
binlog-do-db =test#需要备份的数据库,多个写多行
binlog-ignore-db = mysql#不需要备份的数据库,多个写多行
3. 重启mysql服务
修改完配置文件保存后,重启一下mysql服务 。
4. 查看主服务器状态
进入A服务器Mysql 客户端输入命令
1)Show master STATUS;
2)返回结果如下:
注意看里面的参数,特别前面两个File和Position,在从服务器(Slave)配置主从关系会有用到的 。
5. 从服务器Slave配置修改配置文件
因为这里面是以主-从方式实现mysql双机热备的 , 所以在从服务器就不用在建立同步帐户了,直接打开配置文件my.ini进行修改即可,道理还是同修改主服务器上的一样,只不过需要修改的参数不一样 。
如下:
[mysqld]
server-id = 2
log-bin=mysql-bin
replicate-do-db = test
replicate-ignore-db =mysql
6. 重启mysql服务
修改完配置文件保存后,重启一下mysql服务 。
7. 配置从服务器
先停止slave服务线程,这个是很重要的,如果不这样做会造成下面操作不成功,再用change mster 语句指定同步位置 , 操作如下:
1) stop slave;
2) change master to master_host='172.16.16.90',
master_user='replicate',master_password='1234567',master_port=3306,
master_log_file='mysql-bin.000001',master_log_pos=98;
3) start slave
4) show slave status
查看下面两项值均为Yes,即表示设置从服务器成功 。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MySQL两主四从怎么做的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于不同职业类型的培训应该如何开展、MySQL两主四从怎么做的信息别忘了在本站进行查找喔 。

    推荐阅读