大型项目mysql5.6主从读写分离搭建(一主三从)

    本篇文章记录博主所负责的一个大型项目最近一次遇到主从失效,重新搭建的整个过程。博主可是干了几个小时才搭建好,但是小伙伴们不要怕,其实搭建主从本身是非常简单的;主要还是数据量十几个G还原数据库花费太多时间。

    首先,因为博主负责的该项目服务器几十台的规模,所以批量操作博主都已经做成了自动化脚本。如果大家要想看脚本请到前面博主的文章查看:大型项目linux自动化版本发布脚本(shell)之tomcat、nginx服务脚本

    以下是详细步骤:

   一、停止web应用,接口服务器,mycat

#执行nginx集群下线脚本(主要解决几台nginx转发问题)
sh n_downline_ssh.sh
#停止所有web服务器tomcat
sh t_kill.sh
#停止接口服务器tomcat
Kill -9 接口服务器tomcat进程号
#停止mycat服务
./mycat stop

    二、备份主数据库

#备份命令
nohup mysqldump -uxxx -pxxxxx   xxerx_wcc_test > /opt/xxerx/dbbackup/xxerx_20181031.sql 1>myout.out 2>/dev/null &
#由于博主主了脚本执行,此处就直接运行脚本备份
sh t_xxmp_database_backup.sh 

    三、通知项目公司运维部门的人上传sql到几台从数据库所在服务器(人家是内网,速度快)

    四、把三台数据库主从挂载去掉

#需要先分别登录几台从库上mysql命令行
stop slave;
reset slave  all;
show slave status;

    五、把三台从数据库的xxery_wcc库删掉,重新创建数据库

#从库sql命令行执行
drop database if exists `xxerx_wcc`;
create database `xxerx_wcc` DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;

    六、设置几台从数据库参数

#设置一下参数来提高sql执行速度
set global net_buffer_length=1000000;(经测试无效)
set global max_allowed_packet=1000000000;(经测试无效)
//目标数据库(从库),查看参数设置结果
show variables like 'max_allowed_packet';
show variables like 'net_buffer_length';

#上面的设置可能会没生效,可执行下面登录时设置
mysql -u rxxx -p -e "set global net_buffer_length=1000000; set global max_allowed_packet=1000000000;"

#设置关闭一些数据库校验,提高sql执行速度
SET foreign_key_checks = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET GLOBAL log_bin_trust_function_creators = 1; 

    七、重启主库,在主库执行grant命令授权从库挂载 mysql命令:show master status; 记录posion和bin块

#将mysql锁住不写数据
flush tables with read lock;
#重启mysql
service mysql restart;


#主数据库配置授权从库的连接权限
grant replication slave on *.* to 'xxx'@'10.x.x.xx7' identified by 'xxxxxxxxxx@xxx~!@';
grant replication slave on *.* to 'xxx'@'10.x.x.xx1' identified by 'xxxxxxxxxx@xxx~!@';
grant replication slave on *.* to 'xxx'@'10.x.x.xx1' identified by 'xxxxxxxxxx@xxx~!@';
#查看mysql pos位置和bin文件块
show master status;
#执行结果
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000094 |      715 | xxery_wcc    | mysql,test       |                   |
+------------------+----------+--------------+------------------+-------------------+

    八、在三台从数据上执行备份的sql文件还原数据库,重启mysql

#mysql>

use xxerx_wcc;
source /opt/xxerx/xxerx_wcc20181031_214314.sql;

--需手动复制函数视图过来(函数、视图同步)

    九、将从库校验参数修改回来

SET foreign_key_checks = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;

    十、在从库上执行命令配置主从,并启动:start slave;

#mysql命令
#关闭从库连接
stop slave;
change master to master_host='10.x.x.xxx',master_port=3x06,master_user='xxx',master_password='xxxxxx@xxxx~!@',master_log_file = 'mysql-bin.000094',master_log_pos = 715;
#开启从库连接同步
start slave;
#在主库中执行主库,检查从库是否挂载成功
show processlist \G;
#上一句执行效果
*************************** 1. row ***************************
     Id: 19
   User: root
   Host: 10.x.x.xxx:52739
     db: NULL
Command: Binlog Dump
   Time: 273
  State: Master has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
*************************** 2. row ***************************
     Id: 20
   User: xoox
   Host: 10.x.x.xxx:xxx06
     db: NULL
Command: Binlog Dump
   Time: 158
  State: Master has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
*************************** 3. row ***************************
     Id: 21
   User: xoox
   Host: 10.x.x.xxx:3x9xx
     db: NULL
Command: Binlog Dump
   Time: 78
  State: Master has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
*************************** 4. row ***************************
     Id: 22
   User: xoox
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: init
   Info: show processlist
4 rows in set (0.34 sec)

    十一、检查从库状态 show slave status. 测试同步是否成功(主库手动加数据看从库是否同步)

#主库执行,解锁主库
unlock tables;
#从库执行,查看从库状态
show slave status\G;

    十二、修改mycat配置,重启Mycat(因为从库坏后,我把连接配置修改回了单库支撑线上业务,此处需要修改回读写分离)

cd /opt/xxxx/mycat/conf/
vi  schema.xml
cd /opt/xxxx/bin
./mycat start;

 

#修改前(读写配置同一台主库):
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
        <schema name="xxerx_wcc" checkSQLschema="false" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="xxerx_wcc" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <!-- can have multi master write hosts -->
                <writeHost host="xilon-centos5" url="10.x.x.xxx:3x06" user="xxx"
                        password="xxxxx@xxx~!@">
                <!-- can have multi slave read hosts -->
                <readHost host="xilon-centos5" url="10.x.x.xxx:3x06" user="xxx"
                        password="xxxxx@xxx~!@" />
                </writeHost>
        </dataHost>
</mycat:schema>

 

#修改后:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
        <schema name="xxerx_wcc" checkSQLschema="false" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="xxerx_wcc" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <!-- can have multi master write hosts -->
                <writeHost host="xilon-centos5" url="10.x.x.xxx:3xx6" user="xxx"
                        password="xxxxx@xxx~!@">
                <!-- can have multi slave read hosts -->
                <readHost host="xilon-centos6" url="10.x.x.xxx:3xx6" user="xxx"
                        password="xxxxx@xxx~!@" />
                <readHost host="xilon-centos7" url="10.x.x.xxx:3xx6" user="xxx"
                        password="xxxxx@xxx~!@" />
                <readHost host="xilon-centos8" url="10.x.x.xxx:3xx6" user="xxx"
                        password="xxxxx@xxx~!@" />
                </writeHost>
        </dataHost>
</mycat:schema>

    十三、重启web,接口服务器

sh t_restart_delay_new.sh 60s

    十四、上线nginx

sh n_go_online_ssh.sh

    十五、测试线上业务(完成)

     最后总结,mycat主从读写分离特别方便简单。以上是博主本次文章的全部内容,如果大家觉得博主的文章还不错,请点赞;如果您对博主其它服务器技术或者博主本人感兴趣,请关注博主博客,并且欢迎随时跟博主沟通交流。

 

转载于:https://my.oschina.net/u/2371923/blog/2434889

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用 MySQL 主从复制实现读写分离的毕业项目,你考虑以下步骤要点: 1. 环准备: -装 MySQL 数据库:在主服务器和从服务器上安装 MySQL 数据库。 - 配置主服务器:在主服务器上开启二进制日志功能,并设置唯一标识(server-id)。 - 配置从服务器:在从服务器上设置唯一标识(server-id)和复制账户。 2. 主从复制配置: - 配置主服务器:修改主服务器的配置文件,启用二进制日志(binlog)功能,并设置相关参数如binlog_format、log-bin等。 - 配置从服务器:修改从服务器的配置文件,设置相关参数如server-id、relay-log等,并指定主服务器的地址和复制账户。 - 启动主从复制:重启主服务器和从服务器,使配置生效,启动主从复制。 3. 读写分离实现: - 读写分离架构:将主服务器用于写操作,从服务器用于读操作。这样可以提高数据库的读取性能和扩展性。 - 代码实现:在应用程序中,根据业务需求,通过配置或代码的方式,将读操作与写操作分别发送到主服务器和从服务器。 4. 数据同步与一致性: - 复制延迟处理:由于主从复制存在一定的延迟,可能导致从服务器读取到的数据不是最新的。可以通过配置和监控来处理延迟情况,例如通过设置复制延迟报警、选择合适的复制模式等。 - 数据一致性:在写操作完成后,需要保证数据在主服务器和从服务器之间的同步。可以通过配置同步策略、监控同步状态等来确保数据一致性。 5. 故障恢复与监控: - 故障恢复:当主服务器或从服务器出现故障时,需要进行相应的故障恢复操作。例如,当主服务器宕机时,可以将从服务器提升为新的主服务器,并重新配置其他从服务器。 - 监控与报警:建立监控系统,实时监控数据库主从复制状态、延迟情况、性能指标等,并设置报警机制,及时处理异常情况。 6. 性能优化与扩展: - 数据库性能优化:通过索引、分表分库、查询优化等方式提高数据库的读写性能。 - 扩展能力:当数据库负载增加时,可以考虑使用主从复制集群、分布式数据库等方式进行扩展。 以上是一个基本的 MySQL 主从复制读写分离的实现步骤和要点,你可以根据具体的项目需求进行相应的调整和扩展。希望这些信息对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值