https://www.cnblogs.com/along21/p/8011596.html
https://blog.csdn.net/qq3401247010/article/details/78754671
一主一从,一主多从,双主
① iptables -F && setenforce 清空防火墙策略,关闭selinux
② 拿两台服务器都使用yum 方式安装Mysql 服务,要求版本一致
2、在主master 主服务器上
① vim /etc/my.cnf 修改mysql主配置文件,对master进行配置,包括打开二进制日志,指定唯一的servr ID
server-id=1#配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
skip-name-resolve #关闭名称解析,(非必须)
② 创建并授权slave mysql 用的复制帐号
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';
分析:在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。
③ 查看主服务器状态
在Master的数据库执行show master status,查看主服务器二进制日志状态,位置号
3、在从slave mysql1上
vim /etc/my.cnf 打开中继日志,指定唯一的servr ID,设置只读权限
server-id=2#配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
read_only =1 #设置只读权限
log_bin = mysql-bin #开启从服务器二进制日志,(非必须)
log_slave_updates =1#使得更新的数据写进二进制日志中
② 启动从服务器复制线程,让slave连接master,并开始重做master二进制日志中的事件。
MariaDB [(none)]> change master to master_host='192.168.30.107',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=245;
MariaDB [(none)]> start slave; # 启动复制线程,就是打开I/O线程和SQL线程;实现拉主的bin-log到从的relay-log上;再从relay-log写到数据库内存里
③ 查看从服务器状态
可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看当前复制状态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
4、测试
5、若要继续添加新salve,实现一主多从
假如master 已经运行很久了,想对新安装的slave 进行数据同步,甚至它没有master 的数据。
① 进行完全备份
mysqldump --all-databases > /backup/mysql-all-backup-`date+%F-%T`.sql
把备份生成的文件发给salve-mysql2机器上scp/backup/mysql-all-backup-2017-11-20-22\:04\:06.sql @192.168.30.2:
② 查看现在的二进制文件状态
MariaDB [(none)]> show master status;
mysql -uroot -p < mysql-all-backup-2017-11-20-22\:04\:06.sql
MariaDB [(none)]> change master to master_host='192.168.30.107',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000003',
-> master_log_pos=500;
7、解除主从关系,恢复独立的服务器
① MariaDB [(none)]> stop slave; 关闭两个线程
relay-log =mysql-relay-log
read-only =1log_slave_updates =1
③ systemctl restart mariadb 重启服务
主从+复制过滤
1、环境准备
机器名称IP配置服务角色备注
master-mysql192.168.30.107主数据库二进制日志
slave-mysql1192.168.30.7从数据库中继日志
slave-mysql2192.168.30.2从数据库中继日志
① vim /etc/my.cnf 修改mysql主配置文件,对master进行配置,打开二进制日志,指定唯一的servr ID,设置复制过滤
server-id=1#配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
skip-name-resolve #关闭名称解析,(非必须)
binlog_ignore_db=home #除了home数据库,其他都允许从复制主的二进制文件
#binlog_do_db=along #仅允许从复制along数据库的二进制文件
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';
分析:在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。
在Master的数据库执行show master status,查看主服务器二进制日志状态,位置号
vim /etc/my.cnf 打开中继日志,指定唯一的servr ID,设置只读权限
server-id=2#配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
read_only =1 #设置只读权限
log_bin = mysql-bin #开启从服务器二进制日志,(必须)
log_slave_updates =1#使得更新的数据写进二进制日志中
② 启动从服务器复制线程,让slave连接master,并开始重做master二进制日志中的事件。
MariaDB [(none)]> change master to master_host='192.168.30.107',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=245;
MariaDB [(none)]> start slave; # 启动复制线程,就是打开I/O线程和SQL线程;实现拉主的bin-log到从的relay-log上;再从relay-log写到数据库内存里
可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看当前复制状态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
在主上创建一个along、home库;从上自动生成along、home数据库
① 在主上:在along库中创建一个classes的表;从上自动生成
MariaDB [home]> create table classes (id int not null,name varchar(20));
② 在主上:在home库中创建一个classes的表;从上没有生成
MariaDB [home]> create table classes (id int not null,name varchar(20));
5、设置slave-mysql2 为slave-mysql1 的从,且在mysql2 设置复制过滤
因为上边主配置文件已经开启了自己的二进制文件;且slave-mysql1 是从开始就同步master的,所以授权命令也同步过了
MariaDB [home]> select user,host from mysql.user; 可以查看自己授权过的用户
(2)slave-mysql2 上,可以像上实验一样,先给主的完全备份在本机恢复一下
① 在主上完备
mysqldump --all-databases > /backup/mysql-all-backup-`date+%F-%T`.sqlscp/backup/mysql-all-backup-2017-11-21-11:14:59.sql @192.168.30.2:
② 进行master的完全备份恢复
mysql -uroot -p < mysql-all-backup-2017-11-20-22\:04\:06.sql
③ 在slave-mysql2 上
vim /etc/my.cnf 修改主配置文件,设为从;且设置过滤
server-id=3relay-log =mysql-relay-log
read-only =1log-bin = mysql-bin
log_slave_updates =1replicate_do_dB=along #只复制它的主的along数据库
启动从服务器复制线程,让slave连接master,并开始重做master二进制日志中的事件。
MariaDB [(none)]> change master to master_host='192.168.30.107',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000008',
-> master_log_pos=773;
MariaDB [(none)]> start slave;
⑤ MariaDB [(none)]> show slave status \G; 查看,两个进程打开,且只复制主的along数据库
(1)在主上删除job数据库,master 和slave-mysql1 都删除成功
MariaDB [home]> drop database job; 删除job库
因为slave-mysql2 只同步slave-mysql1 的along库,所以没有删除
(2)在主上的along数据库,创建一个grade 表,master 和slave-mysql1 都删除成功
MariaDB [along]> create table grade (id int not null,name varchar(20));
双主
应用:只适合小型公司,小并发访问量,毕竟同时写入易出错
机器名称IP配置服务角色备注
mysql1192.168.30.107数据库中继日志、二进制日志
mysql2192.168.30.7数据库中继日志、二进制日志
server-id=1 #mysql1的配置ID为1,mysql2的ID为2
relay-log =mysql-relay-log
log-bin = mysql-bin
log_slave_updates =1auto_increment_increment=2 #表示自增长字段每次递增的量,步长
auto_increment_offset=1#表示自增长字段从那个数开始,mysql1从1开始;mysql2从2开始
(1)授权远程登录的用户
mysql1、2 上
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';
(2)开启复制线程
① mysql1 上
MariaDB [(none)]> change master to master_host='192.168.30.7',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=245;
MariaDB [(none)]> start slave; # 启动复制线程
② mysql2 上
MariaDB [(none)]> change master to master_host='192.168.30.107',
-> master_user='slave',
-> master_password='along',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=245;
MariaDB [(none)]> start slave; # 启动复制线程
在mysql1上,删除test数据库;mysql2 上也自动删除
在mysql2上,创建xiaohei数据库;mysql2 上也自动生成
MariaDB [along]> create table home (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20));
MariaDB [along]> insert into home(name) value('mayun'),('mahuateng'),('wangjianlin');
MariaDB [along]> insert into home(name) value('dinglei'),('liyanhong'),('leijun');
场景
公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司也因此对于数据库的性能和可靠性提出更高要求。要求对数据库进行改造,使其承载力进行提升,故障修复时间减少,有没有能实现的方案呢?
1、向上拓展 scale up:针对单台服务器,提高服务器的硬件性能,比如:内存,cpu等,个体本身 容易达到极限
2、向外拓展 scale out:多台服务器形成集群,共同完成一件事情
(4) 高可用性和容错性 High availabilityand failover
(1) 主服务器(master)将改变记录到二进制日志(binarylog)中(这些记录叫做二进制日志事件,binary log events)
(2) 从服务器(slave)将主服务器master的binary logevents拷贝到它的中继日志(relay log)
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
I/O线程:将master数据库二进制日志拉到slave数据库上,并将二进制日志写到中继日志,写完之后,他会睡眠并等待master数据库二进制日志更新,一旦更新,就会写入slave数据库的中继日志中
SQL线程:读取中继日志的事件,并在数据库中执行,写入到内存中,使slave数据库的数据与master数据库中的数据一致
注意:slave数据库只能是可读的,不能是可写的,如果改变了slave数据库的数据,master不能从slave数据库上同步数据,导致主从数据库数据不一致。
centos系统服务器2台、一台用户做Mysql主服务器,一台用于做Mysql从服务器,都在同一个网段中,配置好yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信
1、iptables -F && setenforce 清空防火墙策略,关闭selinux
2、拿两台服务器都使用yum方式安装Mysql服务,要求版本一致
对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值
server-id=1#配置server-id,让主服务器有唯一ID号(让从服务器知道他的主服务器是谁)
log-bin=mysql-bin#打开Mysql日志,日志格式为二进制
skip-name-resolve#关闭名称解析,(非必须)
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master
。进行复制操作的用户会授予REPLICATION SLAVE权限。(给从服务器授权,让他能从主服务器拷贝二进制日志)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
在Master的数据库执行show master status,查看主服务器二进制日志状态
对slave进行配置,打开中继日志,指定唯一的servr ID,设置只读权限。在配置文件加入如下值
server-id=2#配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin#打开Mysql日志,日志格式为二进制
log_bin = mysql-bin#开启从服务器二进制日志
log_slave_updates = 1#使得更新的数据写进二进制日志中
让slave连接master,并开始重做master二进制日志中的事件。
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_LOG_FILE='mysql-bin.000001',
可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看前复制状态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。
就是在从服务器也开启二进制日志,然后从的从I/O线程再将从的二进制日志给拷贝过来写入到自己的relay log中,然后sql线程再读取relay log中的事件,在数据库中执行,写入到内存中。
仅复制有限一个或几个数据库相关的数据,而非所有;由复制过滤器进行;
从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
(2) 用一个slave作为备用master,只进行复制;#主服务器挂了之后,可在从服务器执行
1> 在备机上执行STOP SLAVE 和RESET MASTER
二、互为主从Master-Master(Master-Master in Active-Active Mode)
Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
即:在两台服务器上既执行master的操作又执行slave的操作(注意:两台数据库都必须是可写的)
互为主从:两个节点各自都要开启binlog和relay log;
对于某些唯一性的字段,可以通过设置自增长ID来实现,自增长ID的数据,代表这个表中存在一条唯一的记录;而自增长id是肯定不会重复的;
create table userInfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
insert into userInfo(name) value('xiao'),('da'),('lao');
auto_increment_increment=2#表示自增长字段每次递增的量
auto_increment_offset=1#表示自增长字段从那个数开始
2、均启用binlog和relay log; read only = 0(因为互为主从,所以必须是可写的)
3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
让slave连接master,并开始重做master二进制日志中的事件。
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_LOG_FILE='mysql-bin.000001',
可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看前复制态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
两台数据库服务器都显示如上结果就ok。
create table userinfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20) NOT NULL);
insert into userinfo (name) values('ni'),('wo'),('ta');
然后查看表,因为是自增长id,从1开始,步长为2,所以添加的数据id为1,3,5
然后在另一台数据库服务器插入数据,因为是自增长id,从2开始,步长为2,所以新添加的数据id为6,8,10
注意:mysql的错误日志非常重要,可以提供错误信息,从而找到错误原因。
互为主从容易导致数据不一致,此时我们可以用两个实例来互为主从
异步复制(Asynchronous replication)
全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。需要有超时时间。
半同步复制(Semisynchronous replication)
支持多种插件:/usr/lib64/mysql/plugins/
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+------------------------------------+-------+
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON/1;
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
MariaDB [mydb]> STOP SLAVE IO_THREAD;
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [mydb]> START SLAVE IO_THREAD;