MySQL主从同步node
主从同步使得数据能够从一个数据库服务器复制到其余的服务器上。在复制数据时,一个服务器充当主服务器(master),其他的服务器充当从服务器(slave)。mysql
由于复制是异步进行的,因此从服务器不须要一直连着主服务器,而是断断续续链接主服务器。sql
经过配置文件,能够实现全部数据库,指定数据库 ,指定数据库的表,进行复制。shell
主从同步的好处数据库
数据库复制centos
MySQL是异步复制,MySQL cluster是同步复制。有不少主从同步,可是核心的方法有两种:安全
也可使用Mixed Bases Replication(MBR) 混合复制bash
在MySQL5.6,默认使用SBR。而MySQL5.6.5及之后的版本,基于global transaction identifiters(GIDS)来进行事务复制。经过设置服务器的系统变量binog_format来指定要使用的格式服务器
各机制的优缺异步
SBR 当使用二进制日志来实现主从复制时,主服务器把SQL语句写入到日志中,而后从服务器执行日志
优点:
日志文件小
记录全部语句,能够用于审计
劣势:
使用一些函数的语句则不能进行复制
在日志中出现警告信息则不能复制
RBR 主服务器把表的行变化做为事件写入二进制中,主服务器把表明行变化的事件复制到从服务器中
优点:
全部数据变化都被复制,这是最安全的复制
更少的行级锁表
劣势:
日志很大
不能经过日志来审计执行的SQL语句,不过可使用mysqlbinlog
主从同步机制
MySQL服务器之间的主从同步是基于二进制的日志机制。主服务器使用日志变化来记录数据库变化记录,从服务器经过读取和执行该日志文件来保持和主服务器的数据一致。
主服务器和从服务器都必须配置一个惟一的ID号。另外从服务器须要经过change master to
的语句来配置它要链接的主服务器和ip地址,日志文件名和该日志的位置(这些信息,均存放在主服务器的数据库里)
主从配置过程
主服务器操做:
show master status
查看当前主机的日志信息和存放位置从服务器操做:
change master to
语句,配置主服务器信息start slave
开启从服务器show slave status
查看从服务器状态MySQL的主从同步配置方式,能够配置为:
下面的过程是配置一主一从的配置,一主多从的配置,只是修改从服务器的配置文件,其余过程和从服务器配置同样。
在node19 和node20上,分别建立和执行一下shell脚本
#!/bin/bash if [ "$#" != "2" ];then echo "scripts usage:$0 [hostname] [db_password]" && exit 0 fi HOSTNAME=$1 PASSWORD=$2 # centos6 #yum -y install mysql mysql-server mysql-devel mysql-libs # centos7 yum -y install mariadb mariadb-server maridb-clients mariadb-devel mariadb-libs if [ "$?" == "0" ];then #service mariadbd start 2>/dev/null && echo "start mysqld ok" systemctl start mariadb 2>/dev/null && echo "start mysqld ok" else echo "yum mysql fail" && exit 0 fi mysql <<EOF delete from mysql.user where user = " " and host = "localhost"; delete from mysql.user where user = " " and host = "127.0.0.1"; delete from mysql.user where user = " " and host = "${HOSTNAME}"; delete from mysql.user where user = "root" and host = "${HOSTNAME}"; delete from mysql.user where user = "root" and host = "::1"; grant all privileges on *.* to 'root'@'localhost' identified by '${PASSWORD}'; grant all privileges on *.* to 'root'@'127.0.0.1' identified by '${PASSWORD}'; flush privileges; EOF systemctl enable mariadb
执行上述代码以后,两个节点上,均部署了MySQL(mariadb)服务
在node19上,修改配置文件/etc/my.cnf,在[mysqld]的配置模块下,添加
log-bin=mysql-bin server-id=1
执行systemctl restart mariadb
重启MySQL服务器
mysql -uroot -p
登录数据库系统,执行一下语句
# 建立用于复制数据库的帐号并受权 grant replication slave on *.* to 'repl'@'192.168.10.%' identifiedby 'liwanliang'; # 刷新数据库并设置只读 flush tables with read lock; # 查看主服务器的状态,获取日志信息 show master status;
在node20上,修改配置文件/etc/my.cnf,在[mysqld]的配置模块下,添加
log-bin=mysql-bin server-id=2
执行systemctl restart mairadb
重启服务器
mysql -uroot -p
登录数据库胸痛,执行如下语句
# 配置主服务器 change master to master_host='192.168.10.19', master_user='repl', master_password='liwanliang', master_log_file='mysql-bin.000001', master_log_pos=552; # 启动从服务器 start slave # 查看状态 show slave status\G;
以上述操做过程,配置多个从服务器亦可实现
在主库node19上建立数据库create database liwl_01;
在从库node20/node21上查看数据库show databases
暂停node20上的数据库复制,进行数据备份:mysqladmin -uroot -p stop-slave
,或仅暂停SQL进程(此过程仅暂停SQL执行,而不暂停日志的复制),执行命令:mysql -uroot -p -e 'stop slave sql_thread';
在主库node19上建立数据库liwl_02,create databases liwl_02;
查看从库node21进行了复制,而node20上没有复制
在node20上重启复制进程:mysqladmin -uroot -p start-slave
,查看到数据库已经同步过来
直接复制文件
为了保证数据的文件的完整性,在执行备份以前,应该关闭从服务器:
mysqladmin -uroot -p shutdown
拷贝数据库文件,而后启动MySQL服务
经过mysqldump复制
主库宕机以后,数据可能丢失
半同步复制,解决s数据丢失问题
从库只有一个SQL线程,主库写压力大时,复制可能存在延时
并行复制,解决从库复制延迟问题