为什么要做主从复制
通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。
而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。
主从复制的类型
基于语句的复制(默认)
在主服务器上执行的语句,从服务器执行同样的语句
基于行的复制
把改变的内容复制到从服务器
混合类型的复制
一旦发现基于语句无法精确复制时,就会采用基于行的复制
主从复制过程示意图
来吧!展示!!
三台虚拟机
主服务器:20.0.0.4
从服务器01:20.0.0.5
从服务器02:20.0.0.6
MySQL安装之前有写,可以翻阅一下
链接在这
三台服务器关闭防火墙
setenforce 0
iptables -F
配置主服务器
配置主配置文件
[root@master mysql]# vim /etc/my.cnf
[mysqld]
…省略部分…
server-id = 1
log_slave_updates = true
log-bin = master-bin
[root@master mysql]# systemctl restart mysqld
[root@master mysql]# mysql -u root -p
Enter password:
# *.* 指的是 全部数据库.所有表,slaveuser 是从服务器登录用的账户
mysql> grant replication slave on *.* to 'slaveuser'@'20.0.0.%' identified by
'123123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#刷新
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#查看从服务器读取位置,我这边读取的是 601
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 601 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置从服务器
两台都要进行设置,我这边只演示一台
[root@slave01 ~]# vim /etc/my.cnf
[mysqld]
…省略部分…
server-id = 12 ##三台服务器得各不一样,我另一台配的13
relay-log=relay-log-bin ##二进制日志文件名
relay-log-index=slave-relay-bin.index
[root@slave01 ~]# systemctl restart mysqld
[root@slave01 ~]# mysql -u root -p
Enter password:
##master_host指向主服务器IP,master_user只想刚刚创建的用户,master_log_pos指向刚刚得位置,我的是306
mysql> change master to master_host='20.0.0.4',master_user='slaveuser',master_password='123123',master_log_file='master-bin.000001',master_log_pos=601;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
#启动从同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
#查看 slave 状态
mysql> show slave status\G;
Master_Host: 20.0.0.4
Master_User: slaveuser
Slave_IO_Running: Yes ##有下面两条差不多就ok了
Slave_SQL_Running: Yes
测试主从复制
在主服务器上创建一个数据库和表,验证是否同步
mysql> create database happy;
Query OK, 1 row affected (0.00 sec)
mysql> use happy;
Database changed
mysql> create table kaixin(id int(2) primary key auto_increment,xinqing varchar(10) not null);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into kaixin values(1,'高兴');
Query OK, 1 row affected (0.01 sec)
mysql> select * from kaixin;
+----+---------+
| id | xinqing |
+----+---------+
| 1 | 高兴 |
+----+---------+
1 row in set (0.00 sec)
从数据库验证
mysql> use happy;
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 kaixin;
+----+---------+
| id | xinqing |
+----+---------+
| 1 | 高兴 |
+----+---------+
1 row in set (0.00 sec)