最近在工作中解决了一些Mysql主从集群相关的问题,本着每周进步一点点的态度将主从集群搭建的完整过程记录下来,特此记录便于日后查阅。
一、Mysql简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
二、准备工作
操作系统是Centos7,需要提前准备好 5.7.26 的Mysql安装包:
下载步骤如下所示:
点击 Download 按钮后进行登录,登录完成后跳转到如下页面:
点击 Download Now 开始下载,最后将安装包上传到服务器的 /home 目录下。
三、Mysql主从集群搭建
3.1、单机搭建
我们需要在单节点上创建一个实例,相关环境如下:
将刚刚上传到服务器的安装包进行解压
$ cd /home
$ tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
$ mv ./mysql-5.7.26-linux-glibc2.12-x86_64/ ./mysql
添加MySQL数据库运行的用户和用户组
$ groupadd -r mysql
$ useradd -r -g mysql mysql
更改目录权限
$ chown -R mysql:mysql /home/mysql/
创建软连接到 /user/bin 目录,之后我们就能够直接使用 mysql 命令了
$ ln -s /home/mysql/bin/mysql /usr/bin
初始化数据库
$ /home/mysql/bin/mysqld --initialize --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data
初始化完成后记住打印的内容,里面有初始化的登录密码(千万把密码记录下来,不然后面不能登陆)
创建 RSA 密钥
$ /home/mysql/bin/mysql_ssl_rsa_setup --datadir=/home/mysql/data/
等待几秒后,如图所示:
设置开机自启动
$ cp /home/mysql/support-files/mysql.server /etc/init.d/mysqld
修改 /etc/init.d/mysqld 中的 basedir 和 datadir
加入开机自启动
$ chkconfig mysqld on
$ chkconfig --list mysqld
成功加入后,如图所示:
在全局配置文件中添加mysql可执行文件所在路径
$ vim /etc/profile
加入以下内容
#mysql
export MYSQL_HOME=/home/mysql
export PATH=$MYSQL_HOME/bin
修改完成后保存,使配置文件生效
$ source /etc/profile
删掉系统自带的/etc/my.cnf,在/home/mysql/conf/目录新建3306.cnf,并且将文件属性调整为mysql:mysql
$ mkdir /home/mysql/conf/
$ cd /home/mysql/conf/
$ vim 3306.cnf
在配置文件中加入以下内容
[mysqld]
basedir = /home/mysql/
datadir=/home/mysql/data/
socket=/tmp/mysql.sock
log-error=/home/mysql/data/error.log
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
language=/home/mysql/share/english
# 设置监听开放端口 [多实例中一定要不同]
port=3306
# 设置运行用户
user=mysql
# 设置UTF-8编码
character-set-server=utf8
#自动清理 30 天前的log文件,可根据需要修改
expire_logs_days=30
#设置最大连接数
max_connections=1000
#设置最大等待时长(s)
wait_timeout=120
interactive_timeout=120
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
这里需要注意 mysql.sock 文件所在位置必须是 /tmp 目录下,否则会报找不到 sock 文件的错误。
将 /home/mysql/data/ 和 /home/mysql/conf 的所有子文件的拥有者全部更改为 mysql 用户
$ chown -R mysql:mysql /home/mysql/data/ /home/mysql/conf/
修改完后,启动mysql
$ /home/mysql/bin/mysqld --defaults-file=/home/mysql/conf/3306.cnf &
等待几秒完成后,使用初始化提供的密码进行登陆,如果有错误可以去 /home/mysql/data/error.log 查看日志信息
$ mysql -u root -p
成功登录后,如图所示:
登录上来后的第一件事就是修改初始化密码,我这里新密码是 openailab,大家自定义就好
$ alter user user() identified by "";
$ use mysql;
$ update user set authentication_string = password('openailab'), password_expired = 'N', password_last_changed = now() where user = 'root';
$ FLUSH PRIVILEGES;
如果 3306 端口没开就先开一下端口
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent
$ firewall-cmd --reload
然后我们通过 Navcat 工具进行连接,如图所示:
这里的解决方案是修改 user 表中的Host为 %
$ mysql -u root -p
$ use mysql;
$ update user set Host = '%' where User = 'root';
$ FLUSH PRIVILEGES;
然后重新连接测试,问题解决,如图所示:
到此单机搭建完成(数据备份的方法这里没有说,我会在下文中提到)。
3.2、单机主从搭建
搭建单机主从与单机的主要区别是在于配置文件的不同,我们基于上面的单机环境来进行改造
首先杀掉单机进程
$ ps -aux|grep mysql
$ kill -9 进程号
然后修改删除 /home/mysql/data 文件夹下的所有东西,删除完后创建两个文件夹分别放两个实例的数据
$ cd /home/mysql/data/
$ rm -rf *
$ mkdir 3306 3307
修改 3306.cnf 配置文件,添加Master节点相关内容
$ vim /home/mysql/conf/3306.cnf
修改后如下:
[mysqld]
basedir = /home/mysql/
datadir=/home/mysql/data/3306/
socket=/tmp/3306.sock
log-error=/home/mysql/data/3306/error.log
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
language=/home/mysql/share/english
# 设置监听开放端口 [多实例中一定要不同]
port=3306
# 设置运行用户
user=mysql
# 设置UTF-8编码
character-set-server=utf8
#自动清理 30 天前的log文件,可根据需要修改
expire_logs_days=30
#设置最大连接数
max_connections=1000
#设置最大等待时长(s)
wait_timeout=120
interactive_timeout=120
#主数据库配置
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
然后我们在 /home/mysql/conf/ 目录下新建 3307 实例所需要的配置文件
$ vim /home/mysql/conf/3307.cnf
添加如下内容:
[mysqld]
basedir = /home/mysql/
datadir=/home/mysql/data/3307/
socket=/tmp/3307.sock
log-error=/home/mysql/data/3307/error.log
server-id=2
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
language=/home/mysql/share/english
# 设置监听开放端口 [多实例中一定要不同]
port=3307
# 设置运行用户
user=mysql
# 设置UTF-8编码
character-set-server=utf8
#自动清理 30 天前的log文件,可根据需要修改
expire_logs_days=30
#设置最大连接数
max_connections=1000
#设置最大等待时长(s)
wait_timeout=120
interactive_timeout=120
#从数据库配置
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
master-info-repository=TABLE
relay-log-info-repository=TABLE
relay-log-recovery
binlog-format=ROW
read_only=1
然后我们来初始化3306、3307的数据库实例
$ /home/mysql/bin/mysqld --defaults-file=/home/mysql/conf/3306.cnf --basedir=/home/mysql/ --user=mysql --initialize-insecure --explicit_defaults_for_timestamp
$ /home/mysql/bin/mysqld --defaults-file=/home/mysql/conf/3307.cnf --basedir=/home/mysql/ --user=mysql --initialize-insecure --explicit_defaults_for_timestamp
分别启动两个实例
$ /home/mysql/bin/mysqld_safe --defaults-file=/home/mysql/conf/3306.cnf &
$ /home/mysql/bin/mysqld_safe --defaults-file=/home/mysql/conf/3307.cnf &
注意,这里我使用的命令是 /home/mysql/bin/mysqld_safe,而之前在搭建单机的时候我用的是 /home/mysql/bin/mysqld,后者的区别是开一个守护进程监视实例进程,当mysql实例挂了,守护进程会将实例立刻重启,所以造成的问题就是 mysql 实例永远都死不了,所以这里需要注意的是,如果你想要杀死 mysql 实例,则需要先杀死 mysqld_safe 实例后,才能杀死 mysql 实例。
验证实例启动成功,如图所示:
然后我们登录mysql对密码和Host配置进行修改(注意在多实例登录的时候需要明确是哪一个端口,否则会找不到 .sock 文件导致报错)
$ mysql -uroot -p -P3306 -h127.0.0.1
输入密码,登录成功后执行下面的命令修改配置
$ use mysql;
$ update user set Host = '%' where User = 'root';
$ update user set authentication_string = password('openailab'), password_expired = 'N', password_last_changed = now() where user = 'root';
$ FLUSH PRIVILEGES;
修改完成后通过Navcat工具连接数据库,如图所示:
此时我在Master数据库中创建oas.cloud的库,添加user表,录入数据,如图所示:
数据同步完成,到此单机主从搭建成功。
3.3、集群主从搭建
在两台机器分别启动 MySQL 实例
IP | 系统 | 端口 | MySQL版本 | 节点 |
---|---|---|---|---|
192.168.3.204 | Centos7 | 3306 | 5.7.26 | Master |
192.168.3.204 | Centos7 | 3307 | 5.7.26 | Slave |
192.168.3.211 | Centos7 | 3306 | 5.7.26 | Master |
192.168.3.211 | Centos7 | 3307 | 5.7.26 | Slave |
通过mysql-cluster做到集群主从搭建,还需要再研究一下。。
3.4、数据备份
数据定时备份是非常重要的,我们一定要重视起来,这里我们通过Linux的定时任务来做数据备份,之前已经写过一篇相关的文章,传送门:
通过以下命令进行SQL文件备份
$ /home/mysql/bin/mysqldump -u root -p openailab -P 3306 --all-databases | gzip > ./backupfile_$(date +%Y%m%d%H%M%S).sql.gz
仅保留近7日的备份文件,脚本完整内容如下:
#! /bin/bash
t=$(date +%Y%m%d%H%M%S)
/home/mysql/bin/mysqldump -u root -p openailab -P 3306 --all-databases | gzip > /home/backup/mysql/data/backupfile_$t.sql.gz
find /home/backup/mysql/data -mtime 7 -type f|xargs rm -f
到此数据备份配置完成。