MySQL主从分离实现
前言
大型网站为了减轻服务器处理海量的并发访问,所产生的性能问题,采用了很多解决方案,其中最主流的解决方案就是读写分离,即将读操作和写操作分别导流到不同的服务器集群执行,到了数据业务层,数据访问层,如果还是传统的单靠一台服务器去扛,面对如此多的数据库连接操作,必然会崩溃,如果造成数据的丢失,是不堪设想的。本文将利用mysql的主从配置,实现读写分离。
主从库理论知识
主从同步如何实现?
同步工作主要又三步,第一步就是主服务器(master)将对数据的操作记录到二进制日志文件(Binary log)中,也就是说,在每个事务更新数据完成之前,mster在日志里记录这些改变,mysql将事务串行地写入二进制文件中,在事件写入二进制日志完成后,master通知存储引擎提交事务,提交好事务后,就会进入第二步,需要补充一点的是,我们对数据的一次操作就称为一次二进制日志事件,也就是Binary log event。在第二步呢,Slave将master的Binary log拷贝到它的中继日志(Relay log)中,也就是Slave会首先开启一个工作线程(I/O thread),I/O线程在master上打开一个普通的连接,做Binary log的拷贝,从master的二进制日志文件中读取事件,如果已经跟上了master,就会睡眠并等待master产生新的事件,I/O线程然后将这些事件写入中继日志中;第三步就是Slave重做中继日志事件,SQL线程从中继日志中读取事件,并重放其中的事件,更新Slave中的数据,使其与Master中的数据一致。

主从库配置
我在自己VMware虚拟机上装了两个centOs系统,使用命令:# cat /etc/redhat-release 可以看到我自己的CentOs版本为7.6.1810的

CentOS7.6安装mysql5.7.31
1. 解压到/usr/local目录
# tar -zxvf mysql-5.7.31.tar.gz -C /usr/local
2. mysql-5.7.31-linux-glibc2.5-i686文件夹重命名为mysql
# cd /usr/local
# mv mysql-5.7.18-linux-glibc2.5-i686/ mysql
3. 新建mysql用户组和mysql用户
# groupadd mysql
# useradd -r -g mysql mysql
4. 新建数据目录
# cd /usr/local/mysql
# mkdir data
5. 更改所有者以及授权755
# cd /usr/local
# chown -R mysql:mysql mysql/
# chmod -R 755 mysql/
6. 初始化mysqld
# cd /usr/local/mysql
# ./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
如果执行初始化时出现报错:./bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory,就是少东西,centos使用yum装yum -y install numactl,装了后在执行初始化命令就可以了。
如果出现错误:initialize specified but the data directory has files in it. Aborting.大意是提示data目录有文件,把mysql安装目录\data文件夹里的内容清空(建议读者备份到其他地方)。再次执行"mysqld --initialize",没有报错了!

记录下root的初始密码: Wg;iqpl_P5os
7. 将mysqld添加成服务,并启动它
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
建立mysql默认的配置文件/etc/my.cnf,并添加图片中内容
# vim /etc/my.cnf

按esc,输入 :wq,保存并退出my.cnf,启动mysqld
# service mysqld start
查看mysql是否启动成功
# ps -ef|grep mysql
出现如下信息表示启动成功

当然也可以查看mysqld的状态
# service mysqld status
8. 登录mysql并修改root密码
# cd /usr/local/mysql
# ./bin/mysql -uroot –p
输入初始密码,步骤6中有生成,出现如下信息表示登录成功

修改root密码
mysql> SET PASSWORD = PASSWORD('123456');
mysql> FLUSH PRIVILEGES;
初次登录没有修改root的密码,操作数据库会出现如下错误提示,那么需要修改root用户的密码
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
9. 设置mysql远程可访问(前提是防火墙必须关闭,chkconfig iptables off:设置自动启动为关闭,service iptables stop:关闭防火墙)
先登录到mysql
mysql> use mysql
mysql> update user set host = '192.168.0.148' where user = 'root';
mysql> FLUSH PRIVILEGES;
192.168.0.148即是可远程访问本地mysql的远程ip,若想任意ip都能访问本地mysql,那么只需要将192.168.0.148换成%即可
mysql> update user set host = '%' where user = 'root';

MySQL主从库配置
本文将ip为192.168.0.188的主机作为master,ip为192.168.0.152的主机作为slave,我用的mysql版本为:5.7.31。当然我们也可以在本机下载两套mysql软件,设置不同端口后进行启动,也是可以配置出主从同步来。
1. master上配置bin-log日志
修改mysql的配置文件:# vim /etc/my.cnf,加上如下内容,修改配置后需要重启mysql服务器
log-bin= master-bin #[必须]启用二进制日志
log-bin-index=master-bin.index
server-id = 4 #[必须]服务器唯一ID,默认是1,最好取ip的后3位
expire-logs-days = 7 #只保留7天的二进制日志,以防磁盘被日志占满
测试log_bin是否成功开启
mysql> show variables like '%log_bin%';
出现下图,log_bin为ON则表示开启成功,OFF表示开启失败

配置好后,查看主服务器状态:show master status

2. slave上配置relay-log
配置从服务器:vim /etc/my.cnf,点击 i 进入编辑模式,添加如下配置:
relay-log-index=slave-relay-bin.index
relay-log=slave-bin
server-id=152 #只要和master的server-id不一样就可以了

3. 将master和slave联系起来,slave需要知道master的地址
- master的数据库中建立备份账号
repl为用户名,192.168.0.152代表从数据库的主机地址,如下表示远程地址为密码为123的,用户名是repl就可以连接到master主机,并为其授予 replication slave 权限。123为master的连接密码。
mysql> create user repl; # 创建用户名为repl的用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.152' IDENTIFIED BY '123';
mysql> FLUSH PRIVILEGES;
mysql> use mysql;
mysql> select user,authentication_string,host from user;
可看到我们刚创建的备份账号:

重启MySQL服务并设置读取锁定:登录mysql],mysql> flush tables with read lock;读取锁定的意思是只能读取,不能更新,以便获得一个一致性的快照
查看主服务器上当前的二进制日志名和偏移量值:

4. 我们已经在主库配置好了允许从库访问主库的用户名和密码,下面我们对slave进行操作:
mysql> change master to master_host='192.168.0.188',master_port=3306,master_user='repl',master_password='123',master_log_file='master-bin.000001',master_log_pos=154;
其中的master_log_file,就是主库中file,在主库中使用 show master status;就可以看到了。

启动slave: mysql> start slave;
查看slave从机的状态(\G表示竖着展示): mysql> show slave status \G

5. 关闭掉主数据库的读取锁定
mysql> unlock tables;
6. 测试
才开始的时候,我的主库和从库中的数据库是相同的,使用show databases查看,如下:


我现在主库执行创建库语句,执行:create database o2o; 我们去从库查询,会发现该数据库会自动同步到从库,如下:


通过测试验证,我们的mysql主从同步就配置好了,这里需要注意的是主库的mysql版本不能高于从库的mysql版本,因为MySQL总的语法是高版本兼容底版本的,如果从库的版本要比主库的版本低,可能主库执行的sql语句,从库执行就会报错,导致主从同步失败;从库只能读数据,不能在从库写数据,主库既可以读数据,也可以写数据。
MySQL主从分离实现的更多相关文章
- Mysql主从分离介绍及实现
参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...
- 基于MySql主从分离的代码层实现
前言 该文是基于上篇<MySQL主从分离的实现>的代码层实现,所以本文配置的主数据库和从数据库的数据源都是在上篇博文中已经介绍了的. 动态选择数据源的配置 由于我们在写数据的时候需 ...
- Atlas实现mysql主从分离
可以接受失败,无法接受放弃!加油! 一.介绍Atlas及架构图 Atlas源代码用C语言编写,它对于Web Server相当于是DB,相对于DB相当于是Client,如果把Atlas的逻辑放到Web ...
- Mysql主从分离与双机热备超详细配置
一.概述 本例是在Windows环境,基于一台已经安装好的Mysql57,在本机安装第二台Mysql57服务. 读完本篇内容,你可以了解到Mysql的主从分离与双机热备的知识,以及配置期间问题的解决方 ...
- MySQL主从分离读写复制
参考教程:http://www.yii-china.com/post/detail/283.html MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器( ...
- mysql主从分离
1.工具: 两台机器 master:192.168.0.1 slave:192.168.0.2 2.master的配置 找到mysql的配置文件,一般centos的是/etc/my.cnf,ubunt ...
- CentOS系统 Amoeba+MySql主从读写分离配置 适合新手傻瓜式教程!-----仅供参考!
废话不说,直接开始: 一.安装mysql的三种方式,这里采用第2种(安装方式不再详解,请参照) http://www.cnblogs.com/babywaa/articles/4837946.html ...
- Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- 【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由kee ...
随机推荐
- WARN deploy.SparkSubmit$$anon$2: Failed to load org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount.
前言 今天运行Spark Structured Streaming官网的如下 ./bin/run-example org.apache.spark.examples.sql.streaming.Str ...
- Postman之API测试使用全指南
Postman Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中.旨在简化测试和开发中的API工作流. Postman 工具有 Chrome 扩展和独立客户端, ...
- 开发中如何让本地host和代理共存?
开发中若遇到了需要相同域名的情况,比如利用cookie共享的sso策略,可以设置本地host映射到开发服务.设置域名,生效,正常开发. 但在公司中可能是内网,请求都需要经过代理,这时候可能会发现设置h ...
- 阿里云centos7安装redis全过程记录
Redis下载地址:https://redis.io/download(这个连接可能得翻墙查看,但是在centos7服务器上安装过程不需要翻墙,我查看了最新的是redis-4.0.9.tar.gz ) ...
- 列拖拽顺序调整-sortable.js使用
最近在做一个单表统计功能,涉及到一个查询列配置,但是查询出来的列顺序,可以进行配置,通过写列的排序当然阔以,但是方法就不美丽了.所以,在网上搜了一下拖拽的组件,最终定位Sortable.js,简单易用 ...
- How many ways?? HDU - 2157 矩阵快速幂
题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...
- SpringMVC如何从默认的index.jsp页面跳转到其他页面
最近学习SpringMVC时,想要做一个登录页面Login.jsp,发现Tomcat服务器默认进入的页面是WEB-INF/index.jsp,查询资料发现如果修改默认页面,还需要修改Tomcat文件目 ...
- BFC原理解析
BFC的概念 块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域. 它是 ...
- 数据结构之二叉搜索树(BST)--JavaScript实现
原理: 叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程 ...
- 数据可视化之 图表篇(三)体验Power BI最新发布的AI图表:分解树
在刚刚发布的11月更新中,PowerBI界面全新改版,采用和Office套件相似的Ribbon风格,除了这个重大变化,还发布了一个AI黑科技图表:分解树(Decomposition Tree). 无论 ...