配置 Replication
- 在主服务器上,
- 必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
vim /etc/my.cnf
#编辑主服务器的配置文件 my.cnf,在[mysqld] 下面添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
#主服务器ID
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
#为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性
- 创建日志目录并赋予权限
mkdir /var/log/mysql
chown mysql.mysql /var/log/mysql
- 配置完成,重启 mysql服务
systemctl restart mysqld
- 创建一个专门用于复制数据的用户
- 创建用户
mysql> CREATE USER 'yun'@'%' IDENTIFIED BY '123';
- 授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'yun'@'%';
ps:每个从站使用MySQL用户名和密码连接到主站,因此主站上必须有用户帐户,从站可以使用该帐户进行连接。
master 上的任何账户都可以用于复制的操作,前提是必须先被授权。
- 在主服务器中
- 导出现有的数据
mysqldump -u用户名 -p密码 --all-databases --master-data=1 > dump.db
ps:这里的用户是本机服务器的用户
如果主数据库包含现有数据,则必须将此数据复制到每个从站。
- ****主服务器****中使用 scp 或 rsync 等工具,把备份出来的数据传输到**从服务器**中。
scp dump.db root@从机ip:/root/
PS:从机ip需要能在主服务器中 ping 通
-在从服务器上
- 在从服务器上使用刚才的用户进行测试连接
mysql -uyun -p'123' -h主服务器的ip;
- 配置从服务器
vim /etc/my.cnf
#在从服务器上编辑其配置文件 my.cnf ,在 [mysqld] 下面并添加如下内容:
[mysqld]
server-id=2
#定义从服务器的ID
- 重启从服务器的mysql
systemctl restart mysqld
- 导入数据到从服务器的mysql,并配置连接到主服务器的相关信息
mysql -uroot -p123456 < /root/dump.db
#输入登陆从机mysql的用户名字和密码 < 把主机传送过来的备份文件导入进去
- 进入从服务执行如下操作:
mysql> CHANGE MASTER TO
MASTER_HOST='主服务器ip',
MASTER_USER='yun',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=595;
注意:上面的 MASTER_LOG_FILE 和 MASTER_LOG_POS 需要参照 mysqldump 备份中产生的那个文件 dump.dp 中的内容。
- vim /root/dump.db
#主机或者从机都可以查看
找到以下内容 - 启动从服务器的复制线程以开始复制
mysql> start slave;
Query OK, 0 rows affected (0.09 sec)
检查是否成功
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
ps: 执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
主从同步若出现以下错误:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
解决方法:
导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
1、主机和从机网络不通
2、密码不对
3、pos不对
注意:排查错误应该先要停止从主服务器处理二进制日志,请使用 STOP SLAVE:
mysql> STOP SLAVE;
#要再次开始执行,请使用以下START SLAVE语句:
mysql> START SLAVE;
复制原理实现细节
- MySQL复制功能使用三个线程实现,一个在主服务器上,两个在从服务器上:
- Binlog转储线程 主设备创建一个线程,以便在从设备连接时将二进制日志内容发送到从设备。可以SHOW PROCESSLIST在主服务器的输出中将此线程标识为Binlog Dump线程。
二进制日志转储线程获取主机二进制日志上的锁,用于读取要发送到从机的每个事件。一旦读取了事件,即使在事件发送到从站之前,锁也会被释放。 - 从属 I/O线程 在从属服务器上发出 START SLAVE 语句时,从属服务器会创建一个 I/O 线程,该线程连接到主服务器并要求主服务器发送其在二进制日志中的更新记录。
从属 I/O线程读取主Binlog Dump线程发送的更新 ,并将它们复制到包含从属中继日志的本地文件。此线程的状态显示为 Slave_IO_running输出 SHOW SLAVE STATUS或 Slave_running输出中的状态SHOW STATUS。 - 从属SQL线程 从属设备创建一个SQL线程来读取由从属 I/O 线程写入的中继日志,并执行其中包含的事件。
当从属服务器从放的事件,追干上主服务器的事件后,从属服务器的 I/O 线程将会处于休眠状态,直到主服务器的事件有更新时,被主服务器发送的信号唤醒。
##############################################
除以上介绍的主从复制方法外,还可以配置基于事务的 Replication(利用 GTID 来实现的复制),多线程Replication。在此不作过多介绍!