关于mysql master-slave模式DB服务器的问题发生与解决

本文详细阐述了在MySQL主从复制环境下,网站积分管理系统出现负积分异常的原因,并提出了解决策略。通过分析随机选择从服务器进行读操作可能导致的数据不一致问题,以及对数据库字段属性的改进,最终确保了积分系统的正确性和稳定性。

刚接收一个内容服务下载网站,整体代码格局比较老,管理也比较混乱。最近遇到一个问题刚解决,记录下。


[简述]

mysql数据库服务器的搭建还是经典的master-slave方式,mater用来写操作,slave用来读操作。

网站有个服务器A,功能是 管理页面和cron程序。

cron的程序中有个减去过期积分的程序,每天运行几次。

原理也很简单。

1. 在数据库中查找过期积分。

2. 在数据库中查询用户现保有积分,如果现保有积分大于过期积分,那么就在该基础上减去;

如果现保有积分小于过期积分,那么就将现保有积分归零。

近期问题出现,用户现保有积分被大量减少至负数,例如-10000等数值。

从php程序中几乎找不到问题所在,php程序中都有相应的判断,按程序逻辑不应该出现负值。


[问题追踪]

slave服务器的连接被设计为随机调用。

比如5台服务器,使用rand()函数,随机抽取其中一台来访问查询数据。

master-slave模式的服务器结构,最应当考虑的问题就是,slave不能够及时同步master数据时,

会产生哪些问题。很明显原网站设计者,根本没有考虑过该问题。

所以可以演绎错误是怎样发生的,服务器A查询用户现保有积分时随机访问slave服务器,但是有台服务器

的数据没有与master同步,显示保有积分为500,实际上在master服务器的保有积分为0。而在写操作是在

master服务器上操作,这就导致了最终结果是保有积分为-500的状况出现。


[问题解决]

1. cron程序的所有操作,包括读取,写入,更新,都应该只在主服务器上进行。

2. 表中field的属性应当更加严谨,不能为负数的值应当由int改为unsinged。


[总结]

1. master-slave模式的数据库服务器结构,在构造时,应当更加严谨,充分考虑slave不能与master及时同步时可能产生的问题。

2. 数据库连接的部分一般封装为固定函数方便调用,所以程序员在编写时为了方便拿来就用。在使用这种函数时应当多考虑一步master-slave可能产生的什么样的影响。

<think>我们正在讨论主从(Master-Slave)架构的操作命令。根据之前的引用,我们知道主从复制在Redis、MySQL和ActiveMQ等系统中都有应用。由于用户没有指定具体系统,我将分别给出Redis和MySQL的详细配置命令,因为这两个是数据库中最常见的。ActiveMQ的配置主要是文件共享方式,命令较少,主要是配置文件的修改。 注意:以下命令基于Linux环境,并假设已经安装好相应的服务。 一、Redis主从复制配置命令 根据引用[1]的描述,Redis主从复制配置非常简单,主要是在从节点(Slave)上执行命令。 1. 主节点(Master配置: Redis主节点默认就是主服务器,通常不需要特殊配置(除非需要设置密码等)。我们假设主节点IP为192.168.0.100,端口6379(默认)。 2. 从节点(Slave配置: 在从节点的redis.conf配置文件中可以设置,也可以在运行时通过命令设置。 - 配置文件方式: 修改从节点的redis.conf,添加: slaveof 192.168.0.100 6379 如果主节点有密码,还需添加: masterauth <master-password> 然后重启从节点的Redis服务。 - 命令行方式(运行时配置): 连接到从节点的Redis命令行,执行: SLAVEOF 192.168.0.100 6379 如果主节点有密码,需要先执行: CONFIG SET masterauth <master-password> 然后执行SLAVEOF命令。 注意:使用命令行方式配置在重启后会失效,所以生产环境建议使用配置文件方式。 3. 查看复制状态: 在主节点或从节点上执行: INFO replication 4. 断开复制(如果需要): 在从节点上执行: SLAVEOF NO ONE 二、MySQL主从复制配置命令 根据引用[2][3],MySQL主从复制包括以下步骤: 1. 主节点配置- 修改主节点的MySQL配置文件(my.cnf或my.ini),在[mysqld]部分添加: server-id=1 log-bin=mysql-bin # 启用二进制日志 binlog-do-db=需要复制的数据库名 # 可选,如果不指定则复制所有数据库 - 重启MySQL服务。 - 登录主节点MySQL,创建用于复制的用户并授权: CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 查看主节点状态,记录File和Position: SHOW MASTER STATUS; 2. 从节点配置- 修改从节点的MySQL配置文件,在[mysqld]部分添加: server-id=2 # 必须唯一,不能主节点相同 - 重启MySQL服务。 - 登录从节点MySQL,执行复制配置命令(使用主节点状态中的File和Position): CHANGE MASTER TO MASTER_HOST='192.168.0.127', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=481; - 启动复制: START SLAVE; - 查看从节点状态: SHOW SLAVE STATUS\G 注意查看Slave_IO_Running和Slave_SQL_Running是否为Yes。 3. 停止复制(如果需要): 在从节点上执行: STOP SLAVE; 4. 重置复制(如果需要重新配置): 在从节点上执行: RESET SLAVE; 三、ActiveMQ主从配置(基于共享存储) 根据引用[4],ActiveMQ的共享存储主从配置主要是修改配置文件,而不是命令行。 1. 配置步骤: - 在多个ActiveMQ实例的配置文件中(activemq.xml),配置共享的持久化目录(如kahadb目录)。 - 将每个实例的<persistenceAdapter>中的目录设置为同一个共享目录(如/opt/kahadb)。 - 确保每个实例的brokerName相同(因为它们是同一个broker的主从)。 - 分别启动各个ActiveMQ实例,其中一个会成为Master(通过获取共享目录的锁),其他为Slave。 由于ActiveMQ的主从配置主要是文件配置,所以没有像数据库那样的命令行复制控制。 总结:主从复制的详细操作命令因系统而异,以上分别介绍了Redis、MySQL和ActiveMQ的配置命令。在实际操作中,请根据具体环境调整IP、端口、目录等参数。 §§相关问题§§ 1. 如何验证主从复制是否配置成功? 2. 主从复制配置失败时如何排查问题? 3. 主从切换(故障转移)有哪些常用方法? </think>### 主从(Master-Slave)架构详细操作命令 以下是Redis、MySQL、ActiveMQ三种典型场景下的主从配置命令及操作步骤,基于引用内容整理: --- #### **一、Redis主从复制命令** **1. 主节点(Master配置** 无需特殊命令,启动即为主节点: ```bash redis-server /path/to/redis.conf ``` **2. 从节点(Slave配置** - **命令行实时配置**: ```bash # 连接从节点Redis redis-cli SLAVEOF <master_ip> <master_port> # 如 SLAVEOF 192.168.0.100 6379 ``` - **配置文件永久生效**: 修改`redis.conf`: ```ini slaveof <master_ip> <master_port> masterauth <password> # 若主节点有密码 ``` **3. 复制流程控制** | 命令 | 作用 | |------|------| | `PSYNC` | SlaveMaster发起同步请求(自动触发)[^1] | | `BGSAVE` | Master生成RDB快照用于全量复制(后台执行)[^1] | | `INFO REPLICATION` | 查看主从复制状态(角色、偏移量等) | --- #### **二、MySQL主从复制命令** **1. 主节点(Master配置** ```sql -- 启用二进制日志 SET GLOBAL server_id = 1; SHOW MASTER STATUS; -- 记录File和Position -- 创建复制账号 CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` **2. 从节点(Slave配置** ```sql -- 指向主节点 CHANGE MASTER TO MASTER_HOST = '192.168.0.127', MASTER_USER = 'repl', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', -- 主节点SHOW MASTER STATUS结果 MASTER_LOG_POS = 481; -- 启动复制 START SLAVE; SHOW SLAVE STATUS\G -- 检查Slave_IO_Running: Yes ``` **3. 常用管理命令** | 场景 | 命令 | |------|------| | 暂停复制 | `STOP SLAVE;` | | 重置复制 | `RESET SLAVE ALL;` | | 跳过错误 | `SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;` | --- #### **三、ActiveMQ主从共享存储配置** **1. 配置文件修改** 修改所有节点的`activemq.xml`,指定共享目录: ```xml <persistenceAdapter> <kahaDB directory="/opt/shared_kahadb"/> <!-- 所有节点使用同一目录 --> </persistenceAdapter> ``` **2. 节点启动** ```bash # 分别启动多个ActiveMQ实例 ./bin/activemq start ``` - **自动选举**:首个锁定共享目录的节点成为Master,其他为Slave[^4] - **故障切换**:Master宕机后,剩余节点自动竞争目录锁,新Master接管 --- ### 关键注意事项 1. **数据一致性** - MySQL/Redis:需确保主从`server_id`唯一(避免冲突)[^2][^3] - ActiveMQ:共享目录需所有节点可读写(如NFS)[^4] 2. **复制监控** - MySQL:`SHOW SLAVE STATUS`中的`Seconds_Behind_Master`字段监测延迟 - Redis:`INFO replication`查看`master_repl_offset``slave_repl_offset`差值 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值