Mysql主从同步原理和配置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wxid2798226/article/details/100802106

参考 Mysql主从同步操作实践

背景

组里针对Mysql和MongoDB要搭建主从,提升生产应用的稳定性,同时尽量不影响性能。

mysql主从的原理可以搜索下很多介绍,配置策略同 《MongoDB高可用主从配置.md 》

采用eBay公司的“两地三中心”热备策略
在这里插入图片描述

注:在完成主从配置后,若要添加应用库,参考简明指南:https://forums.mysql.com/read.php?26,171776,205870

1. 创建账号,授权


mysql > grant replication slave,reload,super, on *.* to 'backup'@ ’192.168.52.220’ identified by ‘123456’;

建立一个帐户backup,并且只能允许从192.168.52.220这个地址上来登陆,密码是123456。这里@后面的ip地址就是slave的ip

注意,如上是在主服务器上操作,给将来的cong服务器权限

2. 主服务器配置


server-id=1          #为主服务器A的ID值   

log-bin=mysql-bin     #二进制变更日志

3. 从服务器配置


log_bin = mysql-bin   

 server_id= 2   

 relay_log = mysql-relay-bin   

 log_slave_updates = 1   --这个区分了是否slave

 read_only= 1

4. 完成后的配置


技术摘要

主从复制条件

  • 开启Binlog功能
  • 主库要建立账号
  • 从库要配置master.info (CHANGE MASTER to…相当于配置密码文件和Master的相关信息)
  • start slave 开启复制功能

主从复制时需要理解

  • 3个线程,主库IO,从库IO和SQL及作用
  • master.info(从库)作用
  • relay-log 作用
  • 异步复制
  • binlog作用 (如果需要级联需要开启Binlog)

主从复制时注意事项

  • 主从复制是异步逻辑的SQL语句级的复制
  • 复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程
  • 实现主从复制的必要条件是主库要开启记录binlog功能
  • 作为复制的所有Mysql节点的server-id都不能相同
  • binlog文件只记录对数据库有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句

手工安装具体步骤

官方文档,二进制安装,而不是编译安装

https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

yum search libaio – (在同个目录下已经帮忙下好了 sudo rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm)

注意centos已经有默认的mariadb的包,要删除,先用rpm -qa | grep mariadb查询一下


$ sudo rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

$ rpm -aq | grep mariadb

$ sudo rpm -ivh mysql-community-common-5.7.17-1.el7.x86_64.rpm mysql-community-client-5.7.17-1.el7.x86_64.rpm mysql-community-server-5.7.17-1.el7.x86_64.rpm mysql-community-libs-5.7.17-1.el7.x86_64.rpm

warning: mysql-community-common-5.7.17-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY

Preparing... ################################# [100%]

Updating / installing...

   1:mysql-community-common-5.7.17-1.e################################# [ 25%]

   2:mysql-community-libs-5.7.17-1.el7################################# [ 50%]

   3:mysql-community-client-5.7.17-1.e################################# [ 75%]

   4:mysql-community-server-5.7.17-1.e################################# [100%]

如果具备条件,也可以使用docker,但是最好是tess


安装之后的设置,本文略过安装部分,直接看设置部分

  1. whereis mysql --check if success

  2. sudo systemctl start mysqld / sudo systemctl status mysqld (这样就随系统自启动了)

  3. 找到临时密码


cd /var/log  -- 准备查 /var/log/mysqld.log

$ sudo su mysql

$ cat mysqld.log | grep temporary

2019-07-31T08:06:23.010669Z 1 [Note] A temporary password is generated for root@localhost: qt=e!=:P>50p

  1. 更改密码为XXXXXXXXXXX(填写自己设置的密码),安全设置,但是允许了远程登录

sudo mysql_secure_installation

  1. 登录

mysql –u root –p

grant replication slave, replication client on *.* to slave@'10.199.xxx.xxx' identified by 'XXXXXXXXXX';

grant replication slave, replication client on *.* to slave@'10.16.xxx.xxx' identified by 'XXXXXXXXXX';



准备主从

主的/etc/my.cnf要改,备的也要 (里面指明了哪些数据库要备份,跳过哪些数据库)

主的所有数据库在备上都要建立,然后倒入主库备份的tar

修改配置文件,重启数据库,检查slave线程状态


mysql> show master logs;

+---------------------+-----------+

| Log_name | File_size |

+---------------------+-----------+

| mysql-or-bin.000001 | 1538 |

| mysql-or-bin.000002 | 398 |

+---------------------+-----------+

在/etc/my.cnf配置文件中


log-bin=mysql-or-bin

replicate-do-db=huanqiu

replicate-ignore-db=mysql

slave-skip-errors=all

grant要成功,从备机ping一下主机,telnet 3306端口,然后用mysql,slave账号,看能否远程登录主机


change master to master_host='10.199.xxx.xxx',master_user='slave',master_password='XXXXXXXXXXXX',master_log_file='mysql-or-bin.000001',master_log_pos=1345;

显示slave状态


mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.199.xxx.xxx

                  Master_User: slave

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-or-bin.000001

          Read_Master_Log_Pos: 1056

               Relay_Log_File: lvstraffictepbatch-286242-relay-bin.000002

                Relay_Log_Pos: 323

        Relay_Master_Log_File: mysql-or-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

1 row in set (0.00 sec)



当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!


如何验证同步开启了

登录 主服务器 92 备服务器 140 filer机器 75,同时打开mysql

在主服务器的mysql中插入一条sql insert into huanqiu.haha1 values(201, 'myname'); 然后在3个库上查询,发现每个库都已经有了这个结果


为什么要设置成主从?

好处多多,首先复习一下 设计面试:如何扩展互联网应用Scalability for dummies.md

如上6大原则,可以分为3类,

  • 垂直扩展VS水平扩展

  • 缓存和负载均衡

  • 数据库:repliacation VS sharding
    但是eBay marketing team的特点,主要是批处理,使用了repliacation,暂不考虑分库分表

主从的好处
  • backup,有实时备份了,数据不丢失

  • 可扩展,读应用都从多个备库上走(但这个场景目前在eBay marketing team不多见,在网易圈圈多见)

如果配置为主主模式,还有更进一步的好处:

  • 灾备和高可用,生产上主挂了,备用的自动升级为主,不影响生产 (主从模式下是不能自动切换的,因为主从同步是主服务器binlog是数据源头,如果主挂了,没有源头了,从服务器的数据更新是不会和主服务器同步的。)

猜你喜欢

转载自blog.csdn.net/wxid2798226/article/details/100802106