目录
主从复制的过程:
MySQL支持的复制类型:
主从复制解决的问题
主从复制工作原理
如何实现主从复制?
配置数据库服务
?1)准备环境
?2)配置主从同步
1.配置主服务器? ?
(1)启用binlog参数? ? (2) 重启服务? ? (3)用户授权? ? (4)查看binlog日志
2.配置从服务器? ?
(1)指定server_id值并关闭binog参数? ? (2)重启服务? ? (3)指定主服务器信息? ? (4)启动slave程序? ? (5)查看状态信息
3.测试主从配置? ?
(1) 在主服务器建库projectdb,表user,授权用户admin? ? (2)在从服务器查看数据
mysql的主从架构适用于:初创型企业。
特点:
1、成本低,布署快速、方便
2、读写分离
3、还能通过及时增加从库来减少读库压力
4、主库单点故障
5、数据一致性问题(同步延迟造成)
主从复制的过程:
通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器。
MySQL支持的复制类型:
(1)基于语句(statement)的复制
在主服务器上执行SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
?
(2)基于行(row)的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0开始支持。
?
(3)混合型(mixed)的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。
主从复制解决的问题
(1)解决灾备
(2)数据分布
(3)负载平衡
(4)读写分离
(5)提高并发能力
主从复制工作原理
主要基于MySQL二进制日志
主要包括三个线程(2个I/O线程,1个SQL线程)
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中; 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
?
详细步骤:
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、 password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到 master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的 relay 会自动被清理purge
如何实现主从复制?
在主服务器(master)上 :
? ? ? ? ? ? ? 启用二进制日志
? ? ? ? ? ? ? 选择一个唯一的server-id
? ? ? ? ? ? ? 创建具有复制权限的用户
在从服务器(slave)上 :
? ? ? ? ? ? ? 启用中继日志
? ? ? ? ? ? ? (二进制日志可开启,也可不开启)
? ? ? ? ? ? ? 选择一个唯一的server-id
? ? ? ? ? ? ? 连接至主服务器,并开始复制
配置数据库服务
有两台MySQL数据库服 务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master 中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
? ? ? ?负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器连接主服务器并请求主服务器把二进制变更日志传输给它的权限。
?1)准备环境
1.安装mysql软件步骤:(两台主从数据库服务器相同操作) ? ? (1)下载软件 ? ? (2)解压缩 ? ? (3)安装依赖软件 ? ? (4)安装MySQL服务软件
[root@mysql11 ~]# wget http://repo.mysql.com/mysql57-community-release-el7-9.noarch.rpm [root@mysql11 ~]# rpm -ivh mysql57-community-release-el7-9.noarch.rpm [root@mysql11 ~]# yum install mysql mysql-server
2.挂载LV分区(两台主从数据库服务器相同操作)
[root@mysql11 ~]# vim /etc/fstab? /dev/vg0/lv0 ? ? ? ? ? /var/lib/mysql ? ? ? ? ? xfs ? ? defaults ? ? ? ?0 0 [root@mysql11 ~]# mount -a [root@mysql11 ~]# mount |grep /var/lib/mysql /dev/mapper/vg0-lv0 on /var/lib/mysql type xfs (rw,relatime,attr2,inode64,noquota)
3.启动服务并查看(两台数据库服务器相同操作)
[root@mysql11 ~]# systemctl enable --now mysqld [root@mysql11 ~]# netstat -utnlp|grep :3306 tcp6 ? ? ? 0 ? ? ?0 :::3306 ? ? ? ? ? ? ? ? :::* ? ? ? ? ? ? ? ? ? ?LISTEN ? ? ?2519/mysqld?
4.管理员登录(两台主从数据库服务器相同操作) ? ? (1)查看初始密码 ? ? (2)初始密码登录 ? ? (3)修改登录密码 ? ? (4)断开连接 ? ? (5)新密码登录
[root@mysql11 ~]# grep "temporary password" /var/log/mysqld.log 2020-07-25T07:50:56.663846Z 1 [Note] A temporary password is generated for root@localhost: K2sj!YGpbizD [root@mysql11 ~]# mysql -uroot -p'K2sj!YGpbizD' mysql> alter user root@"localhost" identified by "123qqq...A"; mysql> exit Bye [root@mysql11 ~]# mysql -uroot -p123qqq...A
2)配置主从同步
1.配置主服务器 ? ? (1)启用binlog参数 ? ? (2) 重启服务 ? ? (3)用户授权 ? ? (4)查看binlog日志
[root@mysql11 ~]# vim /etc/my.cnf? //启用binlog参数 log_bin=master11 ?server_id=11 [root@mysql11 ~]# systemctl restart mysqld? ?//重启服务 [root@mysql11 ~]# mysql -uroot -p123qqq...A mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A"; ? ? //?用户授权 Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status; ? // 查看主库状态 +-----------------+----------+--------------+------------------+-------------------+ | File ? ? ? ? ? ?| Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master11.000001 | ? ? ?441 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) [root@mysql22 ~]# systemctl restart mysqld
2.配置从服务器 ? ? (1)指定server_id值并关闭binog参数 ? ? (2)重启服务 ? ? (3)指定主服务器信息 ? ? (4)启动slave程序 ? ? (5)查看状态信息
[root@mysql22 ~]# vim /etc/my.cnf ? ?[mysqld] ? server_id=22 [root@mysql22 ~]# systemctl restart mysqld [root@mysql22 ~]# mysql -uroot -p123qqq...A mysql> change master to ? ? ? ? ? ?// 设定主从同步 ? ? -> master_host="192.168.4.11", ?? ? ? -> master_user="repluser", ? ? -> master_password="123qqq...A", ? ? -> master_log_file="master11.000001", ? ? -> master_log_pos=441; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> show slave status\G ? ? //检查状态 *************************** 1. row *************************** ? ? ? ? ? ? ? ?Slave_IO_State: Waiting for master to send event ? ? ? ? ? ? ? ? ? Master_Host: 192.168.4.11 ? ? ? ? ? ? ? ? ? Master_User: repluser ? ? ? ? ? ? ? ? ? Master_Port: 3306 ? ? ? ? ? ? ? ? Connect_Retry: 60 ? ? ? ? ? ? ? Master_Log_File: master11.000001 ? ? ? ? ? Read_Master_Log_Pos: 441 ? ? ? ? ? ? ? ?Relay_Log_File: mysql22-relay-bin.000003 ? ? ? ? ? ? ? ? Relay_Log_Pos: 319 ? ? ? ? Relay_Master_Log_File: master11.000001 ? ? ? ? ? ? ?Slave_IO_Running: Yes ? ? ? ? ? ? Slave_SQL_Running: Yes
3.测试主从配置 ? ?(1) 在主服务器建库projectdb,表user,授权用户admin ? ? (2)在从服务器查看数据
[root@mysql11 ~]# mysql -uroot -p123qqq...A mysql> grant select,insert on project.* to admin@"%" identified by "123qqq...A"; Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create database project; Query OK, 1 row affected (0.00 sec)
mysql> create table project.user(id int); Query OK, 0 rows affected (0.12 sec)
[root@web33 ~]# yum -y install mariadb [root@web33 ~]# mysql -h192.168.4.11 -uadmin -p123qqq...A MySQL [(none)]> insert into project.user values(11); Query OK, 1 row affected (0.43 sec) MySQL [(none)]> insert into project.user values(22); Query OK, 1 row affected (0.00 sec)
[root@mysql22 ~]# mysql -uroot -p123qqq...A mysql> select * from project.user; +------+ | id ? | +------+ | ? 11 | | ? 22 | +------+ 2 rows in set (0.00 sec)
|