mysql 一主多从环境搭建(亲测)

前期准备

  1. 两台服务器,服务器使用的是 centos7
  2. mysql-5.7.24-linux-glibc2.12-x86_64 安装包 使用是版本是 mysql-5.7.24

数据库安装

1,将 mysql 安装包上传到两台服务器上,我使用 xshell 作为上传工具

2,解压安装包

tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

3,创建需要安装的路径,之后移动刚才解压的文件夹,同时重命名

  mkdir /app     #创建一个文件夹专门用来存放安装的程序
  mv mysql-5.7.24-linux-glibc2.12-x86_64/* /app/mysql  #移动文件并重命名

4,创建用户组、用户、文件夹、赋权

groupadd mysql                  #创建用户组
    useradd -r -g mysql mysql       #创建用户 -r:建立系统账号 -g:指定用户组
    cd /app/mysql                   #切换到安装目录
    mkdir data                      #创建数据存放目录
    mkdir mysql-log                 #创建日志存放目录
    mkdir mysql-log/err-log
    mkdir mysql-log/slow-log
    mkdir mysql-log/bin-log         #主机需要此目录
    chown -R root:mysql .           #将当前目录以及字母里,所有者改变为 mysql,所属组修改为 mysql
    chown -R mysql:mysql data
    chown -R mysql:mysql mysql-log

5,配置 /etc/my.cnf

vi /etc/my.cnf

主机配置文件:

[mysqld]
port = 3306                             #端口
basedir = /app/mysql                    #mysql安装路径
datadir = /app/mysql/data/              #mysql数据存放路径
    
#日志设置
log-error = /app/mysql/mysql-log/err-log/db-err.log   #错误日志路径
slow-query-log-file = /app/mysql/mysql-log/slow-log/db-slow.log  #慢SQL日志路径
long-query-time = 3 #怎样才算是慢sql,单位是秒

#开启 binlog 同步
server_id = 0001                  #一个集群内的 MySQL 服务器 ID,全局唯一
log-bin = /app/mysql/mysql-log/bin-log/db-binlog      #开启 Binlog 并写明存放日志的位置
max-binlog-cache_size = 64M       #binlog 最大能够使用cache的内存大小
max-binlog-size = 1G              #binlog 日志每达到设定大小后,会使用新的 binlog 日志
expire_logs_days = 15             #只保留最近15天的日志
binlog-format = mixed             #混合模式复制
innodb_flush_log_at_trx_commit = 2 #和 sync_binlog 控制MySQL磁盘写入策略以及数据安全性
sync-binlog = 500                  #控制数据库的binlog刷到磁盘上去

#性能调优配置
innodb_buffer_pool_size = 24576M   
max_connections = 5000
max_connect_errors = 6000
external-locking = FALSE
max_allowed_packet = 64M
join_buffer_size = 64M
sort_buffer_size = 2M
read_rnd_buffer_size = 16M 

#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

从机配置文件:

[mysqld]
basedir = /app/mysql
datadir = /app/mysql/data
port = 3306
server_id = 0002 #这里需要在集群中保持唯一
    
#日志设置
expire_logs_days = 15
long-query-time = 3
slow-query-log-file=/app/mysql/mysql-log/slow-log/db-slow.log
log-error=/app/mysql/mysql-log/err-log/db-err.log
    
#主从设置
replicate-do-db=db_test     #需要从主库同步的数据库1
replicate-do-db=db_dev      #需要从主库同步的数据库2
read_only=1                 #只读设置
    
#性能调优设置
innodb_buffer_pool_size = 24576M
max_connections = 5000
max_connect_errors = 6000
external-locking = FALSE
max_allowed_packet = 64M
join_buffer_size = 64M
sort_buffer_size = 2M
read_rnd_buffer_size = 16M 
    
#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

6,设置链接和服务

cp /app/mysql/support-files/mysql.server /etc/init.d/mysql  # 可以使用service mysql start
    ln -s  /app/mysql/bin/mysql /usr/bin         #任何路径可以使用 mysql 命令

数据库初始化

1,初始化数据库

cd /app/mysql/bin/

./mysqld --defaults-file=/etc/my.cnf  --user=mysql --initialize  #初始化

2,查看密码(初始化数据库之后会生成一个 root 账户的默认密码)

cat /app/mysql/mysql-log/err-log/db-err.log

3,启动 mysql

service mysql start

4,登录并修改 root 密码

mysql -u root -p 
    set password = password('root');
    flush privileges;
    
    #如果需要 root 远程连接,执行以下语句
    use mysql;
    update user set host = '%' where user = 'root';
    flush privileges;

创建用户并赋权

主机

#需要创建用于和从机“通信”的用户,具有同步权限,后续操作需要 
    grant replication slave on *.* to 'copy'@'%' identified by 'copy';
    flush privileges;
    
    #主机可以创建一个用户用于访问和操作某些特定的库,不应该让应用直接使用 root 用户. 这里的 db_test 是创建的一个测试库
    grant all privileges  on db_test.* to "app_user"@'%' identified by "app_user";
    flush privileges;

从机

#需要创建用于“只读”权限的用户
    grant select on db_test.* to 'readonly'@'%' identified by "readonly";
    flush privileges;

主从同步启动

主机

#获得 master 二进制日志文件名及位置
    show master status

从机

stop slave;     #暂停
    reset slave;    #重置
    change master to master_host="主机IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #设置和主机同步的用户信息,日志文件信息
    start slave;    #启动
    show slave status \G #查看从机状态,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes

验证

主机和从机都创建数据库 db_test

create database db_test

主机数据库新增表和数据,验证从机是否同步成功

 

可能出现的问题

未开启防火墙端口,导致无法通过远程软件访问到数据库,navicat 提示 10038

#开启防火墙 3306 端口
    firewall-cmd --zone=public --add-port=3306/tcp --permanent # centos7
    firewall-cmd --reload

 

MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法

解决办法如下:

依次执行:
stop slave;                                                      
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;            
start slave;                                                      
show slave status\G  

 

如果是slave_io_running:no

解决办法如下:

查看主服务器

show master status\G    

 

 在从服务器上查看

问题所在:发现Master_Log_File没有对应。

出现Slave_IO_Running: No的机器上操作

依次执行:
slave stop;                 
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;  
slave start;                               
show slave status\G      

 

MHA集群报错:The slave I/O thread stops because master and slave have equal MySQL server UUIDs

问题提示主从使用了相同的server UUID,一个个的检查:

检查主从server_id

主库:show variables like 'server_id';

从库:show variables like 'server_id';

server_id不一样,排除。

检查主从状态:

主库:show master status;

从库:

File一样,排除。

最后检查发现他们的auto.cnf中的server-uuid是一样的。。。

vim /var/lib/mysql/auto.cnf  #mysql安装目录下的data目录里

问题解决

停止从库的mysqld服务,删除他的auto.cnf文件,再启动数据库服务即可:

原理分析

我搭建集群是先在虚拟机上搭好主库环境,然后直接克隆镜像当作从库,这样会导致主从库生成相同的server-uuid。只需删除一个server-uuid并重启数据库服务即可解决问题。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章