当前位置: 首页 > 后端技术 > PHP

MySQLReplication-性能和扩展性的基石之二:部署和配置

时间:2023-03-29 23:50:24 PHP

正所谓理论建造航空母舰和真正的小帆船。光有理论,没有动手实践,所学知识犹如空中楼阁。下面我们一步一步的看一下如何配置MySQLReplication。为MySQL服务器配置复制非常简单。但是,由于场景不同,基本步骤还是有区别的。最基本的场景就是新装主库和备库。一般来说,分为以下几个步骤:在每台服务器上创建一个复制账户。配置主数据库和备用数据库。通知备库连接主库,从主库复制数据。另外,由于主备部署需要多台服务器,这个需求对大多数人来说不是很友好。毕竟,学习部署主备架构不需要额外购买云服务器。因此,为了测试方便,我们通过docker容器技术在同一台机器上部署多个容器,从而实现在一台机器上部署主备结构。这里我们先假设大部分配置使用默认值,主备数据库都是全新安装的,数据相同。接下来,我们将展示如何通过docker技术一步步复制配置。此外,如果您不知道如何配置,我们会推荐一些“安全配置”以确保您的数据安全。1部署docker环境1)部署的docker是什么?docker还没有部署?赶紧参考这里配置一个,docker没玩过,怎么跟面试官吹水!2)拉取MySQL镜像dockerpullmysql:5.73)使用mysql镜像启动容器dockerrun-p3339:3306--namemysql-master-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7#启动master容器dockerrun-p3340:3306--namemysql-slave-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7#启动从容器。master的对外端口是3339,slave的对外端口是3340。我们在使用client连接的时候,需要使用对应的端口去连接对应的mysql。4)使用命令查看正在运行的容器dockerps5)使用客户端连接工具测试连接mysql2配置Master和Slave1)配置master通过以下命令进入容器dockerexec-itmysql-master/bin/basha)Updateapt-getSourceapt-getupdateb)Installvimapt-getinstallvimc)Configuremy.cnfvim/etc/mysql/my.cnf//在my.cnf中添加如下配置[mysqld]server-id=110#serverid,在同一个局域网内Uniquelog-bin=/var/lib/mysql/mysql-bin#二进制日志路径d)重启mysql服务使配置生效servicemysqlrestarte)重启mysql服务时启动容器,docker容器会停止,需要重启容器。dockerstartmysql-masterf)创建数据同步用户并授权CREATEUSER'slave'@'%'IDENTIFIEDBY'123456';GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TO'slave'@'%';2)配置slave通过以下命令进入容器dockerexec-itmysql-slave/bin/basha)配置my.cnfvim/etc/mysql/my.cnf//在my.cnf中添加如下配置[mysqld]server-id=120#serverid,同一局域网内唯一的log-bin=/var/lib/mysql/mysql-bin#二进制日志路径relay_log=/path/to/logs/relay-bin#中继日志路径3)将master和slave关联起来配置好master和slave之后,接下来就是关联master和slave了。回到我们的服务器,首先找出主从容器的IP,执行:dockerinspect--format='{{.NetworkSettings.IPAddress}}'mysql-master这样,我们就知道了mysql-master容器的IP是:172.17.0.3。同理,mysq-slave容器的IP为:172.17.0.4。记住这两个值,后面的配置中会用到。我们首先配置master。在master容器中通过mysql-uroot-p进入MySQL命令行,执行showmasterstatus;上图中应该记录下File和Position字段对应的值,这两个值在后面的slave配置中会用到。需要注意的是,记录这两个值后,不能对主库进行任何操作,否则数据会不同步。接下来,配置从机。同样在slave上输入MySQL命令行。然后执行如下语句:将master改为master_host='172.17.0.3',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=42852,master_connect_retry=30;changemasterto是slave配置master的命令,相关参数含义如下:master_host:master的IP,也就是我们上面获取的IP地址master_port:master的端口号,这是我们的mastermysql的端口号master_user:进行数据同步的用户master_password:同步用户的密码master_log_file:指定slave从master的哪个日志文件开始复制数据,也就是我们的File字段的值上面提到的master_log_pos:从master日志文件的位置开始读取,上面提到的Position字段的值master_connect_retry:重试间隔。单位是秒,默认是603。配置slave后,可以通过showslavestatusG查看slave的状态;命令。![slavestatus]](/img/bVbqPxZ)一般情况下,刚才配置的slave的Slave_IO_Running和Slave_SQL_Running都是NO,因为我们没有开启主从复制。使用startslave启动主从复制,然后查看slave状态。slave的Slave_IO_Running和Slave_SQL_Running都是YES,说明主从复制启动成功。此时可以检查客户端是否可以成功复制数据。我们在master新建一个复制库,然后观察从库是否创建了复制库,如下图,说明复制成功。另外,开启主从复制后,如果出现如下情况:Slave_IO_Running:CONNECTINGSlave_SQL_RUNNING:Yes表示开启主从复制后,slave的IO进程连接master出现问题,连接一直在重试。我们可以根据Last_IO_Error:networkisunreachable的提示来解决。检查IP,端口。密码错误。检查配置的同步用户和密码是否正确。位置错误。检查slave配置的Position值是否和master一致。4开始从另一台服务器复制之前的设置都是假设主备数据库是刚安装的,都是默认数据,也就是说两台服务器上的数据是一样的,当前主库的binarylog众所周知。但在实际环境中,大多数情况下,有一个主库已经运行了一段时间,然后使用一个新安装的备库与之同步。此时备库没有数据。有几种方法可以初始化备库或从其他服务器克隆数据到备库。包括从主库复制数据,从另一个备库克隆数据,使用最新的备份启动备库等。而这些方法都需要三个条件来保持主库和备库的同步:数据快照某个时间点的主库。主库当前的二进制日志文件,以及获取数据快照时二进制日志文件中的偏移量。我们将这两个值称为日志文件坐标。二进制日志的位置可以通过这两个值来确定。这些值可以通过SHOWMASTERSTATUS命令获得。从快照时间到现在的二进制日志。以下是从另一台服务器克隆备用数据库的一些方法:使用冷备份。最基本的方法是关闭主库,将数据复制到备库。主库重启后会使用一个新的二进制日志文件,我们在备库执行CHANGEMASTERTO指向这个文件的开头。但是这种方式的缺点也很明显:复制数据时需要关闭主库。使用热备份。如果您只使用MyISAM表,则可以在主服务器运行时使用mysqlhotcopy或rsync复制数据。使用mysqldump。如果只有InnoDB表,可以使用如下命令将主库数据转储到备库,然后设置对应的二进制日志坐标:mysqldump--single-transaction--all-databases--master-data=1--host=server1|mysql--host=服务器2。选项--single-transaction使转储数据成为事务开始之前的数据。如果您使用的是非事务性表,则可以使用--lock-all-tables选项来获取所有表的一致转储。使用快照或备份。只要知道对应的二进制日志坐标,就可以使用主库的快照或者备份来初始化备库。(如果使用备份,需要保证从备份时间点开始的主库二进制日志存在)。只需将备份或快照恢复到备库,然后使用CHANGEMASTERTO指定二进制日志的坐标即可。使用PerconaXtrabackup。Percona的Xtrabackup是一个开源的热备份工具。它能够在不阻塞服务器运行的情况下进行备份,因此可以在不影响主数据库的情况下设置备用数据库。可以通过克隆主数据库或另一个现有的备用数据库来创建备用数据库。使用另一个备份。可以使用任何克隆或复制技术将数据从任何备用数据库克隆到另一台服务器。但如果您使用的是mysqldump,则--master-data选项将无效。另外SHOWMASTERSTATUS不能用来获取主库的二进制日志坐标,但是SHOWSLAVESTATUS用来获取快照时备库在主库上的执行位置。使用另一个备库进行数据克隆最大的缺点是,如果这个备库的数据与主库不同步,那么克隆出来的数据就是脏数据。5推荐复制配置我们知道MySQL复制有很多可以控制的参数,其中一些参数会对数据安全和性能产生影响。在这里,我们介绍一种“安全配置”,它可以最大限度地减少问题发生的可能性。主库binarylog最重要的选项是sync_binlog:sync_binlog=1如果开启这个选项,MySQL在每次提交事务前都会将binarylog同步到磁盘,以保证服务器不丢失时间崩溃。如果禁用此选项,服务器将做更少的工作,但如果服务器崩溃,二进制日志文件可能会损坏或丢失信息。在不需要成为主数据库的备用数据库上,此选项会引入不必要的开销。请注意,这仅适用于二进制日志,不适用于中继日志。如果不能接受服务器崩溃导致的表损坏,建议使用InnoDB。在备用数据库服务器崩溃并重新启动后,MyISAM表可能已经处于不一致状态。如果使用InnoDB,建议设置如下选项:innodb_flush_logs_at_trx_commit=1#每次事务提交时,将日志缓冲区写入日志文件并刷新到磁盘。默认为1innodb_safe_binlog以显式指定二进制日志文件的名称。在服务器之间传输文件、克隆新的备库、转储备份等场景中,以服务器名命名二进制日志可能会导致很多问题。因此,我们需要为log_bin选项指定一个参数。log_bin=/var/lib/mysql/mysql-bin在备库上,同样启用如下训练,为中继日志指定一个绝对路径:relay_log=/path/to/logs/relay-binskip_slave_startread_only通过设置relay_log,可以avoidrelaylogs文件根据机器名命名,防止前面提到的在主存储库上可能出现的问题。skip_slave_start选项可以防止备用数据库在崩溃后自动启动复制,以便有时间修复可能出现的问题。read_only选项阻止大多数用户更改非临时表。6总结复制初始化配置三部曲:创建账号,配置主备库,备库连接主库启动复制;从现有服务器复制时,可以使用热备份或mysqldump命令进行备份;如果您不确定相关配置,请选择最安全的配置;