Mycat+Mysql主从复制实现双机热备

一、mysql主从配置原理

  1. 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库中的数据一致。 这样做有如下几点好处: 1. 可以做灾备,其中一个坏了可以切换到另一个。 2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。 对于异地热备,尤其适合灾备。 二、mysql 主从备份工作原理 简单的说就是把 一个服务器上执行过的sql语句在别的服务器上也重复执行一遍, 这样只要两个数据库的初态是一样的,那么它们就能一直同步。当然这种复制和重复都是mysql自动实现的,我们只需要配置即可

  2. 上图中有两个服务器,演示了从一个主服务器(master)把数据同步到从服务器(slave)的过程。 对于一个mysql服务器,一般有两个线程来负责复制和被复制。当开启复制这个开关之后(start slave) 1. 作为主服务器Master,会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log,然后在自己那里再执行一遍。) 2. 作为从服务器Slave,会用master上的账号登陆到master上,去读取master的Binarylog, 然后写入到自己的中继日志Relaylog,然后自己的sql线程会负责读取这个中继日志,并执行一遍。到这里主服务器上的更改就同步到从服务器上了。 在mysql上可以查看当前服务器的主,从状态。 其实就是当前服务器的 Binary(作为主服务器角色)状态和位置。以及其RelayLog(作为从服务器)的复制进度。

一台机器上实现双主热备

mysql主从架构搭建

链接地址:

Mysql双主热备架构搭建

mysql主从架构搭建

背景知识:

  1. 主从这个架构可以实现数据备份,数据在多个服务器上分布等等,当然最主要的优点是可以实现负载均衡,将写操作交给主节点,读操作交给从节点。

  2. mysql官网有很多版本,例如Enterprise(企业版需要付费,当然可以试用30天),Community(社区版,开源但是官方不提供技术支持),当然我们常用的也是社区版,本文是基于社区版的。

  3. mysql的安装也有源码安装和二进制免安装等等方法,本文的mysql是通过二进制免安装的方式安装的

  4. 本文使用的环境是centos

  5. mysql版本:mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz

  6. 在/data目录解压两份mysql 修改mysql的端口为3307 3308

  7. 首先下载二进制免安装版的mysql:mysql社区版下载,进入社区版下载页后选择 MySQL Community Server (GPL),选择要下载的mysql版本:

我这里使用的是mysql5.7这个版本,点击之后,选择如下:

嫌麻烦的小伙伴可以直接运行下面的命令安装:

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
  1. 下载好之后解压重命名为mysql-3306然后复制一份,重命名为mysql-3307,我们将3306当作主节点,3307当作从节点:

#解压 tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz #重命名 mv mysql-5.7.25-linux-glibc2.12-x86_64 mysql #复制一份 cp -r mysql mysql3308

  1. 创建几个目录,data,logs,config,sockets,用来管理mysql的相关文件:

    mkdir data logs config sockets

  2. 进入config目录,创建3307.conf以及3308.conf两个文件,文件的内容如下:

    #3307.conf配置文件内容如下:

[mysqld]
user=root
character-set-server=utf8
port=3307
socket=/data/mysql/sockets/3307.sock
basedir=/data/mysql
datadir=/data/mysql/data/3307
server-id=2
log-bin=master-bin
binlog_format=ROW
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
relay-log=relay-log-bin
replicate-do-db=humy
replicate-do-db=usemp
#设置从节点只读,注意如果是超级管理登录从节点仍然是可以写的,该配置只对普通用户有效
read_only=1
#设置relay-log的路径和名称,如果不设置的话,默认路径是datadir设置的路径,默认文件名是:当前主机名-relay-log
relay-log=relay-log-bin

[mysqld_safe]
log-error=/data/mysql/logs/3306.log #错误日志

#3308.conf配置文件内容如下

[mysqld]
user=root #设置mysql的启动用户,我这里直接使用root,读者可以创建用户组和用户指定操作
character-set-server=utf8
port=3308
socket=/data/mysql3308/sockets/3308.sock #设置套字节(/root/mysql/sockets为刚刚创建的sockets的路径,3306.sock可以随意命名,下面的data,logs也是如此)
basedir=/data/mysql3308 #mysql-3306所在的位置
datadir=/data/mysql3308/data/3308 #设置mysql的数据存放目录(也是bin_log的存放的地方)
server-id=1 #唯一标识,每台mysql服务器必须唯一
log-bin=master-bin #开启bin-log并将此值作为二进制文件名的前缀
binlog_format=ROW #设置binlog的格式,主要有STATEMENT,ROW,FIXED
#设置不需要同步给从节点的数据库
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
replicate-do-db=humy
replicate-do-db=usemp
[mysqld_safe]
log-error=/root/mysql3308/logs/3308.log #错误日志
  1. 接下来让我们开启mysql服务:

#进入mysql的bin目录,执行如下操作进行初始化
#-insecure的作用是不设置密码,如果省略的话mysql会生成一个随机密码
./mysqld --defaults-file=/data/mysql/config/3307.conf --initialize-insecure
#之后再执行如下命令启动
./mysqld --defaults-file=/data/mysql/config/3307.conf
  1. 可能有读者在启动mysql服务器的时候会报:error while loading shared libraries: libaio.so,运行如下命令安装即可:

yum install libaio
  1. 连接3307主mysq服务器:

    #进入mysql的bin目录运行如下命令:
    #--socket的值就是我们在mysql配置文件中配置的socket值
    ./mysql -uroot --socket=/data/mysql/sockets/3307.sock

    #同理连接3307的mysql服务器
  1. 执行如下命令查看master状态并进行重置:

show master status;
reset master;

  1. 在主服务器上设置一个用户用于从服务器从主服务器中复制数据时使用:

#创建用户
create user 'salve' identified by '666666';
#赋予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'salve'@'%';

#命令解释
create user 用户名 identified by '密码';
grant 权限 on 数据库名.表名 to '用户名'@'域名';

*表示所有,*.*表示所有的数据库和数据库中的表
'%'所有本地和远程都可以
localhost 本地
ip地址 指定ip登录
  1. 以上操作没有问题之后,我们连接3307服务器进行从节点的配置:

#首先关闭
stop slave;
#参数配置
change master to
master_host='127.0.0.1', #主从服务的地址
master_port=3306, #主服务器的端口
master_user='slave', #用于从复制的用户名,即第九步创建的
master_password='666666', #密码
master_log_file='master-bin.000001', #主服务器的binlog日志名称,查看第八步
master_log_pos=597; #偏移量
#开启
start slave;

至此我们的mysql主从架构已经搭建完成。小伙伴可以自行测试,在master节点写入的数据是否会同步到slave节点.

总结:

  1. 一般主从架构从节点是不需要开启binlog日志的,首先因为从节点是只读的开启binlog日志也没用,因为binlog日志记录的是修改事件,其次从节点从relay-log中读取主节点的修改事件时也不会将修改事件同步到自己的binlog中。因此从节点开启binlog是没有用。

  2. 双主热备的关键参数就是:log_salve_updates

  3. 双主热备其实就是两台mysql服务器互为主从关系。为了实现高可用,可以在两台互为主从关系的服务器下面再配置若干个从节点。

  4. 关于reset master 和 reset slave语句的区别和注意事项:传送门

    注意:

    1. 设置mysql远程访问

      #修改mysql 允许远程访问
      use mysql;
      update user set host = '%' where user = 'root';
    2. 如上操作,可能导致mysql的root用户无初始密码,按以下步骤解决:

      #命令行连接mysql终端
      ./bin/mysql -uroot --socket=/data/mysql3307/sockets/3307.sock
      #修改root的密码
      update mysql.user set authentication_string = password('123456') where user='root';
    3. 使用如下命令登录终端

       ./bin/mysql -h192.168.1.2 -P3307 -uroot -p123456

二、mycat结合双主复制实现读写分离模式

简介:

应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制。

链接:mycat结合双主复制实现读写分离模式

mycat安装

注意:

在安装mycat之前首确定已经安装了java

Mycat官网 下载Mycat安装包:Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz

#解压
tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz

修改schema.xml的配置文件

  • balance="1": 全部的readHost与stand by writeHost参与select语句的负载均衡。

  • writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。

  • switchType="1": 1 默认值,自动切换。

修改/conf/server.xml 和 /conf/schema.xml

server.xml修改内容如下

 <user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB,TESTDBT</property> <!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
<schema name="TESTDBT" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user> <user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB,TESTDBT</property>
<property name="readOnly">true</property>
</user>

schema.xml内容如下

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema> <schema name="TESTDBT" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2">
</schema> <dataNode name="dn1" dataHost="node1" database="humy" />
<dataNode name="dn2" dataHost="node1" database="usemp" /> <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.1.186:3307" user="root" password="123456">
<readHost host="slave2" url="192.168.1.186:3307" user="root" password="123456" />
</writeHost>
<writeHost host="master2" url="192.168.1.186:3308" user="root" password="123456">
<readHost host="slave2" url="192.168.1.186:3308" user="root" password="123456" />
</writeHost>
</dataHost> </mycat:schema>

启动mycat服务

./bin/mycat start

启动:./bin/mycat start

状态: ./bin/mycat status

使用mysql的客户端连接mycat

cd /data/app/mysql/
./bin/mysql -uroot -p 8066 -h 192.168.1.186 ##连接mycat,初始密码123456
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
| TESTDBT |
+----------+
2 rows in set (0.00 sec)

使用Navicat Premium连接mycat

通过mycat添加数据 可以实现配置中的数据库的数据同步。

每次开机都要启动mycat,网上看了好多都是用shell脚本来实现mycat开机自启动,后来看到一种方法,直接修改系统文件来实现,已经实践过,方法有效。

1.修改脚本文件rc.local:vim /etc/rc.d/rc.local

  这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令

2.添加如下内容:

export JAVA_HOME=/opt/jdk1.8.0_65
/usr/local/mycat/bin/mycat start

3.esc 退出编辑,:wq 保存修改

4.将rc.local修改为可执行

  

chmod 777 /etc/rc.d/rc.local

Mycat+Mysql主从复制实现双机热备的更多相关文章

  1. MySQL 5.6 双机热备windows7

    MySQL 5.6 双机热备 目录: 1.说明 2.数据手工同步 3.修改主数据库配置文件 4.修改从数据库配置文件 5.主数据库添加备份用户 6.从数据库设置为Slave 7.验证 1.说明 1)数 ...

  2. MySQL 5.6 双机热备

    目录: 1.说明 2.数据手工同步 3.修改主数据库配置文件 4.修改从数据库配置文件 5.主数据库添加备份用户 6.从数据库设置为Slave 7.验证 1.说明   1)数据库版本要高于5.1 2) ...

  3. Mysql 如何做双机热备和负载均衡 (方法二)

    先简要介绍一下mysql双向热备:mysql从3.23.15版本以后提供数据库复制功能.利用该功能可以实现两个数据库同步,主从模式(A->B),互相备份模式(A<=>B)的功能. m ...

  4. Mysql 如何做双机热备和负载均衡

    MySQL数据库没有增量备份的机制,但它提供了一种主从备份的机制,就是把主数据库的所有的数据同时写到备份数据库中.实现MySQL数据库的热备份. 下面是具体的主从热备份的步骤:假设主服务器A(mast ...

  5. Mysql 如何做双机热备和负载均衡 (方法一)

    MySQL数据库没有增量备份的机制,但它提供了一种主从备份的机制,就是把主数据库的所有的数据同时写到备份数据库中.实现MySQL数据库的热备份. 下面是具体的主从热备份的步骤:假设主服务器A(mast ...

  6. MySQL主从复制,以及双机热备

    MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...

  7. MySQL数据库配置主从服务器实现双机热备

    转自:http://www.cnblogs.com/cchun/p/3712637.html 一.安装MySQL 说明:在两台MySQL服务器192.168.21.169和192.168.21.168 ...

  8. Mysql双机热备--预备知识

    1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说. 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务.当一台服务器 ...

  9. MySQL7.5.15数据库配置主从服务器实现双机热备实例教程

    环境说明 程序在:Web服务器192.168.0.57上面 数据库在:MySQL服务器192.168.0.67上面 实现目的:增加一台MySQL备份服务器(192.168.0.68),做为MySQL服 ...

随机推荐

  1. marquee跑马灯效果的相关属性

    介绍HTML设置滚动文字marquee的相关属性 ㈠文字滚动标签 设置文字滚动使用<marquee></marquee>标签,可以再标签里面设置字体的颜色,字号,字体大小等. ...

  2. 好多坑的升级 phpStudy 中 MySQL 版本至 5.7.17

      由于本地用的集成环境是 phpStudy 2016,没有找到升级 MySQL 版本的选项,所以自己升级一下. 从官网上下载高版本的 MySQL :https://dev.mysql.com/dow ...

  3. 修改 mvc webapi 默认返回 json 格式

    web api 默认的已 xml 格式返回数据 现在开发一般都是以 json 格式为主 下面配置让 webapi 默认返回 json ,在需要返回 xml 时只需要加一个查询参数 datatype=x ...

  4. UOJ #460. 新年的拯救计划 神仙题+构造

    对于这个神仙题,我还能说什么~ 第一个答案=$n/2$ 还是比较好猜的. 对于构造这个树,大概就是先从 $1$ 号节点向 $n/2$ 距离以内都连一条边,再在第 $n/2$ 个节点进行这个操作,然后从 ...

  5. 对象转JSON字符串与json字符串转对象方法

    JSON.stringify()[从一个对象中解析出字符串] JSON.parse()[从一个json字符串中解析出对象] var data = {"nums": 1, " ...

  6. 第七周学习总结&JAVA实验五报告。

    JAVA实验报告五: 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 J ...

  7. ffmpeg剪切视频

    测试的时候需要用到视频,原片太大了,就剪切几分钟来测试 ffmpeg -i input.mp4 -ss 0 -t 300 -acodec copy -vcodec copy -scodec copy ...

  8. 【剑指offer38】字符串的排列

    如果没有要求字典序排序,则直接采用递归的思想,将字符串的排列看成两步,第一步,交换第一个字母和任意一个字母(包括自己,但不包括和自己相等的其他字母)固定第一个字母,固定第一个字母,然后对后面的字符串也 ...

  9. assert断言用法

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  10. 浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Event 对象

    ylbtech-浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Event 对象 1.返回顶部 1. HTML DOM Event 对象 实例 哪个鼠标按钮被点击 ...