赞
踩
目录
MySQL 主从架构,特别是一主两从的配置,主要是为了提高数据库的可用性、负载均衡和数据安全性。这种架构允许一个主服务器处理所有的写操作,而两个从服务器则用于处理读请求,从而分散读取负载。这不仅增加了系统的处理能力,还通过复制机制增强了数据的可靠性和安全性。
在这种配置下,如果主服务器发生故障,其中一个从服务器可以迅速被提升为新的主服务器,从而确保服务的连续性和数据的完整性。此外,使用两个从服务器还提供了额外的灵活性和冗余,可以在进行维护或升级时无需中断服务。总的来说,一主两从的 MySQL 架构是一种高效、可靠且容错性强的数据库解决方案,适合需要高可用性和高性能的场景。
官网下载 8+ 的mysql,版本没有要求,但是主从mysql的版本要保持一致。
MySQL :: Download MySQL Community Server
下载 64 位(mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz)
- $ systemctl stop firewalld
- $ iptables -F
172.16.10.113 作为mater节点
172.16.10.112 作为salve1节点
172.16.10.114 作为salve2节点
将$MYSQL_CLUSTER_HOME 配置为 /home/mysqlcluster/mysql8_0_33
- $ 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
- # 传包到目录,没有则创建
- $ 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
- # 重命名
- $ 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 = 10
-
- log_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.server
- # 修改 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
至此,配置完成。现在需要把包分发到其他两台集群机器中。
- # 执行以下命令,需要配置免密登录以及指定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.1
配置环境变量 -----参考2.3
按照如下步骤逐个启动,确保启动成功然后再继续.
启动三台机器的mysql。
我这里的环境是
172.16.10.114 从
172.16.10.112 从
172.16.10.113 主
- # 启动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
复制这里的密码: hqfqTiu#&8uR 后面登录要用到。
- # 启动
- $ $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
启动成功:
- # 输出上面记住的密码
- $ 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
mysql 5.6版本后,引入了uuid的概念,各个结构的uuid要保证不一样,可以在MySQL中使用。
可以用mysql登录查询,分别查看master、slave1、slave2的uuid,确保不相同。
mysql> show variables like '%server_uuid%';
如果相同,则需要进入 $MYSQL_CLUSTER_HOME/data 目录修改,然后重启。
注意,这里其实在前面的配置中已经做了,这里只是强调一下。主从中每台机器都要改
- # 进入 master 节点,这里是 113
- $ vim /etc/my.cnf
- *****************需要增加/修改的配置*****************************
- [mysqld]
- server_id = 113 # 服务器ID,用于复制和日志。建议使用ip后三位
- log_bin = /home/mysqlcluster/mysql8_0_33/log/mysql-bin.log # 打开binlog并指定二进制日志文件路径
- **************************************************************
在master上创建备份账号,然后授权。允许服务器可以从master拷贝日志到slave。
- #注意:密码必须符合要求,大小写字母+数字+特殊字符
- mysql> create user 'syncuser'@'%' identified with mysql_native_password by 'DQx!wBdV#7';
-
- mysql> grant replication slave on *.* to 'syncuser'@'%';
-
- mysql> flush privileges;
- -- 查看master日志端点以及文件,后面配置从节点需要记录。
- mysql> show master status\G;
- # 进入 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
首先,登录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 event
- Master_Host: 172.16.10.113
- Master_User: syncuser
- Master_Port: 16030
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000004
- Read_Master_Log_Pos: 827
- Relay_Log_File: mysql-relay.000002
- Relay_Log_Pos: 326
- Relay_Master_Log_File: mysql-bin.000004
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 827
- Relay_Log_Space: 532
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_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: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 113
- Master_UUID: d5477ae7-925d-11ee-acd8-005056ad1361
- Master_Info_File: mysql.slave_master_info
- SQL_Delay: 0
- SQL_Remaining_Delay: NULL
- Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
- Master_Retry_Count: 86400
- Master_Bind:
- Last_IO_Error_Timestamp:
- Last_SQL_Error_Timestamp:
- Master_SSL_Crl:
- Master_SSL_Crlpath:
- Retrieved_Gtid_Set:
- Executed_Gtid_Set:
- Auto_Position: 0
- Replicate_Rewrite_DB:
- Channel_Name:
- Master_TLS_Version:
- Master_public_key_path:
- Get_master_public_key: 0
- Network_Namespace:
- 1 row in set, 1 warning (0.00 sec)
slave主从不一致
参考以下思路解决:
- mysql> STOP SLAVE;
- -- 跳过错误步数
- mysql> SET GLOBAL sql_slave_skip_counter=1;
- -- 重启
- mysql> START SLAVE;
- -- 然后查看同步状态
- mysql> SHOW SLAVE STATUS\G;
在master节点执行以下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主从架构搭建完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。