### 环境准备
系统: `CentOS7`
数据库: `MySQL5.7`
Master节点: `172.16.0.100(node1)`
Slave节点: `172.16.0.101(node2)`
 
### 安装MySQL
`Master/Slave节点`
```bash
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server
```
启动数据库
```bash
systemctl enable mysqld
systemctl start mysqld
```
获取数据库临时密码
```bash
grep 'temporary password' /var/log/mysqld.log
```
对数据库进行加固
```bash
mysql_secure_installation
```
 
### 配置Master
修改数据库配置
```bash
vim /etc/my.cnf
```
```ini
bind-address = 172.16.0.100
server-id = 1
log_bin = mysql-bin
```
重启数据库
```bash
systemctl restart mysqld
```
创建复制账号
```sql
mysql> CREATE USER 'replica'@'172.16.0.101' IDENTIFIED BY 'strong_password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica'@'172.16.0.101';
mysql> FLUSH PRIVILEGES;
```
查看二进制日志文件和位置
```sql
mysql> SHOW MASTER STATUS\G
```
```
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 623
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
```
`注意:文件:mysql-bin.000001,位置:623`
 
### 配置Slave
修改数据库配置
```bash
vim /etc/my.cnf
```
```ini
bind-address = 172.16.0.101
server-id = 2
log_bin = mysql-bin
```
重启数据库
```bash
systemctl restart mysqld
```
停止slave线程
```sql
mysql> STOP SLAVE;
```
配置slave复制master
```sql
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='172.16.0.100',
mysql> MASTER_USER='replica',
mysql> MASTER_PASSWORD='strong_password',
mysql> MASTER_LOG_FILE='mysql-bin.000001',
mysql> MASTER_LOG_POS=623;
```
启动slave线程
```sql
mysql> START SLAVE;
```
查看slave状态
```sql
mysql >show slave status\G
```
```
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.0.100
Master_User: replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1576
Relay_Log_File: node2-relay-bin.000002
Relay_Log_Pos: 1273
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: 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: 1576
Relay_Log_Space: 1480
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: f8cc4c10-b429-11e9-9ff9-5600023106ec
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
```
### 开启半同步复制
安装半同步复制插件
`Master`
```sql
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; #安装Master半同步复制插件
mysql> set global rpl_semi_sync_master_enabled=on; #开启Master半同步复制
mysql> show variables like '%semi%'; #查看半同步复制参数
mysql> show plugins; #查看加载的插件
```
```
```
`Slave`
```sql
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; #安装Slave半同步复制插件
mysql> set global rpl_semi_sync_slave_enabled=on; #开启Slave半同步复制
mysql> show variables like '%semi%'; #查看半同步复制参数
mysql> show plugins; #查看加载的插件
```
重启IO线程
`Slave`
```sql
mysql> stop slave io_thread;
mysql> start slave io_thread;
```
查看半同步复制信息
`Master`
```sql
mysql> show global status like '%semi%';
```
```
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
```
`Rpl_semi_sync_master_no_tx`表示没有成功接收slave提交的事务
`Rpl_semi_sync_master_yes_tx`表示成功接收slave事务回复的次数
配置开机自启动半同步复制
`Master`
```bash
vim /etc/my.cnf
```
```ini
rpl_semi_sync_master_enabled = on
```
`Slave`
```bash
vim /etc/my.cnf
```
```ini
rpl_semi_sync_slave_enabled = on
```
 
### 测试主从
`Master`
```sql
mysql> CREATE DATABASE replicatest;
```
`Slave`
```sql
mysql> show databases;
```
```
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| replicatest |
| sys |
+--------------------+
```
`通过输出可以看到slave已经同步成功了!`