Mysql主从架构搭建保姆级教程
目录
背景
下载
部署
前置准备
1 关防火墙,清空防火墙策略。
2 三台服务器安装mysql,且版本一致
部署思路
2.1 配置环境变量
2.2 传包
2.3 初始化目录
2.4 分发配置好的mysql源码到集群其他机器上
2.5 集群中其他机器上执行一下初始化配置
3 分别启动mysql服务
3.1 启动第一次初始化数据
3.2 启动mysql服务
3.3 初始化MYSQL
修改密码
开启远程登录
然后使用工具连接即可
3.4 检查UUID
-Slave配置
1 配置节点
1.1 配置f
1.2 创建复制账号
1.3 查看状态
2 配置Slave节点
2.1 配置f
2.2 启动从服务器的复制线程
2.3 问题1:: No
3 测试主从同步
背景
MySQL 主从架构,特别是一主两从的配置,主要是为了提高数据库的可用性、负载均衡和数据安全性。这种架构允许一个主服务器处理所有的写操作,而两个从服务器则用于处理读请求,从而分散读取负载。这不仅增加了系统的处理能力,还通过复制机制增强了数据的可靠性和安全性。
在这种配置下,如果主服务器发生故障,其中一个从服务器可以迅速被提升为新的主服务器,从而确保服务的连续性和数据的完整性。此外,使用两个从服务器还提供了额外的灵活性和冗余,可以在进行维护或升级时无需中断服务。总的来说,一主两从的 MySQL 架构是一种高效、可靠且容错性强的数据库解决方案,适合需要高可用性和高性能的场景。
下载
官网下载 8+ 的mysql,版本没有要求,但是主从mysql的版本要保持一致。
MySQL :: MySQL
下载 64 位(mysql-8.0.33-linux-.28-.tar.gz)
部署 前置准备 1 关防火墙,清空防火墙策略。
$ systemctl stop firewalld
$ iptables -F
2 三台服务器安装mysql,且版本一致 部署思路
172.16.10.113 作为mater节点
172.16.10.112 作为节点
172.16.10.114 作为节点
2.1 配置环境变量
将$ 配置为 /home//
$ vim /etc/profile
# 增加配置
*****************需要增加的配置*****************************
export MYSQL_CLUSTER_HOME=/home/mysqlcluster/mysql8_0_33
**********************************************************
# 刷新环境变量
$ source /etc/profile# 输出检查一下
$ echo $MYSQL_CLUSTER_HOME# 配置mysql工具包软连接
$ ln -s $MYSQL_CLUSTER_HOME/bin/mysql /usr/bin
2.2 传包
# 传包到目录,没有则创建
$ mkdir -p /home/mysqlcluster
# 解压
$ tar -zxvf mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz
# 删除安装包
$ rm -f /home/mysqlcluster/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz# 清理命令
$ rm -rf /home/mysqlcluster/mysql8_0_33
2.3 初始化目录
# 重命名
$ mv /home/mysqlcluster/mysql-8.0.33-linux-glibc2.28-x86_64 /home/mysqlcluster/mysql8_0_33
# 创建 data文件夹,后续用来初始化mysql时存放数据库信息
$ mkdir -p $MYSQL_CLUSTER_HOME/data && \
mkdir -p $MYSQL_CLUSTER_HOME/tmp && \
mkdir -p $MYSQL_CLUSTER_HOME/log # 配置开机自启
$ cp $MYSQL_CLUSTER_HOME/support-files/mysql.server /etc/init.d/mysql# 创建 my.cnf
$ touch /etc/my.cnf
# 编辑配置
$ vim /etc/my.cnf
# 写入下面的my.cnf 配置:# 检查一下是否修改正确
$ cat /etc/my.cnf
修改了端口为 16030:
[client]
port=16030 # 客户端连接的端口号
default-character-set = utf8mb4 # 默认字符集设置为 utf8mb4
socket=/home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # 客户端连接使用的 socket 文件[mysqld_safe]
socket = /home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # mysqld_safe 使用的 socket 文件
nice = 0 # 进程优先级调整参数[mysqld]
port=16030 # MySQL 服务监听的端口号
user=root # MySQL 服务运行的用户
socket=/home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # MySQL 服务使用的 socket 文件
basedir=/home/mysqlcluster/mysql8_0_33 # MySQL 的基础安装目录
datadir=/home/mysqlcluster/mysql8_0_33/data # 数据文件存放目录#collation_server=utf8mb4_general_ci
character_set_server = utf8mb4 # 服务器默认字符集
collation_server = utf8mb4_general_ci # 服务器默认排序规则
# 最大数据包 100mb
max_allowed_packet= 104857600 # 允许的最大数据包大小
tmpdir=/home/mysqlcluster/mysql8_0_33/tmp # 临时文件目录
skip-external-locking # 跳过外部锁定server_id = 113 # 服务器ID,用于复制和日志。建议使用ip后三位innodb_buffer_pool_size = 20G # InnoDB 缓冲池大小
skip_name_resolve = ON # 跳过主机名解析
max_connections = 1000 # 允许的最大连接数
lower_case_table_names=1
max_allowed_packet = 200m # 允许的最大数据包大小bind-address = 0.0.0.0 # 绑定的地址key_buffer_size = 16M # MyISAM 索引缓冲区大小
max_allowed_packet = 16M # 允许的最大数据包大小
thread_stack = 192K # 线程栈大小
thread_cache_size = 8 # 线程缓存大小
myisam-recover-options = BACKUP # MyISAM 恢复选项
#max_connections = 100
#table_open_cache = 64
#thread_concurrency = 10log_error = /home/mysqlcluster/mysql8_0_33/log/error.log # 错误日志文件路径
log_bin = /home/mysqlcluster/mysql8_0_33/log/mysql-bin.log # 二进制日志文件路径
#max_binlog_size = 100M
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' # SQL 模式
mysqlx=0 # 禁用 MySQL X 协议
继续配置 mysql.
# 修改 mysql.server
$ vim $MYSQL_CLUSTER_HOME/support-files/mysql.server
*****************需要增加/修改的配置*****************************
basedir=/home/mysqlcluster/mysql8_0_33
datadir=/home/mysqlcluster/mysql8_0_33/data
**************************************************************# 检查配置 空格键翻页
$ cat $MYSQL_CLUSTER_HOME/support-files/mysql.server | more
至此,配置完成。现在需要把包分发到其他两台集群机器中。
2.4 分发配置好的mysql源码到集群其他机器上
# 执行以下命令,需要配置免密登录以及指定hostname.# 1 分发mysql包
rsync -avr $MYSQL_CLUSTER_HOME hadoop-112:/home/mysqlcluster/ && \
rsync -avr $MYSQL_CLUSTER_HOME hadoop-114:/home/mysqlcluster/# 2 分发/etc/my.cnf
rsync -av /etc/my.cnf hadoop-112:/etc/ && \
rsync -av /etc/my.cnf hadoop-114:/etc/# 3 分发 mysql.server
rsync -av $MYSQL_CLUSTER_HOME/support-files/mysql.server hadoop-112:$MYSQL_CLUSTER_HOME/support-files/ && \
rsync -av $MYSQL_CLUSTER_HOME/support-files/mysql.server hadoop-114:$MYSQL_CLUSTER_HOME/support-files/
2.5 集群中其他机器上执行一下初始化配置
主要是创建文件夹 -----参考2.1
配置环境变量 -----参考2.3
3 分别启动mysql服务
按照如下步骤逐个启动,确保启动成功然后再继续.
启动三台机器的mysql。
我这里的环境是
172.16.10.114 从
172.16.10.112 从
172.16.10.113 主
3.1 启动第一次初始化数据
# 启动mysql
$ $MYSQL_CLUSTER_HOME/bin/mysqld --initialize --user=root --basedir=$MYSQL_CLUSTER_HOME/ --datadir=$MYSQL_CLUSTER_HOME/data/# 查看密码
$ tail -f $MYSQL_CLUSTER_HOME/log/error.log -n 20
复制这里的密码: #&8uR 后面登录要用到。
3.2 启动mysql服务
# 启动
$ $MYSQL_CLUSTER_HOME/support-files/mysql.server start
# 停止
$ $MYSQL_CLUSTER_HOME/support-files/mysql.server stop
# 重启
$ $MYSQL_CLUSTER_HOME/support-files/mysql.server restart
# 查看状态
$ $MYSQL_CLUSTER_HOME/support-files/mysql.server status# 进入日志目录查看启动情况
$ tail -f $MYSQL_CLUSTER_HOME/log/error.log -n 199
启动成功:
3.3 初始化MYSQL 修改密码
# 输出上面记住的密码
$ mysql -uroot -p
-- 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'DQx!wBdV#7';
开启远程登录
-- 依次执行
-- 切换到自带的mysql数据库;修改数据库下user表的信息;更新权限
mysql> USE mysql; UPDATE user SET host='%' WHERE user='root';FLUSH PRIVILEGES;EXIT;
然后使用工具连接即可
172.16.10.113(主)
172.16.10.112(从1)
172.16.10.114(从2)
16030
root DQx!wBdV#7
3.4 检查UUID
mysql 5.6版本后,引入了uuid的概念,各个结构的uuid要保证不一样,可以在MySQL中使用。
可以用mysql登录查询,分别查看、、的uuid,确保不相同。
mysql> show variables like '%server_uuid%';
如果相同,则需要进入 $/data 目录修改,然后重启。
-Slave配置 1 配置节点 1.1 配置f
注意,这里其实在前面的配置中已经做了,这里只是强调一下。主从中每台机器都要改
# 进入 master 节点,这里是 113
$ vim /etc/my.cnf
*****************需要增加/修改的配置*****************************
[mysqld]
server_id = 113 # 服务器ID,用于复制和日志。建议使用ip后三位
log_bin = /home/mysqlcluster/mysql8_0_33/log/mysql-bin.log # 打开binlog并指定二进制日志文件路径
**************************************************************
1.2 创建复制账号
在上创建备份账号,然后授权。允许服务器可以从拷贝日志到slave。
#注意:密码必须符合要求,大小写字母+数字+特殊字符
mysql> create user 'syncuser'@'%' identified with mysql_native_password by 'DQx!wBdV#7';mysql> grant replication slave on *.* to 'syncuser'@'%';mysql> flush privileges;
1.3 查看状态
-- 查看master日志端点以及文件,后面配置从节点需要记录。
mysql> show master status\G;
2 配置Slave节点 2.1 配置f
# 进入 slave 节点,这里是 112 、 114
$ vim /etc/my.cnf# 增加如下配置
[mysqld]
relay_log=/home/mysqlcluster/mysql8_0_33/log/mysql-relay.log #打开Mysql日志,日志格式为二进制
read_only=1 #设置只读权限
log_slave_updates=1 #使得更新的数据写进二进制日志中
修改完成后重启 slave
2.2 启动从服务器的复制线程
首先,登录slave
-- 使用 CHANGE MASTER TO 命令来设置复制
mysql> CHANGE MASTER TO
master_host='172.16.10.113',
master_port=16030,
master_user='syncuser',
master_password='DQx!wBdV#7',
master_log_file='mysql-bin.000004',
master_log_pos=827;-- 启动复制线程
mysql> START SLAVE;-- 检查复制状态
-- 在输出的信息中,
-- Slave_IO_Running 和 Slave_SQL_Running 字段应该都是 Yes。如果不是,需要检查错误信息来分析问题。
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 172.16.10.113Master_User: syncuserMaster_Port: 16030Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 827Relay_Log_File: mysql-relay.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 827Relay_Log_Space: 532Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 113Master_UUID: d5477ae7-925d-11ee-acd8-005056ad1361Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.00 sec)
2.3 问题1:: No
slave主从不一致
参考以下思路解决:
mysql> STOP SLAVE;
-- 跳过错误步数
mysql> SET GLOBAL sql_slave_skip_counter=1;
-- 重启
mysql> START SLAVE;
-- 然后查看同步状态
mysql> SHOW SLAVE STATUS\G;
3 测试主从同步
在节点执行以下sql脚本,然后去从库查看。所有DDL动作均应该是同步的,则搭建成功。
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS test_sync;-- 使用测试数据库
USE test_sync;-- 创建一个测试表
CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT,name VARCHAR(100),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id)
);-- 插入模拟数据
INSERT INTO test_table (name) VALUES ('Item 1');
INSERT INTO test_table (name) VALUES ('Item 2');
INSERT INTO test_table (name) VALUES ('Item 3');-- 查看插入的数据
SELECT * FROM test_table;
至此,mysql主从架构搭建完成。