centos7上mariadb10.3多实例安装部署及主从复制

    mariaDB是开源的数据库,是mysql的衍生版。mysql

   Mariadb官方: https://mariadb.com/ web

  os:centos7sql

 mariadb:10.3数据库

yum安装实现。vim

一个版本mysql经过多个端口实现centos

规划3个实例的端口:3306/3307/3308。缓存

将各自的配置文件、日志文件、pid、socket单独存放。bash


1、yum安装app

    采用 yum安装,centos7默认的yum源是mariadb5.5版本,因此须要修改yum仓库配置文件,以安装10.3.0版本的mariadb
ssh

vim /etc/yum.repos.d/CentOS-Base.repo

在仓库配置文件中添加以下行

# MariaDB 10.3 CentOS repository list - created 2019-01-07 01:34 UTC
#  
[mariadb]
name = MariaDB
baseurl =  
gpgkey= 
gpgcheck=1

完成后,更新yum缓存,而后检查maradb是否已经更换

yum info MariaDB-server

image.png

确认后,便可使用yum进行安装

yum install MariaDB-server


2、配置

三个数据库实例都放在独立的目录中

mkdir -pv /data/{3306,3307,3308}/{etc,socket,pid,log,data}

完成后的目录结构以下所示:

image.png

确认mysql的用户帐户是否已经被建立

getent passwd mysql

image.png

修改数据库的权限和组信息

chown -R mysql.mysql /data

生成各个实例数据库文件

mysql_install_db --datadir=/data/3306/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3307/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3308/data --user=mysql --basedir=/usr

image.png


根据3个不一样的实例准备3个配置文件,用/etc/my.cnf 当模板:

将配置文件考到各自的文件下:

cp /etc/my.cnf /data/3306/etc/
cp /etc/my.cnf /data/3307/etc/
cp /etc/my.cnf /data/3308/etc/


修改各自实例的配置文件,以下所示:

vim /data/3306/etc/my.cnf

[mysqld]
port=3306                    #手动添加部分
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid
#!includedir /etc/my.cnf.d            #须要注释掉

image.png

其余实例3307,3308的配置文件也按上修改

注意,配置文件中,能够有不少优化,能够查询资料后制定


3、准备启动脚本

首先确认中止mariadb服务

systemctl stop mariadb

在/data/3306/路径下建立mysql启动脚本,脚本内容以下:

touch /data/3306/mysql
vim /data/3306/mysql


#!/bin/bash

port=3306                                  #设定实例端口号
mysql_user="root"                          
mysql_pwd="abc@123"                        #设定数据库密码
cmd_path="/usr/bin"
mysql_basedir="/data"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac

完成后的目录结构以下:

image.png

注意修改3307,3308各个实例的脚本

cp /data/3306/mysqld  /data/3307/(配置文件端口改成port=3307)
cp /data/3306/mysqld  /data/3308/(配置文件端口改成port=3308)

设置合适的权限

chmod 700 /data/3306/mysqld
chmod 700 /data/3307/mysqld
chmod 700 /data/3308/mysqld

启动脚本

./ mysqld start

image.png

检查服务启动状态

image.png

可见 各个端口都是正常开启


测试链接

须要用sock指定文件连接到 mysql

mysql -S /data/3306/socket/mysql.sock
mysql -S /data/3307/socket/mysql.sock
mysql -S /data/3308/socket/mysql.sock

经过查看端口判断进入哪一个实例

show variables like 'port';

image.png

设置密码

mysqladmin -uroot -S /data/3306/socket/mysql.sock password 'abc@123'


此时进入3306实例数据库

mysql -S /data/3306/socket/mysql.sock -u root -p

image.png


4、主从复制

主从复制是一个异步的复制过程,数据从一个Mysql数据库复制到另外一个mysql数据库,在主和从之间实现整个主从复制使的过程是由三个线程参与完成的。

其中有两个线程在从端,另一个线程在主端。
要实现主从复制,首先必须打开master端的binlog记录功能,不然没法实现。整个主从复制过程就是从端从主端获取binlog日志,而后再到slave上以相同的顺序获取binlog日志中所记录的各类

SQL操做。

要打开binlog记录功能,可经过配置文件my.cnf中的mysqld模块增长log-bin参数选项来实现。

image.png

主从复制原理

从库生成两个线程,一个I/O线程,一个SQL线程;

 

i/o线程去请求主库 的binlog,并将获得的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

 

SQL 线程,会读取relay log文件中的日志,并解析成具体操做,来实现主从的操做一致,而最终数据一致;

主从复制重点:

1)主从复制是异步的逻辑的sql语句级的复制

2)复制时,主库有一个I/O线程,从库有有两个线程,即I/O和SQL线程。

3)实现主从复制的必要条件是主库须要开启binlog功能

4)做为复制的全部mysql节点的server-id都不能相同

5)binlog文件只记录对数据库有更改的sql语句,不记录任何查询语句。

以本机单机数据库多实例环境测试主从复制

主库于从库IP信息以下:

主库            3306
从库1          3307

从库2          3308


4.1设置server-id值并开启binlog功能参数

修改主库配置文件my.cnf,按照以下修改两个参数

vim /data/etc/my.cnf
[mysqld]
server-id =1            #用于同步的每台机器或者实例server-id都不能相同
log-bin = /data/3306/mysql-bin            #注意,只须要主库设置便可,从库不须要设置此参数

说明:

参数要放在my.cnf的[mysqld]模块下

server-id的值不能相同

参数不能重复

修改完成后重启数据库

/data/3306/mysql restart

登录数据库,检查参数的更改状况,以下:

mysql -S /data/3306/socket/mysql.sock -u root -pabc@123


show variables like 'server_id';
show variables like 'log_bin';

image.png

按照这个方法检查其余实例数据库



4.2主库创建用于主从复制的帐号

从库想要和主库同步,必须有一个能够链接主库的帐号,而且这个帐号是主库上建立的,权限是运行主库链接并同步数据库。

登录主库后,创建用于从库复制的帐号rep

grant replication slave on *.* to 'rep'@'172.31.208.%' identified by 'abc@123';
flush privileges;

image.png


检查主库rep帐号

image.png


4.3实现对主数据库锁表只读

对主数据库锁表只读

flush table with read lock;


查看主库状态

image.png


锁表后,导出主库数据(新开一个ssh链接)

mkdir /data/backup -p
mysqldump -uroot -p'abc@123' -S /data/3306/socket/mysql.sock --events -A -B |gzip >/data/backup/mysql_bak.$(date +%F).sql.gz

为了确保导出数据期间,数据库没有数据插入,导出主库完毕后能够再次检查主库状态信息,结果以下:

image.png

能够看到主库没有数据写入

完成主库导出后,解锁主库,恢复可写

unlock tables;

完成导出后,则可使用mysqldump将主库数据备份到从库上


4.4从库上配置

数据库的server-id通常在一套主从复制体系内时惟一的,从库的server-id须要和主库和其余从库的不一样,而且要注释掉从库的binlog参数配置,若是从库不作级联复制,而且不做为备份做用,则不须要开启binlog,开启反而会增长从库磁盘I/O压力。

    可是有两种状况须要打开从库的binlog记录功能,记录数据库更新的SQL语句。

1)A-B-C级联同步,中间的B数据库服务,须要开启binlog记录功能

2)在从库作数据库备份要开启binlog记录功能,由于数据库备份必需要有全备和binlog日志,才是完成的备份。

完成从库3307的配置文件修改后,检查从库参数改变状况

image.png

使用mysqldump命令将主库备份文件恢复到从库

gzip -d mysql_bak.2019-01-07.sql.gz
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock <mysql_bak.2019-01-07.sql


4.5 主从库同步

从库的配置信息以下:

CHANGE MASTER TO
MASTER_HOST='172.31.208.81',               #主库ip
MASTER_PORT=3306,                          #主库端口
MASTER_USER='rep',                         #主库上的复制权限用户rep
MASTER_PASSWORD='abc@123',                #rep用户密码
MASTER_LOG_FILE='mysql-bin.000001',        #show master status时查看到的二进制文件名称,注意不能多空格
MASTER_LOG_POS=648;                       #show master status时看到的二进制日志偏移量,注意不能多空格

也能够按照以下方式配置从库链接主数据库进行配置

image.png


实际上,以上操做信息其实是写入从库新的master.info文件中

image.png



启动从库主从复制开关,并查看复制状态

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "start slave;"
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"

image.png

主从复制是否成功,最关键的是下面的3项状态参数

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"

image.png

说明:

 Slave_IO_Running :IO线程状态,IO线程负责从库到主库读取binlog日志,并写入从库的中继日志,状态为yes表示IO工做征程

Slave_SQL_Runing :SQL线程状态,SQL线程负责读取中继日志中的数据并转换为SQL 语句到从数据库,状态为YES 表示SQL线程工做正常

Seconds_Behind_Master: 复制过程当中从库比主库的延迟秒数



4.6总结

一、主库配置log-bin和server-id参数,从库只用配置 server-id,配置完成后重启数据库

二、主库增长同步用户帐号,例如rep 受权 repliaction slave权限

三、登录主库,整库锁表flush table with read lock,检查show master status 查看binlog的位置状态

四、同步以前,备份主库,可使用mydump导出到指定位置

五、完成主库导出后,执行unlock tables解锁主库

六、把主库导出的数据恢复到从库

七、根据主库show master status  查看的binlog位置状态,从库执行change master to 语句

八、从库开启复制开关,执行start slave;

9 、从库show slave status\G,检查同步状态

相关文章
相关标签/搜索