首页 >> 大全

Mysql主从架构搭建保姆级教程

2023-12-07 大全 26 作者:考证青年

目录

背景

下载

部署

前置准备

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一台服务器主从_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 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主从架构搭建完成。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了