mysql主从技术_MySQL主从架构的实现

目录

一主一从

1.1 环境准备:

1.2 准备步骤:

1.3 实现步骤:

1.3.1 配置master主服务器

1.3.2 创建复制帐号

1.3.3 查看主服务器状态

1.3.4 配置slave从服务器

1.3.5 启动从服务器复制线程

1.3.6 查看从服务器状态

1.3.7 测试

1.4 扩展——实现一主多从

1.4.1 需求分析

1.4.2 具体实现过程

1.5 扩展——实现半同步复制

1.5.1 三种复制方式

1.5.2 实现半同步复制

互为主从(双主)

2.1 环境准备:

2.2 准备步骤:

2.3 实现步骤:

2.3.1 配置第一台 master 主服务器

2.3.2 配置第二台 master 主服务器

2.3.3 创建复制账号

2.3.4 查看服务器状态

2.3.5 启动复制线程

2.3.5 测试

高可用架构MHA的实现

正文

一主一从

1.1 环境准备:

CentOS系统服务器2台、 一台用户做MySQL主服务器, 一台用于做MySQL从服务器, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信。

1.2 准备步骤:

1)iptables -F && setenforce 清空防火墙策略,关闭selinux

2)拿两台服务器都使用yum方式安装Mysql服务, 要求版本一致

3)分别启动两台服务器mysql服务, 确保服务正常

架构图:

95b9db80c2f8d19f80982320ca38a71a.png

1.3 实现步骤:

1.3.1 配置master主服务器

对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值

server-id=1      //配置server-id,让主服务器有唯一ID号

log-bin=mysql-bin  //打开Mysql日志,日志格式为二进制

skip-name-resolve  //关闭名称解析,(非必须)

b857899ed32cc3da63c3c968386bffb9.png

1.3.2 创建复制帐号

在 Master 的数据库中建立一个备份帐户:每个 slave 使用标准的 MySQL 用户名和密码连接 master 。进行复制操作的用户会授予 REPLICATION SLAVE 权限。

MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';

1.3.3 查看主服务器状态

在 Master 的数据库执行 show master status,查看主服务器二进制日志状态及位置号。

b9edb8bfc51c831c152c771e88102ea2.png

1.3.4 配置slave从服务器

对 slave 进行配置,打开中继日志,指定唯一的 servr ID,设置只读权限。在配置文件加入如下值:

server-id=2 //配置server-id,让从服务器有唯一ID号

relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制

read_only = 1 //设置只读权限

log_bin = mysql-bin //开启从服务器二进制日志

log_slave_updates = 1 //使得更新的数据写进二进制日志中

208c735bdd12c5b21c18b6ac4574faac.png

1.3.5 启动从服务器复制线程

让 slave 连接 master ,并开始重做 master 二进制日志中的事件。

MariaDB [(none)]> change master to master_host='192.168.37.111',

>master_user='slave',

>master_password='keer',

>master_log_file='mysql-bin.000001',

>master_log_pos=413;

执行start slave;,来启动复制线程。

1.3.6 查看从服务器状态

可使用SHOW SLAVE STATUS\G;查看从服务器状态,如下所示,也可用show processlist \G;查看当前复制状态:

Slave_IO_Running: Yes //IO线程正常运行

Slave_SQL_Running: Yes //SQL线程正常运行

5fecd44ff7c6d8d3be4960d0d8d28da4.png

1.3.7 测试

1)测试主从同步

我们在 master 服务器上创建一个数据库,再使用该数据库创建一个表,添加一条记录,来看一看 slave 服务器有没有同步成功。

首先,我们先来查看一下两个服务器上有什么数据库:

master:

9c1bc6dc847355df7a140f150699d8bb.png

slave:

b98f4ede52eaacada27362f38c2f2a21.png

现在,我们在主服务器上创建一个数据库“keer”:

872ae50970892dbd50e02ec66aed713a.png

然后,我们来看看从服务器是否已经更新:

700de14a5e7ab76d32ff68b51cc6c3ae.png

我们可以看出,数据库已经同步,接下来,我们就来创建表,并在表中插入一条记录:

4d7fce1b45bc3a9e6f798834a841cff4.png

然后,我们来看看从服务器是否更新:

d0e2f18773beb168bc112ab912f2e3ba.png

2)测试只读属性

我们在从服务器上设置了只读,所以我们来试试看能不能插入数据:

a718ee3d3b35d3b5dd65d7fcd066152d.png

这就很尴尬了,为什么我们设置只读还是可以插入数据呢?这要如何解决呢?

因为我们登录的时候使用的是root超级用户,这个大变态是不受只读设置影响的,所以,我们还是可以往里面去插入数据,当然,如果我们换成其他的普通用户就不会出现这样的问题了。

解决方式也很简单,我们只需要把表锁起来就可以了:

MariaDB [keer]> flush tables with read lock;

进行锁表操作以后,我们再来插入一条数据:

b650605acfa9f5bc802d04355346a5dd.png

这样的话,即使我们是超级用户登录进来的,也不能再插入数据了。这样会安全很多。但是,有利就有弊,这样的话,我们的主从就不能实时同步了,因为我们的主从同步是通过把主上的 sql 语句放在从上再执行一遍来实现的,可是我们锁表的话,sql 语句就不能执行了。想要同步方法也很简单,直接把表解锁就可以了。

我们在主上插入一条数据:

15596962324915941b88a7fb60803e92.png

此时,我们的从上就要解表以后才能实现同步:

8bd84da06b475d79a9a6c93895a0e69c.png

1.4 扩展——实现一主多从

1.4.1 需求分析

当我们的服务器运行一段时间后,流量变得越来越多,这时,一主一从能够实现的高可用性和负载均衡不能满足我们的需求,我们就要选择再添加一台从服务器。

可是现在我们的 master 已经运行很久了,我们也需要对新安装的 slave 进行数据同步,甚至它没有 master 的数据。

此时,有几种方法可以使 slave 从另一个服务开始,例如,从 master 拷贝数据,从另一个 slave 克隆,从最近的备份开始一个 slave 。为了加快 slave 与 master 同步,可用以下方式先进行数据同步:

(1)master的某个时刻的数据快照;

(2)数据库的备份数据;

(3)master的二进制日志文件。

架构图:

e8ef2b623646543bd9e7455bb02b6a0d.png

接下来,我们就来实现一下这个过程:

1.4.2 具体实现过程

1)对 master 进行完全备份

[root@master ~]# mkdir /backup

[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql

照例查看一下主的二进制日志状态及位置号。

3a3ddd6ed118ede3f1a503fb8633055b.png

2)把完全备份的数据发到新增的从上

[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~

root@192.168.37.133's password:

mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00

3)把这个完全备份导入从的数据库:

fbe1f74c206696354f6d05a636856b1c.png

4)查看从是否恢复成功:

612013b136a95be282f55fc856464edb.png

efb49d10b85834e0431ecbd81b0ebf61.png

我们来查看一下从的二进制日志状态及位置号:

5b643bf64abefe326d83f5da71a58a02.png

我们的数据已经恢复成功

5)设置主从

接下来就是按照上述步���,对该从服务器进行设置就好:

[root@slave2 ~]# vim /etc/my.cnf

[mysqld]

server-id = 3

relay-log = mysql-relay-bin

read-only = 1

log-bin = mysql-bin

log-slave-updates = 1

然后,我们就来设置从服务器:

[root@slave2 ~]# mysql -uroot -p

Enter password:

MariaDB [(none)]> change master to master_host='192.168.37.111',

>master_user='slave',

>master_password='keer',

>master_log_file='mysql-bin.000001',

>master_log_pos=330;

MariaDB [(none)]> start slave;

然后我们来查看一下从服务器的状态:

e2728f3019a2f245bcd2126913e1889e.png

6)测试

设置完毕,我们来测试一下,当主上有操作时,从上是否更新:

d472b13949bee7b7917892127fab96f2.png

f9be0f78d33229506145c6ef1cc0946c.png

至此,我们就完成了一主两从。如果有需要,我们还可以继续添加从服务器。

1.5 扩展——实现半同步复制

1.5.1 三种复制方式

1)同步复制

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。需要有超时时间。

2)异步复制

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

3)半同步复制

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

1.5.2 实现半同步复制

半同步复制是基于特定的模块来实现。不过非常 nice 的一点就是,在我们的 mariadb5.5 以上的版本默认是带有这个模块的。

如果我们的 centos7 上安装了 mariadb ,我们就可以进入目录去查看一下:

[root@master ~]# cd /usr/lib64/mysql/plugin/

535347db5526e59f4be5714813e40bdb.png

找到我们的模块后,我们就可以通过命令来安装,然后进行简单配置即可使用了。下面就是具体方法:

master 服务器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

9f7da891589836830a1d404051a0303f.png

slave 服务器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;

MariaDB [(none)]> stop slave;

MariaDB [(none)]> start slave;

1965e18d065090a66bfb0467f8dc9c9a.png

4c5f7b7ef1eeb23904d4c7f3d67e3171.png

现在,我们的半同步复制就开启了,我们可以来查看一下日志:

[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log

从日志里也可以看出我们的半同步复制已经开启。

d24225e68f50c24798d3c967a7074789.png

以上,实验一完成。

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

C# winfrom listView

转自http://hi.baidu.com/gaoisbest/item/84034943d4d94195823ae12b 1.如何为listview手动添加第一列和第二列数据 for (int i 0; i < 10; i) { ListViewItem Item new ListViewItem(); Item.Text dt.Rows[i][1].ToString();//读取数据库中字段 Item.Tag dt.…

[教程指导]索尼官方4.0.3系统一键root方法! [复制链接]

[教程指导]索尼官方4.0.3系统一键root方法&#xff01; [复制链接] 青青子衿198976青青子衿198976注册时间2011-9-26最后登录2012-9-15在线时间730 小时阅读权限150积分3996帖子1173精华32UID13306151版主 在线时间730 小时经验1629 分贡献2693 点极币10442 极币最后登录2012-9…

python --函数

转http://www.cnblogs.com/vamei/archive/2012/06/01/2529500.html 函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数&#xff0c;以后你想实现相同的操作的时候&#xff0c;只用调用函数名就可以&#xff0c;而不需要重复敲所有的语句。 函数的定…

国外网站设计欣赏:30个优秀的国外咖啡网站设计

梦想天空博客向大家分享各种类型的优秀网站作品&#xff0c;有电子商务网站设计、旅游网站设计、餐馆网站设计、设计工作室网站设计、大学网站设计以及各种色系&#xff0c;各种风格的网站设计作品。今天这篇文章给大家带来30个优秀的国外咖啡网站设计作品&#xff0c;一起欣赏…

【译】CodeIgniter HMVC模块扩展使用文档

CodeIgniter HMVC扩展说明 原文地址&#xff1a;Modular Extensions - HMVC 模块扩展——HMVC 模块扩展让CodeIgniter框架模块化。模块是一组独立的组件&#xff08;通常有模型、控制器和视图&#xff09;&#xff0c;它们被分类在应用模块的子文件夹中&#xff0c;并且能够直接…

python函数参数类型及顺序_python函数参数类型及其顺序

根据inspect模块官文文档中关于函数参数类型的相关说明&#xff0c;python函数参数共有五种类型&#xff0c;按顺序分别为&#xff1a;POSITIONAL_ONLY、POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、KEYWORD_ONLY、VAR_KEYWORD。如图&#xff1a;POSITIONAL_ONLY&#xff1a;参数值…

JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

原文:JS组件系列——Bootstrap Table 表格行拖拽&#xff08;二&#xff1a;多行拖拽&#xff09;前言&#xff1a;前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽&#xff0c;今天接到新的需要&#xff0c;需要在之前表格行拖拽的基础上能够同时拖拽选中的多行。博主用…

scrapy知乎爬虫mysql存储项目_Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写...

思路分析&#xff1a;(1)选定起始人(即选择关注数和粉丝数较多的人--大V)(2)获取该大V的个人信息(3)获取关注列表用户信息(4)获取粉丝列表用户信息(5)重复(2)(3)(4)步实现全知乎用户爬取实战演练&#xff1a;(1)、创建项目&#xff1a;scrapy startproject zhijutest(2)、创建爬…

kali下生成web端后门

很多时候在***测试时选择web***害怕用的别人的马带有后门&#xff0c;这样自己的辛苦就要被别人不劳而获&#xff0c;很多时候我们都想拥有自己的马&#xff0c;那么这个时候你就应该使用kail来生成一个自己独特密码的web***了。Kali Linux自带有好几个web***生成工具&#xff…

素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)

因为文中存在公式&#xff0c;只能用图片方式上传了&#xff01; 以下为C语言源代码&#xff1a; #include <stdio.h> typedef long long unsigned LLU; typedef int BOOL; #define TRUE 1 #define FALSE 0 BOOL isPrime(LLU n) { //这是传统的方法&#xff0c;用于与…

MongoDB源码阅读之ReplSet源码分析

1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义了几乎所有replSet相关的类&#xff08;Member:replSet中的节点成员&#xff0c; GhostSync&#xff1a;备份同步类&#xff0c;Rep…

C# 字符串性能

Written By Dr Herbie [2] Translated By Allen Lee Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。程序中需要考虑两个由于使用字符串而产生的问题&#xff1a;临时字符串变量的使用和字符串连接。Background1.String是引用类型&#xff0c;在堆上…

手把手教你部署VSAN见证虚拟设备 (Cormac)

译者注&#xff1a;本文翻译自Cormac的博客&#xff0c;并未严格地逐字逐句的直译&#xff0c;如有谬误&#xff0c;万望见谅。原文见此http://cormachogan.com/2015/09/14/step-by-step-deployment-of-the-vsan-witness-appliance/现在开始在之前的帖子中我曾经介绍过见证虚拟…

PyCharm编程环境的中英文字体分别设置的好处多----一石三鸟地解决中文字体不一致、英文字体不涵盖中文字符、编程字体实用性兼顾美观性的三个问题

在编程环境&#xff08;例如Python的PyCharm&#xff09;中&#xff0c;我们希望编程环境的字体具有如下特性&#xff1a; &#xff08;1&#xff09;字体覆盖中文和英文字符。 &#xff08;2&#xff09;等宽字体&#xff0c;并且是TrueType字体&#xff0c;方便辨识代码中缩…

WordPress博客系统的安全

随着计算机网络的流行&#xff0c;越来越多的人开始创建自己的博客&#xff0c;论起博客系统&#xff0c;全球用的最多的博客系统就是wordpress&#xff08;以下简称WP&#xff09;。但是如果用过WP的人都应该知道&#xff0c;WP的站点想要做的好看&#xff0c;插件是必不可少的…

mysql为什么行数据库_关系数据表中的行称为什么?

在一个二维表中&#xff0c;水平方向的行称为元组&#xff0c;每一行是一个元组&#xff1b;元组对应表中的一个具体记录。数据元组也称为记录。一个数据表中的每一个记录均有一个惟一的编号(记录号)。一个记录也就是数据表中的一行。元组(tuple)是关系数据库中的基本概念&…

maven安装以及eclipse配置maven

http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html 必须先下载并安装JDK&#xff0c;配置JDK的环境变量JAVA_HOME&#xff0c;否则maven将无法使用 eclipse安装maven插件后必须重新定位maven到本地maven目录 如下定位&#xff1a; 为了使得Eclipse中安装的Maven…

JS 问题集锦

【1】js页面跳转 和 js打开新窗口方法 第一种&#xff1a;<script language"javascript" type"text/javascript">window.location.href"http://www.xlfun.com/login.php?backurl"window.location.href; </script>第二种&#xff1a…

重温Observer模式--热水器·改(转载)

引言 在 C#中的委托和事件 一文的后半部分&#xff0c;我向大家讲述了Observer(观察者)模式&#xff0c;并使用委托和事件实现了这个模式。实际上&#xff0c;不使用委托和事件&#xff0c;一样可以实现Observer模式。在本文中&#xff0c;我将使用GOF的经典方式&#xff0c;再…