一、mysql主从配置原理
-
-
上图中有两个服务器,演示了从一个主服务器(master)把数据同步到从服务器(slave)的过程。 对于一个mysql服务器,一般有两个线程来负责复制和被复制。当开启复制这个开关之后(start slave) 1. 作为主服务器Master,会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log,然后在自己那里再执行一遍。) 2. 作为从服务器Slave,会用master上的账号登陆到master上,去读取master的Binarylog, 然后写入到自己的中继日志Relaylog,然后自己的sql线程会负责读取这个中继日志,并执行一遍。到这里主服务器上的更改就同步到从服务器上了。 在mysql上可以查看当前服务器的主,从状态。 其实就是当前服务器的 Binary(作为主服务器角色)状态和位置。以及其RelayLog(作为从服务器)的复制进度。
一台机器上实现双主热备
mysql主从架构搭建
链接地址:
背景知识:
-
主从这个架构可以实现数据备份,数据在多个服务器上分布等等,当然最主要的优点是可以实现负载均衡,将写操作交给主节点,读操作交给从节点。
-
mysql官网有很多版本,例如Enterprise(企业版需要付费,当然可以试用30天),Community(社区版,开源但是官方不提供技术支持),当然我们常用的也是社区版,本文是基于社区版的。
-
mysql的安装也有源码安装和二进制免安装等等方法,本文的mysql是通过二进制免安装的方式安装的
-
本文使用的环境是centos
-
mysql版本:mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
-
在/data目录解压两份mysql 修改mysql的端口为3307 3308
-
首先下载二进制免安装版的mysql:mysql社区版下载,进入社区版下载页后选择 MySQL Community Server (GPL),选择要下载的mysql版本:
我这里使用的是mysql5.7这个版本,点击之后,选择如下:
嫌麻烦的小伙伴可以直接运行下面的命令安装:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
-
下载好之后解压重命名为mysql-3306然后复制一份,重命名为mysql-3307,我们将3306当作主节点,3307当作从节点:
#解压 tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz #重命名 mv mysql-5.7.25-linux-glibc2.12-x86_64 mysql #复制一份 cp -r mysql mysql3308
-
创建几个目录,data,logs,config,sockets,用来管理mysql的相关文件:
mkdir data logs config sockets
-
进入config目录,创建3307.conf以及3308.conf两个文件,文件的内容如下:
#3307.conf配置文件内容如下:
[mysqld] user=root character-set-server=utf8 port=3307 socket=/data/mysql/sockets/3307.sock basedir=/data/mysql datadir=/data/mysql/data/3307 server-id=2 log-bin=master-bin binlog_format=ROW binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schema relay-log=relay-log-bin replicate-do-db=humy replicate-do-db=usemp #设置从节点只读,注意如果是超级管理登录从节点仍然是可以写的,该配置只对普通用户有效 read_only=1 #设置relay-log的路径和名称,如果不设置的话,默认路径是datadir设置的路径,默认文件名是:当前主机名-relay-log relay-log=relay-log-bin [mysqld_safe] log-error=/data/mysql/logs/3306.log #错误日志
#3308.conf配置文件内容如下
[mysqld] user=root #设置mysql的启动用户,我这里直接使用root,读者可以创建用户组和用户指定操作 character-set-server=utf8 port=3308 socket=/data/mysql3308/sockets/3308.sock #设置套字节(/root/mysql/sockets为刚刚创建的sockets的路径,3306.sock可以随意命名,下面的data,logs也是如此) basedir=/data/mysql3308 #mysql-3306所在的位置 datadir=/data/mysql3308/data/3308 #设置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 replicate-do-db=humy replicate-do-db=usemp [mysqld_safe] log-error=/root/mysql3308/logs/3308.log #错误日志
-
接下来让我们开启mysql服务:
#进入mysql的bin目录,执行如下操作进行初始化 #-insecure的作用是不设置密码,如果省略的话mysql会生成一个随机密码 ./mysqld --defaults-file=/data/mysql/config/3307.conf --initialize-insecure
#之后再执行如下命令启动
./mysqld --defaults-file=/data/mysql/config/3307.conf
-
可能有读者在启动mysql服务器的时候会报:error while loading shared libraries: libaio.so,运行如下命令安装即可:
yum install libaio
-
连接3307主mysq服务器:
#进入mysql的bin目录运行如下命令: #--socket的值就是我们在mysql配置文件中配置的socket值 ./mysql -uroot --socket=/data/mysql/sockets/3307.sock #同理连接3307的mysql服务器
-
执行如下命令查看master状态并进行重置:
show master status;
reset master;
-
在主服务器上设置一个用户用于从服务器从主服务器中复制数据时使用:
#创建用户 create user 'salve' identified by '666666'; #赋予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'salve'@'%'; #命令解释 create user 用户名 identified by '密码'; grant 权限 on 数据库名.表名 to '用户名'@'域名'; *表示所有,*.*表示所有的数据库和数据库中的表 '%'所有本地和远程都可以 localhost 本地 ip地址 指定ip登录
-
以上操作没有问题之后,我们连接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日志的,首先因为从节点是只读的开启binlog日志也没用,因为binlog日志记录的是修改事件,其次从节点从relay-log中读取主节点的修改事件时也不会将修改事件同步到自己的binlog中。因此从节点开启binlog是没有用。
-
双主热备的关键参数就是:log_salve_updates
-
双主热备其实就是两台mysql服务器互为主从关系。为了实现高可用,可以在两台互为主从关系的服务器下面再配置若干个从节点。
-
关于reset master 和 reset slave语句的区别和注意事项:传送门
注意:
-
设置mysql远程访问
#修改mysql 允许远程访问 use mysql; update user set host = '%' where user = 'root';
-
如上操作,可能导致mysql的root用户无初始密码,按以下步骤解决:
#命令行连接mysql终端 ./bin/mysql -uroot --socket=/data/mysql3307/sockets/3307.sock #修改root的密码 update mysql.user set authentication_string = password('123456') where user='root';
-
使用如下命令登录终端
./bin/mysql -h192.168.1.2 -P3307 -uroot -p123456
-
二、mycat结合双主复制实现读写分离模式
简介:
应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制。
mycat安装
注意:
在安装mycat之前首确定已经安装了java
Mycat官网 下载Mycat安装包:Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
#解压
tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
修改schema.xml
的配置文件
-
balance="1"
: 全部的readHost与stand by writeHost参与select语句的负载均衡。 -
writeType="0"
: 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。 -
switchType="1"
: 1 默认值,自动切换。
修改/conf/server.xml 和 /conf/schema.xml
server.xml修改内容如下
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB,TESTDBT</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
<schema name="TESTDBT" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB,TESTDBT</property>
<property name="readOnly">true</property>
</user>
schema.xml内容如下
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema> <schema name="TESTDBT" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"> </schema> <dataNode name="dn1" dataHost="node1" database="humy" /> <dataNode name="dn2" dataHost="node1" database="usemp" /> <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> <heartbeat>select user()</heartbeat> <writeHost host="master1" url="192.168.1.186:3307" user="root" password="123456"> <readHost host="slave2" url="192.168.1.186:3307" user="root" password="123456" /> </writeHost> <writeHost host="master2" url="192.168.1.186:3308" user="root" password="123456"> <readHost host="slave2" url="192.168.1.186:3308" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
启动mycat服务
./bin/mycat start
启动:./bin/mycat start
状态: ./bin/mycat status
使用mysql的客户端连接mycat
cd /data/app/mysql/ ./bin/mysql -uroot -p 8066 -h 192.168.1.186 ##连接mycat,初始密码123456 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | | TESTDBT | +----------+ 2 rows in set (0.00 sec)
使用Navicat Premium连接mycat
通过mycat添加数据 可以实现配置中的数据库的数据同步。
每次开机都要启动mycat,网上看了好多都是用shell脚本来实现mycat开机自启动,后来看到一种方法,直接修改系统文件来实现,已经实践过,方法有效。
1.修改脚本文件rc.local:vim /etc/rc.d/rc.local
这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令
2.添加如下内容:
export JAVA_HOME=/opt/jdk1.8.0_65
/usr/local/mycat/bin/mycat start
3.esc 退出编辑,:wq 保存修改
4.将rc.local修改为可执行
chmod 777 /etc/rc.d/rc.local