MySQL支持的复制类型
- 基于语句的复制。在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。
- 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
- 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就 会采用基于行的复制。
主从复制的工作过程
- 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
- Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待 Master 产生新的事件。I/O 线程将这些事件写入中继日志。
- SQL slavethread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
资源列表
Master | CentOS 7.3 x86_64 | 192.168.10.51 |
Slave1 | CentOS 7.3 x86_64 | 192.168.10.52 |
Slave2 | CentOS 7.3 x86_64 | 192.168.10.53 |
Amoeba | CentOS 7.3 x86_64 | 192.168.10.54 |
客户端 | CentOS 7.3 x86_64 | 192.168.10.55 |
安装MySQL数据库
#参考MySQL编译安装
配置防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config
setenforce 0
配置Master主服务器
vi /etc/my.cnf
//添加或修改一下选项
server-id=11
log-bin=master-bin
log-slave-updates=true
//重启MySQL服务
systemctl restart mysqld
登录MySQL服务给服务器授权(master节点)
//进入数据库
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.10.%' IDENTIFIED BY '123456';
IDENTIFIED BY '123456': 设置用户 'myslave' 的登录密码为 '123456'。当从库节点使用该用户连接主库时,需要提供此密码进行身份验证。
FLUSH PRIVILEGES; //刷新权限设置
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 603 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#需记住603数字
配置Slave从服务器(在两台server节点操作)
vi /etc/my.cnf
log-bin=slave1-bin
binlog-format = MIXED
server-id = 2
#serverid需要不相同
进入MySQL服务器配置
CHANGE MASTER TO
master_host='192.168.10.51',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=603;
start slave; //启动同步
show slave status\G; //查看Slave状态
确保两个均为yes即可
#master_log_pos=603;master节点查询到的数字