Mysql主从复制
为什么要部署主从复制
-
在一些企业网站中,后端Mysql 数据库只有一台时,会有以下问题
1)单点故障点,服务不可用
2)无法处理大量的并发数据请求
3)数据丢失 -
通过部署主从复制解决这一问题
1) 增加Mysql数据库服务器,对数据进行备份,形成主备
2)确保主备Mysql数据库服务器是一样的
3)主服务器宕机了,备份服务器继续工作,数据有保障
Mysql支持的复制类型
- 基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。(Mysql默认采用语句的复制,效率比较高)
- 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器执行一遍。
- 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
主从复制的原理过程
- 在每个事物更新数据完成之前,master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务
- slave(从服务器)将master(主服务器)的Binary log 复制到中继日志,首先slave开始一个工作线程 I/O线程,I/O线程在master上开一个普通的连接,然后开始Binlog dump process,Binlog dump process从master的二进制日志中读取事件,如果已经更上master,它会睡眠并等待master产生新事件。I/O线程将这些日志写入中继日志
- SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其它事件而更新slave数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
部署主从复制
部署环境
- maser 主服务器 ;ip :20.0.0.105/24
- slave 从服务器 ;ip :20.0.0.106/24
- slave 从服务器 ;ip :20.0.0.107/24
已关闭防火墙、核心防护、安装本地yum源、安装mysql数据库、安装ntp
设置master主服务器 20.0.0.105
1、设置时间同步(必须设置)
[root@localhost ~]# ntpdate ntp1.aliyun.com
20 Oct 16:41:19 ntpdate[15677]: the NTP socket is in use, exiting
2、修改主配置文件
[root@localhost ~]# vi /etc/my.cnf
.......省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
secure-file-priv=""
server-id = 11 ####修改主服务器的id号
log_bin = master-bin ####添加master中生成二进制日志的语句
log-slave-updates = true ####给从服务器授权同步,更新二进制日志文件
...........省略内容
[root@localhost ~]# systemctl restart mysqld ###重启mysql
3、登录 mysql 数据库给从服务器授权
[root@localhost ~]# mysql -uroot -p
......省略内容
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)
(允许20.0.0.%网段内的myslave 用户登录所有数据库、数据表)
mysql> flush privileges; ####刷新,生成二进制日志文件
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; ####查看master的状态
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000013 | 751 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
4、进入data目录下查看刷新出的二进制日志文件
[root@localhost ~]# ls /usr/local/mysql/data
auth ib_logfile0 master-bin.000002 master-bin.000007 master-bin.000012 sys
auto.cnf ib_logfile1 master-bin.000003 master-bin.000008 master-bin.000013 test
bbs ibtmp1 master-bin.000004 master-bin.000009 master-bin.index
ib_buffer_pool kfc master-bin.000005 master-bin.000010 mysql
ibdata1 master-bin.000001 master-bin.000006 master-bin.000011 performance_schema
设置slave从服务器 20.0.0.106
1、设置时间同步(必须设置)
[root@localhost ~]# ntpdate ntp1.aliyun.com
20 Oct 16:41:28 ntpdate[46953]: the NTP socket is in use, exiting
2、修改主配置文件
[root@localhost ~]# vi /etc/my.cnf
.......省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 22 ####修改slave 的id号
relay-log = relay-log-bin ###添加,开启中继日志
relay-log-index = slave-relay-bin.index ####添加中继日志索引文件
...........省略内容
[root@localhost ~]# systemctl restart mysqld ###重启mysql
3、登录 slave 中的数据库,配置同步
[root@localhost ~]# mysql -uroot -p
......省略内容
mysql> change master to master_host='20.0.0.105',master_user='myslave',master_password='123456',master_log_file='master-bin.000013',master_log_pos=751;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 20.0.0.105
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000013
Read_Master_Log_Pos: 903
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 473
Relay_Master_Log_File: master-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
............省略内容
设置slave从服务器 20.0.0.107
1、设置时间同步(必须设置)
[root@localhost ~]# ntpdate ntp1.aliyun.com
20 Oct 16:41:32 ntpdate[46992]: the NTP socket is in use, exiting
2、修改主配置文件
[root@localhost ~]# vi /etc/my.cnf
.......省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 33 ####修改slave 的id号
relay-log = relay-log-bin ###添加,开启中继日志
relay-log-index = slave-relay-bin.index ####添加中继日志索引文件
...........省略内容
[root@localhost ~]# systemctl restart mysqld ###重启mysql
3、登录 slave 中的数据库,配置同步
[root@localhost ~]# mysql -uroot -p
......省略内容
mysql> change master to master_host='20.0.0.105',master_user='myslave',master_password='123456',master_log_file='master-bin.000013',master_log_pos=751;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 20.0.0.105
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000013
Read_Master_Log_Pos: 903
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 473
Relay_Master_Log_File: master-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
............省略内容
验证
1、在master主服务器上创建一个lookupme数据库
2、去slave从服务器验证有没有这个库
- slave 20.0.0.106
- slave 20.0.0.107
验证都有这个数据库,证明部署主从复制成功。
---------------------------------------------------------------------到此结束。感谢浏览