运维打铁: 数据库主从复制与读写分离配置

文章目录

    • 思维导图
    • 一、数据库主从复制
      • 原理
      • 配置步骤
        • 1. 主库配置
        • 2. 从库配置
        • 3. 验证配置
    • 二、数据库读写分离
      • 原理
      • 配置方法
        • 1. 中间件实现
        • 2. 应用层实现
    • 总结

思维导图

数据库主从复制与读写分离配置
数据库主从复制
数据库读写分离
原理
配置步骤
主库配置
从库配置
验证配置
原理
配置方法
中间件实现
应用层实现

一、数据库主从复制

原理

数据库主从复制是一种将主数据库的数据复制到一个或多个从数据库的技术。主数据库负责处理写操作,从数据库负责处理读操作。当主数据库的数据发生变化时,会将这些变化记录在二进制日志(Binary Log)中,从数据库通过读取主数据库的二进制日志,将这些变化应用到自己的数据中,从而实现数据的同步。

配置步骤

1. 主库配置

以 MySQL 为例,编辑主库的配置文件 my.cnf

[mysqld]
# 开启二进制日志
log-bin=mysql-bin
# 服务器唯一 ID,范围 1 - 2^32 - 1
server-id=1

重启 MySQL 服务:

sudo systemctl restart mysql

创建用于复制的用户并授予权限:

CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

查看主库状态:

SHOW MASTER STATUS;

记录下 FilePosition 的值,后续从库配置会用到。

2. 从库配置

编辑从库的配置文件 my.cnf

[mysqld]
# 服务器唯一 ID,范围 1 - 2^32 - 1,不能与主库重复
server-id=2

重启 MySQL 服务:

sudo systemctl restart mysql

配置从库连接主库:

CHANGE MASTER TO
    MASTER_HOST='主库 IP 地址',
    MASTER_USER='repl_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='主库 SHOW MASTER STATUS 中的 File 值',
    MASTER_LOG_POS=主库 SHOW MASTER STATUS 中的 Position 值;

启动从库复制:

START SLAVE;
3. 验证配置

查看从库状态:

SHOW SLAVE STATUS\G

确保 Slave_IO_RunningSlave_SQL_Running 都为 Yes,表示复制配置成功。

二、数据库读写分离

原理

数据库读写分离是将数据库的读操作和写操作分离到不同的数据库实例上,主数据库负责处理写操作,从数据库负责处理读操作。这样可以提高数据库的并发处理能力和性能,减轻主数据库的压力。

配置方法

1. 中间件实现

以 MySQL Proxy 为例,安装 MySQL Proxy:

sudo apt-get install mysql-proxy

编写 Lua 脚本 rw_split.lua

function read_query(packet)
    if string.find(string.lower(packet.query), "^select", 1) then
        -- 读操作转发到从库
        mysqlproxy.connection.server = {host = "从库 IP 地址", port = 3306}
    else
        -- 写操作转发到主库
        mysqlproxy.connection.server = {host = "主库 IP 地址", port = 3306}
    end
    return packet
end

启动 MySQL Proxy:

mysql-proxy --proxy-backend-addresses=主库 IP 地址:3306 --proxy-read-only-backend-addresses=从库 IP 地址:3306 --proxy-lua-script=rw_split.lua
2. 应用层实现

在应用程序中根据操作类型选择连接主数据库或从数据库。以 Python 为例:

import mysql.connector

# 主库连接
master_conn = mysql.connector.connect(
    host="主库 IP 地址",
    user="root",
    password="password",
    database="test"
)
master_cursor = master_conn.cursor()

# 从库连接
slave_conn = mysql.connector.connect(
    host="从库 IP 地址",
    user="root",
    password="password",
    database="test"
)
slave_cursor = slave_conn.cursor()

# 写操作
def write_data():
    sql = "INSERT INTO users (name) VALUES ('John')"
    master_cursor.execute(sql)
    master_conn.commit()

# 读操作
def read_data():
    sql = "SELECT * FROM users"
    slave_cursor.execute(sql)
    results = slave_cursor.fetchall()
    for row in results:
        print(row)

write_data()
read_data()

总结

数据库主从复制和读写分离是提高数据库性能和可用性的重要技术。主从复制可以实现数据的同步和备份,读写分离可以将读操作和写操作分离到不同的数据库实例上,提高数据库的并发处理能力。在实际应用中,可以根据业务需求选择合适的配置方法,如中间件实现或应用层实现。同时,需要注意主从复制的延迟问题和读写分离的负载均衡问题,确保系统的稳定性和可靠性。

你可能感兴趣的:(运维打铁,原力计划,运维,数据库,adb)