导言
本文为社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!
在上篇《主从原理篇》中,根本上把主从仿制原理、主从架构方法、数据同步方法、仿制技能优化…..等各类细枝末节讲清楚了,本章则准备真正对聊到的几种主从方法落地实践,但实践的内容通常比较枯燥乏味,由于便是调整各种装备、设置各种参数等进程。
本章中就树立最根本的两种常用树立,一主一从/多从架构、双主/多主多写架构,其他例如级联仿制架构、多主一从架构的装备进程大致相同,因而各位小伙伴能够举一反三,这儿就不再具体打开实践。
自身这章本来计划不写的,由于内容相对会比较无趣,但看了一下网上的树立教程根本杂乱无章,想要从零跟着树立出一个完善的主从集群也不是易事,所以仍是写下这章实践篇,体系性梳理好MySQL
主从集群的具体树立进程。
一、CentOS7装置MySQL8.0
其实依据Docker
容器去构建会更简略,根本上就敲几行指令,敞开一下端口映射即可,但那种方法好像缺少一些原汁原味,因而这儿仍是依据原生的Linux-CentOS7
体系,完结MySQL
主从仿制集群的树立作业,但在此之前先装置一个MySQL8.0
版别。
❶首要创立MySQL
的目录并进入:
[root@localhost]# mkdir /soft && mkdir /soft/mysql/
[root@localhost]# cd /soft/mysql/
❷下载MySQL
的装置包,能够经过FTP
东西上传离线环境包,也可经过wget
指令在线获取装置包:
[root@localhost]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
没有wget
指令的可经过yum
指令装置:
[root@localhost]# yum -y install wget
❸解压MySQL
的压缩包,并对解压后的目录重命名:
[root@localhost]# tar -xvJf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
[root@localhost]# mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql8.0
❹Linux-CentOS
内核会自带MariaDB
这个开源版的MySQL
,因而在正式装置前,一定要先检测是否一下,假如存在则卸载一下:
[root@localhost]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
❺卸载掉MariaDB
后,进入重命名后的目录并创立一个data
文件夹,用于寄存数据:
[root@localhost]# cd mysql8.0 && mkdir data
❻装备体系的环境变量,装备好后记住改写装备文件:
[root@localhost]# vi /etc/profile
# 在终究面加一行:
# export PATH=$PATH:/soft/mysql/mysql8.0/bin:/soft/mysql/mysql8.0/lib
# 按ESC键,输入 :wq 保存退出
[root@localhost]# source /etc/profile
其实这一步不装备也行,MySQL8.0
的发动文件中,会主动去装备体系的PATH
变量。
❼接着要创立一个mysql
的用户组,并创立一个用户和分配暗码、权限:
[root@localhost]# groupadd mysql
[root@localhost]# useradd -g mysql mysql
[root@localhost]# chown -R mysql.mysql /soft/mysql/mysql8.0
这一步千万要做,有人也许会想:我能够直接用root
用户呀,确实能够用,但后续会发生天多的费事,由于你需求手动更改许多许多的装备文件,所以这一步千万别省略,不要图简略!
❽接着进入MySQL
解压目录下的bin
文件夹,初始化MySQL
的根本信息:
[root@localhost]# cd /soft/mysql/mysql8.0/bin
[root@localhost]# ./mysqld --user=mysql --basedir=/soft/mysql/mysql8.0 --datadir=/soft/mysql/mysql8.0/data/ --initialize
# 假如履行报错,请先履行 yum install -y libaio 装置一下依靠库
这一步的指令稍微有些长,但实际上的作用便是指定MySQL
的体系用户、装置目录、数据寄存目录等信息,这行指令履行完结后会得到一个暂时暗码,也便是在终究一行输出的结尾,如下:
这个暗码各位小伙伴能够手动先仿制出来,由于后续需求经过这个暂时暗码衔接MySQL
。
❾接着需求装备一下MySQL
的装备文件,发动MySQL
时会默许读取/etc/my.cnf
这个文件,因而装备如下:
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
上述最主要的是装备装置目录和数据目录,这儿仅是根底装备,后续还会做更改~!
一起,
MySQL
的默许目录是/usr/local/mysql/
,假如你和我一样,没有在这个目录下装置MySQL
,那也记住一定要修正MySQL
的发动文件,如下:
[root@localhost]# cd /soft/mysql/mysql8.0
[root@localhost]# vi support-files/mysql.server
# 其间装置目录和数据目录默许为空,发动时会去加载/usr/local/mysql/目录
basedir=
datadir=
# 记住将其修正为你自定义的装置目录和数据目录(终究不要加斜杠)
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
❿修正完结后,接着先测验经过MySQL
发动脚本,工作MySQL
程序:
[root@localhost]# ./support-files/mysql.server start
Starting MySQL.Logging to '/soft/mysql/mysql8.0/data/localhost.localdomain.err'.
.. SUCCESS!
当呈现SUCCESS
后表明发动成功,接着能够查询一下后台进程:
[root@localhost]# ps aux | grep mysql
⓫后台有进程则表明装置成功,接着能够衔接一下MySQL
并重置暗码:
[root@localhost]# mysql -uroot -p
Enter password: (这儿输入前面得到的暂时暗码)
# 暗码输入正确后会进入MySQL终端,此刻能够测验简略查询
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER ...
此刻你会看到一个信息提示,也便是必需求经过ALTER USER
重置暗码后,才干进行操作:
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
重置暗码后再次进行查询,此刻就能查询出成果啦~:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.03 sec)
mysql> quit
⓬对MySQL-root
账号的暗码做了重置后,为了后续便利发动,此刻可将MySQL
添加到体系服务:
# 先中止MySQL服务
[root@localhost]# ./support-files/mysql.server stop
# 将MySQL发动文件仿制到体系etc目录下
[root@localhost]# cp -a ./support-files/mysql.server /etc/init.d/mysql
# 给予发动文件的履行权限
[root@localhost]# chmod +x /etc/init.d/mysql
# 经过体系etc目录下的发动文件创立体系服务
[root@localhost]# chkconfig --add mysql
为MySQL
创立好体系服务后,后续可经过service
指令来方便办理MySQL
,指令如下:
# 查看MySQL服务的工作状况
[root@localhost]# service mysql status
# 发动MySQL服务
[root@localhost]# service mysql start
# 中止MySQL服务
[root@localhost]# service mysql stop
# 重启MySQL服务
[root@localhost]# service mysql reload
# 平滑重启MySQL服务(先处理完已接纳的SQL后再重启)
[root@localhost]# service mysql force-reload
⓭经过服务指令发动MySQL
,并运用更改后的暗码衔接:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
Enter password: 123456
Welcome to the MySQL monitor. Commands end with ;
.......
能够看到上述欢迎信息,即表明全部无误!
⓮MySQL8.0
版别中,root
账号默许是不接受长途衔接的,因而这儿还需求修正一下长途衔接的权限:
# 进入mysql体系库
mysql> use mysql;
# 直接经过update修正体系用户表
mysql> update user set host="%" where user="root";
# 改写一下一切用户的权限信息
mysql> flush privileges;
到这儿,root
用户也支撑长途衔接了,但MySQL8.0
的暗码认证套件换掉了,所以需求经过SSL
加密方法去衔接,这儿需求紧记!
上述这个流程,是经过本人两次实验的,所以绝对牢靠,我们需求装置时,只需无脑仿制指令并履行即可~
二、一主一从架构树立实践
经过第一阶段后,装置好了一个最根本的MySQL
裸机,但想要树立主从集群,最少也需求两个节点,所以还需求再开一个节点,假如为了图简略,也能够直接克隆上一台机器,这样最省时省力,我这儿就不重复再装置一次了,现有两台机器的信息如下:
-
192.168.12.128、CentOS7、MySQL8.0
:后续将作为主节点(主库)运用。 -
192.168.12.129、CentOS7、MySQL8.0
:后续将作为从节点(从库)运用。
我们也能够挑选更多的节点来作为从库,方法根本上一样,也便是再开一个节点,装备和129
的一样即可。
2.1、装备MySQL主节点(master)
首要一起来树立一下MySQL
的主节点,大体可分为三步:
- ①修正主节点的装备文件。
- ②敞开主节点的端口。
- ③创立一个用于同步数据的账号。
2.1.1、修正主库的中心装备
主从集群的装备实则非常简略,只需修正前面装置时的my.cnf
文件即可,假如服务器是Windows
体系,则找到对应的my.ini
文件做修正,在修正前记住先停掉MySQL
服务,然后将主库的/etc/my.cnf
文件修正成如下内容:
[root@localhost]# service mysql stop
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------接下来的是主从集群装备-------
# 主库在主从集群中的仅有标识
server-id=1
# 敞开bin-log日志,并为bin-log日志取个前缀名(有默许值可不写)
log-bin=mysql-bin-log
# 同步仿制时过滤的库(主要将一些不需求备份/同步库写进来)
# 也能够经过binlog-do-db=xx1,xx2... 来指定要仿制的目标库
binlog-ignore-db=mysql
# 指定bin-log日志的格局为混合方法(默许为statement)
binlog_format=mixed
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
2.1.2、敞开主节点的端口
更改/etc/my.cnf
文件后,由于后续从库会经过网络实现数据同步,因而还需求对外敞开相应的3306
端口,一起也要记住改写防火墙,如下:
[root@localhost]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
假如嫌这样比较费事,也能够直接将防火墙封闭:
[root@localhost]# systemctl stop firewalld.service
但最好不要这样做,由于坚持体系防火墙的正常工作,在线上状况时,往往比装N
多个杀毒软件都管用,体系自带的防火墙能够有效的协助我们拦截大量网络进犯和木马植入。
2.1.3、创立用于数据同步的账号
敞开对应的数据库端口后,接着重启MySQL
服务并运用root
登录,稍后从库需求一个账号作为同步账号,这儿能够用root
账号,但最好再创立一个用户做区别,一起新的账号也能够做精准的权限操控:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> create user 'zhuzi'@'%' identified with mysql_native_password by '666666';
mysql> grant replication slave on *.* to 'zhuzi'@'%';
上面我为了图简略,因而直接为新用户zhuzi
分配了一切权限,但线上环境最好依据自己的需求取分配权限!
这儿有个小细节要紧记,我在创立用户时经过
with
指定暗码套件为mysql_native_password
,这是早版别中,默许的暗码认证套件,而在MySQL8.0
中则将默许套件换成了caching_sha2_password
,假如依据默许的认证套件创立用户,后续经过该账号衔接时,则需求以SSL
加密方法衔接。
2.1.4、查看主库的工作状况
终究来简略查看一下master
主节点的状况,如下:
mysql> show master status;
现在主库的bin-log
日志正在运用mysql-bin-log.000001
这个文件,Position
也便是《主从原理篇》中说到的POS
点,更具体一点的说,它代表当时日志文件的光标位置,每个MySQL
节点都有或许不一致,因而MySQL5.7
之后的版别并不会运用这种最根本的数据仿制方法,这儿先做简略演示,后续会运用GTID
仿制。
2.2、装备MySQL从节点(slave)
前面装备好了MySQL
的主库,接着再来弄一下MySQL
从库,装备进程也大致相同,但这儿需求紧记一点:假如你的单/多个从节点是直接克隆出来的,一定要记住更改的一下server_uuid
,由于克隆会导致每个节点的server_uuid
相同,这种状况下是无法树立出主从集群的。
更改
server_uuid
的方法也很简略,MySQL
在发动时会随机生成一个UUID
放到数据目录下的auto.cnf
文件中,假如是克隆出来的机器,直接rm -rf
移除auto.cnf
文件,再次重启MySQL
后又会生成一个新的UUID
。
2.2.3、更改从库的中心装备
相同得先修正一下从库的/etc/my.cnf
文件,将其装备为如下格局:
[root@localhost]# service mysql stop
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------接下来的是主从装备-------
# 从库在主从集群中的仅有标识
server-id=2
# 敞开bin-log日志(为了主从切换时运用,不敞开bin-log的从机只能当备库运用)
log-bin=mysql-bin-log
# 同步仿制时要过滤的库
binlog-ignore-db=mysql
# 指定bin-log日志的格局为混合方法
binlog_format=mixed
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
# 敞开relay-log日志(相同能够指定前缀名)
relay_log=mysql-relay-log
# 敞开存储进程、函数、触发器等内容的同步功用
log_bin_trust_function_creators=true
# 同步履行越过一些过错码(防止同步写入时呈现过错导致仿制中止)
slave_skip_errors=1062
假如你的从库只计划作为备库运用,那则无需再敞开从库的bin-log
日志,由于这会让从库的性能下降,究竟写数据时还需求多写一次日志,相较于只写数据而言,性能开支近乎下降一倍。但如若从库还计划用于热备切换,那则有必要也要敞开bin-log
日志,不然这个从节点升级为主库后,无法接纳客户端SQL
写入数据,也无法给其他从库供给数据仿制的根底。
2.2.2、敞开从库的端口和防火墙
不仅仅只要主库需求敞开3306
端口,从库地点的机器相同需求,由于主从之间是依据TCP/IP
协议来构建网络衔接,从而实现传输数据的,TCP
协议是一种对端协议,一方的端口未敞开都有或许导致数据传输呈现问题:
[root@localhost]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
2.2.3、从库衔接账号实现数据同步
想要装备主库的衔接账号,从库也需求先登录root
账号,或许其他具有权限的账号也行,接着履行下述指令即可:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_log_file='mysql-bin-log.000001',
master_log_pos=653;
也便是依据本来主库上创立的zhuzi
账号,以此来树立网络衔接,在主库数据更新后,从库会以客户端的方法恳求主库的bin-log
日志,接着写入到自身的relay-log
日志中,后续从库上的SQL
线程会读取relay-log
日志解析履行。
这儿额外提一句:假如你主库上创立的长途账号,运用了
8.0
中默许的caching_sha2_password
套件,那在这儿衔接时,也仅仅只需求在终究加上一行master_ssl=1
即可!
2.2.4、发动从库线程、调查从库状况
从库上衔接好账号之后,接着需求发动一下从库线程:
mysql> start slave;
mysql> show slave status\G;
上述指令履行完结后,会呈现下面这一堆信息:
在其间必需求看到Slave_IO_Running、Slave_SQL_Running
两个线程的状况都为Yes
时,这才意味着主从集群树立完结。
2.2.5、测验主从数据同步的作用
前面手把手带着诸位将最根本的主从集群树立出来了,假如你想要为主节点搭载更多的从库,只需求再多开几个机器/节点,重复前面的从库装备即可,接着来实际测验看看主从同步的作用,先看看主从节点各自的数据状况:
# 查询主节点的库信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
# 查询从节点的库信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
从上述信息中可看出,现在主、从节点都归于裸机状况,其间没有任何数据,接着先在主节点上创立一个名为db_zhuzi
的库:
mysql> create database db_zhuzi;
从上图的作用中,也能够显着看出,尽管从节点上未主动创立库,但从节点会直接将主节点上创立的db_zhuzi
库直接同步过来,接着再创立一张zz_users
看看:
mysql> create table `zz_users` (
`user_id` int(8) not null,
`user_name` varchar(255) not null,
`user_sex` varchar(255) not null,
`password` varchar(255) not null,
`register_time` datetime
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci
row_format = Compact;
从作用图上看,不仅仅之前创立库的操作会同步,创立表的记录仍旧会经过bin-log
日志同步过来,这也就意味着DDL
句子都会做同步,那接下来再试试DML
句子,也便是增、删、改句子的作用是怎么样呢?
mysql> insert into `zz_users` values(1,"熊猫","女","6666",now()),(2,"竹子","男","1234",now());
作用仍旧非常显着,我们只在master
节点上履行了数据刺进动作,但从节点上仍旧能够查询出数据,这也就意味着主库上刺进的数据,也被同步过来啦~,关于修正、删去操作则不再重复演示,我们能够自己玩一玩,作用仍旧是相同的!
三、GTID仿制、无损仿制落地实操
经过第二阶段的内容解说后,就现已完结了最传统的主从集群树立,但这种集群有一个令人非常难过的点,也便是当主节点宕机后,假定从节点成为了新主,假如这儿还有其他从节点,就需求指向新主,但POS
定位又会成为一个问题,究竟各个从库之间的仿制进展也许不一致,所以需求开发/运维人员手动介入,才干寻觅到适宜的同步点。
也正是由于上述这个问题,所以在MySQL5.6
中引入了一种名为GTID
仿制的技能,专门用于处理从库寻点的问题,在前面装备从节点时,需求我们手动指定master_log_pos=653
同步点,而敞开GTID
仿制后则可彻底治愈该问题,但具体如何操作呢?接着我们来实操一下。
3.1、GTID仿制实操
由于之前我们从库现已装备好了同步,因而这儿需求中止一下从库的同步线程,如下:
mysql> stop slave;
中止从库的同步线程,接着主从节点都需求退出衔接,然后中止MySQL
服务:
mysql> quit
[root@localhost]# service mysql stop
接着需求再次更改两个节点的/etc/my.cnf
文件,添加如下内容:
# 敞开GTID仿制
gtid_mode=on
# 越过一些或许导致履行犯错的SQL句子
enforce-gtid-consistency=true
接着再重启两个节点上的MySQL
服务,然后登录从节点,再经过下述指令树立与主库的衔接:
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
从这儿能够看到,本来需求经过master_log_file='mysql-bin-log.000001', master_log_pos=653
指定同步的日志文件和同步点,但在GTID
仿制方法中,只需求设置一个master_auto_position=1
即可,接下来它会主动寻觅同步点,接着来试试作用,但不要忘了在从机上发动slave
线程:
mysql> start slave;
测验成果如下:
- ①首要分别在主从节点上查询表数据,此刻各自用户表中都只要两条数据。
- ②发动从节点上的同步线程,并在主节点上刺进一条
ID=3
的数据。 - ③从上图也能显着看到从节点上有数据,装备了
GTID
仿制后,数据同步机制仍旧正常作业。 - ④终究查看一下主节点的状况,能够显着看到现在
Executed_Gtid_Set
现已有值啦!
假如未敞开GTID
仿制,主从节点的数据同步必需求求手动指定POS
同步点,从库会按照指定同步点开始同步数据,而敞开GTID
仿制方法后,MySQL
会主动寻觅数据的同步点。
3.2、无损仿制实操
MySQL5.7
中对原有的半同步仿制方法做了增强,也便是引入了无损仿制的方法,具体的概念可参考上篇《MySQL主从原理篇-无损仿制》,MySQL
的无损仿制是插件式实现的,这也就意味着想要运用还需求先装置插件,如下:
主节点履行:INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从节点履行:INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
分别在主从节点上装置后,接着仍旧要中止同步线程、退出衔接、封闭MySQL
服务,接着再次修正主从的/etc/my.cnf
装备文件,内容如下:
# 主节点上新增装备:
# 敞开无损仿制
rpl_semi_sync_master_enabled=on
# 等候从节点ACK的时长(不指定默许为10s)
rpl_semi_sync_master_timeout=3000
# 从节点上新增装备:
rpl_semi_sync_slave_enabled=on
在各自的文件中新增上述装备后,再次重启MySQL
服务就能将仿制方法改为无无损仿制计划,但线上最好不要运用这种无损仿制,由于会导致MySQL
整体性能直线下滑,假如对数据实时性要求较高,能够引入Canal
中间件来监控主节点的Bin-log
日志。
四、多主架构树立实战
经过第三阶段的学习后,我们把握了一些主从集群中的高级特性,接着再来树立一下另一种非常盛行的主从架构计划,也就双主/多主多写架构,其实这种多主的思维非常简略,好比现在我这两个节点组成的集群,两个互为各自的主节点,也互为各自的从节点,这儿就不对这些概念做重复叙述了,不了解的可参考《主从原理篇-多种主从架构模型》中的具体阐明,这儿就直接上实战。
4.1、修正第一个节点的装备文件
这儿也便是将本来的128
节点,再在其装备文件中加上从库的装备信息,然后再设置一下自增步长和初始值即可,完好装备文件如下:
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------主节点装备-------
# 当时节点在集群中的仅有标识
server-id=1
# 敞开bin-log日志,并为bin-log日志取个前缀名(有默许值可不写)
log-bin=mysql-bin-log
# 同步仿制时过滤的库(主要将一些不需求备份/同步库写进来)
# 也能够经过binlog-do-db=xx1,xx2... 来指定要仿制的目标库
binlog-ignore-db=mysql
# 指定bin-log日志的格局为混合方法(默许为statement)
binlog_format=mixed
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
# ------GTID装备-------
# 敞开GTID仿制
gtid_mode=on
# 越过一些或许导致履行犯错的SQL句子
enforce-gtid-consistency=true
# ------从节点装备-------
# 敞开relay-log日志(相同能够指定前缀名)
relay_log=mysql-relay-log
# 敞开存储进程、函数、触发器等内容的同步功用
log_bin_trust_function_creators=true
# 同步履行越过一些过错码(防止同步写入时呈现过错导致仿制中止)
slave_skip_errors=1062
# ------自增序列装备-------
# 设置自增初始值为1
auto_increment_offset=1
# 设置自增步长为2,自增序列为{1、3、5、7、9.....}
auto_increment_increment=2
4.2、修正第二个节点的装备文件
上面完结了第一个节点装备后,接着再来装备第二个节点的信息,根本上大致相同,主要有两点不同的当地:
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------主节点装备-------
# 当时节点在集群中的仅有标识
server-id=2
# 敞开bin-log日志,并为bin-log日志取个前缀名(有默许值可不写)
log-bin=mysql-bin-log
# 同步仿制时过滤的库(主要将一些不需求备份/同步库写进来)
# 也能够经过binlog-do-db=xx1,xx2... 来指定要仿制的目标库
binlog-ignore-db=mysql
# 指定bin-log日志的格局为混合方法(默许为statement)
binlog_format=mixed
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
# ------GTID装备-------
# 敞开GTID仿制
gtid_mode=on
# 越过一些或许导致履行犯错的SQL句子
enforce-gtid-consistency=true
# ------从节点装备-------
# 敞开relay-log日志(相同能够指定前缀名)
relay_log=mysql-relay-log
# 敞开存储进程、函数、触发器等内容的同步功用
log_bin_trust_function_creators=true
# 同步履行越过一些过错码(防止同步写入时呈现过错导致仿制中止)
slave_skip_errors=1062
# ------自增序列装备-------
# 设置自增初始值为1
auto_increment_offset=2
# 设置自增步长为2,自增序列为{1、3、5、7、9.....}
auto_increment_increment=2
第二个节点的装备信息和第一个节点的信息,只要两点不同:
-
server-id=2
:这个是各节点在集群中的仅有标识,不能重复。 -
auto_increment_offset=2
:自增初始值从1
变为2
,终究作用会变为:192.168.12.128:1、3、5、7、9、11、13、15、17.......
192.168.12.129:2、4、6、8、10、12、14、16、18......
接着需求先发动一下本来作为从库的192.168.12.129
节点,相同需求创立一个同步账号,如下:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> create user 'zhuzi'@'%' identified with mysql_native_password by '666666';
mysql> grant replication slave on *.* to 'zhuzi'@'%';
创立好了账号后,接着再发动192.168.12.128
节点的MySQL
服务,两个节点都经过root
账号登录,接着履行下述指令,都将对方指定为自己的主节点:
# 192.168.12.128节点上履行,将192.168.12.129设为自己的主节点
mysql> change master to master_host='192.168.12.129',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
# 192.168.12.129节点上履行,将192.168.12.128设为自己的主节点
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
终究再分别发动各自的同步线程:
mysql> start slave;
然后再在恣意一个节点上创立一张zz_user
用户表:
mysql> create table `zz_user` (
`user_id` int(8) not null auto_increment,
`user_name` varchar(255),
primary key (`user_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci
row_format = Compact;
上述表中将user_id
设置为了主键,并具有自增特性,一起由于两个节点互为主从,所以在一个节点上创立表之后,就会主动同步给另一个节点,因而无需在两个节点上都创立表,测验一下:
- ①在
192.168.12.128
节点上,刺进了一条名为“竹子”的用户数据。 - ②在
192.168.12.129
节点上,能够查询出名为“竹子”的这条用户数据。 - ③在
192.168.12.129
节点上,刺进了一条名为“熊猫”的用户数据。 - ④在
192.168.12.128
节点上,也能够查询出名为“熊猫”的这条用户数据。
从上述成果中可显着看出作用,这也就意味着我们的双主双写架构就树立完结啦!两台节点都支撑客户端读写数据,一起两个节点都具有完好数据,这也便是所谓的双主双写架构,我们也能够用更多的节点来树立环形多主架构,但之前《MySQL优化篇-架构优化》中聊过,树立双主以上的多主架构则没有必要了,能够直接将架构升级到分库分表。
五、主从实践篇总结
前面的进程中实现了数据库的主备、主主树立,但这仅仅只是数据库的根底架构,假如想要将这些架构应用到事务中,还得解决客户端的衔接问题,究竟现在从原有的单库变为了多库,因而多数据源的衔接需求再经过新的手段处理,业内一般有三种做法:
- ①依据
Spring、MyBatis
供给的接口和类,拦截SQL
句子动态挑选对应的数据源。 - ②运用
Sharding-JDBC
这类驱动层结构,装备多个数据源,路由改写的作业交给结构完结。 - ③运用
MyCat、Sharding-Proxy
等这类署理中间件,事务体系衔接中间件,路由改写的作业交给中间件完结。
依据上述三种计划,装备很多数据源的办理后,事务体系在线上工作时,会自行依据SQL
类型分发恳求,比方主从树立读写别离架构,便是将SQL
以insert、delete、update、alter...
这类关键字最初的句子,分发到主节点处理,关于select
这类关键字最初的句子,分发到从节点处理。
关于双主双写的架构而言,就只需求取模分发或随机分发即可,无需区别读写操作,究竟两个节点都会彼此同步数据,因而终究都会具有完好的数据,所以集群内的恣意节点,都具有处理读写恳求的才能。
PS:尽管本章中只树立了一主多从、多主多写两种架构,但关于多主一从、级联仿制这两种架构,也仅仅只是节点数量的分配不同,因而我们有爱好可自行树立,这儿就不再重复赘述~
一起,为了保证数据库集群的高可用,一般也会结合Keeplived+VIP
来对各节点做虚拟IP
映射和宕机检测,这样能够保证MySQL
呈现宕机时,能够第一时间将流量切换到新主上,而且也能够快速重启宕机的程序,但Keeplived+VIP
在之前关于《Nginx高可用》的文章具体讲过,我们感爱好能够去看看,这儿相同不做重复赘述。