背景知识:
- 主从这个架构可以实现数据备份,数据在多个服务器上分布等等,当然最主要的优点是可以实现负载均衡,将写操作交给主节点,读操作交给从节点。
- mysql官网有很多版本,例如Enterprise(企业版需要付费,当然可以试用30天),Community(社区版,开源但是官方不提供技术支持),当然我们常用的也是社区版,本文是基于社区版的。
- mysql的安装也有源码安装和二进制免安装等等方法,本文的mysql是通过二进制免安装的方式安装的
- 本文使用的环境是centos
1.首先下载二进制免安装版的mysql:mysql社区版下载,进入社区版下载页后选择 MySQL Community Server (GPL),选择要下载的mysql版本:
我这里使用的是mysql5.7这个版本,点击之后,选择如下:
嫌麻烦的小伙伴可以直接运行下面的命令安装:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
2.下载好之后解压重命名为mysql-3306然后复制一份,重命名为mysql-3307,我们将3306当作主节点,3307当作从节点:
#解压
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
#重命名
mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql-3306
#复制一份
cp -r mysql-3306 mysql-3307
3.创建几个目录,data,logs,config,sockets,用来管理mysql的相关文件:
mkdir data logs config sockets
4.进入config目录,创建3306.conf以及3307.conf两个文件,文件的内容如下:
[mysqld]
user=root #设置mysql的启动用户,我这里直接使用root,读者可以创建用户组和用户指定操作
character-set-server=utf8
port=3306
socket=/root/mysql/sockets/3306.sock #设置套字节(/root/mysql/sockets为刚刚创建的sockets的路径,3306.sock可以随意命名,下面的data,logs也是如此)
basedir=/root/mysql/mysql-3306 #mysql-3306所在的位置
datadir=/root/mysql/data/3306 #设置mysql的数据存放目录(也是bin_log的存放的地方)
server-id=1 #唯一标识,每台mysql服务器必须唯一
log-bin=master-bin #开启bin-log并将此值作为二进制文件名的前缀
binlog_format=ROW #设置binlog的格式,主要有STATEMENT,ROW,FIXED
#设置不需要同步给从节点的数据库
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
[mysqld_safe]
log-error=/root/mysql/logs/3306.log #错误日志
#以下的3307的配置
[mysqld]
user=root
character-set-server=utf8
port=3307
socket=/root/mysql/sockets/3307.sock
basedir=/root/mysql/mysql-3307
datadir=/root/mysql/data/3307
server-id=2
#设置从节点只读,注意如果是超级管理登录从节点仍然是可以写的,该配置只对普通用户有效
read_only=1
#设置relay-log的路径和名称,如果不设置的话,默认路径是datadir设置的路径,默认文件名是:当前主机名-relay-log
relay-log=relay-log-bin
[mysqld_safe]
log-error=/root/mysql/logs/3306.log #错误日志
5.接下来让我们开启mysql服务:
#进入mysql-3306目录,执行如下操作进行初始化
# -insecure的作用是不设置密码,如果省略的话mysql会生成一个随机密码
./bin/mysqld --defaults-file=/root/mysql/config/3306.conf --initialize-insecure
#之后再执行如下命令启动
./bin/mysqld --defaults-file=/root/mysql/config/3306.conf
#同理启动3307mysql服务
6.可能有读者在启动mysql服务器的时候会报:error while loading shared libraries: libaio.so,运行如下命令安装即可:
yum install libaio
7.连接3306主mysq服务器:
#进入mysql-3306运行如下命令:
#--socket的值就是我们在mysql配置文件中配置的socket值
./bin/mysql -uroot --socket=/root/mysql/sockets/3306.sock
#同理连接3307的mysql服务器
8.执行如下命令查看master状态并进行重置:
show master status;
reset master;
9.在主服务器上设置一个用户用于从服务器从主服务器中复制数据时使用:
#创建用户
create user 'salve' identified by '666666';
#赋予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'salve'@'%';
#命令解释
create user 用户名 identified by '密码';
grant 权限 on 数据库名.表名 to '用户名'@'域名';
*表示所有,*.*表示所有的数据库和数据库中的表
'%'所有本地和远程都可以
localhost 本地
ip地址 指定ip登录
10.以上操作没有问题之后,我们连接3307服务器进行从节点的配置:
#首先关闭
stop slave;
#参数配置
change master to
master_host='127.0.0.1', #主从服务的地址
master_port=3306, #主服务器的端口
master_user='slave', #用于从复制的用户名,即第九步创建的
master_password='666666', #密码
master_log_file='master-bin.000001', #主服务器的binlog日志名称,查看第八步
master_log_pos=597; #偏移量
#开启
start slave;
至此我们的mysql主从架构已经搭建完成。小伙伴可以自行测试,在master节点写入的数据是否会同步到slave节点。
这里有一个巨坑:
- 我以为设置了binlog_ignore_db之后,在主节点创建的用户:执行语句create user test identified by '1234' 不会被同步到从节点,因为创建的用户会被存储到系统表user中,而该表是在mysql库下的,而mysql这个数据库在上面的配置中被设置了ignore,但是实际登录到从节点之后会发现用户test也被同步到了从节点。这是因为mysql是根据use关键字来判断哪些库不被记录到binlog中,因此如果将上面的创建语句改成:use mysql; create user test1 identified by '1234' 那么再登录从节点会发现test1用户没有被同步。详细解释