MySQL主从双机部署方案
本文阅读预计需要: 4 minutes
需求和实现逻辑
- 在A,B 2台机器上配置 MySQL主从同步
- 在A,B 2台机器同时部署网盘应用, 并且站点目录相同( A站点目录通过NFS共享挂载到B)
一 环境准备
1. 节点规划
- 主节点(Master): IP 192.168.xx.10(示例,需替换为实际IP)
- 备节点(Backup): IP 192.168.xx.11(示例)
- 系统要求: 确保两台服务器时间同步(chronyd服务),防火墙开放相关端口包括
80/443/3306/6379
# 若无法联网更新时间,可配置局域网时间同步
yum install chrony -y
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload
# 服务端打开 /etc/chrony.conf 文件,添加或修改以下内容
# 允许局域网内的客户端访问
allow 192.168.0.0/16
# 本地时间源
local stratum 10
# 记录系统时钟的漂移
driftfile /var/lib/chrony/drift
# 启用内核同步
rtcsync
# 客户端打开 /etc/chrony.conf 文件,添加或修改以下内容
# 指定时间服务器的 IP 地址
server 192.168.1.1 iburst
# 记录系统时钟的漂移
driftfile /var/lib/chrony/drift
# 启用内核同步
rtcsync
# 验证
systemctl restart chronyd
chronyc sources -v # 应显示服务端IP为同步源
timedatectl # 确认已同步
2. 修改主机名(可选)
# 主节点
hostnamectl set-hostname master
# 备节点
hostnamectl set-hostname backup
二 NFS共享目录挂载
NFS服务端
# 关闭selinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sestatus # 确认状态
yum install nfs-utils rpcbind
# cat /etc/exports # 假设/var/www/html 是站点目录
/var/www/html 192.168.xx.1/24(rw,async,no_subtree_check,no_root_squash)
exportfs -rv
systemctl enable rpcbind nfs # or nfs-server
systemctl restart rpcbind nfs
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
NFS客户端
yum install nfs-utils rpcbind
mount -t nfs -o nolock,rw 192.168.xx.10:/var/www/html /var/www/html
#nfsstat 命令可以显示有用的 NFS 信息。例如,以下命令显示 NFS 客户端当前挂载的内容
nfsstat -m
/var/www/html from 192.168.xx.10:/var/www/html
Flags: rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.xx.11,local_lock=none,addr=192.168.xx.11
# 开机自动挂载
echo "192.168.xx.10:/var/www/html /var/www/html nfs nolock,rw" >> /etc/fstab
umount /var/www/html
mount -a
三 MySQL主从同步
提示:
- 同步之前确保数据库状态一致,若数据库已创建,就需要同步到到从库。
-- 主库操作
mysqldump kodbox -u root -p"xxx" > backup_db.sql
-- 从库操作
mysql -u root -p"xxx" kodbox < backup_db.sql
- 主库配置文件
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
- 从库配置文件
[mysqld]
server-id = 2
relay_log = relay-bin
read_only = 1
1. 主库操作:创建复制账号
-- 创建用于复制的用户
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'repl_password';
FLUSH PRIVILEGES;
-- 查看主库状态(记录 File 和 Position)
SHOW MASTER STATUS;
-- 输出示例:
-- +------------------+----------+--------------+------------------+
-- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
-- +------------------+----------+--------------+------------------+
-- | mysql-bin.000003 | 785 | | |
-- +------------------+----------+--------------+------------------+
2. 从库操作:配置主从连接
-- 设置主库信息(替换 MASTER_HOST 为 master 的IP)
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_password',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003', -- 替换为 SHOW MASTER STATUS 中的 File
MASTER_LOG_POS=785; -- 替换为 SHOW MASTER STATUS 中的 Position
-- 启动从库复制
START SLAVE;
-- 检查从库状态(Slave_IO_Running 和 Slave_SQL_Running 应为 Yes)
SHOW SLAVE STATUS\G
-- 如果需要重置
-- stop slave;
-- reset slave;
3. 验证主从同步
- 在主库创建测试数据,在从库查询数据.
- 故障排查命令
# 主库确认二进制日志正常
mysql -uroot -pmaster_root_password -e "SHOW BINARY LOGS;"
# 从库查看复制错误
mysql -uroot -pslave_root_password -e "SHOW SLAVE STATUS\G" | grep "Last_IO_Error\|Last_SQL_Error"
4. 配置到kodbox
注意:
- 数据库主从
- 指定redis服务器
// 在站点下 config/setting_user.php 文件后新增以下配置
// mysql集群
$config['database']=array(
'DB_DEPLOY_TYPE'=>1, //设置分布式数据库支持
'DB_RW_SEPARATE'=>true, //分布式数据库的读写是否分离
'DB_TYPE'=>'mysqli', //数据库类型
'DB_HOST'=>'192.168.xx.10,192.168.xx.11',//数据库服务器地址
'DB_NAME'=>'kodbox', //数据库名称
'DB_USER'=>'kodbox,kodbox',//数据库用户名
'DB_PWD'=>'xxx', //数据库密码
'DB_PORT'=>'3306,3306', //数据库端口
'DB_PREFIX'=>'', //数据表前缀
'DB_SLAVE_NO' => '',
//'DB_MASTER_NUM'=>2
);
$config['cache']['sessionType'] = 'redis';
$config['cache']['cacheType'] = 'redis';
$config['cache']['redis']['host'] = '192.168.xx.10';
$config['cache']['redis']['port'] = '6379';
$config['cache']['redis']['auth'] = 'xxx';