MYSQL主从介绍

MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启binlog才能进行主从。 binlog,其实就是一个文件,文件里记录了一些日志,文件是 二进制文件,无法cat 主从过程大致有3个步骤 主将更改操作记录到binlog里 从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里 relaylog,中文叫做 中继日志 从根据relaylog里面的sql语句按顺序执行 mysql主从共有三个线程 主上有一个log dump线程,用来和从的I/O线程传递binlog 从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地 MySQL主从原理图 mysql主从使用场景: 数据备份,主机器宕机,从机器还能随时对web提供服务 作为一个从库,读的库,减轻主库的压力,数据备份且可以分担主机器被调用数据时的压力,mysql主从,是有方向性的,写数据,必须从主机器开始;如果不依照原理会导致数据紊乱

准备工作 mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 首先下载二进制免编译的包,下载到/usr/local/src/目录下 解压压缩包 解压完之后,把解压出来的目录放到 /usr/local/mysql/ 目录下 注意点: 首先检查 /usr/local/mysql/ 目录是否存在 若是这个目录存在,首先把这个目录改个名字,或者把目录下的内容删除 然后把解压出来的目录放到 /usr/local/mysql/ 目录下面 然后切换到 /usr/local/mysql/ 目录下,进行初始化 命令 初始化命令 ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql 注意点: 其中的--user=mysql 需要提前创建 初始化成功的标志就是两个OK,或者用 echo $? 检查是否初始化成功 编辑 /etc/my.cnf 文件——>默认是自带 my.cnf 文件的 拷贝启动脚本 命令 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 编辑启动脚本 之后就可以启动mysql了 命令 /etc/init.d/mysql start 如果启动失败,可以去查看错误日志 建议 :查看 /data/mysql 目录下的文件,默认属主、属组,如果不是mysql的,启动时会因无法写入数据而不能启动mysql 改变属主和属组,命令 chomd mysql:mysql /data/mysql 然后就可以尝试启动,命令 /etc/init.d/mysql start 若想开机启动,只需要输入命令 命令 chkconfig mysqld on

主从配置,主上配置 操作 安装mysql 修改my.cnf,增加server-id=130和log_bin=aminglinux1 修改完配置文件后,启动或者重启mysqld服务 把mysql库备份并恢复成aming库,作为测试数据 mysqldump -uroot mysql > /tmp/mysql.sql mysql -uroot -e “create database aming” mysql -uroot aming < /tmp/mysql.sql 创建用作同步数据的用户 grant replication slave on . to 'repl'@slave_ip identified by 'password'; flush tables with read lock; 容易忘记这个操作 show master status;

主从操作主上操作

在两台机器安装并启动mysql服务后,首先在主上进行操作 修改/etc/my.cnf配置文件 在配置文件下[mysqld]下添加 server-id=105这个id可以自定义,这里根据ip来定义 log_bin=wzq01打开binlog,名字自定义为log_bin=01最终如下 更改完配置文件后,需要重启mysql /etc/init.d/mysqld restart 这时候来/data/mysql/目录下,会生成一些文件 ls -lt /data/mysql/ 其中 .index 索引页,这个文件是必须要有的 其中 .000001 这个是二进制日志文件,会持续生成2、3、4等等(这个文件是实现主从配置的根本,没有这个文件根本没有办法完成主从) 测试,准备一个数据做演示用的 首先做一个备份 mysqldump -uroot -p'123456' wzq0123 > /tmp/wzq0123.sql 然后创建一个新的库 mysql -uroot -p111111 -e "create database aming" 能看到wzq01.000001.000001二进制文件是有增加的,wzq01.000001增长的大小是和aming这个库的保持一致的,wzq01.000001文件里完整的记录了数据库的创建的库,创建的表,以及表里的内容全都有 下面创建用于主从相互同步数据的用户 先进入到mysql里面去 创建用户 grant replication slave on . to 'repl'@'192.166.1.106' identified by '123456'; 这里得ip为slave_ip 锁定表,目的是不让表继续写,因为一会需要做 从 机器配置,需要进行一个同步,让两台机器同步,保证两台机器的数据一致,同步才不会出错 flush tables with read lock; 然后退出数据库,做一个数据同步 查看/data/mysql/下有哪些库,主上有哪些库,一会从上也得有哪些库,同步这些库,就意味着这些数据都得备份过去 备份数据库,除了mysql库,因为mysql库里面有账号密码,从上的时候不可能把所有权限复制过去,所以mysql不需要备份 备份其他的库 等会把/tmp/目录下 .sql文件都拷贝到 从上 去 主上操作完成,接下来从上操作

主从操作,从上操作

安装mysql 查看my.cnf,配置server-id=106,要求和主不一样 修改完配置文件后,启动或者重启mysqld服务 把主上aming库同步到从上 可以先创建aming库,然后把主上的/tmp/mysql.sql拷贝到从上,然后导入aming库 mysql -uroot stop slave; change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx, start slave; 还要到主上执行 unlock tables 在增加 server-id 后,对于mysql 是没有任何变化的 把主机器上备份的 .sql 数据,拷贝到从机器上,然后做一个数据恢复 scp 192.168.1.105:/tmp/*.sql /tmp/ 进入从数据库中新建库名,然后将主数据中 得wzq0123.sql导入到相应得wzq0123库中。 然后将数据库做一个恢复 mysql -uroot test < /tmp/test.sql 保证两边数据一致 然后查看/data/mysql/目录下的数据是否和主机器上的/data/mysql/目录是否一致 开始实现主从 在从机器登录到mysql 然后在数据库里面执行命令,停止slave stop slave; 配置主机器相关配置 change master to master_host='192.168.1.105', master_user='repl', master_password='123456', master_log_file='wzq01.000001', master_log_pos=xxx; master_host='192.168.1.105',指定主机器host master_user='repl',指定主机器用户 master_password='123456',指定主机器密码 master_log_file='wzq01.000001',指定binlog文件名 master_log_pos=xxx,指定binlog文件大小 也可以指定主机器的port,因为在生产环境中,也会有人更改mysql的默认端口 master_port=3306

开始slave start slave; 这时候通过 show slave status\G 判断主从是否配置成功 查看slave配置 show slave status\G 在G后面不需要加分号,\G本身就是一种结束符 看 Slave_IO_Running: Yes 是否为yes 看 Slave_SQL_Running: Yes 是否为yes 登陆主服务器并解锁

主服务器上

从服务器上

测试主从OK 若是误操作了,比如在从机器误删除了,再去主上删除相同的数据,就会有可能导致主从失败 这时在从机器上 start slave; 然后在start slave; 再来查看show slave status\G 若是还是失败,则只能 重新做主从了 重新主从 在主机器的数据库上 show mater status; 查看文件大小 然后在从机器上先stop slave; 然后直接change master to master_host='192.168.180.134', master_user='repl', master_password='123456', master_log_file='yueyong123.000001', master_log_pos=10470; 因为基本还没做什么操作的,数据还是一致的,直接改下数据大小就行 然后在从机器上 start slave; 再来查看 show slave status\G 看是否为两个Yes 若实在只能从头做主从的 mysql主从 https://my.oschina.net/u/3791387/blog/1837336

相关扩展 不停库不锁表在线主从配置 http://seanlook.com/2015/12/14/mysql-replicas/ 主从不同步 http://www.rfyy.net/archives/2309.html http://blog.51cto.com/storysky/259280 主主 关于 auto_increment https://blog.csdn.net/leshami/article/details/39779509 http://www.cnblogs.com/ygqygq2/p/6045279.html mysql-proxy 实现读写分离 http://blog.51cto.com/zzclinux/1980487 mysql-proxy类似的产品有: mycat 基于阿里的开源软件cobar,官网 www.mycat.io https://my.oschina.net/ruoli/blog/1789370 mycat实现分库分表
https://www.cnblogs.com/joylee/p/7513038.html atlas 出自于360,不维护不更新了 https://blog.csdn.net/AnPHPer/article/details/80566385

mysql环形主从 http://ask.apelearn.com/question/11437

mysql架构演变 http://www.aminglinux.com/bbs/thread-8025-1-1.html

MHA架构 http://blog.51cto.com/xiaoshuaigege/2060768

比较复杂的mysql集群架构 http://ask.apelearn.com/question/17026