Python实现数据库读写分离:香港VPS主从复制实战
日常数据库操作中,当遇到大量读写请求时,单数据库往往难以应对高并发压力。这时候,数据库读写分离就成了关键——将写操作集中到主库处理,读操作分散到从库执行,既能提升响应速度,也能缓解单库负载。今天我们就结合香港VPS服务器的主从复制,聊聊如何用Python实现数据库读写分离。

香港VPS搭建MySQL主从复制
香港VPS凭借优质网络条件,在数据同步场景中优势明显。主从复制(Master-Slave Replication)是实现读写分离的基础,核心是让主库实时同步数据到从库,形成"一主多从"的架构。以下以MySQL为例,演示在香港VPS上的配置流程。
首先配置主库:修改MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),添加以下内容开启二进制日志(记录数据变更)并设置唯一服务ID:
```
[mysqld]
log-bin=mysql-bin # 开启二进制日志
server-id=1 # 主库唯一标识(建议用IP末段或其他唯一值)
```
保存后重启MySQL服务,接着创建用于主从同步的用户并授权:
```sql
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'YourPassword123'; -- 创建同步用户
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; -- 授予复制权限
FLUSH PRIVILEGES; -- 刷新权限
SHOW MASTER STATUS; -- 记录File和Position值(后续从库使用)
```
执行完SHOW MASTER STATUS后,会看到类似"File: mysql-bin.000001,Position: 154"的输出,这两个值需要记下来。
接下来配置从库:同样修改配置文件,设置不同的服务ID(避免与主库冲突):
```
[mysqld]
server-id=2 # 从库唯一标识(与主库不同即可)
```
重启从库服务后,通过以下命令关联主库:
```sql
CHANGE MASTER TO
MASTER_HOST='主库IP', -- 填写香港VPS主库的公网或内网IP
MASTER_USER='repl_user', -- 前面创建的同步用户
MASTER_PASSWORD='YourPassword123', -- 用户密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主库SHOW MASTER STATUS得到的File值
MASTER_LOG_POS=154; -- 主库SHOW MASTER STATUS得到的Position值
START SLAVE; -- 启动从库复制进程
SHOW SLAVE STATUS\G -- 检查状态
```
若输出中"Slave_IO_Running"和"Slave_SQL_Running"均为"Yes",说明主从复制配置成功。
Python实现读写分离操作
主从复制搭建完成后,接下来用Python实现读写分离。这里选用常用的pymysql库,先通过pip安装:
```bash
pip install pymysql
```
然后编写代码,分别连接主库和从库,将写操作指向主库,读操作指向从库:
```python
import pymysql
# 主库连接配置(香港VPS主库IP)
master_config = {
'host': '主库IP',
'user': '主库用户名',
'password': '主库密码',
'database': '目标数据库',
'charset': 'utf8mb4'
}
# 从库连接配置(香港VPS从库IP)
slave_config = {
'host': '从库IP',
'user': '从库用户名',
'password': '从库密码',
'database': '目标数据库',
'charset': 'utf8mb4'
}
# 初始化连接
master_conn = pymysql.connect(**master_config)
slave_conn = pymysql.connect(**slave_config)
def write_operation(sql):
"""写操作(主库执行)"""
try:
with master_conn.cursor() as cursor:
cursor.execute(sql)
master_conn.commit()
print("写操作执行成功")
except Exception as e:
print(f"写操作失败:{str(e)}")
master_conn.rollback()
def read_operation(sql):
"""读操作(从库执行)"""
try:
with slave_conn.cursor() as cursor:
cursor.execute(sql)
return cursor.fetchall()
except Exception as e:
print(f"读操作失败:{str(e)}")
return None
# 示例:插入数据(写操作)
write_sql = "INSERT INTO user (username) VALUES ('test_user')"
write_operation(write_sql)
# 示例:查询数据(读操作)
read_sql = "SELECT * FROM user"
result = read_operation(read_sql)
print("查询结果:", result)
# 关闭连接
master_conn.close()
slave_conn.close()
```
通过这套方案,香港VPS上的MySQL主从复制能有效分担数据库压力,配合Python的读写分离代码,可显著提升高并发场景下的系统响应能力。实际部署时,建议定期检查主从同步状态,并根据业务需求扩展从库数量,进一步优化读性能。