IE盒子

搜索
查看: 138|回复: 1

Mysql主从部署

[复制链接]

4

主题

9

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-1-12 15:11:39 | 显示全部楼层 |阅读模式
一、什么是主从同步

将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态,称之为主从复制。简单概括为,主数据库做什么,从数据库就跟着做什么。
二、主从同步原理

2.1 原理图




主从同步原理图

上述相关名词说明如下:
1.bin log:二进制文件
2.log dump线程:二进制日志转储线程
3.relay log:中继日志
4.I/O线程:用于请求主库的binlog,并且把接收到的binlog信息写入relay log日志文件中
5.SQL线程:用于读取relay log日志文件内容,并且在从库中做回放
2.2 原理概述

1.从库创建两个进程,一个I/O线程,一个SQL线程,其中I/O线程用于请求主库的binlog,并且把接收到的binlog信息写入relay log日志文件中;SQL线程用于读取relay log日志文件内容,并且在从库中做回放。
2.主库创建一个log dump线程,用于发送binlog到从库;
三、为什么做主从同步

1.主从同步可以提高数据库的吞吐量;
2.主从同步可以读写分离,通过主从复制方式同步数据,通过读写分离提高数据库并发处理能力;
3.主从同步可以进行数据备份;
4.主从同步具有高可用性。
四、Mysql主从部署

4.1 环境介绍

操作系统Mysql版本主机IP
Centos7-X86_64-Eeverything20095.6.34192.168.100.135(主)
Centos7-X86_64-Eeverything20095.6.34192.168.100.136(备)
4.2 操作步骤

4.2.1 主库

4.2.1.1 防火墙开放端口
1.执行firewall-cmd --zone=public --add-port=3306/tcp --permanent命令开放3306端口
[root@test ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success参数说明如下:

  • –zone:作用域
  • –add-port=3306/tcp:添加端口,格式为:端口/通讯协议
  • –permanent:永久生效,没有此参数重启后失效
2.执行systemctl restart firewalld.service命令重启防火墙服务
[root@test ~]# systemctl restart firewalld.service3.执行firewall-cmd --list-ports命令查看端口是否开放成功
[root@test ~]# firewall-cmd --list-ports
3306/tcp4.2.1.2 修改主机名
[root@test ~]# hostname master
[root@test ~]# hostname
master4.2.1.3 修改配置文件
1.执行vim /etc/my.cnf命令修改配置文件,添加以下内容
server-id = 1
log-bin=mysql-bin

  • server-id = 1:配置服务器的服务号
  • log-bin=mysql-bin:指定数据库操作的日志文件
2.其他可选参数

  • max_binlog_size= 500M:设置日志文件得最大值,超过该值则另启文件记录日志
  • binlog_cache_size= 128K:设置日志文件缓存大小
  • replicate-do-db= pos:指定要同步的数据库,如果有多个,请重复该行内容并修改数据库名称为对应数据库
  • replicate-ignore-db= mysql:指定不需要同步的数据库
4.2.1.4 重启mysql服务
1.执行service mysqld restart命令重启mysql服务
[root@test ~]# service mysqld restart4.2.1.4 创建用户并授权
# 创建用户
mysql> grant replication slave on *.* to 'test'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

# 用户授权
mysql> grant all on *.* to 'test'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

# 刷新权限
mysql> Flush privileges;
Query OK, 0 rows affected (0.01 sec)4.2.1.5 查看二进制文件名以及大小
1.执行show master status;语句查看二进制文件名及大小,方便在从库进行绑定
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      592 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+4.2.2 备库

4.2.2.1 防火墙开放端口
1.执行firewall-cmd --zone=public --add-port=3306/tcp --permanent命令开放3306端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success参数说明如下:

  • –zone:作用域
  • –add-port=3306/tcp:添加端口,格式为:端口/通讯协议
  • –permanent:永久生效,没有此参数重启后失效
2.执行systemctl restart firewalld.service命令重启防火墙服务
[root@localhost ~]# systemctl restart firewalld.service3.执行firewall-cmd --list-ports命令查看端口是否开放成功
[root@localhost ~]# firewall-cmd --list-ports
3306/tcp4.2.2.2 修改主机名
[root@localhost ~]# hostname slave
[root@localhost ~]# hostname
slave4.2.2.3 修改配置文件
1.执行vim /etc/my.cnf命令修改配置文件,添加以下内容
server-id = 2
log-bin=mysql-bin

  • server-id = 2:配置服务器的服务号
  • log-bin=mysql-bin:指定数据库操作的日志文件
2.其他可选参数

  • replicate-do-db= pos:指定要同步的数据库,如果有多个,请重复该行内容并修改数据库名称为对应数据库。   replicate-ignore-db= mysql:指定不需要同步的数据库
  • max_binlog_size= 500M:设置日志文件得最大值,超过该值则另启文件记录日志
  • binlog_cache_size= 128K:设置日志文件缓存大小
4.2.2.4 重启mysql服务
1.执行service mysqld restart命令重启mysql服务
[root@localhost ~]# service mysqld restart4.2.2.5 配置主数据库信息
mysql> change master to
master_host='192.168.100.135',master_user='test',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=592;
Query OK, 0 rows affected, 2 warnings (0.02 sec)4.2.2.6 开始同步
mysql> start slave;4.2.2.7 查看同步
1.执行show slave status\G;语句查看同步情况,这里观察到Slave_IO_Running和Slave_SQL_Running显示YES。
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.135
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 592
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 592
              Relay_Log_Space: 456
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: f0fd84c8-53ee-11ed-9b81-000c2904ef91
             Master_Info_File: /opt/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)4.3 测试

1.在主库执行以下SQL语句创建class库并添加表结构
# 创建数据库class
mysql> create database class;
Query OK, 1 row affected (0.00 sec)

# 进入数据库class
mysql> use class;
Database changed

#添加表结构
mysql> create table student ( id int primary key auto_increment, name varchar(10) );
Query OK, 0 rows affected (0.02 sec)2.在从库执行以下SQL语句查看从库是否存在主库创建的库信息。这里观察到,已同步。
#显示库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)

#进入库
mysql> use class
Database changed五、主从同步缺陷

1.部署时存在一定的复杂度
2.带来一定的主从同步延迟
六、主从同步延迟优化

6.1 强制查询主库

不查询从库,只查询主库。这种方法适用于适用于对实时性业务要求非常高的业务,但是要考虑查询的量级会不会很大,在不在主库的可承受范围内。
6.2 并行复制

将SQL单线程拆分为多个work线程来进行重放
6.3 降低并发

控制主库写入速度,主从同步延迟发生概率变小
回复

使用道具 举报

2

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 4 天前 | 显示全部楼层
OMG!介是啥东东!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表