`
vieri124
  • 浏览: 26652 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MYSQL主从复制及读写分离小记

阅读更多

 在自己的破本本上实现了配置主从复制及读写分离,特记录下来备忘。

多服务器配置参考mysql5.1参考手册5.12.1. 在Windows下运行多个服务器

主从复制参考mysql5.1参考手册第6章:MySQL中的复制

读写分离参考http://www.gaojinbo.com/mysql-proxy-%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html

1.环境
windows xp sp3
MySQL Proxy mysql-proxy-0.8.1-win32-x86

MySQL Server mysql-noinstall-5.5.9-win32

Lua

2.配置多服务器

将MySQL Server mysql-noinstall-5.5.9-win32解压到%mysql_home%(目录自定),我此处解压到D:/MYSQL/mysql-5.5.9下,将data文件夹复制为data3309,data3301,data3302,复制启动选项文件为my3309.ini,my3301.ini,my3302.ini(ini文件的内容见3.主从复制

创建startboot.bat文件,内容如下

cd D:\MySQL\mysql-5.5.9\bin

d:

rem 启动SQL节点
start mysqld --defaults-file=D:\MySQL\mysql-5.5.9\my3309.ini --console
start mysqld --defaults-file=D:\MySQL\mysql-5.5.9\my3301.ini --console
start mysqld --defaults-file=D:\MySQL\mysql-5.5.9\my3302.ini --console

保存后双击startboot.bat,启动服务器

对应的stopboot.bat文件,内容如下

cd %mysql_home%/bin:

rem 启动SQL节点
start mysqladmin shutdown -u root -proot -P 3301
start mysqladmin shutdown -u root -proot -P 3302
start mysqladmin shutdown -u root -proot -P 3309

 

以上脚本均采用命令行的形式

 

3.主从复制

1).配置启动选项文件

采用一主两从,主服务器端口设置为3309,从服务器端口设置为3301、3302

配置主服务器3309的my.ini文件

[mysqld]

#端口
port  = 3309
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K

# 设置安装路径

basedir=D:/MySQL/mysql-5.5.9
# 设置数据文件目录

datadir=D:/MySQL/mysql-5.5.9/data3309

# 服务器默认的字符集
character-set-server=utf8

# 默认的存储引擎

default-storage-engine=INNODB

# 服务器节点,必须唯一,为方便改为和端口一样的值
server-id = 3309

# 复制目标数据库

replicate-do-db=test

# 复制忽略的数据库
replicate-ignore-db=mysql
#开启二进制日志,设置日志名
log-bin=mysql-bin-3309
# 按服务器启动日志中的提示将log换成了general-log

general-log=mylog-3309
#需要记录二进制记录复制的数据库
binlog-do-db=test
#复制忽略二进制记录的数据库
binlog-ignore-db=mysql
#在事务过程中容纳二进制日志SQL语句的缓存大小,二进制日志缓存是服务器支持事务存储引擎并且服务器启用了二进制日志(–log-bin选项)的前提下为 每个客户端分配的内存。#如果经常使用大的,多语句事务,可以增加该值以获得更有的性能
binlog_cache_size = 5M
#binlog_format=mixed
#是否记录慢查询,默认OFF。用long_query_time变量的值来确定“慢查 询”。
log_slow_queries
#超过2S的query将记slow query日志
long_query_time = 2

#既做为从服务器又做为主服务器
log-slave-updates=true

# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE

# 以下是innodb引擎的配置

# innodb数据文件目录

innodb_data_home_dir = D:/MySQL/mysql-5.5.9/data3301/

# innodb数据文件,采用innodb_data_home_dir的相对路径

innodb_data_file_path = ibdata1:10M:autoextend

# innodb日志组目录

innodb_log_group_home_dir =D:/MySQL/mysql-5.5.9/data3301/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

因为是在一台机器上配置,为方便辨识,在相关目录、id都加上端口数值,如datadir=D:/MySQL/mysql-5.5.9/data3309。从服务器配置同主服务器,只需将参数中的3309替换为3301和3302,另存为my.ini即可。

启动主从服务器。

2).配置复制用户

配置主服务器复制用户

登录主服务器

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3309

mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep_master_3309'@'localhost' IDENTIFIED BY 'rep';

mysql> quit;

配置从服务器复制用户

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3301

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep_slave_3301'@'localhost' IDENTIFIED BY 'rep';

mysql> quit;

 

 

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3302

 

3).同步数据

 

使用mysqldump从主服务器导出数据,再导入到从服务器中,步骤略。或者直接将datadir=D:/MySQL/mysql-5.5.9/data3309下的数据文件ibdata1和ib_logfile0及test数据库文件拷贝到3301和3302的datadir下(因为是测试,能简则简,拷贝数据文件的原因是因为引擎采用的innodb,没有ibdata1和ib_logfile0进入客户端后查询表会出错)。

4).配置复制

登录主服务器3309

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3309

输入

mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
            File: mysql-bin-3309.000001
        Position: 107
    Binlog_Do_DB: test
Binlog_Ignore_DB: mysql

记住File和Position

 

登录从服务器3301

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3301

输入

mysql> STOP SLAVE;

将主服务器的参数配置到从服务器中,MASTER_LOG_FILE和MASTER_LOG_POS分别对应主服务器的File和Position
mysql> CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='rep_master_3309', MASTER_PASSWORD='rep', MASTER_LOG_FILE='mysql-bin-3309.000001', MASTER_LOG_POS=107, MASTER_PORT=3309;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: localhost
                  Master_User: rep_master_3309
                  Master_Port: 3309
                Connect_Retry: 60
              Master_Log_File: mysql-bin-3309.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: www-ff27f888e5e-relay-bin.000002
                Relay_Log_Pos: 258
        Relay_Master_Log_File: mysql-bin-3309.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 424
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 3309

 

看到Slave_IO_Running: Yes

Slave_SQL_Running: Yes

即为从服务器3301连接主服务器3309成功。

 

PS:如果配置后出现

Slave_IO_Running: No

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

提示无法找到索引文件mysql-3301-bin.index,按以下方式解决。

mysql> stop slave;
mysql> change master to master_host='localhost',master_user='rep_slave_3301',master_password='rep';
mysql> start slave;

为什么改下主机、用户、密码就好了,在网上找了好多,也没有明确解释,但问题还是解决了。

 

 

从服务器3302也如法炮制。

 

5).复制数据

登录主服务器3309

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3309

在test数据库下创建表t11,表很简单,够用了
mysql> CREATE TABLE `t11` (
  `i` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`i`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

利用自增长插入数据(在sql_mode=''等检查不严格时可以采用以下语句)

mysql> insert into t11 values('');

mysql> select * from t11;

+---+
| i |
+---+
| 1 |

+---+

登录主服务器3301

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 3301

查询test数据库下的表t11,就会发现这条数据。

mysql> select * from t11;

+---+
| i |
+---+
| 1 |

+---+


4.读写分离

1).配置启动选项文件

解压mysql-proxy-0.8.1-win32-x86到%mysql_proxy_home%(目录自定),我此处解压到D:/MYSQL/mysql-proxy-0.8.1-win32-x86下,配置mysql-proxy.ini如下

[mysql-proxy]
daemon=true
proxy-skip-profiling=true
keepalive = true

#代理写服务器
proxy-backend-addresses = localhost:3309

#代理只读服务器
proxy-read-only-backend-addresses = localhost:3301,localhost:3302
#lua编写的读写分离代理脚本
proxy-lua-script = D:/MySQL/mysql-proxy-0.8.1-win32-x86/share/doc/mysql-proxy/rw-splitting.lua

#新建log文件夹
log-file = D:/MySQL/mysql-proxy-0.8.1-win32-x86/logs/mysql-proxy-0.8.0.log
log-level = debug
# --proxy-fix-bug-25371 — 修正 mysql的libmysql版本大于5.1.12的一个#25371号bug

#代理主机及端口,端口默认为4040
#proxy-address=localhost:4040
#指定一个mysqo-proxy的管理端口,缺省是 4041
admin-address=localhost:4041

#管理员
admin-username=name

#管理员密码
admin-password=pwd
#lua编写的管理脚本
admin-lua-script=D:/MySQL/mysql-proxy-0.8.1-win32-x86/share/doc/mysql-proxy/admin.lua

2).修改rw-splitting.lua脚本

修改默认连接,进行快速测试,不修改的话要等达到连接数时才读写分离

        proxy.global.config.rwsplit = {
                min_idle_connections = 1,        #默认是4
                max_idle_connections = 2,        #默认是8

                is_debug = false
        }

3).添加启动的相关脚本

将D:\MySQL\mysql-proxy-0.8.1-win32-x86\lib\mysql-proxy路径下的lua文件夹整个复制到D:\MySQL\mysql-proxy-0.8.1-win32-x86\bin下

4).启动代理

windows命令行下启动
rem mysql-proxy --daemon --proxy-skip-profiling --admin-username=name --admin-password=pwd --proxy-lua-script=D:/MySQL/mysql-proxy-0.8.1-win32-x86/share/doc/mysql-proxy/rw-splitting.lua --admin-address=localhost:4041 --proxy-address=:4040 --proxy-backend-addresses=localhost:3309 --proxy-read-only-backend-addresses=localhost:3301 --proxy-read-only-backend-addresses=localhost:3302 --log-file=D:/MySQL/mysql-proxy-0.8.1-win32-x86/logs/mysql-proxy-0.8.0.log  --log-level=debug --admin-lua-script=D:/MySQL/mysql-proxy-0.8.1-win32-x86/share/doc/mysql-proxy/admin.lua

利用参数文件启动
mysql-proxy --defaults-file=D:\MySQL\mysql-proxy-0.8.1-win32-x86\mysql-proxy.ini

重启mysql服务器3309,3301,3302

登录主服务器3309,开启3个连接,确保开启读写分离

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 4040

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 4040

D:\MySQL\mysql-5.5.9\bin> mysql -u root -P 4040

登录从服务器3301

D:\MySQL\mysql-5.5.9\bin> mysql -u rep_slave_3301 -P 3301

启动主从复制

mysql> start slave;

在主服务器3309上的任一个连接下增加数据

mysql> insert into t11 values('');

mysql> select * from t11;

+---+
| i |
+---+
| 1 |

| 2 |

+---+

在从服务器3301下查询表t11

mysql> select * from t11;

+---+
| i |
+---+
| 1 |

| 2 |

+---+

从服务器3301关闭复制

mysql> stop slave;

在主服务器3309上的任一个连接下增加数据

mysql> insert into t11 values('');

在从服务器3301下查询表t11,原本自增加到3,查询只有2,说明读写分离成功。

mysql> select * from t11;

+---+
| i |
+---+
| 1 |

| 2 |

+---+

 

另记:

在登录代理管理器时的状态查询

D:\MySQL\mysql-5.5.9\bin>mysql -u name -p -P 4041
Enter password: ***
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show proxy processlist;
ERROR 1105 (07000): need a resultset + proxy.PROXY_SEND_RESULT ... got something
 else
mysql> select * from backends;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: *** NONE ***

ERROR 1105 (07000): error
mysql> select * from backends;
ERROR 1105 (07000): error
mysql> show proxy processlist;
ERROR 1105 (07000): need a resultset + proxy.PROXY_SEND_RESULT ... got something
 else

#SELECT * FROM backends时,SELECT * FROM 必须是大写,否则如上报错
mysql> SELECT * FROM backends;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: *** NONE ***

+-------------+----------------+-------+------+
| backend_ndx | address        | state | type |
+-------------+----------------+-------+------+
|           1 | 127.0.0.1:3309 | 1     | 1    |
|           2 | 127.0.0.1:3301 | 0     | 2    |
|           3 | 127.0.0.1:3302 | 0     | 2    |
+-------------+----------------+-------+------+
3 rows in set (0.23 sec)

#这句无论大小写总是查询错误,原因未知

mysql> SHOW PROXY PROCESSLIST\G;
ERROR 1105 (07000): need a resultset + proxy.PROXY_SEND_RESULT ... got something
 else
ERROR:
No query specified

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep_slave_3302'@'localhost' IDENTIFIED BY 'rep';

 

mysql> quit;

分享到:
评论
3 楼 vieri124 2012-06-25  
是的,要安装lua,不好意思,忘记写了
2 楼 songjiesdnu 2012-05-21  
是不是需要安装lua的运行环境才行啊?
1 楼 songjiesdnu 2012-05-21  
4.读写分离-->4).启动代理
在这个时候出现下面的错误:
应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件
日志,或使用命令行 sxstrace.exe 工具。
请问楼主怎么解决?

相关推荐

    小记一次mysql主从配置解决方案

    MySQL主从配置是一种常见的数据库高可用性和负载均衡策略,它主要目标是实现读写分离,提升数据库系统的并发处理能力。在大数据量或者复杂的报表查询场景下,某些SQL语句可能会导致长时间锁定表,从而影响到前端应用...

    mysql数据库互为主从配置方法分享

    mysql主从配置小记: 共有四台机器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。 配置后结果:A-C互为主从,B为A的slave,D为C的slave。 0)准备工作 在四台机器上面安装好mysql后,创建用于同步的...

    win7修复本地系统工具

    win7修复本地系统工具

    《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt

    《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt

    《计算机专业英语》chapter12-Intelligent-Transportation.ppt

    《计算机专业英语》chapter12-Intelligent-Transportation.ppt

    西门子S7-1200博图平台下3轴伺服螺丝机程序解析与应用

    内容概要:本文详细介绍了基于西门子S7-1200博图平台的3轴伺服螺丝机程序。该程序使用SCL语言编写,结合KTP700组态和TIA V14及以上版本,实现了对X、Y、Z三个轴的精密控制。文章首先概述了程序的整体架构,强调了其在自动化控制领域的高参考价值。接着深入探讨了关键代码片段,如轴初始化、运动控制以及主程序的设计思路。此外,还展示了如何通过KTP700组态实现人机交互,并分享了一些实用的操作技巧和技术细节,如状态机设计、HMI交互、异常处理等。 适用人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC编程感兴趣的工程师。 使用场景及目标:适用于希望深入了解西门子S7-1200博图平台及其SCL语言编程特点的学习者;旨在帮助读者掌握3轴伺服系统的具体实现方法,提高实际项目中的编程能力。 其他说明:文中提供的代码示例和设计理念不仅有助于理解和学习,还能直接应用于类似的实际工程项目中。

    MATLAB仿真:非线性滤波器在水下长基线定位(LBL)系统的应用与比较

    内容概要:本文详细探讨了五种非线性滤波器(卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波(PF)和变维卡尔曼滤波(VDKF))在水下长基线定位(LBL)系统中的应用。通过对每种滤波器的具体实现进行MATLAB代码展示,分析了它们在不同条件下的优缺点。例如,KF适用于线性系统但在非线性环境中失效;EKF通过雅可比矩阵线性化处理非线性问题,但在剧烈机动时表现不佳;UKF利用sigma点处理非线性,精度较高但计算量大;PF采用蒙特卡罗方法,鲁棒性强但计算耗时;VDKF能够动态调整状态维度,适合信标数量变化的场景。 适合人群:从事水下机器人(AUV)导航研究的技术人员、研究生以及对非线性滤波感兴趣的科研工作者。 使用场景及目标:①理解各种非线性滤波器的工作原理及其在水下定位中的具体应用;②评估不同滤波器在特定条件下的性能,以便为实际项目选择合适的滤波器;③掌握MATLAB实现非线性滤波器的方法和技术。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现这些滤波器。此外,还讨论了数值稳定性问题和一些实用技巧,如Cholesky分解失败的处理方法。

    VMware-workstation-full-14.1.3-9474260

    VMware-workstation-full-14.1.3-9474260

    DeepSeek系列-提示词工程和落地场景.pdf

    DeepSeek系列-提示词工程和落地场景.pdf

    javaSE阶段面试题

    javaSE阶段面试题

    《综合布线施工技术》第5章-综合布线工程测试.ppt

    《综合布线施工技术》第5章-综合布线工程测试.ppt

    安川机器人NX100使用说明书.pdf

    安川机器人NX100使用说明书.pdf

    S7-1200 PLC改造M7120平面磨床电气控制系统:IO分配、梯形图设计及组态画面实现

    内容概要:本文详细介绍了将M7120型平面磨床的传统继电器控制系统升级为基于西门子S7-1200 PLC的自动化控制系统的过程。主要内容涵盖IO分配、梯形图设计和组态画面实现。通过合理的IO分配,确保了系统的可靠性和可维护性;梯形图设计实现了主控制逻辑、砂轮升降控制和报警逻辑等功能;组态画面则提供了友好的人机交互界面,便于操作和监控。此次改造显著提高了设备的自动化水平、运行效率和可靠性,降低了维护成本。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和控制系统设计的专业人士。 使用场景及目标:适用于需要进行老旧设备升级改造的企业,旨在提高生产设备的自动化水平和可靠性,降低故障率和维护成本。具体应用场景包括但不限于金属加工行业中的平面磨床等设备的控制系统改造。 其他说明:文中还分享了一些实际调试中的经验和技巧,如急停逻辑的设计、信号抖动的处理方法等,有助于读者在类似项目中借鉴和应用。

    chromedriver-linux64-136.0.7103.48.zip

    chromedriver-linux64-136.0.7103.48.zip

    IMG_20250421_180507.jpg

    IMG_20250421_180507.jpg

    《网络营销策划实务》项目一-网络营销策划认知.ppt

    《网络营销策划实务》项目一-网络营销策划认知.ppt

    Lianantech_Security-Vulnerabil_1744433229.zip

    Lianantech_Security-Vulnerabil_1744433229

    MybatisCodeHelperNew2019.1-2023.1-3.4.1.zip

    MybatisCodeHelperNew2019.1-2023.1-3.4.1

    《Approaching(Almost)any machine learning problem》中文版第13章(最后一章)

    【深度学习部署】基于Docker的BERT模型训练与API服务部署:实现代码复用与模型共享

    火车票订票系统设计与实现(代码+数据库+LW)

    摘  要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装火车票订票系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,火车票订票系统的有效运用可以帮助管理人员准确快速地处理信息。 火车票订票系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现火车票订票系统的功能。其中管理员管理用户,新闻公告。 火车票订票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,火车票订票系统都可以轻松应对。 关键词:火车票订票系统;SpringBoot框架,系统分析,数据库设计

Global site tag (gtag.js) - Google Analytics