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# 默认字符集设置为 utf8mb4socket=/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_cicharacter_set_server = utf8mb4# 服务器默认字符集collation_server = utf8mb4_general_ci# 服务器默认排序规则# 最大数据包 100mbmax_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=1max_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= 100Msql_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_33datadir=/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.cnfrsync -av /etc/my.cnf hadoop-112:/etc/ && \rsync -av /etc/my.cnf hadoop-114:/etc/# 3 分发 mysql.serverrsync -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主从架构搭建保姆级教程

文章插图
-- 修改密码 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 TOmaster_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: 0Master_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主从架构搭建保姆级教程】至此,mysql主从架构搭建完成 。