当前位置:   article > 正文

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

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

Master-Slave配置

1 配置Master节点

1.1 配置my.cnf

1.2 创建master复制账号

1.3 查看master状态

2 配置Slave节点

2.1 配置my.cnf

2.2 启动从服务器的复制线程

2.3 问题1:Slave_SQL_Running: No

3 测试主从同步


背景

        MySQL 主从架构,特别是一主两从的配置,主要是为了提高数据库的可用性、负载均衡和数据安全性。这种架构允许一个主服务器处理所有的写操作,而两个从服务器则用于处理读请求,从而分散读取负载。这不仅增加了系统的处理能力,还通过复制机制增强了数据的可靠性和安全性。

        在这种配置下,如果主服务器发生故障,其中一个从服务器可以迅速被提升为新的主服务器,从而确保服务的连续性和数据的完整性。此外,使用两个从服务器还提供了额外的灵活性和冗余,可以在进行维护或升级时无需中断服务。总的来说,一主两从的 MySQL 架构是一种高效、可靠且容错性强的数据库解决方案,适合需要高可用性和高性能的场景。

下载

        官网下载 8+ 的mysql,版本没有要求,但是主从mysql的版本要保持一致。

MySQL :: Download MySQL Community Server

下载 64 位(mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz)

部署

前置准备

1 关防火墙,清空防火墙策略。

  1. $ systemctl stop firewalld
  2. $ iptables -F

2 三台服务器安装mysql,且版本一致

部署思路

172.16.10.113 作为mater节点

172.16.10.112 作为salve1节点

172.16.10.114 作为salve2节点

2.1 配置环境变量

将$MYSQL_CLUSTER_HOME 配置为 /home/mysqlcluster/mysql8_0_33

  1. $ vim /etc/profile
  2. # 增加配置
  3. *****************需要增加的配置*****************************
  4. export MYSQL_CLUSTER_HOME=/home/mysqlcluster/mysql8_0_33
  5. **********************************************************
  6. # 刷新环境变量
  7. $ source /etc/profile
  8. # 输出检查一下
  9. $ echo $MYSQL_CLUSTER_HOME
  10. # 配置mysql工具包软连接
  11. $ ln -s $MYSQL_CLUSTER_HOME/bin/mysql /usr/bin
2.2 传包
  1. # 传包到目录,没有则创建
  2. $ mkdir -p /home/mysqlcluster
  3. # 解压
  4. $ tar -zxvf mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz
  5. # 删除安装包
  6. $ rm -f /home/mysqlcluster/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz
  7. # 清理命令
  8. $ rm -rf /home/mysqlcluster/mysql8_0_33
2.3 初始化目录
  1. # 重命名
  2. $ mv /home/mysqlcluster/mysql-8.0.33-linux-glibc2.28-x86_64 /home/mysqlcluster/mysql8_0_33
  3. # 创建 data文件夹,后续用来初始化mysql时存放数据库信息
  4. $ mkdir -p $MYSQL_CLUSTER_HOME/data && \
  5. mkdir -p $MYSQL_CLUSTER_HOME/tmp && \
  6. mkdir -p $MYSQL_CLUSTER_HOME/log
  7. # 配置开机自启
  8. $ cp $MYSQL_CLUSTER_HOME/support-files/mysql.server /etc/init.d/mysql
  9. # 创建 my.cnf
  10. $ touch /etc/my.cnf
  11. # 编辑配置
  12. $ vim /etc/my.cnf
  13. # 写入下面的my.cnf 配置:
  14. # 检查一下是否修改正确
  15. $ cat /etc/my.cnf

修改了端口为 16030:

  1. [client]
  2. port=16030 # 客户端连接的端口号
  3. default-character-set = utf8mb4 # 默认字符集设置为 utf8mb4
  4. socket=/home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # 客户端连接使用的 socket 文件
  5. [mysqld_safe]
  6. socket = /home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # mysqld_safe 使用的 socket 文件
  7. nice = 0 # 进程优先级调整参数
  8. [mysqld]
  9. port=16030 # MySQL 服务监听的端口号
  10. user=root # MySQL 服务运行的用户
  11. socket=/home/mysqlcluster/mysql8_0_33/tmp/mysql.sock # MySQL 服务使用的 socket 文件
  12. basedir=/home/mysqlcluster/mysql8_0_33 # MySQL 的基础安装目录
  13. datadir=/home/mysqlcluster/mysql8_0_33/data # 数据文件存放目录
  14. #collation_server=utf8mb4_general_ci
  15. character_set_server = utf8mb4 # 服务器默认字符集
  16. collation_server = utf8mb4_general_ci # 服务器默认排序规则
  17. # 最大数据包 100mb
  18. max_allowed_packet= 104857600 # 允许的最大数据包大小
  19. tmpdir=/home/mysqlcluster/mysql8_0_33/tmp # 临时文件目录
  20. skip-external-locking # 跳过外部锁定
  21. server_id = 113 # 服务器ID,用于复制和日志。建议使用ip后三位
  22. innodb_buffer_pool_size = 20G # InnoDB 缓冲池大小
  23. skip_name_resolve = ON # 跳过主机名解析
  24. max_connections = 1000 # 允许的最大连接数
  25. lower_case_table_names=1
  26. max_allowed_packet = 200m # 允许的最大数据包大小
  27. bind-address = 0.0.0.0 # 绑定的地址
  28. key_buffer_size = 16M # MyISAM 索引缓冲区大小
  29. max_allowed_packet = 16M # 允许的最大数据包大小
  30. thread_stack = 192K # 线程栈大小
  31. thread_cache_size = 8 # 线程缓存大小
  32. myisam-recover-options = BACKUP # MyISAM 恢复选项
  33. #max_connections = 100
  34. #table_open_cache = 64
  35. #thread_concurrency = 10
  36. log_error = /home/mysqlcluster/mysql8_0_33/log/error.log # 错误日志文件路径
  37. log_bin = /home/mysqlcluster/mysql8_0_33/log/mysql-bin.log # 二进制日志文件路径
  38. #max_binlog_size = 100M
  39. sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' # SQL 模式
  40. mysqlx=0 # 禁用 MySQL X 协议

继续配置 mysql.server

  1. # 修改 mysql.server
  2. $ vim $MYSQL_CLUSTER_HOME/support-files/mysql.server
  3. *****************需要增加/修改的配置*****************************
  4. basedir=/home/mysqlcluster/mysql8_0_33
  5. datadir=/home/mysqlcluster/mysql8_0_33/data
  6. **************************************************************
  7. # 检查配置 空格键翻页
  8. $ cat $MYSQL_CLUSTER_HOME/support-files/mysql.server | more

至此,配置完成。现在需要把包分发到其他两台集群机器中。

2.4 分发配置好的mysql源码到集群其他机器上
  1. # 执行以下命令,需要配置免密登录以及指定hostname.
  2. # 1 分发mysql包
  3. rsync -avr $MYSQL_CLUSTER_HOME hadoop-112:/home/mysqlcluster/ && \
  4. rsync -avr $MYSQL_CLUSTER_HOME hadoop-114:/home/mysqlcluster/
  5. # 2 分发/etc/my.cnf
  6. rsync -av /etc/my.cnf hadoop-112:/etc/ && \
  7. rsync -av /etc/my.cnf hadoop-114:/etc/
  8. # 3 分发 mysql.server
  9. rsync -av $MYSQL_CLUSTER_HOME/support-files/mysql.server hadoop-112:$MYSQL_CLUSTER_HOME/support-files/ && \
  10. 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 启动第一次初始化数据
  1. # 启动mysql
  2. $ $MYSQL_CLUSTER_HOME/bin/mysqld --initialize --user=root --basedir=$MYSQL_CLUSTER_HOME/ --datadir=$MYSQL_CLUSTER_HOME/data/
  3. # 查看密码
  4. $ tail -f $MYSQL_CLUSTER_HOME/log/error.log -n 20

复制这里的密码: hqfqTiu#&8uR 后面登录要用到。

3.2 启动mysql服务
  1. # 启动
  2. $ $MYSQL_CLUSTER_HOME/support-files/mysql.server start
  3. # 停止
  4. $ $MYSQL_CLUSTER_HOME/support-files/mysql.server stop
  5. # 重启
  6. $ $MYSQL_CLUSTER_HOME/support-files/mysql.server restart
  7. # 查看状态
  8. $ $MYSQL_CLUSTER_HOME/support-files/mysql.server status
  9. # 进入日志目录查看启动情况
  10. $ tail -f $MYSQL_CLUSTER_HOME/log/error.log -n 199

启动成功:

3.3 初始化MYSQL
修改密码
  1. # 输出上面记住的密码
  2. $ mysql -uroot -p
  1. -- 修改密码
  2. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'DQx!wBdV#7';

开启远程登录
  1. -- 依次执行
  2. -- 切换到自带的mysql数据库;修改数据库下user表的信息;更新权限
  3. 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登录查询,分别查看master、slave1、slave2的uuid,确保不相同。

mysql> show variables like '%server_uuid%';

如果相同,则需要进入 $MYSQL_CLUSTER_HOME/data 目录修改,然后重启。

Master-Slave配置

1 配置Master节点

1.1 配置my.cnf

注意,这里其实在前面的配置中已经做了,这里只是强调一下。主从中每台机器都要改

  1. # 进入 master 节点,这里是 113
  2. $ vim /etc/my.cnf
  3. *****************需要增加/修改的配置*****************************
  4. [mysqld]
  5. server_id = 113 # 服务器ID,用于复制和日志。建议使用ip后三位
  6. log_bin = /home/mysqlcluster/mysql8_0_33/log/mysql-bin.log # 打开binlog并指定二进制日志文件路径
  7. **************************************************************
1.2 创建master复制账号

在master上创建备份账号,然后授权。允许服务器可以从master拷贝日志到slave。

  1. #注意:密码必须符合要求,大小写字母+数字+特殊字符
  2. mysql> create user 'syncuser'@'%' identified with mysql_native_password by 'DQx!wBdV#7';
  3. mysql> grant replication slave on *.* to 'syncuser'@'%';
  4. mysql> flush privileges;
1.3 查看master状态
  1. -- 查看master日志端点以及文件,后面配置从节点需要记录。
  2. mysql> show master status\G;

2 配置Slave节点

2.1 配置my.cnf
  1. # 进入 slave 节点,这里是 112 、 114
  2. $ vim /etc/my.cnf
  3. # 增加如下配置
  4. [mysqld]
  5. relay_log=/home/mysqlcluster/mysql8_0_33/log/mysql-relay.log #打开Mysql日志,日志格式为二进制
  6. read_only=1 #设置只读权限
  7. log_slave_updates=1 #使得更新的数据写进二进制日志中

修改完成后重启 slave

2.2 启动从服务器的复制线程

首先,登录slave

  1. -- 使用 CHANGE MASTER TO 命令来设置复制
  2. mysql> CHANGE MASTER TO
  3. master_host='172.16.10.113',
  4. master_port=16030,
  5. master_user='syncuser',
  6. master_password='DQx!wBdV#7',
  7. master_log_file='mysql-bin.000004',
  8. master_log_pos=827;
  9. -- 启动复制线程
  10. mysql> START SLAVE;
  11. -- 检查复制状态
  12. -- 在输出的信息中,
  13. -- Slave_IO_Running 和 Slave_SQL_Running 字段应该都是 Yes。如果不是,需要检查错误信息来分析问题。
  14. mysql> SHOW SLAVE STATUS\G;
  15. *************************** 1. row ***************************
  16. Slave_IO_State: Waiting for source to send event
  17. Master_Host: 172.16.10.113
  18. Master_User: syncuser
  19. Master_Port: 16030
  20. Connect_Retry: 60
  21. Master_Log_File: mysql-bin.000004
  22. Read_Master_Log_Pos: 827
  23. Relay_Log_File: mysql-relay.000002
  24. Relay_Log_Pos: 326
  25. Relay_Master_Log_File: mysql-bin.000004
  26. Slave_IO_Running: Yes
  27. Slave_SQL_Running: Yes
  28. Replicate_Do_DB:
  29. Replicate_Ignore_DB:
  30. Replicate_Do_Table:
  31. Replicate_Ignore_Table:
  32. Replicate_Wild_Do_Table:
  33. Replicate_Wild_Ignore_Table:
  34. Last_Errno: 0
  35. Last_Error:
  36. Skip_Counter: 0
  37. Exec_Master_Log_Pos: 827
  38. Relay_Log_Space: 532
  39. Until_Condition: None
  40. Until_Log_File:
  41. Until_Log_Pos: 0
  42. Master_SSL_Allowed: No
  43. Master_SSL_CA_File:
  44. Master_SSL_CA_Path:
  45. Master_SSL_Cert:
  46. Master_SSL_Cipher:
  47. Master_SSL_Key:
  48. Seconds_Behind_Master: 0
  49. Master_SSL_Verify_Server_Cert: No
  50. Last_IO_Errno: 0
  51. Last_IO_Error:
  52. Last_SQL_Errno: 0
  53. Last_SQL_Error:
  54. Replicate_Ignore_Server_Ids:
  55. Master_Server_Id: 113
  56. Master_UUID: d5477ae7-925d-11ee-acd8-005056ad1361
  57. Master_Info_File: mysql.slave_master_info
  58. SQL_Delay: 0
  59. SQL_Remaining_Delay: NULL
  60. Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  61. Master_Retry_Count: 86400
  62. Master_Bind:
  63. Last_IO_Error_Timestamp:
  64. Last_SQL_Error_Timestamp:
  65. Master_SSL_Crl:
  66. Master_SSL_Crlpath:
  67. Retrieved_Gtid_Set:
  68. Executed_Gtid_Set:
  69. Auto_Position: 0
  70. Replicate_Rewrite_DB:
  71. Channel_Name:
  72. Master_TLS_Version:
  73. Master_public_key_path:
  74. Get_master_public_key: 0
  75. Network_Namespace:
  76. 1 row in set, 1 warning (0.00 sec)
2.3 问题1:Slave_SQL_Running: No

slave主从不一致

参考以下思路解决:

  1. mysql> STOP SLAVE;
  2. -- 跳过错误步数
  3. mysql> SET GLOBAL sql_slave_skip_counter=1;
  4. -- 重启
  5. mysql> START SLAVE;
  6. -- 然后查看同步状态
  7. mysql> SHOW SLAVE STATUS\G;

3 测试主从同步

在master节点执行以下sql脚本,然后去从库查看。所有DDL动作均应该是同步的,则搭建成功。

  1. -- 创建测试数据库
  2. CREATE DATABASE IF NOT EXISTS test_sync;
  3. -- 使用测试数据库
  4. USE test_sync;
  5. -- 创建一个测试表
  6. CREATE TABLE IF NOT EXISTS test_table (
  7. id INT AUTO_INCREMENT,
  8. name VARCHAR(100),
  9. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  10. PRIMARY KEY (id)
  11. );
  12. -- 插入模拟数据
  13. INSERT INTO test_table (name) VALUES ('Item 1');
  14. INSERT INTO test_table (name) VALUES ('Item 2');
  15. INSERT INTO test_table (name) VALUES ('Item 3');
  16. -- 查看插入的数据
  17. SELECT * FROM test_table;

至此,mysql主从架构搭建完成。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/944624
推荐阅读
相关标签
  

闽ICP备14008679号