复制原理:
Mysql中有一种日志叫做bin日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL语句(insert,update,delete,ALTER TABLE,grant等等)。
主从复制的原理其实就是把主服务器上的BIN日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引 以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从服务器接收从那时起发生的任何更新,然后封
锁并等待主服务器通知新的更新。
复制过程:
复制特点:
单向复制有利于健壮性、速度和系统管理:
1. 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份,
2. 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT 查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
3. 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
注意:当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突!
一.主从复制配置过程
主节点:172.25.0.121(master)
从节点:172.25.0.122(slave)
所需的安装包:
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-client-5.7.17-1.el6.x86_64.rpm
1.安装mysql
[root@server5 ~]# yum install * -y
[root@server5 ~]# /etc/init.d/mysqld start #开启数据库
[root@server5 ~]# grep password /var/log/mysqld.log ##查看初始密码
[root@server5 ~]# mysql_secure_installation # 修改密码
Enter password for user root: #输入初始化密码
New password: #输入新密码(字母大小写,数字,字符,大于8位!)
Re-enter new password:
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y #删除匿名
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y #不允许root远程登陆
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y #测试数据库并访问
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y #重新加载数据表
2.修改主配置文件
[root@server5 ~]# vim /etc/my.cnf
[root@server5 ~]# /etc/init.d/mysqld restart
server-id=5 #服务器Id
log-bin=mysql-bin ##开启二进制日志
3.配置数据库
[root@server5 ~]# mysql -p
Enter password: #输入设置的新密码
mysql> grant replication slave on *.* to user@'172.25.0.%' identified by 'Westos+123'; #建立用户并授权
mysql> show master status; #查看主库master的状态
1.安装mysql并设置密码
[root@server6 ~]# yum install *.rpm -y
[root@server6 ~]# /etc/init.d/mysqld start
[root@server6 ~]# grep password /var/log/mysqld.log
[root@server6 ~]# mysql_secure_installation
2.修改主配置文件
[root@server6 ~]# vim /etc/my.cnf
3.配置数据库
[root@server6 ~]# mysql -p
Enter password: #输入新密码
mysql>change master to master_host='172.25.0.121',master_user='user',master_password='Westos+123',master_log_file='mysql-bin.000001',master_log_pos=446; #从库上建立用户并授权
mysql> start slave ; #开启从库
mysql> show slave status\G; #查看从库状态
当看到Slave_IO_Running: Yes以及Slave_SQL_Running: Yes,则表示slave库已经正常运行了
当出现Slave_IO_Running: Connecting的提示时,说明主库和从库没有连接上,有以下三点原因:
1.网络问题:检查网络连接是否能够连接上
2.密码或POS号错误:查看pos号和主库的号是否对应
3.防火墙的问题:查看主库防火墙的策略,数据库是否拒绝外来连接,然后做相应的改动
主从测试:
(1)主库:
mysql> show databases;
mysql> create database westos;
mysql> use westos;
mysql> create table usertable(
-> username varchar(11) not null,
-> password varchar(11) not null);
mysql> desc userlist;
mysql> insert into usertable values('user1','111');
mysql> insert into usertable values('user2','123');
(2)从库:
mysql> show databases;
mysql> use westos;
mysql> show tables;
mysql> select * from usertable;
可以在slave从库上看到在master主库上建立的库和表信息。
1.在master主库和slave从库修改配置文件
[root@server5 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld restart
2.查看主库masterf数据
mysql> show master status;
master_log_file和master_log_pos都会发生改变。
3.配置从数据库
mysql> stop slave;
mysql> change master to master_host='172.25.0.121',master_user='user',master_password='Westos+123',master_auto_position = 1;
mysql> start slave;
mysql> show slave status\G;
4.测试:
主库中:
mysql> show databases;
mysql> use westos;
mysql> select * from usertable;
mysql> delete from usertable where username='user2';
mysql> select * from usertable;
从库中:
mysql> show databases;
mysql> use westos;
mysql> select * from usertable;
server5:主master
server6:次master,slave
server7:slave
1.server7中安装数据库,同上设置
[root@server7 ~]# yum install *.rpm -y
[root@server7 ~]# vim /etc/my.cnf
[root@server7 ~]# /etc/init.d/mysqld start
[root@server7 ~]# grep password /var/log/mysqld.log
修改密码:[root@server7 ~]# mysql_secure_installation
2.将server6设为从master
[root@server6 ~]# vim /etc/my.cnf
[root@server6 ~]# /etc/init.d/mysqld restart
[root@server6 ~]# mysqldump -p westos > westos.sql
[root@server6 ~]# scp westos.sql 172.25.0.123:/root
[root@server6 ~]# mysql -p
mysql> show slave status\G; #查看是否还是两个YES
mysql> grant replication slave on *.* to user1@'172.25.0.%' identified by 'Westos+123'; #master上建立用户并授权
mysql> show master status;
3:server7中
[root@server7 ~]# vim westos.sql
[root@server7 ~]# mysql -p < westos.sql
[root@server7 ~]# mysql -p
mysql> change master to master_host='172.25.0.122',master_user='user1',master_password='Westos+123',master_auto_position = 1;
mysql> start slave;
mysql> show slave status\G;
测试 :server5中添加信息
[root@server5 ~]# mysql -p
mysql> insert into westos.usertable values('tom','111');
server6/7中查看:
mysql> select * from westos.usertable;
server6/7中成功复制了主mater的信息。