背景知识:
- 主从这个架构可以实现数据备份,数据在多个服务器上分布等等,当然最主要的优点是可以实现负载均衡,将写操作交给主节点,读操作交给从节点。
- mysql官网有很多版本,例如Enterprise(企业版需要付费,当然可以试用30天),Community(社区版,开源但是官方不提供技术支持),当然我们常用的也是社区版,本文是基于社区版的。
- mysql的安装也有源码安装和二进制免安装等等方法,本文的mysql是通过二进制免安装的方式安装的
- 本文使用的环境是centos
架构搭建步骤如下:
1.首先下载二进制免安装版的mysql:mysql社区版下载,进入社区版下载页后选择 MySQL Community Server (GPL),选择要下载的mysql版本:
如嫌麻烦的小伙伴可以直接运行下面的命令安装:(本人采用命令方式直接下载安装)
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x8
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两个文件,文件的内容如下:
以下的3306的配置
[mysqld]
user=root #设置mysql的启动用户,我这里直接使用root,读者可以创建用户组和用户指定操作
character-set-server=utf8
port=3306
socket=/home/liuchao/liuchao/software/mysql/sockets/3306.sock #设置套字节(/home/liuchao/liuchao/software/mysql/sockets为刚刚创建的sockets的路径,3306.sock可以随意命名,下面的data,logs也是如此)
basedir=/home/liuchao/liuchao/software/mysql/mysql-3306 #mysql-3306所在的位置
datadir=/home/liuchao/liuchao/software/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
#设置需要同步给从节点的数据库 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-do-db=testSlaveFromMasterDB
[mysqld_safe]
log-error=/home/liuchao/liuchao/software/mysql/logs/3306.log #错误日志
#以下的3307的配置
[mysqld]
user=root
character-set-server=utf8
port=3307
socket=/home/liuchao/liuchao/software/mysql/sockets/3307.sock
basedir=/home/liuchao/liuchao/software/mysql/mysql-3307
datadir=/home/liuchao/liuchao/software/mysql/data/3307
server-id=2
#设置从节点只读,注意如果是超级管理登录从节点仍然是可以写的,该配置只对普通用户有效
read_only=1
#设置relay-log的路径和名称,如果不设置的话,默认路径是datadir设置的路径,默认文件名是:当前主机名-relay-log
relay-log=relay-log-bin
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-do-db=testSlaveFromMasterDB
#设置不需要复制的数据库(replicate-ignore-db=数据库名称 若没有可忽略的可不配置)
[mysqld_safe]
log-error=/home/liuchao/liuchao/software/mysql/logs/3307.log #错误日志
配置完成如下图:
5.接下来让我们开启mysql服务:
#进入mysql-3306目录,执行如下操作进行初始化
# -insecure的作用是不设置密码,如果省略的话mysql会生成一个随机密码
./bin/mysqld --defaults-file=/home/liuchao/liuchao/software/mysql/config/3306.conf --initialize-insecure
#之后再执行如下命令启动
./bin/mysqld --defaults-file=/home/liuchao/liuchao/software/mysql/config/3306.conf
#同理启动3307mysql服务
6.可能有读者在启动mysql服务器的时候会报:error while loading shared libraries: libaio.so,
运行如下命令安装即可:
yum install libaio
或缺失其他的g++库信息 百度查询该报错 正常安装依赖库即可。我当时启动报:error while loading shared libraries: libncurses.so.5: cannot open shared object file 百度搜索原因下载对应依赖即可 对应问题解答连接:https://blog.csdn.net/jadonzhb/article/details/86062153
7.连接3306主mysq服务器:
#进入mysql-3306运行如下命令:
#--socket的值就是我们在mysql配置文件中配置的socket值
./bin/mysql -uroot --socket=/home/liuchao/liuchao/software/mysql/sockets/3306.sock
#同理连接3307的mysql服务器
8.执行如下命令查看master状态并进行重置:
show master status;
reset master;
9.在主服务器上设置一个用户用于从服务器从主服务器中复制数据时使用:
关于在master上用root 权限用户建立新用户的方式,若不了解 请自行百度查看学习了解。可以参考:https://blog.csdn.net/weixin_38091140/article/details/82983229?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
#暂时当前所有库
show databases;
#进入mysql库
use mysql;
#创建用户
create user 'slave' identified by '666666';
#更改用户密码
update user set authentication_string=password('Liu123456@') where User='slave';
#赋予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
#命令解释
create user 用户名 identified by '密码';
grant 权限 on 数据库名.表名 to '用户名'@'域名';
*表示所有,*.*表示所有的数据库和数据库中的表
'%'所有本地和远程都可以
localhost 本地
ip地址 指定ip登录
#更新权限
flush privileges;
#查询用户表数据
select * from mysql.user where user='slave'\G;
SELECT host,user,authentication_string from mysql.user;
10.以上操作没有问题之后,我们连接3307服务器进行从节点的配置
#首先关闭
stop slave;
change master to
master_host='127.0.0.1', #主从服务的地址
master_port=3306, #主服务器的端口
master_user='slave', #用于从复制的用户名,即第九步创建的
master_password='Liu123456@', #密码
master_log_file='master-bin.000001', #主服务器的binlog日志名称,查看第八步
master_log_pos=154; #偏移量 对应的值 查看第八步
#开启
start slave;
至此我们的mysql主从架构已经搭建完成。小伙伴可以自行测试,在master节点写入的数据是否会同步到slave节点。
本人测试sql 如下,可以拿去使用:
master 节点上:
create table testusertable(id int(11) auto_increment primary key, name varchar(30) )engine=innodb,default charset=utf8;
insert into testusertable(name) values('小杰');
slave 节点上:
查看slave节点状态:show slave status\G; 注意关注其信息细节。譬如 Slave_IO_Running、Slave_SQL_Running等字段及含义。若存在某些字段为No 或其他情况,自行研究处理。
本人当时遇到的问题是Replicate_Do_DB 当时该字段发现没值。然后想了想 发现是在配置3306.conf 和3307.conf的时候 没配置。即没有指出同步哪个库。对应问题解答点参考:
https://blog.csdn.net/xujunjie/article/details/5474274?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control地址,https://blog.csdn.net/mengtianyalll/article/details/52683021,
https://blog.csdn.net/zhao3587717/article/details/83576806
select * from testusertable;
发现主节点写入的数据,在从节点 能够及时读到。证明 主从架构是搭建成功的。
注意:上面的搭建情况 保持的是SQL的TCP socket连接方式,即用./bin/mysql -uroot --socket=/home/liuchao/liuchao/software/mysql/sockets/3306.sock
可自行研究 用-h 端口号方式 启动连接。