mysql主从复制和并行复制

Mysql的主从复制和并行复制

  1. 复制概述
    mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
    请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突
  2. 复制工作过程:
    (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
    (2) slave将master的binary log events拷贝到它的中继日志(relay log);

    (3) slave重做中继日志中的事件,将改变反映它自己的数据。
    下图描述了复制的过程:
    mysql主从复制和并行复制_第1张图片

    该过程的第一部分就是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上并行操作。

实验环境:
Mater 172.25.64.3
Slave 172.25.64.4

Mysql的主从复制:

Redhat6.5自带mysql,直接yum安装

yum install mysql-server –y ##主从都需要安装

Master主机配置:

Vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
log-bin=mysql-bin #启动二进制日至系统 ##以下四行为新添加的参数
binlog-do-db=test ##二进制需要同步的数据库名,如果需要同步多个库,按照这个参数,再添加,然后修改后面的数据库名字就行
server-id=1 ##主服务器的id值,
binlog-ignore-db=mysql ##禁止同步mysql数据库

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

/etc/init.d/mysqld start ##开启数据库

创建复制帐号1,在master的数据库中建立一个备用账户,每个slave使用用户名和密码连接master,进行复制操作的用户会授予replicati on slave权限,用户名的密码都会存储在slave服务器的master.info中。
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON . TO westos@’172.25.64.4’ DENTIFIED BY ‘westos’; ##建立一个账户westos,并且只能允许172.25.64.4这个地址来登陆,密码是westos
mysql>Flush privileges;
调试:
在master上面用下面命令查看日至文件和更新值的在日至中的位置。这个后面配置从服务器的时候要用到,从服务器从主服务器的日志文件中的更新位置开始进行复制。

mysql> show master status
-> ;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 346 | test | mysql |
+——————+———-+————–+——————+

Master服务器配置好了,接下来我们配置slave服务器:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
server-id=2 #从服务器 ID 号,不要和主 ID 相同,如果设置多个从服务器,每个从服务器必须有一个唯一的 server-id 值,必须与主服务器的以及其它从服务器的不相同。可以认为 server-id 值类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集
中的每个服务器实例。

/etc/init.d/mysqld start ##开启slave数据库

在slave上面执行下面命令

mysql> change master to master_host=’172.25.64.3’, master_user=’westos’,
master_password=’westos’, master_log_file=’mysql-bin.000003’, master_log_pos=346;
参数解释:MASTER_HOST : 设置要连接的主服务器的ip地址
     MASTER_USER : 设置要连接的主服务器的用户名
     MASTER_PASSWORD : 设置要连接的主服务器的密码
    MASTER_LOG_FILE : 设置要连接的主服务器的bin日志的日志名称,即查看master服务器上面数据库的show master status;所显示的文件名称
MASTER_LOG_POS : 设置要连接的主服务器的bin日志的记录位置,即show master status中的postion,(这里注意,最后一项不需要加引号。否则配置失败)

Query OK, 0 rows affected (0.28 sec)
mysql> slave start; ##开启从服务器
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.64.3 ##主服务器地址
Master_User: westos ##授权账户名
Master_Port: 3306 ##数据库端口
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 346 ##同步读取二进制日志的位置
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes ##IO和SQL必须是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: 346
Relay_Log_Space: 407
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:
1 row in set (0.00 sec)

测试:

Master上面再test库里面新建表然后插入数据,然后在slave服务器上面查看有没有复制过来

Master服务器上面:
mysql> use test;
mysql> create table test;
mysql> create table yiyi(id int(3),name char(10));
mysql> insert into yiyi values(001,’yiyi’);
mysql> select * from yiyi;
mysql> select * from yiyi;
+——+——+
| id | name |
+——+——+
| 1 | yiyi |
+——+——+
1 row in set (0.00 sec)

Slave服务器上面:
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from yiyi
-> ;
+——+——+
| id | name |
+——+——+
| 1 | yiyi |
+——+——+

Mysql并行复制:

为什么需要并行复制:
  一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) —–>IO Thread (从) —–> SQL Thread(从)。复制出现延迟一般出在两个地方
1)SQL线程忙不过来(可能需要应用数据量较大,可能和从库本身的一些操作有锁和资源的冲突;主库可以并发写,SQL线程不可以;主要原因)
2)网络抖动导致IO线程复制延迟(次要原因)。
MySQL从5.6开始有了SQL Thread多个的概念,可以并发还原数据,即并行复制技术。
  在MySQL 5.7中,引入了基于组提交的并行复制(Enhanced Multi-threaded Slaves),设置参数slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,
即可支持一个schema下,slave_parallel_workers个的worker线程并发执行relay log中主库提交的事务。其核心思想:一个组提交的事务都是可以并行回放(配合binary log group commit);
slave机器的relay log中 last_committed相同的事务(sequence_num不同)可以并发执行。
  其中,变量slave-parallel-type可以有两个值:DATABASE 默认值,基于库的并行复制方式;LOGICAL_CLOCK:基于组提交的并行复制方式

安装5.7版本的数据库:
tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar ##解开tar包
yum remove mysql-libs -y ##首先需要卸载当前版本数据库的库
yum install mysql-community-common-5.7.17-1.el6.x86_64.rpm -y
yum install mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y ##安装数据库

主从服务器都需要安装5.7版本的数据库。
mysql_secure_installation ##数据库安全认证修改数据库密码
由于5.7版本的数据库安装的时候就会生成密码,密码在/var/log/mysql.log里面

master服务器配置与授权与主从复制的一样,由于并行复制是再5.7版本加入的,5.7版本对数据库的密码健壮性要求比较高,所以我们在授权的时候需要对密码进行修改,slave服务器的配置文件需要添加以下几行:
server-id=2
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##并行复制线程数
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON ##从机要求重新同步master日志

测试:在master里面插入数据,然后在slave上面查看:
Master插入:
mysql> create table bushe;
mysql> create table bushe(name char(10));
mysql> insert into bushe values (‘kang’);

Slave查看mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
| yiyi |
+——————–+
5 rows in set (0.00 sec)

mysql> use yiyi;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> show tables;
+—————-+
| Tables_in_yiyi |
+—————-+
| bushe |
+—————-+
1 row in set (0.00 sec)

mysql> select * from bushe;
+——+
| name |
+——+
| kang |
+——+
1 row in set (0.00 sec)

可以看到在master中的数据复制到了slave

你可能感兴趣的:(mysql主从复制和并行复制)