(1)MySQL数据的复制
MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务器,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
(2)MySQL数据复制的原理
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。
MySQL数据库的复制需要启动三个线程来实现:
其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
这样读取和执行语句被分成两个独立的任务。如果语句执行较慢则语句读取任务没有慢下来。例如,如果从服务器有一段时间没有运行了,当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程远远滞后。如果从服务器在SQL线程执行完所有索取的语句前停止,I/O 线程至少已经索取了所有内容,以便语句的安全拷贝保存到本地从服务器的中继日志中,供从服务器下次启动时执行。这样允许清空主服务器上的二进制日志,因为不再需要等候从服务器来索取其内容。
(3)可能存在的问题
延迟问题——新版本的MySQl大致可以解决该问题;更改模型,可以减少延迟
复制过程中出错的问题——采用半同步可避免
HA集群切换导致的问题——可用lock master 解决
##Linux自带的MySQl##
1. MySQl的主从复制(A→B)
防火墙关闭,SELnux Disabled
【server1】
yum install -y mysql-server /etc/init.d/mysqld start mysql_secure_installation
vim /etc/my.cnf
在[mysqld]最后添加以下内容:
server-id=1
log-bin=mysql-bin ##默认不打开二进制日志
/etc/init.d/mysqld restart
cd /var/lib/mysql/ mysqlbinlog mysql-bin.000001 ##二进制日志
mysql -p mysql> grant replication slave on *.* to [email protected]‘172.25.45.2‘ identified by ‘westos‘; mysql> show master status; mysql> show databases; mysql> quit
mysqlbinlog mysql-bin.000001
【server2】
yum install -y mysql-server mysql -h 172.25.45.1 -uwjl -p vim /etc/my.cnf
在[mysqld]最后添加一行:server-id=2
/etc/init.d/mysqld start mysql_secure_installation
mysql -p mysql> show slave status; mysql> change master to master_host=‘172.25.45.1‘,master_user=‘wjl‘,master_password=‘westos‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=255; mysql> start slave; mysql> show slave status; mysql> show slave status\G; mysql> show databases; mysql> quit
测试:
【server1】
mysql -p mysql> create database westos; mysql> use westos; mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null); mysql> show tables; mysql> insert into usertb value (‘user1‘,‘123‘); mysql> insert into usertb value (‘user2‘,‘456‘); mysql> delete from usertb where username=‘user2‘; mysql> update usertb set passwd=passwd(‘456‘); ##边做边看server2是否同步
【server2】
mysqlbinlog mysql-bin.000001
mysql -p mysql> show databases; mysql> use westos; mysql> show tables; mysql> desc usertb; mysql> select * from usertb;
cd /var/lib/mysql/ cat relay-log.info ##判断不同并记录 cat master.info
2.主从复制应用(A→B→C)
【server2】
vim /etc/my.cnf
添加以下内容:
log-bin=mysql-bin
log-slave-updates
/etc/init.d/mysqld restart
ls /var/lib/mysql
mysql -p mysql> show master status; mysql> grant replication slave on *.* to [email protected]‘172.25.45.3‘ identified by ‘westos‘; mysql> show databases; mysql> quit
【server3】
yum install -y mysql-server mysql -h 172.25.45.2 -uwjl -p vim /etc/my.cnf
在[mysqld]最后添加一行:server-id=3
/etc/init.d/mysqld start mysql_secure_installation
mysql -p mysql> show slave status; mysql> change master to master_host=‘172.25.45.2‘,master_user=‘wjl‘,master_password=‘westos‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=255; mysql> start slave; mysql> show slave status\G; mysql> show databases; mysql> quit
【server1】
scp mysql-bin.000001 [email protected]:/var/lib/mysql/
【server3】
mysql -p mysql> show databases; mysql> quit
mysqlbinlog mysql-bin.000001 --start-position=255 --stop-position=490 | mysql -pwestos ##执行server2上执行的操作
##mysql5.7版本##
1.
【server1/server2】
rm -rf /var/lib/mysql/* rpm -qa | grep mysql
yum remove mysql mysql-server rpm -e mysql-libs --nodeps/ rpm -e `rpm -qa | grep mysql` --nodeps rpm -qa | grep mysql ##卸载干净,不然和新版本会有冲突
需要软件包:
mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
【server1】
tar -xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
scp mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm [email protected]:
yum install -y mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm
/etc/init.d/mysqld start cat /var/log/mysqld.log | grep password
mysql_secure_installation ##新版本对密码的要求更高
vim /etc/my.cnf
在最后添加以下内容:
server-id=1
log-bin=mysql-bin
/etc/init.d/mysqld restart
mysql -p mysql> grant replication slave on *.* to [email protected]‘172.25.45.2‘ identified by ‘Westos+123‘; mysql> show master status; mysql> quit
【server2】
yum install -y mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm
mysql -h 172.25.45.1 -uwjl -pWestos+123 ##可成功登录
vim /etc/my.cnf
在最后添加一行:server-id=2
/etc/init.d/mysqld start cat /var/log/mysqld.log | grep password
/etc/init.d/mysqld start mysql_secure_installation
mysql -p mysql> start slave; mysql> show slave status\G; mysql> show databases; mysql> quit
测试:
【server1】
mysql -p mysql> create database westos; mysql> use westos; mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null); mysql> show tables; mysql> insert into usertb value (‘user1‘,‘123‘); mysql> insert into usertb value (‘user2‘,‘456‘); mysql> delete from usertb where username=‘user2‘; mysql> update usertb set passwd=passwd(‘456‘);##边做边看server2是否同步
【server2】
mysqlbinlog mysql-bin.000001
mysql -p mysql> show databases; mysql> use westos; mysql> show tables; mysql> desc usertb; mysql> select * from usertb;
2.
【server2】
mysql -p mysql> stop slave; mysql> quit
【server1/server2】
vim /etc/my.cnf
在最后添上以下内容:
gtid-mode=on
enforce-gtid-consistency=on
/etc/init.d/mysqld restart
【server2】
mysql -p mysql> show slave status\G;##slave依然开启 mysql> stop slave; mysql> change master to master_host=‘172.25.45.1‘,master_user=‘wjl‘,master_password=‘Westos+123‘,master_auto_position=1; mysql> start slave; mysql> show slave status\G;
测试:
【server1】
mysql -p mysql> create database westos; mysql> use westos; mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null); mysql> show tables; mysql> insert into usertb value (‘user1‘,‘123‘); mysql> insert into usertb value (‘user2‘,‘456‘); mysql> delete from usertb where username=‘user2‘; mysql> update usertb set passwd=passwd(‘456‘); ##边做边看server2是否同步
【server2】
mysqlbinlog mysql-bin.000001
mysql -p mysql> show databases; mysql> use westos; mysql> show tables; mysql> desc usertb; mysql> select * from usertb;
对应且增加
3.
【server2】
vim /etc/my.cnf
在最后添上以下内容:
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
/etc/init.d/mysqld restart
mysql -p mysql> show slave status\G;
4.
【server1】
需要一个sql文件——add.sql
mysql -p mysql> use westos; mysql> drop table usertb; mysql> show processlist; mysql> quit
mysql -pWestos+123 westos < add.sql
mysql -p mysql> use westos; mysql> call test1;
可通过mysql> show slave status\G在server2查看进度
扩大server2内存空间
pvcreate /dev/vdb1 vgextend VolGroup /dev/vdb1 lvextend -L +10g /dev/VolGroup/lv_root resize2fs /dev/VolGroup/lv_root
time mysqldump -pWestos+123 westos > westos.sql time mysqlpump -pWestos+123 --default-parallelism=2 --compress-output=lz4 westos > test