欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何实现MySQL服务器主从复制同步?

程序员文章站 2022-04-09 20:34:09
...

前言

  • 生产环境中,服务器不可能只有一台,而多台服务器的存在必然要用到主从复制同步。

一:主从复制原因与解决

1.1:原因

  • 在企业网站中,后端MySQL数据库只有一台时,会有以下问题:
    • 遇到单点故障,服务不可用
    • 无法处理大量的并发数据请求
    • 数据丢失将会造成很大损失
  • 如何实现MySQL服务器主从复制同步?

1.2:解决办法

  • 增加MySQL数据库服务器,对数据进行备份,形成主备
  • 确保主备MySQL数据库服务器数据是一样的
  • 主服务器宕机了,备份服务器继续工作,数据有保障
  • MySQL主从复制与读写分离是密切相关的
  • 如何实现MySQL服务器主从复制同步?

1.3:更高级的解决方案

  • 通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力

  • Amoeba:是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy,外号变形虫

    读取请求发送给从服务器时,采用轮询调度算法

  • 主服务器挂掉,我们会采用MHA解决(此实验用不到)

  • 此实验涉及到的账号权限

    • 主从同步账号
    • 节点服务器开放调度账号
    • Amoeba代理账号
  • 如何实现MySQL服务器主从复制同步?

1.4:MySQL主从复制的类型

  • 基于语句的复制(默认)
    • 在主服务器上执行的语句,从服务器执行同样的语句
  • 基于行的复制
    • 把改变的内容复制到从服务器
  • 混合类型的复制
    • 一旦发现基于语句无法精确复制时,就会采用基于行的复制

1.5:主从复制的工作过程

  • 如何实现MySQL服务器主从复制同步?

二:主从复制实验实操

2.1:环境

  • 四台centos7服务器
  • 一台做client
  • 三台做mysql服务器

2.2:拓扑图

如何实现MySQL服务器主从复制同步?

2.3:实验目的

  • 通过配置,实现主从复制

2.4:实验过程

2.4.1:防火墙设置
  • 所有服务器关闭 Firewall或者进行规则设置

    systemctl stop firewalld.service 
    setenforce 0
    
2.4.2:建立时间同步环境
  • 在主服务器上安装配置NTP时间同步服务器

    • 使用yum安装NTP服务

    • 修改 ntp. conf,设置主服务器为时间同步源

      [aaa@qq.com ~]# yum install ntp -y
      [aaa@qq.com ~]# vim /etc/ntp.conf
      ...省略内容
      server 0.centos.pool.ntp.org iburst
      server 1.centos.pool.ntp.org iburst
      server 2.centos.pool.ntp.org iburst
      server 3.centos.pool.ntp.org iburst
      '//添加一下两段'
      server 127.127.195.0 //本地是时钟源// 
      fudge 127.127.195.0 stratum 8  //设置时间层级为8//
      ...省略内容
      [aaa@qq.com ~]# systemctl start ntpd
      
  • 在从服务器上进行时间同步

    • 使用yum安装 ntpdate并进行时间同步

      [aaa@qq.com ~]# yum install ntp ntpdate -y
      [aaa@qq.com ~]# systemctl start ntpd
      [aaa@qq.com ~]# /usr/sbin/ntpdate 192.168.79.134
          '//两台从服务器都这样设置'
      
2.4.3:编译安装mysql
2.4.4:配置mysql主服务器
  • 修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项

    [aaa@qq.com ~]# vim /etc/my.cnf
    ...省略内容
    '//mysqld字段下面修改'
    server-id = 11	'//修改为11'
    log-bin=master-bin	'//设置二进制日志名'
    log-slave-updates=true	'//从服务器更新二进制日志'
    [aaa@qq.com ~]# systemctl restart mysqld.service 	'//重启mysql服务'
    
  • 登陆mysql服务,授权所有从服务器复制二进制日志的权限

    [aaa@qq.com ~]# mysql -u root -p
    Enter password: 
    '//192.168.79.0段的从服务器拥有复制权限,可以使用myslave身份123456密码复制所有的库和表'
    GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.79.%' IDENTIFIED BY '123456';
    mysql> flush privileges;	'//刷新'
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show master status;	'//查看位置id'
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | master-bin.000001 |      603 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
2.4.5:配置两台从服务器
  • 修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项

    [aaa@qq.com ~]# vim /etc/my.cnf
    ...省略内容
    '//mysqld字段下面修改'
    server-id = 22	'//修改为22,另一台从服务器的id设为23,三个id不可相同'
    relay-log=relay-log-bin	'//设置二进制日志名'
    relay-log-index=slave-relay-bin.index	'//从服务器更新二进制日志'
    [aaa@qq.com ~]# systemctl restart mysqld.service 	'//重启mysql服务'
    
  • 登陆mysql服务,配置组从同步

    [root@slave1 ~]# mysql -uroot -p
    Enter password: 
    mysql> change master to master_host='192.168.79.134',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=603;
    
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> start slave;
    ...省略内容
                 Slave_IO_Running: Yes	'//发现IO是正常的'
                Slave_SQL_Running: Yes	'//SQL是正常的'
    ...省略内容
    

2.5:实验验证

  • 主服务器创建一个库

    [root@master ~]# mysql -uroot -p
    Enter password: 
    mysql> create database erku;
    Query OK, 1 row affected (0.00 sec)
    
    
  • 两台从服务器查看是否同步

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | erku               |	'//成功同步'
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)