阅读文本大约需要20分钟。
1.1 环境准备:centos系统服务器2台, 用户制作Mysql主服务器, Mysql服务器用于制作, 配置yum源, 关闭防火墙, 同步每个节点的时钟服务, 每个节点都可以通过主机名相互通信
1.2 准备步骤:1)iptables -F && setenforce 清空防火墙策略,关闭selinux
2)用yum安装两台服务器的Mysql服务, 要求相同的版本
3)启动两台服务器mysql服务, 确保服务正常
架构图:
1.3 实现步骤:1.3.1 master主服务器配置配置master,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件中添加以下值
server-id=1 ///配置serverer-id,让主服务器拥有唯一的ID号 log-bin=mysql-bin ///打开Mysql日志,日志格式为二进制 skip-name-resolve ///关闭名称分析,(不必要)
1.3.2 创建复制帐户
在 Master 在数据库中建立一个备份帐户:每个备份帐户 slave 使用标准的 MySQL 连接用户名和密码 master 。用户将授予复制操作 REPLICATION SLAVE 权限。
MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';
1.3.3 检查主服务器状态
在 Master 执行数据库show master status
,检查主服务器二进制日志的状态和位置号。
对 slave 配置,打开中继日志,指定唯一的 servr ID,设置只读权限。在配置文件中添加以下值:
server-id=2 ///配置serverer-id,唯一的ID号是让从服务器 relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_bin = mysql-bin //打开服务器二进制日志 log_slave_updates = 1 ///将更新的数据写入二进制日志
1.3.5 从服务器开始复制线程
让 slave 连接 master ,并开始重做 master 二进制日志中的事件。
MariaDB [(none)]> change master to master_host=192.168.37.111, >master_user='slave', >master_password='keer', >master_log_file='mysql-bin.000001', >master_log_pos=413;
执行start slave;
,启动复制线程。
可使用SHOW SLAVE STATUS\G;
也可以从服务器状态查看,如下所示show processlist \G;
检查当前复制状态:
Slave_IO_Running: Yes ///IO线程正常运行 Slave_SQL_Running: Yes ////SQL线程正常运行
1.3.7 测试
1)测试主从同步
我们在 master 在服务器上创建一个数据库,然后使用该数据库创建一个表,添加一个记录 slave 服务器同步成功吗?
首先,让我们检查两个服务器上的数据库:
master:
slave:
现在,我们在主服务器上创建了一个数据库keer”:
然后,让我们看看服务器是否已经更新:
我们可以看到数据库已经同步了。接下来,我们将创建一个表,并在表中插入一个记录:
然后,让我们看看服务器是否更新:
2)测试只读属性
我们在服务器上设置了只读,所以让我们试着看看是否可以插入数据:
这很尴尬。为什么我们设置只读还是可以插入数据?如何解决这个问题?
因为我们在登录时使用它root
对于超级用户来说,这种大变态不受阅读设置的影响。因此,我们仍然可以将数据插入其中。当然,如果我们用其他普通用户代替,就不会有这样的问题。
解决方案也很简单,我们只需要锁上手表:
MariaDB [keer]> flush tables with read lock;
锁表操作完成后,我们将再次插入数据:
在这种情况下,即使我们是超级用户登录,我们也不能再插入数据了。这样会安全得多。然而,有利有弊。在这种情况下,我们的主从不能实时同步,因为我们的主从通过主从同步 sql 把句子从上面再执行一遍来实现,但是我们锁表的话,sql 句子不能执行。同步方法也很简单,可以直接解锁表。
我们在主上插入一个数据:
此时,我们必须从上面解释表格,才能实现同步:
1.4 扩展-实现一主多从1.4.4.1 需求分析当我们的服务器运行一段时间后,流量变得越来越多。此时,我们必须选择添加另一个服务器,以实现高可用性和负载平衡不能满足我们的需求。 但是现在我们的 master 它已经运行了很长时间,我们也需要新安装 slave 数据同步,甚至没有 master 的数据。 在这个时候,有几种方法可以制造它 slave 例如,从另一项服务开始, master 从另一个复制数据 slave 克隆,从最近的备份开始 slave 。为了加快 slave 与 master 数据同步可以通过以下方式进行:
(1)master某一时刻的数据快照;(2)数据库备份数据;(3)master的二进制日志文件。
架构图:
接下来,让我们来实现这个过程:
1.4.2 具体实现过程1)对 master 完全备份
[root@master ~]# mkdir /backup[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
像往常一样,检查主二进制日志的状态和位置号。
2)将完全备份的数据从上发送到新的
[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~root@192.168.37.133's password:mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00
3)将此完全备份导入从数据库:
4)检查恢复是否成功:
让我们来看看二进制日志的状态和位置号:
我们的数据已经成功恢复
5)设置主从下一步就是按照上述步骤设置服务器:
[root@slave2 ~]# vim /etc/my.cnf [mysqld] server-id = 3 relay-log = mysql-relay-bin read-only = 1 log-bin = mysql-bin log-slave-updates = 1
然后我们将从服务器中设置:
[root@slave2 ~]# mysql -uroot -pEnter password:MariaDB [(none)]> change master to master_host=192.168.37.111, >master_user='slave', >master_password='keer', >master_log_file='mysql-bin.000001', >master_log_pos=330;MariaDB [(none)]> start slave;
然后我们来看看服务器的状态:
6)测试
设置完成后,我们来测试一下,当主上有操作时,是否从上更新:
到目前为止,我们已经完成了一主两从。如有必要,我们可以继续添加服务器。
1.5 扩展-半同步复制1.5.1 三种复制方法1)同步复制 指当主库完成一项事务时,所有事务都从库中完成,然后返回给客户端。全同步复制的性能必然会受到严重影响,因为它需要等待所有事务从库中完成才能返回。超时需要时间。2)异步复制 MySQL的默认复制是异步的。主库在执行客户端提交的事务后,会立即将结果返还给客户端,不在乎从库是否已经接收和处理。这样,就会出现问题。如果主库丢失,此时主提交的事务可能不会从上传到上传。如果此时被迫从上升到上升,可能会导致新主数据不完整。三、半同步复制 在异步复制和全同步复制之间,主库在执行客户端提交的事务后不会立即返回客户端,而是等待至少一个从库中收到并写下来 只有在log中返回到客户端。与异步复制相比,半同步复制提高了数据的安全性,也造成了一定程度的延迟,至少是TCP/IP往返时间。因此,最好在低延迟网络中使用半同步复制。
1.5.2 半同步复制基于特定模块实现半同步复制。但是非常 nice 有一点是,在我们身上 mariadb5.5 默认情况下,上述版本有该模块。 如果我们的 centos7 上安装了 mariadb ,我们可以进入目录查看:
[root@master ~]# cd /usr/lib64/mysql/plugin/
在找到我们的模块后,我们可以通过命令进行安装,然后进行简单的配置。具体方法如下:
master 服务器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
slave 服务器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;MariaDB [(none)]> stop slave;MariaDB [(none)]> start slave;
现在,我们的半同步复制已经开始,我们可以查看日志:
[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log
从日志中也可以看出,我们的半同步复制已经打开。