数据库主从复制是一种将主数据库的数据复制到一个或多个从数据库的技术。主数据库负责处理写操作,从数据库负责处理读操作。当主数据库的数据发生变化时,会将这些变化记录在二进制日志(Binary Log)中,从数据库通过读取主数据库的二进制日志,将这些变化应用到自己的数据中,从而实现数据的同步。
以 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;
记录下 File
和 Position
的值,后续从库配置会用到。
编辑从库的配置文件 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;
查看从库状态:
SHOW SLAVE STATUS\G
确保 Slave_IO_Running
和 Slave_SQL_Running
都为 Yes
,表示复制配置成功。
数据库读写分离是将数据库的读操作和写操作分离到不同的数据库实例上,主数据库负责处理写操作,从数据库负责处理读操作。这样可以提高数据库的并发处理能力和性能,减轻主数据库的压力。
以 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
在应用程序中根据操作类型选择连接主数据库或从数据库。以 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()
数据库主从复制和读写分离是提高数据库性能和可用性的重要技术。主从复制可以实现数据的同步和备份,读写分离可以将读操作和写操作分离到不同的数据库实例上,提高数据库的并发处理能力。在实际应用中,可以根据业务需求选择合适的配置方法,如中间件实现或应用层实现。同时,需要注意主从复制的延迟问题和读写分离的负载均衡问题,确保系统的稳定性和可靠性。