文章目录
原理
- master数据更改,写入Binary log二进制日志文件
- slave节点,通过IO线程远程读取master的Binary log中写入的改动记录,从而写入自身节点的Relay Log日志
- slave启动SQL线程从Relay Log日志读取改动记录并且更新至slave数据库
(图是B站大佬画的,这里附上知识白嫖学习地址:高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制))
准备
准备2台虚拟器,配置好网络,保证互通。各自装上mysql
虚拟机1:192.168.43.110
虚拟机2:192.168.43.111
安装MySQL
Mysql 5.5版本(建议,但是此安装方式/etc目录下没有my.cnf文件,需手动准备)
-
下载client和server,放入服务器 Mysql下载
-
卸载自带的mariadb(一定卸载,不然会报错)
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64 -
rpm -ivh MySQL-server-5.5.58-1.el6.x86_64.rpm
-
rpm -ivh MySQL-client-5.5.58-1.el6.x86_64.rpm
-
启动service mysql start
-
reboot重启
-
登录:mysql -uroot -p
-
修改密码:mysqladmin -u root password ‘123456’(这里图示没改起,是因为笔者动了my.cnf文件,正常情况下是可以的)
Mysql 8 版本(8可能会出问题,笔者一开用的8,改了my.cnf文件后死活启动不起来)
-
下载MYSQL RPM:下载mysql
-
安装下载的安装包:
yum -y localinstall mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server -
修改密码
启动mysql:systemctl start mysqld
设置开机启动:systemctl enable mysqld
关闭开机启动:systemctl daemon-reload
查看密码:cat /var/log/mysqld.log | grep password(查看后记录好)
登录:mysql -uroot -p 密码
设置密码安全等级低:set global validate_password.policy=LOW;
设置密码长度为6:set global validate_password.length=6;
修改密码为123456:ALTER USER USER() IDENTIFIED BY ‘123456’;
注意:
查看mysql全局配置项:SHOW VARIABLES LIKE ‘validate_password%’;
更改密码安全等级和长度的时候注意其中的字段名字,比如有些是validate_password_length,文中版本为validate_password.length
修改后重新登录 -
设置外部连接的权限,比如navicat连接
create user ‘root’@‘%’ identified with mysql_native_password by ‘你的密码’;
grant all privileges on . to ‘root’@‘%’ with grant option;
flush privileges;
如果还是不行的话修改/etc/my.cnf添加一行:bind-address = 0.0.0.0
- 设置默认编码并关闭防火墙(这里供学习所以关闭防火墙)
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置
character_set_server=utf8
init_connect=‘SET NAMES utf8’
查看编码:show variables like ‘%character%’;
主从同步
前提:
1.首先关闭防火墙防止由于防火墙原因导致2个主机不通:systemctl stop firewalld;(正式环境开放3306端口即可,这里只做演示就直接关闭)
2.配置2个节点的mysql可以远程连接权限:
3.my.cnf文件放入 /etc目录 (使用/usr/share/mysql目录下的my-medium.cnf,复制过来改名为my.cnf)
grant all privileges on *.* to root@"%" identified by "root" with grant option;
flush privileges;
如果实在不行,在/etc/my.cnf配置文件添加配置:
方案一:添加一行:bind-address = 0.0.0.0
方案二:skip-grant-tables:这个参数会跳过权限校验(仅供学习时用,正式环境不建议用,风险大)
配置master的my.cnf文件
master:192.168.43.110
修改/etc/my.cnf文件,新增配置
server-id=1
log-bin=mysql-bin
replicate-do-db=test01
replicate-do-db=test02
配置slave的my.cnf文件
slave:192.168.43.111
修改/etc/my.cnf文件,新增配置(就是server-id不一样)
server-id=2
log-bin=mysql-bin
replicate-do-db=test01
replicate-do-db=test02
图示红框上面的是一些基本的配置,如设置编码级为utf-8,不过多介绍。
本文着重介绍主从同步的配置如下:
参数 | 介绍 |
---|---|
server-id | 服务id |
log-bin | 二进制日志文件,用于主从之间的同步 |
replicate-do-db | 指定需要同步的数据库,这里是test01,test02 |
binlog-ignore-db | 指定不需要同步的数据库 |
… | … |
重启主从节点的mysql
service mysql restart
slave从节点指定master
- maser节点查看信息:
show master status
- slave节点指定master(注意指定的时候都得查一下master,用最新的参数。File和position有可能会变,本示例就出现了)
根据上面查看的master节点信息在slave节点执行如下命令:
配置master_log_file和master_log_pos
change master to
master_host='192.168.43.110',
master_user='root',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=107;
检验效果
-
主节点创建数据库test01,test02:
create database test01;
create database test02;
-
开启从节点:
start slave ; -
查看从节点状态
show slave status \G
一定要注意Slave_IO_Running和Slave_SQL_Running字段都是YES才是正常的,如果不是yes,下面error会有报错信息
-
查看从节点是否同步了test01和test02数据库
我们可以看到从节点已经同步过来了test01和test02数据库,当然也可以在主节点对数据库创建表,插入数据等等操作,从节点依旧会同步过来,试验如下:
主节点创建表插入数据:
create table student(id int(4) ,name varchar(10) ) ;
insert into student(id,name) values(1,zs) ;
从节点查询:
可以看到是同步过来了。
其他知识点
1关于本文示例安装mysql5.5没有my.cnf文件。解决方式摘自 MySQL配置文件my.ini或my.cnf的位置
Windows下MySQL的配置文件是my.ini,一般会在安装目录的根目录。
Linux下MySQL的配置文件是my.cnf,一般会放在/etc/my.cnf,/etc/mysql/my.cnf。如果找不到,可以用find命令查找。
Linux用rpm包安装的MySQL是不会安装/etc/my.cnf文件的
至于为什么没有这个文件而MySQL却也能正常启动和作用,有两个说法:
第一种说法,my.cnf只是MySQL启动时的一个参数文件,可以没有它,这时MySQL会用内置的默认参数启动;
第二种说法,MySQL在启动时自动使用/usr/share/mysql目录下的my-medium.cnf文件,这种说法仅限于rpm包安装的MySQL。
解决方法:只需要复制一个/usr/share/mysql目录下的.cnf文件到/etc目录,并改名为my.cnf即可
2.关于mysql添加远程连接权限
提供远程连接如navicat连接,以 root/123456 登录。这个密码123456可以不跟数据库的密码一致
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
执行命令后,会在user表插入一条数据
也可以单独对某个局域网或者某台机子赋予权限:
对192.168.43局域网赋予远程连接权限:
grant all privileges on *.* to 'root'@'192.168.43.%' identified by 'root' with grant option ;
flush privileges;
对192.168.43.111赋予远程连接权限:
grant all privileges on *.* to 'root'@'192.168.43.111' identified by 'root' with grant option ;
flush privileges;