前言:这次学习分布式的思想要配置mysql的主从复制和读写分离,我在主从配置上踩到很多坑,在此演示一遍配置过程,并附上问题的说明和自己的一些见解

Mysql主从复制的原理

附上原理图:

mysql的主从复制原理其实挺简单,主要由两种类型3个线程完成:I/O 和 sql thread

主服务器上有一个I/O thread用来生成二进制日志,每当有事务产生便写入二进制文件,所有主服务器上需要配置mysql 打开日志服务,新的日志内容会通过从服务器的I/O thread 更新到从服务器上的日志

从服务器更新日志后会用sql thread 写入数据库,从而实现复制

显而易见,这种复制方式在数据传输的时候会占用一定时间产生延迟,我们接下来的配置用于测试,一般不会出现延迟

主从复制的配置

测试环境

主服务器:120.78.85.213

从服务器:120.79.205.19

mysql版本:5.7.21 (这次演示都是新下的mysql)

mysql下载:

sudo apt-get update
sudo apt-get install mysql-client mysql-server

(附带mysql删除,说不定你会用的到)

sudo apt-get remove mysql-*

dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

主服务器配置

在 /etc/mysql/mysql.conf.d/ 目录下(按上述安装一般在这里)的mysqld.cnf 的[mysqld]下配置server-id 和 log_bin

server-id 是服务器号(我这样理解),具体值随意,只要不和从服务器不重叠

log_bin 就是开启二进制服务(必须要有的)

然后重启mysql让配置生效

service mysql restart

登录到mysql,如果你想远程连接数据库先把mysql 库(mysql 的基础数据库)中的user 表中的 root 用户的host 更新为 %

use mysql;

update user set host='%' where user='root';

其次在刚刚的配置文件里面bind-address 这行

你可以配置为bind-address = 0.0.0.0 或者直接注释掉


现在开始正式的配置

先在主服务器上设置一个账号让从服务器能够访问

create user 'dba'@'120.79.205.%' identified by '123456';
grant replication slave on *.* to dba@'120.79.205.%';

这里用了两步,网上有些配置只用了一步会有一个警告,这个警告好像在mysql5 之后才有的,具体内容就是不能太暴露什么的(比如 mysql -uroot -pXXXX 这时在Linux下你的密码也会暴露,一般warning不用管),用show warning可以查看

这两步的意思很简单

一:创建一个名为dba 密码为123456的账号在120.79.205这个网段上都能访问

二:授权120.79.205这个网段名为 dba 的用户可以和主服务器建立 slave 连接

访问mysql.user 表可以看到此用户


然后在主服务器上创建数据库/表,并插入(我自己打的,可能有错,如果你复制的话)

create database dba;

create table t(id int,name varchar(10),primary key(id));

insert into t values(1,'aa'),(2,'aa'),(3,'aa');

插入数据成功后,网上有的配置直接开始配置从数据库,但是这里需要发送一份.sql 到从数据库先同步一道,毕竟如果不是测试数据库一般不一样,需要在开始就同步(所以一般会在第一步配置,指定要同步的数据库)

退出数据库

备份

mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > all.sql;

(ps备份单个数据库:mysqldump -u root -p mysql > ~/mysql.sql  #把数据库mysql备份到家目录下命名为mysql.sql)

输入数据库密码

发送到从数据库

scp all.sql root@120.79.205.19:/tmp

输入连接密码

发送到从数据库的 /tmp 目录下


从数据库配置

参考主数据库的配置打开 mysqld.cnf 只用配置server-id = 2(不和其他数据库的id相同)

从 /tmp下导入.sql 文件

cd /tmp

mysql -uroot -p <all.sql

(ps导入单个数据库:mysqldump -u root -p mysql < ~/mysql.sql  )

重启mysql(这里不是因为导入需要重启,而是改了配置文件需要重启,照顾某些强迫症患者)

你可以查看一下是否导入成功


现在我们前期工作做好了,准备开始连接

在主服务器上mysql 操作下输入命令:show master status\G;

*************************** 1. row ***************************
File: master-bin.000002
Position: 1483
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec) ERROR:
No query specified

  这个error 不用管

记住

File: master-bin.000002
Position: 1483
这是你主服务器的日志名和日志位置,错了就无法连接

然后再从服务器的mysql 操作下输入:

show slave status\G;

如果显示不为空则先停止slave :stop slave

尝试建立连接

change master to master_host='120.78.85.213',master_user='dba',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1483;

这里一定要注意!!!

master_log_file='master-bin.000002',master_log_pos=1483 对应的就是主服务器上的日志名和位置

千万千万不要错了,我当时在配置的时候看了很多博客,有些在配置主服务器的时候是log_bin = mysql 有些是 log_bin = master ,导致后面的命名不同就一直连不上,切记切记

开启slave: start slave

查看slave 状态:show slave status\G;

如果两个状态都为yes 则代表连接成功

如果io 为no 则代表I/O线程失败,你可以查看Last_IO_Errno:里面的信息为失败原因

不外乎两种:前面提到的server id 重叠,或者就是change master 不对应

或者是防火墙问题:

安装防火墙:

sudo apt-get install ufw

你可以通过以下两个命令开启允许访问的端口:

ufw allow 端口号(3306)

ufw allow from ip(120.79.94.90)

两个服务器都查看一下

ufw status看看是否开启

如果sql _running:no 一般是你没开启slave ,start slave就OK


最后你就可以在主服务器上测试插入数据看是否同步了

以上是我配置主从的过程,可参考

Mysql的主从配置的更多相关文章

  1. [转帖]mysql数据库主从配置

    mysql数据库主从配置 https://www.toutiao.com/i6680489302947791371/ 多做实验 其实挺简单的 很多东西 要提高自信 去折腾. 架构与我 2019-04- ...

  2. mysql的主从配置以及主主配置

    基础环境 系统:linuxmysql版本:5.5主服务器IP:192.168.1.101从服务器IP:192.168.1.102 1.主服务器(master)要打开二进制日志2.从服务器(slave) ...

  3. Mysql数据库主从配置

    一.为什么要使用数据库主从架构 一个网站损耗资源最厉害的就是数据库,最易崩溃的也是数据库,而数据库崩溃带来的后果是非常严重的.数据库分为读和写操作,在实际的应用中,读操作的损耗远比写操作多太多,因此读 ...

  4. mysql传统主从配置与主从监控

    主从简介 在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患. 当数据规模非常大,读写量也很高时,一台数据库已经无法负担全部读写任务,就需要多台数据 ...

  5. Centos7下mysql的主从配置

    最近,有朋友业务并发量比较大,让我帮他配置个主从,来缓解数据库的压力.下面就是我配置的,有需要的朋友可以借鉴下. 首先,我得到2台服务器: 172.18.2.142(主) 172.18.2.141(从 ...

  6. Mysql Master-slave 主从配置

    MySQL主从复制 场景描述:主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据.从数据库服务器:192.168.10.131,MySQL已经安装,并且无应用数据. 2. ...

  7. mysql主从复制 主从配置(windows系统上)

    OS:Windows7 DB:MYSQL5.6.2 1.正常安装第一个mysql(安装步骤省略)  2.在控制面板里停止第一个mysql服务  3.将C:\Program Files\MySQL目录下 ...

  8. mysql GTID主从配置

    主数据库配置 [mysqld] server_id=1 gtid_mode=on enforce_gtid_consistency=on skip_slave_start=1log_bin=maste ...

  9. mysql之主从配置实现

    我使用的是两台centos7虚拟机来做实验的,主服务器ip为192.168.2.128,从服务器ip为192.168.2.130 安装mysql就不用说了吧,不对,我们需要安装的是mariadb,命令 ...

随机推荐

  1. git命令记录

    1, clone 远程分支 git clone 命令默认的只会建立master分支,如果你想clone指定的某一远程分支(如:dev)的话,可以如下: A. 查看所有分支(包括隐藏的)  git br ...

  2. MyEclipse2015上传项目到GitHub(很详细)

    MyEclipse 2015 默认已经安装了git插件,在MyEclipse中上传项目到github的步骤如下: 1.github官网(https://github.com)申请开通账号(略) 1.1 ...

  3. 使用筛选器特性标记方法解决webapi 跨域问题

    在我的之前随笔 解决api.WebService跨域问题 中有人问到可以用特性来解决跨域问题吗,答案是肯定的,可以的:操作如下: 首先建一个类CrossSiteAttribute:从抽象 Action ...

  4. C语言范例学习06-上

    第六章 文件操作 前言:第五章是C语言在数学上的一些应用,我觉得没有必要,便跳过了.这章正如我标题所写的,是C语言在文件上的操作.学习了这个后,你们可以自行编辑一些所需的快捷程序,来实现一些既定的目的 ...

  5. webpack基础打包安装分享

    一.创建webpack-first文件夹作为站点,创建app文件夹存放js原始模块(main.js 和 Greeter.js) 创建 public文件夹存放index.html和打包后的bundle. ...

  6. 牛客网linux试题-错误整理-20170914

    Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性. 1.交互进程--由一个shell启动的进程.交互进程既可以在前台运行,也可以在后台运行. 2.批处理进程--这种进程和终端没有 ...

  7. Angular-搜索框及价格上下限

    Angular-搜索框及价格上下限 闲来无事,写一个简单的angular的搜索框. 1.要求: 利用 AngularJS 框架实现手机产品搜索功能,题目要求: 1)自行查找素材,按照原有数据格式将手机 ...

  8. Gym 101667I Slot Machines

    原题传送门 题意:给定n(n≤106)个数,要求将它化为混偱环小数的形式,即前k个数不参与循环,之后所有数以p为循环节长度进行循环.求k和p,要求k+p尽量小,k+p相等时要求p尽量小. 样例1 输入 ...

  9. python 使用paramiko模块上传本地文件到ssh

    我们要了解几个函数: paramiko.Tranport(("目标ip,端口"))#这是上传目标的IP和端口 paramiko.SFTPClient.from_tranport() ...

  10. 《JavaScript设计模式与开发实践》知识点笔记

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...