1。单一数据库服务器的缺点数据库服务器存在单点问题;数据库服务器资源无法满足增加的读写请求;高峰期数据库连接数经常超过上限。2、如何解决单点问题添加额外的数据库服务器,形成数据库集群;同一集群中的数据库服务器需要有相同的数据;集群中任意一台服务器宕机后,其他服务器可以替代宕机的服务器。三、MySQL主从复制架构1、主库将变化写入主库的binlog。部分MySQL版本没有开启二进制日志,一定要检查是否开启;如果一开始没有启用,则稍后启用。需要重启数据库才能生效,而数据库的重启往往对业务影响很大;二进制日志虽然对性能影响不大,但无论是否使用复制功能,建议开启MySQL二进制日志,因为增量备份也需要二进制日志。2、从库的IO线程读取主库指定位置的binlog内容,存储到本地的中继日志(RelayLog)中。为了完成二进制日志的传输过程,MySQL会在从服务器上启动一个工作线程,称为IO线程,这个IO线程会与主数据库建立一个普通的客户端连接,然后启动一个特殊的二进制转储线程,称为binlogdown线程在主服务器上。从库上的IO线程使用这个binarydump线程读取主库上的binaryevent。如果事件赶上主库,就会进入休眠状态,直到主库发出信号通知有新的事件产生。被唤醒后,relaylog的格式和binlog的格式完全一样。您可以使用mysqlbinlog读取中继日志的内容。3、从库的SQL线程读取RelayLog的内容,重放从库SQL线程执行的事件。我们可以通过配置选项来决定是否写入从服务器的二进制日志。目前MySQL支持两种复制方式:基于二进制日志点的复制基于GTID的复制(推荐MySQL>=5.7)四、MySQL主从配置步骤1、配置主从数据库服务器参数有些参数需要重启才能生效配置后生效,为了不影响数据库的正常使用,我们最好在服务器上线的时候配置所有的参数。特别是主服务器的参数应该配置为服务器的初始参数。主服务器:从服务器:2.在主服务器上创建一个用于复制的数据库账号,用于IO线程连接主服务器获取binlog日志。*REPLICATIONSLAVE**需要权限:createuser'repl'@'ipsection'identifiedby'password';grantreplicationslaveon*.*to'repl'@'ipsegment';3、备份主服务器上的数据,初始化从服务器数据。建议主从数据库服务器使用相同的MySQL版本;推荐使用全库备份方式初始化slave数据。使用同一个版本的好处:我们可以使用全量备份的方式来初始化slave数据,同时也避免了不同版本之间的差异导致数据库同步失败的问题。如果我们使用的主从复制服务器的MySQL版本不同,一定要注意master上的版本必须低于slave服务器,否则同步时可能会出错。由于我们演示过程中的MySQL服务器都是使用MySQL5.7,所以我们可以使用全量备份的方式:mysqldump--master-data=2-uroot-p-A--single-transaction-R--triggers4.启动复制链接基于日志点在从服务器上运行。MySQL命令:CHANGEMASTERTOMASTER_HOST='master_host_ip',MASTER_USER='repl',MASTER_PASSWORD='密码',MASTER_LOG_FILE='mysql_log_file_name',MASTER_LOG_POS=xxxxxx;5.启动基于GTID的Replication链接GTID:全局事务ID,GTID可以保证master上提交的每一个事务,在replication集群中可以产生唯一的ID值。要使用基于GTID的复制,我们需要在主从复制配置文件中设置,同时添加如下配置项。MySQL配置:gtid_mode=on#是否开启gtid模式,如果开启该模式,二进制日志中会额外记录每笔交易的GTID标识。securitylog-slave-updates=on#mysql5.6必须启用参数,5.7不能启用MySQL命令:CHANGEMASTERTOMASTER_HOST='master_host_ip',MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1;GTID复制限制:你不能再使用createtable...select语句来建表,只能先建表,再插入数据;您不能使用createtemporarytable在事务中创建临时表;您不能使用关联更新同时更新事务表和非事务表。选择4和5之一执行。五、MySQL主从复制演示1、先配置主服务器。由于主服务器一直在运行,所以生产环境中很少重启主服务器。如果主服务器重启,正常的业务访问会中断。所以二进制日志是在服务器启动之前启动的。这里不需要重启主服务器。由于主服务器默认的server_id=1,虽然我们在配置文件中改变了它的值,但是在实际运行环境中并没有改变。我们可以查看当前的server_id:mysql>showvariablelike'%server_id%';可以通过以下命令动态修改:mysql>setglobalserver_id=100;2、然后配置从服务器修改从服务器配置后,重启MySQL服务器。注意如果你使用的是MySQL5.7:MySQL5.7增加了一个server-uuid值。默认情况下,会下载auto.cnf文件。如果使用镜像安装,可能每个人的uuid都是一样的,所以需要设置auto.cnf文件删除。MySQL重启后,会自动重新生成uuid值,从而保证不同服务器上MySQL实例的uuid值不同;如果server-uuid值相同,主从复制就会出现问题。上面我们已经完成了主从复制的配置,接下来我们需要在主服务器上创建一个复制账号。3、在MySQL主服务器上创建MySQL复制账号mysql>createuser'dba_repl'@'192.168.3.%'identifiedby'123456';mysql>grantreplicationslaveon*.*to'dba_repl'@'192.168.3.%';4.建立复制账号后,通过mysql主服务器上的全量备份初始化,对从服务器上的数据进行全量备份:[root@localhostdata]#cd/data/db_backup/[root@localhostdb_backup]#mysqldump-uroot-p--master-data=1--single-transaction--routines--triggers--events--all-databases>all.sqlEnterpassword:复制到从服务器:[root@localhostdb_backup]#scpall.sqlroot@192.168.3.101:/root通过从服务器恢复备份进行初始化:[root@Node2~]#mysql-uroot-p
