mySQL服务主从实现

news2024/11/16 13:46:47

一主一从

1.1 环境准备:

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

1.2 准备步骤:

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

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

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

  架构图:

1.3 实现步骤:

1.3.1 配置master主服务器

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

log-bin=/usr/local/mysql/data/binlog/mysql-bin

#[必须]服务器唯一ID,默认是1

server-id=1

#每次执行写入就与硬盘同步

sync-binlog=1

#需要同步的二进制数据库名

binlog-do-db=tuling

#只保留7天的二进制日志,以防磁盘被日志占满

expire-logs-days = 7

#不备份的数据库

binlog-ignore-db=information_schema

binlog-ignore-db=performation_schema

binlog-ignore-db=sysskip-name-resolve  //关闭名称解析,(非必须)

1.3.2 创建复制帐号

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

#创建用户MariaDB [(none)]> CREATE USER 'tuling'@'192.168.%.%' IDENTIFIED BY 'root';

#授权MariaDB [(none)]> grant replication slave,replication client on *.* to tuling@'192.168.%.%' identified by 'root';#刷新权限MariaDB [(none)]> FLUSH PRIVILEGES;

1.3.3 查看主服务器状态

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

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 //使得更新的数据写进二进制日志中

#如果salve库名称与master库名相同,使用本配置

replicate-do-db = tuling

#如果master库名[tuling]与salve库名[tuling01]不同,使用以下配置[需要做映射] replicate-rewrite-db = tuling[主库名] -> tuling01[从库名]

#如果不是要全部同步[默认全部同步],则指定需要同步的表

replicate-wild-do-table=tuling01.t_order

replicate-wild-do-table=tuling01.t_order_item

1.3.5 启动从服务器复制线程

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

MariaDB [(none)]> change master to master_host='192.168.241.198', [你的master-ip] >master_user='tuling', >master_password='root', >master_log_file='mysql-bin.000007', //master对应的bin-log文件 >master_log_pos=413; //master对应的position >start slave; //启动复制线程。

>SHOW SLAVE STATUS\G; //查看从节点状态

#启动可能报错: ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

#解决办法 //在设置同步关系时,没有先停止slaves线程。解决办法为在设置同步关系之前, //先执行下“stop slave;”,以停止slave线程。然后启动线程"start slave;"

  

  

1.3.6 查看从服务器状态

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

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

1.3.7 测试

1)测试主从同步

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

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

  master:

  slave:

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

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

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

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

2)测试只读属性  

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

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

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

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

MariaDB [keer]> flush tables with read lock;

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

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

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

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

1.4 扩展——实现一主多从

1.4.1 需求分析

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

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

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

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

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

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

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

1.4.2 具体实现过程

1)对 master 进行完全备份

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

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

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)把这个完全备份导入从的数据库:

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

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

  我们的数据已经恢复成功

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;

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

6)测试

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

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

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/

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

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;

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;

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

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

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

  以上,实验一完成。

回到顶部

互为主从(双主)

  还有一种数据库的架构为双主模式,也就是互为主从,这种设定在企业中虽不常用,但是我们还是需要掌握的。

  Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

  架构图如下:

2.1 环境准备:

  centos系统服务器2台、 两台用户实现Mysql互为主从, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信

2.2 准备步骤:

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

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

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

2.3 实现步骤:

2.3.1 配置第一台 master 主服务器

server-id = 1      //配置server-id,让主服务器有唯一ID号 log-bin = mysql-bin  //打开Mysql日志,日志格式为二进制 skip-name-resolve   //关闭名称解析,(非必须) relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_slave_updates = 1 //使得更新的数据写进二进制日志中 auto_increment_offset = 1    //表示自增长字段从那个数开始 auto_increment_increment = 2  //表示自增长字段每次递增的量

2.3.2 配置第二台 master 主服务器

server-id = 2      //配置server-id,让主服务器有唯一ID号 log-bin = mysql-bin  //打开Mysql日志,日志格式为二进制 skip-name-resolve   //关闭名称解析,(非必须) relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_slave_updates = 1 //使得更新的数据写进二进制日志中 auto_increment_offset = 2    //表示自增长字段从那个数开始 auto_increment_increment = 2  //表示自增长字段每次递增的量

2.3.3 创建复制账号

  因为我们实现的是双主模式,所以我们每一台机器上都要创建复制账号:

2.3.4 查看服务器状态

  我们分别查看两台服务器的状态,从而为我们下一步的设置奠下基础:

2.3.5 启动复制线程

  我们来分别对两台机器进行的设置:

  首先,先对第一台 master 机器进行设置:

MariaDB [(none)]> change master to master_host='192.168.37.222',master_user='slave',master_password='keer',master_log_file='mysql-bin.000003',master_log_pos=245;MariaDB [(none)]> start slave;

  接着,我们来查看一下他的状态:

  现在,我们来对第二台 master 进行设置:

MariaDB [(none)]> change master to master_host='192.168.37.111',master_user='slave',master_password='keer',master_log_file='mysql-bin.000002',master_log_pos=245;MariaDB [(none)]> start slave;

  我们来查看一下他的状态:

  

  可以看出,我们的两个机器都设置完毕,接下来,我们就可以来测试一下了。

2.3.5 测试

  在我们的配置文件中,我们设置了自增长字段的起始值和增长值,现在我们去创建一个自增长的表:

MariaDB [keer]> create table test(id int PRIMARY KEY AUTO_INCREMENT,name char(20) not null);

  因为我们设置了主从,所以在任一机器使用该命令即可。

  创建好了表以后,我们就可以插入数据进行测试了,我们一个插入多条数据来看看效果:

第一个服务器:

MariaDB [keer]> insert into test(name) value('zhao'),('qian'),('sun'),('li');Query OK, 4 rows affected (0.00 sec)Records: 4 Duplicates: 0 Warnings: 0

第二个服务器:

MariaDB [keer]> insert into test(name) value('zhou'),('wu'),('zheng'),('wang');Query OK, 4 rows affected (0.00 sec)Records: 4 Duplicates: 0 Warnings: 0

  数据我们都插入了,我们来看看效果如何:

  可以看出,两个表插入的数据是不会重复的。

  但是现在也不是我们想象的连续的 id ,这是因为,我们两台机器都是同时插入4条数据,而且不是同步插入的,这样就会有一个先后顺序,第一台机器上的 sql 语句执行结束以后才执行第二台机器上的。所以会出现这样的情况。

  但是,这样已经不会插入重复的数据了。我们的目的也是达到了。

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

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

相关文章

多态和可变参数

多态 多态是同一个行为具有不同的表现形式或者形态的能力 👿多态的作用:主要用来实现动态性,提高程序的灵活性和扩展性 🤖故事:大宝-小宝是父子,有一天小宝接到打给大宝的电话,让大宝去喝喜酒,但是大宝不在家,小宝急中生智想到假扮成大宝去参加喜宴,这个…

Unity法线贴图原理理解(为什么存在切线空间?存的值是什么?)

Unity法线贴图原理理解(为什么存在切线空间?存的值是什么?)写在前面1、为什么用法线贴图?2、用什么存法线?3、法线向量为什么存在切线空间?法线贴图存得是什么?4、法线贴图为什么会偏蓝&#xf…

MySQL字段值如何区分大小写

MySQL字段值如何区分大小写 注意:设置的是字段值区分大小写 1. 查询时指定大小写敏感,加关键字‘BINARY’ (1)删表,建表,新增数据 drop table binary_test; CREATE TABLE binary_test (id INT unsigned P…

2023年浙江建筑施工物料提升(建筑特种作业)模拟试题及答案

百分百题库提供特种工(物料提升机)考试试题、特种工(物料提升机)考试预测题、特种工(物料提升机)考试真题、特种工(物料提升机)证考试题库等,提供在线做题刷题,在线模拟考…

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速

从去年开始,Zebec 就开始以多链的形式来拓展自身的流支付生态,一方面向更多的区块链系统拓展自身流支付协议,即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署,且能够在这些EV…

handler解析(4)-Message及Message回收机制

Message中可以携带的信息 Message中可以携带的数据比较丰富,下面对一些常用的数据进行了分析。 /*** 用户定义的消息代码,以便当接受到消息是关于什么的。其中每个Hanler都有自己的命名控件,不用担心会冲突*/ public int what; /*** 如果你…

Mrkdown相关快捷键

Mrkdown相关快捷键欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚…

ChatGPT持续“狂飙“,有这么人工智能吗?

最近,一款新聊天工具ChatGPT火了,可以聊天、写作、编程、翻译,甚至可以质疑和拒绝你的要求。自2022年11月底推出以来,ChatGPT已经成为历史上增长最快的消费者应用程序之一。ChatGPT的狂飙突进引来谷歌、百度等众多互联网巨头的跟进…

案例分享 | 某券商利用AI技术进行告警关联分析(下)

本内容来自公众号“布博士”------(擎创科技资深产品专家)在上期内容中,我们了解到跨行业数据挖掘标准流程包括6大过程,分别为业务理解(Business Understanding)、数据理解(Data Understanding&…

JavaWeb3-线程的3种创建方式7种写法

目录 1.方式一:继承Thread(2种写法) 写法①(常规): a.使用jconsole观察线程 b.启动线程——start方法 PS:(常见面试题)start 方法与 run 方法的区别: 写…

免费CRM客户管理系统真的存在吗?不仅有,还有5个!

免费CRM客户管理系统真的存在吗?当然有! 说到CRM客户管理系统,相信很多企业并不陌生,是因为CRM客户管理系统已经成为大多数企业最不可或缺的工具。但是对于很多小微企业和个人用户来说,购买和实施CRM的成本仍然难以承…

上海亚商投顾:沪指午后放量跳水两市上涨个股不足500只

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪指数早间震荡走高,沪指盘中收复3300点,午后集体跳水,创业板指一度跌超2%。ChatGP…

Spring 系列之 MVC

Spring 系列文章目录 文章目录Spring 系列文章目录前言一、介绍二、项目搭建1.创建空项目2.设置maven和lombok3.创建maven web module4. 配置Tomcat启动运行项目(选择local本地)5. 导入jar依赖包6.在web.xml中配置DispatcherServlet7. 加入SpringMVC的配…

第六章——抽样分布

文章目录1、统计量的定义2、常用的统计量3、经验分布函数4、正态总体常用统计量的分布4.1、卡方分布4.1.1、卡方分布的定义4.1.2、卡方分布的性质4.2、t分布4.2.1、t分布的定义4.2.2、t分布的性质4.3、F分布4.3.1、F分布的定义4.3.2、F分布的性质5、正态总体的样本均值与样本方…

Hexo搭建个人博客流程全记录

建站缘由 有些东西过不了审,不方便给他人查看,于是就利用Hexo框架搭建了一个个人博客,部署在Github上,取名为“zstar的安全屋”。 链接:http://xdxsb.top 安装Git Bash 无需多言,下载链接:ht…

全网招募P图高手!阿里巴巴持续训练鉴假AI

P过的证件如何鉴定为真?三千万网友都晒出了与梅西的合影?图像编辑技术的普及让人人都能P图,但也带来“假图”识别难题,甚至是欺诈问题。 为此,阿里安全联合华中科技大学国家防伪工程中心、国际文档分析识别方向的唯一顶…

【集合】JAVA基础篇(二)

【集合】JAVA基础篇(二)一、java常用集合1、Java集合接口的作用2、Java集合常用实现类的作用二、Collection 常用的方法三、List 集合接口1、ArrayList类的常用方法2、LinkList类中的方法3、Vector4、ArrayList 类和 LinkedList 类的区别四、Set 集合1、…

图解LeetCode——剑指 Offer 27. 二叉树的镜像

一、题目 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像&#xff0c;返回镜像后的根节点TreeNode。 二、示例 2.1> 示例 1&#xff1a; 【输入】root [4,2,7,1,3,6,9] 【输出】[4,7,2,9,6,3,1] 限制&#xff1a; 0 < 节点个数 < 1000 …

Hadoop核心组成和生态系统简介

一、Hadoop的概念 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统&#xff08; Distributed File System&#xff09;&am…

Word处理控件Aspose.Words功能演示:使用 C++ 将电子邮件消息转换为 PDF

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…