需求 三台服务器上搭建MySQL一主两从主从复制配置
目录
- 安装环境
- 准备好安装包
- 复制至安装环境中
- 系统配置
- 配置/etc/hosts
- 关闭防火墙
- 禁掉Selinux
- 修改limits.conf 文件
- 创建mysql用户
- 创建安装目录
- 卸载系统自带的mariadb
- 解压安装文件
- 配置mysql环境变量
- 配置my.cnf
- 初始化mysql
- 主从节点都启动mysql服务
- 修改root密码
- 主从配置
- 2个从节点配置复制通道(db2/db3)
- 从节点启动复制进程并检查复制状态
- 从节点开启super_read_only (slave只读)
- 主节点创建test库(db1)
- 测试主从切换
- 重新将主节点切成db1
安装环境
实际中是三台实体机上分别部署,这里为了演示截图,采用虚拟机中部署了三个Linux环境,网络设置为桥接模式
准备好安装包
https://downloads.mysql.com/archives/community/ 中选择5.7.32-el7-x86_64.tar.gz
复制至安装环境中
如果是内网环境没有外网yum,可以通过powerShell 中scp指令 先放好压缩包
代码语言:javascript复制scp localFile root@192.168.0.106:/usr/
系统配置
配置/etc/hosts
代码语言:javascript复制vi /etc/hosts
192.168.253.100 db1
192.168.253.101 db2
192.168.253.102 db3
//换成自己对应的各个ip
关闭防火墙
代码语言:javascript复制systemctl stop firewalld #停止firewall
systemctl disable firewalld #禁止firewall开机启动
禁掉Selinux
代码语言:javascript复制setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
修改limits.conf 文件
代码语言:javascript复制vi /etc/security/limits.conf
mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
创建mysql用户
代码语言:javascript复制useradd mysql
passwd mysql #密码自行配置,这里用的 password
创建安装目录
代码语言:javascript复制mkdir -p /data/{log,data,tmp,binlog,relaylog}
卸载系统自带的mariadb
代码语言:javascript复制rpm -qa|grep mariadb
rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps
解压安装文件
代码语言:javascript复制tar -xzvf /root/mysql-5.7.32-el7-x86_64.tar.gz -C /
mv /mysql-5.7.32-el7-x86_64 /mysql
chown -R mysql:mysql /mysql /data #递归改变文件用户所有权
配置mysql环境变量
代码语言:javascript复制cp /mysql/support-files/mysql.server /etc/init.d/mysqld
lfconfig
echo "PATH=$PATH:/mysql/bin" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
chkconfig mysqld on
配置my.cnf
代码语言:javascript复制vi /etc/my.cnf
#(master和slave只有server_id不同)
代码语言:javascript复制[client]
socket=/mysql/mysql.sock
[mysqld]
port=3306
user=mysql
basedir=/mysql #mysql路径
socket=/mysql/mysql.sock
#加载半同步复制主备插件
plugin-load-add=semisync_master.so
plugin-load-add=semisync_slave.so
symbolic-links=0
log-error=/data/log/mysqld.log
slow_query_log_file=/data/log/slow.log
slow_query_log=1
long_query_time=0.3
#server_id三台分别是1,2,3
server_id=1
#开启gtid模式
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=1
binlog_checksum=NONE
log_slave_updates=ON
log_bin=/data/binlog/binlog
relay_log=/data/relaylog/relaylog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
datadir=/data/data
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1
slave_parallel_workers =4
innodb_file_per_table
sync_binlog = 1
binlog-group-commit-sync-delay=20
binlog_group_commit_sync_no_delay_count=5
innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
innodb_io_capacity = 5000
innodb_io_capacity_max=15000
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 200
innodb_spin_wait_delay = 6
innodb_status_file = 1
innodb_purge_threads=4
innodb_undo_log_truncate=1
innodb_max_undo_log_size=4G
innodb_use_native_aio = 1
innodb_autoinc_lock_mode = 2
log_slow_admin_statements=1
expire_logs_days=7
character-set-server=utf8mb4
collation-server= utf8mb4_bin
skip-name-resolve
lower_case_table_names
skip-external-locking
max_allowed_packet = 1024M
table_open_cache = 4000
table_open_cache_instances=16
max_connections = 4000
query_cache_size = 0
query_cache_type = 0
tmp_table_size = 1024M
max_heap_table_size = 1024M
innodb_log_files_in_group = 3
innodb_log_file_size = 1024M
innodb_flush_method= O_DIRECT
log_timestamps=SYSTEM
#三个节点auto_increment_offset的值可以跟server_id相同
auto_increment_offset=1
auto_increment_increment=6
explicit_defaults_for_timestamp
log_bin_trust_function_creators = 1
transaction-isolation = READ-COMMITTED
innodb_buffer_pool_instances=8
innodb_write_io_threads=4
innodb_read_io_threads=4
#生产环境增加
innodb_buffer_pool_size=2G
innodb_flush_log_at_trx_commit=1
#设置从节点应用relaylog后产生binlog
log_slave_updates=1
#设置不自动删除relaylog
#relay_log_purge=0
#设置增强半同步复制参数
rpl_semi_sync_master_wait_point= AFTER_SYNC
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
初始化mysql
代码语言:javascript复制/mysql/bin/mysqld --user=mysql --basedir=/mysql --datadir=/data/data --initialize
主从节点都启动mysql服务
代码语言:javascript复制启动前先创建mysql日志文件
su - mysql
touch /data/log/mysqld.log
exit
代码语言:javascript复制systemctl start mysqld
#确保启动没报错,ps -ef|grep mysql 可以看到进程
修改root密码
代码语言:javascript复制#(主从节点均需执行,注意root密码)
root初始密码查找: grep password /data/log/mysqld.log
mysql -uroot -pR00T_12344
mysql>SET SQL_LOG_BIN=0;
set password='R00T_12344';
FLUSH PRIVILEGES;
use mysql;
update user set host = '%' where user = 'R00T_12344';
flush privileges;
SET SQL_LOG_BIN=1;
代码语言:javascript复制#select user,host from mysql.user 可以查看当前已开放
#如查询后root没有开放权限,尝试使用
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'R00T_12344' WITH GRANT OPTION;
flush privileges;
主从配置
2个从节点配置复制通道(db2/db3)
代码语言:javascript复制mysql>change master to master_host='db1',master_port=3306,master_user='root',master_password='R00T_12344',MASTER_AUTO_POSITION=1;
#因为开启了gtid,可以设置MASTER_AUTO_POSITION=1使主从复制自动按照gtid的位置复制
从节点启动复制进程并检查复制状态
代码语言:javascript复制#启动slave
mysql>START SLAVE;
#查看从库的状态
mysql>SHOW SLAVE STATUSG;
#确保 :
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
尝试连接过程中会遇到 两个No 的可能是未启动start salve;
如果是connectting yes 的,可能情况就有多种
- 首先测试ping db1,能否ping通,如果不能说明hosts设置失败,重新设置;
- 查看防火墙以及端口开放情况是否开放;
- Change maset指令有误,检查用户名及密码是否正确;
- 直接本地远程登录mysql -uroot -pR00T_12344 -hdb1,如果不能再排查远程登录问题;
从节点开启super_read_only (slave只读)
代码语言:javascript复制set global super_read_only=1;
主节点创建test库(db1)
代码语言:javascript复制mysql>
create database test;
use test;
create table test (id int primary key);
insert into test values(1);
测试主从切换
代码语言:javascript复制#从节点db2:(新主节点)
mysql>
stop slave;
set global read_only=0;
#原主节点db1:
mysql>
set global super_read_only=1;
change master to master_host='db2',master_port=3306,master_user='rpl_user',master_password='R00T_12344',MASTER_AUTO_POSITION=1;
start slave;
show slave status G;
#从节点db3:
mysql>
show slave status G;
stop slave;
change master to master_host='db2',master_port=3306,master_user='rpl_user',master_password='R00T_12344',MASTER_AUTO_POSITION=1;
start slave;
show slave status G;
#db2上插入数据,检查db1,db3是否数据同步
重新将主节点切成db1
测试过程略。
后续文章中将会更新MHA高可用以及读写分离相关内容。
本文章仅用于个人记录及学习参考。
Post Views: 194