一、准备两台MySQL服务器,并一台为主服务器(master),一台为从服务器(slave)。
二、两台服务器都装好MySQL,并都设置好远程访问。
三、配置主服务器
1.主服务器MySQL配置文件,Linux中一般是在etc/my.cnf文件中配置,在[mysqld]下添加log-bin=mysql-bin(自己设置二进制日志文件名)和server-id= 42(自己设定值,需要唯一)。
[mysqld]
...
log-bin=mysql-bin
server-id=42
...
- 开启二进制日志
- 配置唯一的server-id
- 获得master二进制日志文件名及位置
- 创建一个用于slave和master通信的用户账号
进入mysql使用show master status;语句查看二进制日志文件名和位置。
三、配置从服务器
1.从服务器MySQL配置文件,Linux中一般是在etc/my.cnf文件中配置,添加server-id= 129(自己设定值)。
2.进入mysql,执行如下:
mysql>CHANGE MASTER TO
>MASTER_HOST=’192.168.0.42’, //主服务器数据库地址
>MASTER_USER=’root’, //用户
>MASTER_PASSWORD=’root’, //密码
>MASTER_LOG_FILE=’mysql-bin.000048’, //二进制日志文件名
>MASTER_LOG_POS=432; //位置值
# 不同步哪些数据库
binlog-ignore-db = mysql
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = test
四、开启主从复制
从服务器中进入mysql,执行start slave;开启复制。
执行show slave status; ,如果Slave_IO_Running和Slave_SQL_Running是Yes表示主从配置成功。
关闭并重新开始:
master中:reset master;
slave中:stop slave; reset slave;然后change master to ......(如果不行,reset slave后重启一下数据库)
五、测试
1.在主服务器的mysql创建数据库、创建表、添加数据。
2.在从服务器的mysql中查看数据库、查看表、查看数据。
如果数据同步,就表示MySQL主从复制成功。
优化(2018.12.20update)
MySQL的复制是基于binlog的,MySQL复制IO线程 和 SQL线程,IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log,SQL线程主要负责解析relay log,并应用到slave中。
IO和SQL线程都是单线程,然后master却是多线程的,所以难免会有延迟,为了解决这个目前最新的5.6,5.7,8.0 都是在SQL线程上实现了多线程,来提升slave的并发度,减少了延迟。
启用并行复制:
MySQL 5.7.22+ 支持基于write-set的并行复制
# master
loose-binlog_transaction_dependency_tracking = WRITESET
loose-transaction_write_set_extraction = XXHASH64
binlog_transaction_dependency_history_size = 25000 #默认
#slave
slave-parallel-type = LOGICAL_CLOCK
slave-parallel-workers = 32
https://yq.aliyun.com/articles/621197
1. 基于order-commit的模式,本身并行复制已经很好了,如果并发量非常高,那么order-commit可以有很好的表现,如果并发量低,order-commit体现不了并行的优势。
但是大家想想,并发量低的MySQL,根本也不需要并行复制吧
2. 基于write-set的模式,这是目前并发度最高的并行复制了,基本可以解决大部分场景,如果并发量高,或者新搭建的slave需要快速追主库,这是最好的办法。
3. 单线程复制 + 安全参数双0,这种模式同样拥有不随的表现,一般压力均可应付。