博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 主从复制简单部署过程
阅读量:6194 次
发布时间:2019-06-21

本文共 6983 字,大约阅读时间需要 23 分钟。

整体上来说,复制大致分为3个步骤: 

1. master将数据库的改变记录到二进制日志(binary log)中,这些记录叫做二进制日志事件(binary log  

    events);

2. slave将master的binary log events  dump到它的中继日志(relay log);
3. slave重做中继日志中的事件,将改变反映到它自己的数据。

下图描述了复制的原理

    

        该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
      接下来就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
       SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

以一个实验介绍mysql主从复制的部署过程.

场景介绍:

HostName: Mysql_master IP: 192.168.200.20  Mysql复制主服务器

HostName: Mysql_slave  IP: 192.168.200.21  Mysql复制从服务器

Mysql版本: 5.6.19

安装部分:

1. 安装cmake:从mysql5.5版本开始,开始使用cmake

   

    下载链接:

cmake安装:

#cmake安装[root@Master_mysql src]# tar zxvf cmake-3.0.0.tar.gz[root@Master_mysql src]# cd cmake-3.0.0[root@Master_mysql cmake-3.0.0]# ./bootstrap[root@Master_mysql cmake-3.0.0]# gmake[root@Master_mysql cmake-3.0.0]# make install

 

2.安装mysql:

[root@Master_mysql ~]# groupadd mysql[root@Master_mysql ~]# useradd -g mysql mysql[root@Master_mysql src]# tar zxvf mysql-5.6.19.tar.gz[root@Master_mysql src]# cd mysql-5.6.19[root@Master_mysql mysql-5.6.19]# cmake .[root@Master_mysql mysql-5.6.19]# make[root@Master_mysql mysql-5.6.19]# make install[root@Master_mysql mysql-5.6.19]# cd /usr/local/mysql/[root@Master_mysql mysql]# chown -R mysql:mysql .[root@Master_mysql mysql]# scripts/mysql_install_db --user=mysql &[root@Master_mysql mysql]# chown -R root:root  .[root@Master_mysql mysql]# chown -R mysql:mysql data[root@Master_mysql mysql]# bin/mysqld_safe --user=mysql &[root@Master_mysql mysql]# cp support-files/mysql.server /etc/init.d/

在Mysql主从服务器上分别执行上诉安装过程.

配置部分:

  1. 主数据库服务器配置

修改主数据库服务器配置文件my.cnf: 

#增加如下:[mysqld]server_id = 1log_bin = mysql-binlog   #二进制日志名称前缀

启动Mysql服务: 

[root@Master_mysql mysql]# /etc/init.d/mysql.server start

主服务器上创建授权账号并获取二进制文件和位置:

#复制权限mysql> grant replication slave on *.* to 'replica'@'192.168.200.21' identified by 'replicapass';Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.10 sec)#锁表mysql> flush tables with read lock;Query OK, 0 rows affected (0.01 sec)#mysql> show master status\G*************************** 1. row ***************************             File: mysql-binlog.000015         Position: 413     Binlog_Do_DB: Binlog_Ignore_DB:Executed_Gtid_Set:1 row in set (0.00 sec)#mysql> unlock tables;Query OK, 0 rows affected (0.04 sec)

此处主要用来获取File 文件名称、Postition 位置,之后从服务器配置change master to时需要

指定此处获取的内容.

2. 从数据库服务器配置:

修改从数据库服务器配置文件my.cnf: 

#增加如下:server_id = 2log_bin = mysql-binlog relay_log = mysql-relaylog   #(中继日志名称前缀)log_slave_updates = 1        #(slave重做中继日志内容并写入到log_bin指定的二进制日志文件)

 

 普通的从数据库服务器是不需要启用二进制日志的,但在某些特殊情况下,必须启用二进制日志。比

 如:某个从服务器同时作为其他数据库服务器的主、或者希望日常备份在从库上执行等。 开启二进制

 日志后,需要同时开启log_slave_updates参数,如果不启用,二进制日志文件则不会有内容. 

启动Mysql服务: 

[root@Slave_mysql mysql]# /etc/init.d/mysql.server start

设置复制并启动复制:

#mysql> change master to  master_host='192.168.200.20',    -> master_user='replica',    -> master_password='replicapass',    -> master_log_file='mysql-binlog.000015',    -> master_log_pos=413,    -> master_connect_retry=10;Query OK, 0 rows affected, 2 warnings (0.08 sec)#mysql> start slave;Query OK, 0 rows affected (0.03 sec)

从服务器上查看复制状态:

#mysql> show slave status\G*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.200.20                  Master_User: replica                  Master_Port: 3306                Connect_Retry: 10              Master_Log_File: mysql-binlog.000015          Read_Master_Log_Pos: 413               Relay_Log_File: mysql-relaylog.000002                Relay_Log_Pos: 286        Relay_Master_Log_File: mysql-binlog.000015             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: 413              Relay_Log_Space: 458              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: 0Master_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: e84592e0-0e5b-11e4-a5d3-000c29e88022             Master_Info_File: /usr/local/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: 01 row in set (0.00 sec)

可以看到: Slave_IO_Running和Slave_SQL_Running 状态都是Yes,这说明两个线程都在正常运行,复制

成功执行.

复制验证部分:

主服务器上,登录数据库进行建库操作:

本例创建库temp和表t1

#mysql> create database temp;Query OK, 1 row affected (0.06 sec)#mysql> create table temp.t1(    -> number varchar(10) not null,    -> name varchar(20),    -> birthday date,    -> primary key (number)    -> );Query OK, 0 rows affected (0.23 sec)#mysql> insert into temp.t1    -> values('20140805','shizhenning','19860101');Query OK, 1 row affected (0.07 sec)#mysql> select * from temp.t1;+----------+-------------+------------+| number   | name        | birthday   |+----------+-------------+------------+| 20140805 | shizhenning | 1986-01-01 |+----------+-------------+------------+1 row in set (0.03 sec)

查询从库服务器复制结果:

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || temp               || test               |+--------------------+5 rows in set (0.00 sec)mysql> select * from temp.t1;+----------+-------------+------------+| number   | name        | birthday   |+----------+-------------+------------+| 20140805 | shizhenning | 1986-01-01 |+----------+-------------+------------+1 row in set (0.00 sec)

可以看到,从库服务器已经复制完成.

对比两台服务器日志:

 主服务器执行:  mysqlbinlog data/mysql-binlog.000015

 可以看到:     

从库服务器执行: mysqlbinlog data/mysql-binlog.000002 

 

从库服务器的二进制日志已经有了内容,时间戳和主库二进制保持一致.

这样一个基本的主从复制就部署完成了.

 

转载地址:http://afuca.baihongyu.com/

你可能感兴趣的文章
什么是ground truth(GT)
查看>>
读取C#AssemblyInfo文件中的AssemblyVersion中的值
查看>>
CRM 相关术语 (一)
查看>>
Makefile 使用总结
查看>>
P4035 [JSOI2008]球形空间产生器
查看>>
Codeforces Round #239 (Div. 1) 解题报告
查看>>
第一天开通博客纪念一下吧
查看>>
b/s结构和c/s结构
查看>>
前台vue的使用简单小结
查看>>
Linux-DNS服务-主域名服务器的配置(中)
查看>>
Python之 Virtualenv简明教程
查看>>
蛤车1:两个习题,群作用与覆叠空间,N-S定理
查看>>
hibernate自动生成数据库表
查看>>
DateUtil
查看>>
贝叶斯分类器
查看>>
输入长整形数据输出对应的十六进制字符串
查看>>
Swing的Look And Feel机制研究
查看>>
linux 使用记录
查看>>
博客网站参考
查看>>
冒泡排序
查看>>